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.

This commit is contained in:
Kevin Whitaker
2017-02-08 21:30:23 -05:00
parent 1a545af49f
commit 39a780cb95
2 changed files with 54 additions and 17 deletions

View File

@@ -89,33 +89,57 @@ std::list<AudioTrack> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio
} }
//Determine first track //Determine first track
int trackAlbumCount = session->query<int>("select count(fingerprint) from tracks").where("album = ?").bind(getCurrentTrack(session).trackAlbumName); int trackAlbumCount = session->query<int>("select count(fingerprint) from tracks").where("album = ?").bind(currentTrack.trackAlbumName);
int trackArtistCount = session->query<int>("select count(fingerprint) from tracks").where("artist = ?").bind(getCurrentTrack(session).trackArtistName); int trackArtistCount = session->query<int>("select count(fingerprint) from tracks").where("artist = ?").bind(currentTrack.trackArtistName);
int computerSlightOfHand = rand() % 10 + 1; 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 //Pick item from album
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(getCurrentTrack(session).trackAlbumName); Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().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<AudioTrack>().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(currentTrack.trackAlbumName);
}
}
selectedTracks.push_back(*eligibleTrack); selectedTracks.push_back(*eligibleTrack);
} }
else if(trackArtistCount > 0) else
{ {
//Pick item from artist //Pick item from artist
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(getCurrentTrack(session).trackArtistName); Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().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<AudioTrack>().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(currentTrack.trackArtistName);
}
}
selectedTracks.push_back(*eligibleTrack); selectedTracks.push_back(*eligibleTrack);
} }
//Determine second track //Determine second track
int trackGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre = ?").bind(getCurrentTrack(session).trackGenre); int trackGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre = ?").bind(currentTrack.trackGenre);
if(trackGenreCount > 0) if(trackGenreCount > 0)
{ {
//Pick item from genre //Pick item from genre
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(getCurrentTrack(session).trackGenre); Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().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<AudioTrack>().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(currentTrack.trackGenre);
}
}
selectedTracks.push_back(*eligibleTrack); selectedTracks.push_back(*eligibleTrack);
} }
//Determine third track //Determine third track
int trackNotGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre != ?").bind(getCurrentTrack(session).trackGenre); int trackNotGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre != ?").bind(currentTrack.trackGenre);
if(requestQueue.size() > 0) if(requestQueue.size() > 0)
{ {
//There's a request. Pick one up front and put as third item. //There's a request. Pick one up front and put as third item.
@@ -124,7 +148,7 @@ std::list<AudioTrack> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio
else if(trackNotGenreCount > 0) else if(trackNotGenreCount > 0)
{ {
//Pick from other genre //Pick from other genre
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre != ?").limit(1).offset(rand() % trackNotGenreCount).bind(getCurrentTrack(session).trackGenre); Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre != ?").limit(1).offset(rand() % trackNotGenreCount).bind(currentTrack.trackGenre);
selectedTracks.push_back(*eligibleTrack); selectedTracks.push_back(*eligibleTrack);
} }
else else
@@ -200,7 +224,7 @@ void GroovePlayerMgr::grooveEventLoop()
Wt::WApplication* app = Wt::WApplication::instance(); Wt::WApplication* app = Wt::WApplication::instance();
if(app != nullptr) if(app != nullptr)
{ {
static_cast<WebInterface*>(app)->songChangedFromServer(getCurrentTrack(&sqlSession)); static_cast<WebInterface*>(app)->songChangedFromServer(currentTrack);
} }
} }
); );
@@ -216,6 +240,7 @@ void GroovePlayerMgr::grooveEventLoop()
} }
else if(event == GROOVE_NOWPLAYING) else if(event == GROOVE_NOWPLAYING)
{ {
currentTrack = getCurrentTrackDB(&sqlSession);
//Pick new batch of tracks to vote on and inform UI of update. //Pick new batch of tracks to vote on and inform UI of update.
currentVoteBatch = getNextVoteBatch(&sqlSession); currentVoteBatch = getNextVoteBatch(&sqlSession);
currentVoteStatus = std::list<std::pair<AudioTrack, int>>(); currentVoteStatus = std::list<std::pair<AudioTrack, int>>();
@@ -227,12 +252,12 @@ void GroovePlayerMgr::grooveEventLoop()
Wt::WApplication* app = Wt::WApplication::instance(); Wt::WApplication* app = Wt::WApplication::instance();
if(app != nullptr) if(app != nullptr)
{ {
static_cast<WebInterface*>(app)->songChangedFromServer(getCurrentTrack(&sqlSession)); static_cast<WebInterface*>(app)->songChangedFromServer(currentTrack);
static_cast<WebInterface*>(app)->voteTracksUpdatedFromServer(currentVoteBatch); static_cast<WebInterface*>(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) 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); 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<WebInterface*>(app)->voteNextPollClosedFromServer();
}
}
);
Wt::log("info")<< "Voting has ended. Next track is: " << winner.trackName; Wt::log("info")<< "Voting has ended. Next track is: " << winner.trackName;
} }
else if(event == VOTE_CAST) else if(event == VOTE_CAST)
{ {
// if(!voteEndedButNotNextTrackYet)
{
//
}
} }
else if(event == PLAYING_PAUSED) else if(event == PLAYING_PAUSED)
{ {
@@ -366,7 +402,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
{ {
double timeIntoTrack; double timeIntoTrack;
groove_player_position(currentPlayer,nullptr,&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; voteEndedButNotNextTrackYet = true;
return VOTING_ENDED; return VOTING_ENDED;
@@ -389,7 +425,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
return NOTHING; return NOTHING;
} }
AudioTrack GroovePlayerMgr::getCurrentTrack(Wt::Dbo::Session* session) AudioTrack GroovePlayerMgr::getCurrentTrackDB(Wt::Dbo::Session* session)
{ {
Wt::Dbo::Transaction transaction(*session); Wt::Dbo::Transaction transaction(*session);
GroovePlaylistItem* currentItem; GroovePlaylistItem* currentItem;

View File

@@ -47,6 +47,7 @@ public:
struct GroovePlaylist* currentPlaylist; struct GroovePlaylist* currentPlaylist;
struct GroovePlayer* currentPlayer; struct GroovePlayer* currentPlayer;
AudioTrack currentTrack;
std::list<AudioTrack> currentVoteBatch; std::list<AudioTrack> currentVoteBatch;
std::list<std::pair<AudioTrack, int>> currentVoteStatus; std::list<std::pair<AudioTrack, int>> currentVoteStatus;
bool voteEndedButNotNextTrackYet = false; bool voteEndedButNotNextTrackYet = false;
@@ -73,7 +74,7 @@ private:
PlayerEvents getNextPlayerEvent(Wt::Dbo::Session* session); PlayerEvents getNextPlayerEvent(Wt::Dbo::Session* session);
void removeOrphanedTracks(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); void getPictureFromTrack(AudioTrack* trackToFill);
}; };