fix synced nodes

This commit is contained in:
Andrei Yankovich 2018-01-14 15:29:42 +03:00
parent 9a654d737c
commit cd62c20e97
6 changed files with 71 additions and 41 deletions

View File

@ -18,6 +18,8 @@
#define LOCAL_HOST "127.0.0.1"
#define DEFAULT_PORT 1994
#define MAX_SYNC_TIME 20 * 1000 // 10 sec on millisec
#define RESYNC_TIME 1000 // 1 sec on millisec
#define MAX_RESYNC_COUNT 3
#define SYNC_TIME 5 * 1000 // 5 sec on millisec
#define DEEP_SCANER_INTERVAL 10000 // 10 sec
#define CHECK_PING_INTERVAL 5 * 60 *1000 // 5 minutes

View File

@ -39,6 +39,14 @@ public:
}
};
class SyncCountError:public std::exception
{
public:
QString what(){
return QObject::tr("Could not sync audio.");
}
};
class BadAnswerExaption:public std::exception
{
public:

View File

@ -30,29 +30,21 @@ bool Player::setMediaFromBytes(const QByteArray &array){
return true;
}
bool Player::syncBegin(){
void Player::syncBegin(){
if(!isAudioAvailable()){
return false;
}
bufferVolume = volume();
setVolume(0);
play();
return true;
}
bool Player::syncEnd(){
void Player::syncEnd(){
if(!bufferVolume){
return false;
}
if(bufferVolume){
setVolume(bufferVolume);
bufferVolume = 0;
return true;
}
}

View File

@ -29,16 +29,14 @@ public:
bool setMediaFromBytes(const QByteArray& array);
/**
* @brief syncBegin
* @return true if palyer waiting for sunced.
* @brief syncBegin - palyer waiting for sunced.
*/
bool syncBegin();
void syncBegin();
/**
* @brief syncEnd
* @return true if player waiting for finished sync.
* @brief syncEnd ending synced
*/
bool syncEnd();
void syncEnd();
/**
* @brief isSynced

View File

@ -24,6 +24,7 @@ Sync::Sync(const QString address, int port, const QString &datadir):
}
fbroadcaster = false;
resyncCount = 0;
sql = new MySql(datadir);
sql->updateAvailableSongs(playList);
@ -69,7 +70,10 @@ bool Sync::play(const Song &song, bool fbroadcast){
}
fbroadcaster = fbroadcast;
if(!findHeader(song) && sql->save(song) > -1 && !findHeader(song)){
if(!findHeader(song) && sql->save(song) > -1 &&
sql->updateAvailableSongs(playList) && !findHeader(song)){
return false;
}
@ -77,12 +81,8 @@ bool Sync::play(const Song &song, bool fbroadcast){
player->play();
sync();
}else{
if(!player->syncBegin()){
return false;
player->syncBegin();
}
}
sql->updateAvailableSongs(playList);
return true;
}
@ -130,14 +130,21 @@ void Sync::jump(const qint64 seek){
player->setPosition(seek);
}
bool Sync::isReadyToSync()const{
return !fbroadcaster && player->isSeekable()
&& (player->state() == QMediaPlayer::PlayingState);
}
bool Sync::sync(const Syncer &sync, milliseconds ping){
if(!fbroadcaster && (!player->isSeekable() || !(player->state() == QMediaPlayer::PlayingState))){
if(!isReadyToSync()){
return false;
}
player->setPosition(sync.seek + ping);
player->syncEnd();
return true;
return player->syncEnd();
;
}
void Sync::sync(){
@ -246,24 +253,40 @@ void Sync::packageRender(ETcpSocket *socket){
emit networkStateChange();
}
if(fbroadcaster == (pkg.getType() & t_brodcaster)){
throw BrodcastConflict();
socket->nextItem();
continue;
}
// if(fbroadcaster == (pkg.getType() & t_brodcaster)){
// throw BrodcastConflict();
// socket->nextItem();
// continue;
// }
if(pkg.getType() & t_brodcaster){
// if requst from server
if(pkg.getType() & t_sync && !sync(pkg.getPlayData(), 10)){
package answer;
if(!createPackage(t_play, answer)){
throw CreatePackageExaption();
socket->nextItem();
continue;
}
socket->Write(answer.parseTo());
QTimer::singleShot(RESYNC_TIME, [=]() {
package pac;
if(resyncCount < MAX_RESYNC_COUNT){
if(!createPackage(t_sync, pac)){
throw CreatePackageExaption();
return;
}
resyncCount++;
}else{
resyncCount = 0;
throw SyncCountError();
return;
}
node->WriteAll(pac.parseTo());
});
}
else if (pkg.getType() & t_sync){
resyncCount = 0;
}
if(pkg.getType() & t_play && !play(pkg.getHeader(), false) && !play(pkg.getSong(), false)){
@ -281,7 +304,7 @@ void Sync::packageRender(ETcpSocket *socket){
}
socket->Write(answer.parseTo());
}
else if(player->state() == QMediaPlayer::PlayingState){
else if(pkg.getType() & t_play){
package answer;
if(!createPackage(t_sync, answer)){

View File

@ -28,6 +28,7 @@ private:
SongHeader *curentSong;
QList<ETcpSocket*> servers;
bool fbroadcaster;
int resyncCount;
LocalScanner deepScaner;
MySql *sql;
int port;
@ -118,6 +119,12 @@ public:
*/
bool sync(const Syncer& sync, milliseconds ping);
/**
* @brief isReadyToSync
* @return true if node ready to sync;
*/
bool isReadyToSync()const;
/**
* @brief sync with clients
*/