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 LOCAL_HOST "127.0.0.1"
#define DEFAULT_PORT 1994 #define DEFAULT_PORT 1994
#define MAX_SYNC_TIME 20 * 1000 // 10 sec on millisec #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 SYNC_TIME 5 * 1000 // 5 sec on millisec
#define DEEP_SCANER_INTERVAL 10000 // 10 sec #define DEEP_SCANER_INTERVAL 10000 // 10 sec
#define CHECK_PING_INTERVAL 5 * 60 *1000 // 5 minutes #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 class BadAnswerExaption:public std::exception
{ {
public: public:

View File

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

View File

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

View File

@ -24,6 +24,7 @@ Sync::Sync(const QString address, int port, const QString &datadir):
} }
fbroadcaster = false; fbroadcaster = false;
resyncCount = 0;
sql = new MySql(datadir); sql = new MySql(datadir);
sql->updateAvailableSongs(playList); sql->updateAvailableSongs(playList);
@ -69,7 +70,10 @@ bool Sync::play(const Song &song, bool fbroadcast){
} }
fbroadcaster = 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; return false;
} }
@ -77,13 +81,9 @@ bool Sync::play(const Song &song, bool fbroadcast){
player->play(); player->play();
sync(); sync();
}else{ }else{
if(!player->syncBegin()){ player->syncBegin();
return false;
}
} }
sql->updateAvailableSongs(playList);
return true; return true;
} }
@ -130,14 +130,21 @@ void Sync::jump(const qint64 seek){
player->setPosition(seek); player->setPosition(seek);
} }
bool Sync::isReadyToSync()const{
return !fbroadcaster && player->isSeekable()
&& (player->state() == QMediaPlayer::PlayingState);
}
bool Sync::sync(const Syncer &sync, milliseconds ping){ bool Sync::sync(const Syncer &sync, milliseconds ping){
if(!fbroadcaster && (!player->isSeekable() || !(player->state() == QMediaPlayer::PlayingState))){ if(!isReadyToSync()){
return false; return false;
} }
player->setPosition(sync.seek + ping); player->setPosition(sync.seek + ping);
player->syncEnd();
return true;
return player->syncEnd();
;
} }
void Sync::sync(){ void Sync::sync(){
@ -246,24 +253,40 @@ void Sync::packageRender(ETcpSocket *socket){
emit networkStateChange(); emit networkStateChange();
} }
if(fbroadcaster == (pkg.getType() & t_brodcaster)){ // if(fbroadcaster == (pkg.getType() & t_brodcaster)){
throw BrodcastConflict(); // throw BrodcastConflict();
socket->nextItem(); // socket->nextItem();
continue; // continue;
} // }
if(pkg.getType() & t_brodcaster){ if(pkg.getType() & t_brodcaster){
// if requst from server // if requst from server
if(pkg.getType() & t_sync && !sync(pkg.getPlayData(), 10)){ 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)){ 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()); socket->Write(answer.parseTo());
} }
else if(player->state() == QMediaPlayer::PlayingState){ else if(pkg.getType() & t_play){
package answer; package answer;
if(!createPackage(t_sync, answer)){ if(!createPackage(t_sync, answer)){

View File

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