mirror of
https://github.com/QuasarApp/SoundBand.git
synced 2025-04-28 00:04:33 +00:00
Fixed synchronization
This commit is contained in:
parent
3d0bf07419
commit
c627f31229
@ -20,8 +20,6 @@ bool SongHeader::operator ==(const SongHeader& right){
|
||||
return this->name == right.name && this->size == right.size;
|
||||
}
|
||||
|
||||
SongHeader::~SongHeader(){}
|
||||
|
||||
unsigned int SongHeader::getSize() const{
|
||||
QByteArray size;
|
||||
QDataStream stream(size);
|
||||
@ -29,6 +27,15 @@ unsigned int SongHeader::getSize() const{
|
||||
return size.size();
|
||||
}
|
||||
|
||||
bool SongHeader::isValid() const{
|
||||
|
||||
return id > -1 && !name.isEmpty() && size > 0;
|
||||
}
|
||||
|
||||
SongHeader::~SongHeader(){}
|
||||
|
||||
|
||||
|
||||
Song::Song():
|
||||
SongHeader()
|
||||
{
|
||||
@ -60,14 +67,19 @@ void Song::clear(){
|
||||
source.clear();
|
||||
}
|
||||
|
||||
Song::~Song(){
|
||||
source.clear();
|
||||
}
|
||||
|
||||
unsigned int Song::getSize() const{
|
||||
return SongHeader::getSize() + source.size();
|
||||
}
|
||||
|
||||
bool Song::isValid() const{
|
||||
|
||||
return SongHeader::isValid() && source.size() == size;
|
||||
}
|
||||
|
||||
Song::~Song(){
|
||||
source.clear();
|
||||
}
|
||||
|
||||
QDataStream& operator << (QDataStream& stream,const Song& song){
|
||||
stream << static_cast<const SongHeader&>(song);
|
||||
stream << song.source;
|
||||
|
@ -41,7 +41,8 @@ public:
|
||||
SongHeader();
|
||||
SongHeader& operator = (const SongHeader& right);
|
||||
bool operator == (const SongHeader& right);
|
||||
virtual unsigned int getSize()const;
|
||||
virtual unsigned int getSize() const;
|
||||
virtual bool isValid() const;
|
||||
virtual ~SongHeader();
|
||||
friend QDataStream& operator << (QDataStream& stream, const SongHeader& song);
|
||||
friend QDataStream& operator >> (QDataStream& stream, SongHeader& song);
|
||||
@ -59,6 +60,7 @@ public:
|
||||
Song(const SongHeader& from);
|
||||
void clear();
|
||||
unsigned int getSize() const;
|
||||
bool isValid() const;
|
||||
~Song();
|
||||
friend QDataStream& operator << (QDataStream& stream, const Song& song);
|
||||
friend QDataStream& operator >> (QDataStream& stream, Song& song);
|
||||
|
@ -158,6 +158,11 @@ Clock Sync::from(const milliseconds& mc){
|
||||
}
|
||||
|
||||
bool Sync::play(const SongHeader &header, const Syncer *syncdata){
|
||||
|
||||
if(!header.isValid()){
|
||||
return false;
|
||||
}
|
||||
|
||||
QString qyer = QString("SELECT * from %0 where name=%1 and size=%2").arg(DATATABLE_NAME).arg(header.name).arg(header.size);
|
||||
if(!qyery->exec(qyer)){
|
||||
return false;
|
||||
@ -167,17 +172,22 @@ bool Sync::play(const SongHeader &header, const Syncer *syncdata){
|
||||
song.name = qyery->value(1).toString();
|
||||
song.size = qyery->value(2).toInt();
|
||||
song.source = qyery->value(3).toByteArray();
|
||||
return Sync::play(song,syncdata);
|
||||
return Sync::play(song, syncdata);
|
||||
}
|
||||
|
||||
bool Sync::play(Song &song, Syncer *syncdata){
|
||||
bool Sync::play(const Song &song, const Syncer *syncdata){
|
||||
|
||||
if(!song.isValid()){
|
||||
return false;
|
||||
}
|
||||
|
||||
buffer->setData(song.source);
|
||||
buffer->open(QIODevice::ReadOnly);
|
||||
player->setMedia(QMediaContent(), buffer);
|
||||
|
||||
|
||||
fbroadcaster = !bool(syncdata);
|
||||
playList.push_front(static_cast<SongHeader&>(song));
|
||||
playList.push_front(static_cast<const SongHeader&>(song));
|
||||
if(fbroadcaster){
|
||||
package pac;
|
||||
if(!createPackage(t_song_h | t_sync, pac)){
|
||||
@ -355,15 +365,18 @@ void Sync::packageRender(ETcpSocket *socket){
|
||||
player->play();
|
||||
}
|
||||
|
||||
if((pkg.getType() & t_song_h) && !play(pkg.getHeader(), &pkg.getPlayData())){
|
||||
if((pkg.getType() & t_song) && !play(pkg.getSong(), &pkg.getPlayData())){
|
||||
package answer;
|
||||
if(!createPackage(t_song | t_sync, answer)){
|
||||
throw CreatePackageExaption();
|
||||
}
|
||||
socket->Write(answer.parseTo());
|
||||
if(pkg.getType() & t_sync && !play(pkg.getHeader(), &pkg.getPlayData()) && !play(pkg.getSong(), &pkg.getPlayData())){
|
||||
|
||||
Type requestType = t_song_h;
|
||||
|
||||
if(pkg.getType() & t_song_h)
|
||||
requestType = t_song;
|
||||
|
||||
package answer;
|
||||
if(!createPackage(requestType | t_sync, answer)){
|
||||
throw CreatePackageExaption();
|
||||
}
|
||||
socket->Write(answer.parseTo());
|
||||
}
|
||||
|
||||
if(pkg.getType() & t_close){
|
||||
@ -380,14 +393,15 @@ void Sync::packageRender(ETcpSocket *socket){
|
||||
socket->Write(answer.parseTo());
|
||||
}
|
||||
|
||||
|
||||
}else{
|
||||
|
||||
if(pkg.getType() & t_sync){
|
||||
if(playList.empty()){
|
||||
throw SyncError();
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
package answer;
|
||||
if(!createPackage(pkg.getType() & ~t_what & ~t_play & ~t_stop & ~t_brodcaster, answer)){
|
||||
throw CreatePackageExaption();
|
||||
|
@ -114,7 +114,7 @@ public:
|
||||
* @param syncdata data of synbced playning of media data.
|
||||
* @return true if all done else false.
|
||||
*/
|
||||
bool play(Song &song, Syncer *syncdata = nullptr);
|
||||
bool play(const Song &song, const Syncer *syncdata = nullptr);
|
||||
/**
|
||||
* @brief Play song from local media file.
|
||||
* @param url of local media file.
|
||||
|
Loading…
x
Reference in New Issue
Block a user