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 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
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)){
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user