mirror of
https://github.com/QuasarApp/SoundBand.git
synced 2025-04-28 16:24:32 +00:00
fix synced nodes
This commit is contained in:
parent
9a654d737c
commit
cd62c20e97
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)){
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user