From 39a780cb95d39a8f9d07048c6b0e608cd38d3eed Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Wed, 8 Feb 2017 21:30:23 -0500 Subject: [PATCH] Remove lots of DB calls just for getting the current track. Add update call for vote closing. Add some code to try and avoid having current playing track show up in votes again. --- src/GroovePlayer.cpp | 68 +++++++++++++++++++++++++++++++++----------- src/GroovePlayer.h | 3 +- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index e9f6530..aa365af 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 6ad8b1a..6d0b5f4 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); }; -- GitLab