diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index e9f65303ba8d2cb841293f196e7180ee866b2f1a..aa365afd99f74cc9b1b4982a2db82e556179d33d 100644 --- a/src/GroovePlayer.cpp +++ b/src/GroovePlayer.cpp @@ -89,33 +89,57 @@ std::list GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio } //Determine first track - int trackAlbumCount = session->query("select count(fingerprint) from tracks").where("album = ?").bind(getCurrentTrack(session).trackAlbumName); - int trackArtistCount = session->query("select count(fingerprint) from tracks").where("artist = ?").bind(getCurrentTrack(session).trackArtistName); + int trackAlbumCount = session->query("select count(fingerprint) from tracks").where("album = ?").bind(currentTrack.trackAlbumName); + int trackArtistCount = session->query("select count(fingerprint) from tracks").where("artist = ?").bind(currentTrack.trackArtistName); int computerSlightOfHand = rand() % 10 + 1; - if(trackAlbumCount > 0 && computerSlightOfHand > 3) + if(trackAlbumCount > 0 && ((computerSlightOfHand > 3 && trackAlbumCount > 1) || (computerSlightOfHand > 3 && trackAlbumCount == 1 && trackArtistCount == 1) || !(trackArtistCount > 1 && trackAlbumCount == 1))) { //Pick item from album - Wt::Dbo::ptr eligibleTrack = session->find().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(getCurrentTrack(session).trackAlbumName); + Wt::Dbo::ptr eligibleTrack = session->find().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(currentTrack.trackAlbumName); + //Try to make sure the same track isn't up to vote again. + if((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint && trackAlbumCount > 1) + { + while((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint) + { + eligibleTrack = session->find().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(currentTrack.trackAlbumName); + } + } selectedTracks.push_back(*eligibleTrack); } - else if(trackArtistCount > 0) + else { //Pick item from artist - Wt::Dbo::ptr eligibleTrack = session->find().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(getCurrentTrack(session).trackArtistName); + Wt::Dbo::ptr eligibleTrack = session->find().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(currentTrack.trackArtistName); + //Try to make sure the same track isn't up to vote again. + if((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint && trackArtistCount > 1) + { + while((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint) + { + eligibleTrack = session->find().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(currentTrack.trackArtistName); + } + } selectedTracks.push_back(*eligibleTrack); } //Determine second track - int trackGenreCount = session->query("select count(fingerprint) from tracks").where("genre = ?").bind(getCurrentTrack(session).trackGenre); + int trackGenreCount = session->query("select count(fingerprint) from tracks").where("genre = ?").bind(currentTrack.trackGenre); if(trackGenreCount > 0) { //Pick item from genre - Wt::Dbo::ptr eligibleTrack = session->find().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(getCurrentTrack(session).trackGenre); + Wt::Dbo::ptr eligibleTrack = session->find().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(currentTrack.trackGenre); + //Try to make sure same track isn't up to vote again + if((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint && trackGenreCount > 1) + { + while((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint) + { + eligibleTrack = session->find().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(currentTrack.trackGenre); + } + } selectedTracks.push_back(*eligibleTrack); } //Determine third track - int trackNotGenreCount = session->query("select count(fingerprint) from tracks").where("genre != ?").bind(getCurrentTrack(session).trackGenre); + int trackNotGenreCount = session->query("select count(fingerprint) from tracks").where("genre != ?").bind(currentTrack.trackGenre); if(requestQueue.size() > 0) { //There's a request. Pick one up front and put as third item. @@ -124,7 +148,7 @@ std::list GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio else if(trackNotGenreCount > 0) { //Pick from other genre - Wt::Dbo::ptr eligibleTrack = session->find().where("genre != ?").limit(1).offset(rand() % trackNotGenreCount).bind(getCurrentTrack(session).trackGenre); + Wt::Dbo::ptr eligibleTrack = session->find().where("genre != ?").limit(1).offset(rand() % trackNotGenreCount).bind(currentTrack.trackGenre); selectedTracks.push_back(*eligibleTrack); } else @@ -200,7 +224,7 @@ void GroovePlayerMgr::grooveEventLoop() Wt::WApplication* app = Wt::WApplication::instance(); if(app != nullptr) { - static_cast(app)->songChangedFromServer(getCurrentTrack(&sqlSession)); + static_cast(app)->songChangedFromServer(currentTrack); } } ); @@ -216,6 +240,7 @@ void GroovePlayerMgr::grooveEventLoop() } else if(event == GROOVE_NOWPLAYING) { + currentTrack = getCurrentTrackDB(&sqlSession); //Pick new batch of tracks to vote on and inform UI of update. currentVoteBatch = getNextVoteBatch(&sqlSession); currentVoteStatus = std::list>(); @@ -227,12 +252,12 @@ void GroovePlayerMgr::grooveEventLoop() Wt::WApplication* app = Wt::WApplication::instance(); if(app != nullptr) { - static_cast(app)->songChangedFromServer(getCurrentTrack(&sqlSession)); + static_cast(app)->songChangedFromServer(currentTrack); static_cast(app)->voteTracksUpdatedFromServer(currentVoteBatch); } } ); - Wt::log("info") << "Track playing changed to: " << getCurrentTrack(&sqlSession).trackName; + Wt::log("info") << "Track playing changed to: " << currentTrack.trackName; } else if(event == VOTING_ENDED) { @@ -317,11 +342,22 @@ void GroovePlayerMgr::grooveEventLoop() } } groove_playlist_insert(currentPlaylist,groove_file_open(winner.trackPath.c_str()),1.0,1.0,nullptr); + Wt::WServer::instance()->postAll([]() { + Wt::WApplication* app = Wt::WApplication::instance(); + if(app != nullptr) + { + static_cast(app)->voteNextPollClosedFromServer(); + } + } + ); Wt::log("info")<< "Voting has ended. Next track is: " << winner.trackName; } else if(event == VOTE_CAST) { - // + if(!voteEndedButNotNextTrackYet) + { + // + } } else if(event == PLAYING_PAUSED) { @@ -366,7 +402,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi { double timeIntoTrack; groove_player_position(currentPlayer,nullptr,&timeIntoTrack); - if(!voteEndedButNotNextTrackYet && getCurrentTrack(session).trackName != std::string() && getCurrentTrack(session).trackLengthSeconds-timeIntoTrack < 3) + if(!voteEndedButNotNextTrackYet && currentTrack.trackName != std::string() && currentTrack.trackLengthSeconds-timeIntoTrack < 3) { voteEndedButNotNextTrackYet = true; return VOTING_ENDED; @@ -389,7 +425,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi return NOTHING; } -AudioTrack GroovePlayerMgr::getCurrentTrack(Wt::Dbo::Session* session) +AudioTrack GroovePlayerMgr::getCurrentTrackDB(Wt::Dbo::Session* session) { Wt::Dbo::Transaction transaction(*session); GroovePlaylistItem* currentItem; diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h index 6ad8b1a527e302961cb3c0d9fd5d1a608b9347f8..6d0b5f4a106340bebcf5adc744e6160cdd621d1a 100644 --- a/src/GroovePlayer.h +++ b/src/GroovePlayer.h @@ -47,6 +47,7 @@ public: struct GroovePlaylist* currentPlaylist; struct GroovePlayer* currentPlayer; + AudioTrack currentTrack; std::list currentVoteBatch; std::list> currentVoteStatus; bool voteEndedButNotNextTrackYet = false; @@ -73,7 +74,7 @@ private: PlayerEvents getNextPlayerEvent(Wt::Dbo::Session* session); void removeOrphanedTracks(Wt::Dbo::Session* session); - AudioTrack getCurrentTrack(Wt::Dbo::Session* session); + AudioTrack getCurrentTrackDB(Wt::Dbo::Session* session); void getPictureFromTrack(AudioTrack* trackToFill); };