diff --git a/sync/config.h b/sync/config.h index 90ad0e8..f75407d 100644 --- a/sync/config.h +++ b/sync/config.h @@ -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 diff --git a/sync/exaptions.h b/sync/exaptions.h index a690b56..f83c875 100644 --- a/sync/exaptions.h +++ b/sync/exaptions.h @@ -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: diff --git a/sync/player.cpp b/sync/player.cpp index eca3fef..1f8494a 100644 --- a/sync/player.cpp +++ b/sync/player.cpp @@ -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; } - setVolume(bufferVolume); - bufferVolume = 0; - - return true; } diff --git a/sync/player.h b/sync/player.h index 4e58722..9af3603 100644 --- a/sync/player.h +++ b/sync/player.h @@ -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 diff --git a/sync/sync.cpp b/sync/sync.cpp index 79ec56e..2139fdb 100644 --- a/sync/sync.cpp +++ b/sync/sync.cpp @@ -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,13 +81,9 @@ 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)){ diff --git a/sync/sync.h b/sync/sync.h index ed811aa..88c48f9 100644 --- a/sync/sync.h +++ b/sync/sync.h @@ -28,6 +28,7 @@ private: SongHeader *curentSong; QList 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 */