Fixed synchronization

This commit is contained in:
Andrei Yankovich 2017-12-02 14:35:39 +03:00
parent 3d0bf07419
commit c627f31229
4 changed files with 48 additions and 20 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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();

View File

@ -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.