Stop using pointers from DB as storage mechanism. Start storing copies of the object itself. Use commits after methods are done with transaction to hopefully help with DB issues. Don't use map because it requires too much about the key object I don't need. Add boolean that prevents vote end from being called constantly during it's 3 second window.
This commit is contained in:
@@ -64,7 +64,7 @@ GroovePlayerMgr::GroovePlayerMgr (std::string dbFile) : sqliteConnection(dbFile)
|
|||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<const AudioTrack*> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* session)
|
std::list<AudioTrack> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* session)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* This method will attempt to pick 3 tracks that will be up for selection next.
|
* This method will attempt to pick 3 tracks that will be up for selection next.
|
||||||
@@ -78,7 +78,7 @@ std::list<const AudioTrack*> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session*
|
|||||||
* The third track will be replaced by a recent request item if one exists.
|
* The third track will be replaced by a recent request item if one exists.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
std::list<const AudioTrack*> selectedTracks;
|
std::list<AudioTrack> selectedTracks;
|
||||||
|
|
||||||
Wt::Dbo::Transaction transaction(*session);
|
Wt::Dbo::Transaction transaction(*session);
|
||||||
//First make sure there are at least 3 tracks to suggest.
|
//First make sure there are at least 3 tracks to suggest.
|
||||||
@@ -90,33 +90,33 @@ std::list<const AudioTrack*> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session*
|
|||||||
}
|
}
|
||||||
|
|
||||||
//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(getCurrentTrack(session).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(getCurrentTrack(session).trackArtistName);
|
||||||
int computerSlightOfHand = rand() % 10 + 1;
|
int computerSlightOfHand = rand() % 10 + 1;
|
||||||
if(trackAlbumCount > 0 && computerSlightOfHand > 3)
|
if(trackAlbumCount > 0 && computerSlightOfHand > 3)
|
||||||
{
|
{
|
||||||
//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(getCurrentTrack(session).trackAlbumName);
|
||||||
selectedTracks.push_back(eligibleTrack.get());
|
selectedTracks.push_back(*eligibleTrack);
|
||||||
}
|
}
|
||||||
else if(trackArtistCount > 0)
|
else if(trackArtistCount > 0)
|
||||||
{
|
{
|
||||||
//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(getCurrentTrack(session).trackArtistName);
|
||||||
selectedTracks.push_back(eligibleTrack.get());
|
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(getCurrentTrack(session).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(getCurrentTrack(session).trackGenre);
|
||||||
selectedTracks.push_back(eligibleTrack.get());
|
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(getCurrentTrack(session).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.
|
||||||
@@ -125,15 +125,17 @@ std::list<const AudioTrack*> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session*
|
|||||||
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(getCurrentTrack(session).trackGenre);
|
||||||
selectedTracks.push_back(eligibleTrack.get());
|
selectedTracks.push_back(*eligibleTrack);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Pick randomly
|
//Pick randomly
|
||||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().limit(1).offset(rand() % trackCount);
|
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().limit(1).offset(rand() % trackCount);
|
||||||
selectedTracks.push_back(eligibleTrack.get());
|
selectedTracks.push_back(*eligibleTrack);
|
||||||
}
|
}
|
||||||
|
transaction.commit();
|
||||||
|
Wt::log("info") << "Next set of tracks to vote picked: 1=>[" << (*selectedTracks.begin()).trackName << "] 2=>[" << (*std::next(selectedTracks.begin(),1)).trackName << "] 3=>[" << (*std::next(selectedTracks.begin(),2)).trackName << "]";
|
||||||
return selectedTracks;
|
return selectedTracks;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,23 +162,24 @@ void GroovePlayerMgr::grooveEventLoop()
|
|||||||
|
|
||||||
//Pick initial track to bootstrap.
|
//Pick initial track to bootstrap.
|
||||||
int tracksPlayedBefore = sqlSession.query<int>("select count(fingerprint) from tracks as t join actions on (actions.action = 3 or actions.action = 2) and actions.track_id = t.id");
|
int tracksPlayedBefore = sqlSession.query<int>("select count(fingerprint) from tracks as t join actions on (actions.action = 3 or actions.action = 2) and actions.track_id = t.id");
|
||||||
const AudioTrack* selectedTrack;
|
AudioTrack selectedTrack;
|
||||||
if (tracksPlayedBefore > 0)
|
if (tracksPlayedBefore > 0)
|
||||||
{
|
{
|
||||||
selectedTrack = sqlSession.query<Wt::Dbo::ptr<AudioTrack>>("select t from tracks as t join actions on (actions.action = 3 or actions.action = 2) and actions.track_id = t.id").limit(1).offset(rand() % tracksPlayedBefore).resultValue().get();
|
selectedTrack = *sqlSession.query<Wt::Dbo::ptr<AudioTrack>>("select t from tracks as t join actions on (actions.action = 3 or actions.action = 2) and actions.track_id = t.id").limit(1).offset(rand() % tracksPlayedBefore).resultValue();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int trackCount = sqlSession.query<int>("select count(fingerprint) from tracks");
|
int trackCount = sqlSession.query<int>("select count(fingerprint) from tracks");
|
||||||
selectedTrack = sqlSession.find<AudioTrack>().limit(1).offset(rand() % trackCount).resultValue().get();
|
selectedTrack = *sqlSession.find<AudioTrack>().limit(1).offset(rand() % trackCount).resultValue();
|
||||||
}
|
}
|
||||||
|
transaction.commit();
|
||||||
struct GroovePlaylist* playlist = groove_playlist_create();
|
struct GroovePlaylist* playlist = groove_playlist_create();
|
||||||
currentPlaylist = playlist;
|
currentPlaylist = playlist;
|
||||||
struct GroovePlayer* player = groove_player_create();
|
struct GroovePlayer* player = groove_player_create();
|
||||||
if(!player) {return;}
|
if(!player) {return;}
|
||||||
currentPlayer = player;
|
currentPlayer = player;
|
||||||
|
|
||||||
groove_playlist_insert(playlist, groove_file_open(selectedTrack->trackPath.c_str()),1.0,1.0,nullptr);
|
groove_playlist_insert(playlist, groove_file_open(selectedTrack.trackPath.c_str()),1.0,1.0,nullptr);
|
||||||
|
|
||||||
//Now boostrap player with initial data
|
//Now boostrap player with initial data
|
||||||
groove_player_attach(player, playlist);
|
groove_player_attach(player, playlist);
|
||||||
@@ -185,7 +188,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).get());
|
static_cast<WebInterface*>(app)->songChangedFromServer(getCurrentTrack(&sqlSession));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -203,51 +206,52 @@ void GroovePlayerMgr::grooveEventLoop()
|
|||||||
{
|
{
|
||||||
//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::map<const AudioTrack*, int>();
|
currentVoteStatus = std::list<std::pair<AudioTrack, int>>();
|
||||||
std::for_each(currentVoteBatch.begin(),currentVoteBatch.end(),[&](const AudioTrack* item){
|
for(auto track : currentVoteBatch)
|
||||||
currentVoteStatus.insert(std::pair<const AudioTrack*, int>(item,0));
|
{
|
||||||
});
|
currentVoteStatus.push_back(std::pair<AudioTrack, int>(track,0));
|
||||||
|
}
|
||||||
Wt::WServer::instance()->postAll([&]() {
|
Wt::WServer::instance()->postAll([&]() {
|
||||||
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).get());
|
static_cast<WebInterface*>(app)->songChangedFromServer(getCurrentTrack(&sqlSession));
|
||||||
static_cast<WebInterface*>(app)->voteTracksUpdatedFromServer(currentVoteBatch);
|
static_cast<WebInterface*>(app)->voteTracksUpdatedFromServer(currentVoteBatch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Wt::log("info") << "Track playing changed to: " << getCurrentTrack(&sqlSession).get()->trackName;
|
Wt::log("info") << "Track playing changed to: " << getCurrentTrack(&sqlSession).trackName;
|
||||||
}
|
}
|
||||||
else if(event == VOTING_ENDED)
|
else if(event == VOTING_ENDED)
|
||||||
{
|
{
|
||||||
//Look at votes and add correct track to end of playlist.
|
//Look at votes and add correct track to end of playlist.
|
||||||
//If more than one track has highest votes, pick random. TODO:maybe base off of other play data instead.
|
//If more than one track has highest votes, pick random. TODO:maybe base off of other play data instead.
|
||||||
|
|
||||||
std::list<std::pair<const AudioTrack*,int>> trackWinners;
|
std::list<std::pair<AudioTrack,int>> trackWinners;
|
||||||
for(std::map<const AudioTrack*,int>::iterator track = currentVoteStatus.begin(); track != currentVoteStatus.end(); track++)
|
for(auto track : currentVoteStatus)
|
||||||
{
|
{
|
||||||
//There nothing yet and there was at least a vote is an initial winner.
|
//There nothing yet and there was at least a vote is an initial winner.
|
||||||
if(trackWinners.size() == 0 && track->second > 0)
|
if(trackWinners.size() == 0 && track.second > 0)
|
||||||
{
|
{
|
||||||
trackWinners.push_back(std::pair<const AudioTrack*, int>(track->first,track->second));
|
trackWinners.push_back(track);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//If there is a winner. Check if higher. If so, clear the list and add this one. If equal, add to list.
|
//If there is a winner. Check if higher. If so, clear the list and add this one. If equal, add to list.
|
||||||
if(trackWinners.size() > 0)
|
if(trackWinners.size() > 0)
|
||||||
{
|
{
|
||||||
if(trackWinners.front().second < track->second)
|
if(trackWinners.front().second < track.second)
|
||||||
{
|
{
|
||||||
trackWinners.clear();
|
trackWinners.clear();
|
||||||
trackWinners.push_back(std::pair<const AudioTrack*,int>(track->first, track->second));
|
trackWinners.push_back(std::pair<AudioTrack,int>(track.first, track.second));
|
||||||
}
|
}
|
||||||
else if(trackWinners.front().second == track->second)
|
else if(trackWinners.front().second == track.second)
|
||||||
{
|
{
|
||||||
trackWinners.push_back(std::pair<const AudioTrack*, int>(track->first, track->second));
|
trackWinners.push_back(std::pair<AudioTrack, int>(track.first, track.second));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const AudioTrack* winner;
|
AudioTrack winner;
|
||||||
//Randomly pick from winners(in case of tie), if there are any.
|
//Randomly pick from winners(in case of tie), if there are any.
|
||||||
if(trackWinners.size() > 0)
|
if(trackWinners.size() > 0)
|
||||||
{
|
{
|
||||||
@@ -259,7 +263,7 @@ void GroovePlayerMgr::grooveEventLoop()
|
|||||||
if(requestQueue.size() > 0)
|
if(requestQueue.size() > 0)
|
||||||
{
|
{
|
||||||
//If winning track was a request, now you can remove it from request queue.
|
//If winning track was a request, now you can remove it from request queue.
|
||||||
if(requestQueue.front()->trackFingerprint == winner->trackFingerprint)
|
if(requestQueue.front().trackFingerprint == winner.trackFingerprint)
|
||||||
{
|
{
|
||||||
requestQueue.pop_front();
|
requestQueue.pop_front();
|
||||||
}
|
}
|
||||||
@@ -296,12 +300,12 @@ void GroovePlayerMgr::grooveEventLoop()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Third track wins
|
//Third track wins
|
||||||
winner = (*currentVoteBatch.begin()+=2);
|
winner = (*(currentVoteBatch.begin()++)++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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::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)
|
||||||
{
|
{
|
||||||
@@ -350,8 +354,9 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
|
|||||||
{
|
{
|
||||||
double timeIntoTrack;
|
double timeIntoTrack;
|
||||||
groove_player_position(currentPlayer,nullptr,&timeIntoTrack);
|
groove_player_position(currentPlayer,nullptr,&timeIntoTrack);
|
||||||
if(getCurrentTrack(session).get() != nullptr && getCurrentTrack(session)->trackLengthSeconds-timeIntoTrack < 3)
|
if(!voteEndedButNotNextTrackYet && getCurrentTrack(session).trackName != std::string() && getCurrentTrack(session).trackLengthSeconds-timeIntoTrack < 3)
|
||||||
{
|
{
|
||||||
|
voteEndedButNotNextTrackYet = true;
|
||||||
return VOTING_ENDED;
|
return VOTING_ENDED;
|
||||||
}
|
}
|
||||||
GroovePlayerEvent event;
|
GroovePlayerEvent event;
|
||||||
@@ -359,6 +364,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
|
|||||||
{
|
{
|
||||||
if(event.type == GROOVE_EVENT_NOWPLAYING)
|
if(event.type == GROOVE_EVENT_NOWPLAYING)
|
||||||
{
|
{
|
||||||
|
voteEndedButNotNextTrackYet = false;
|
||||||
return GROOVE_NOWPLAYING;
|
return GROOVE_NOWPLAYING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -371,17 +377,19 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
|
|||||||
return NOTHING;
|
return NOTHING;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::Dbo::ptr<AudioTrack> GroovePlayerMgr::getCurrentTrack(Wt::Dbo::Session* session)
|
AudioTrack GroovePlayerMgr::getCurrentTrack(Wt::Dbo::Session* session)
|
||||||
{
|
{
|
||||||
Wt::Dbo::Transaction transaction(*session);
|
Wt::Dbo::Transaction transaction(*session);
|
||||||
GroovePlaylistItem* currentItem;
|
GroovePlaylistItem* currentItem;
|
||||||
groove_player_position(this->currentPlayer,¤tItem,nullptr);
|
groove_player_position(this->currentPlayer,¤tItem,nullptr);
|
||||||
if(currentItem != nullptr)
|
if(currentItem != nullptr)
|
||||||
{
|
{
|
||||||
Wt::Dbo::ptr<AudioTrack> track = session->find<AudioTrack>().where("path = ?").bind(currentItem->file->filename);
|
AudioTrack track = *session->find<AudioTrack>().where("path = ?").bind(currentItem->file->filename).resultValue();
|
||||||
|
transaction.commit();
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
return Wt::Dbo::ptr<AudioTrack>();
|
transaction.commit();
|
||||||
|
return AudioTrack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -436,6 +444,7 @@ bool GroovePlayerMgr::addFileToTrackDBIfTagged(Wt::Dbo::Session* session, std::f
|
|||||||
newTrack->trackFingerprint = fingerprint;
|
newTrack->trackFingerprint = fingerprint;
|
||||||
newTrack->trackPath = file.string();
|
newTrack->trackPath = file.string();
|
||||||
session->add(newTrack);
|
session->add(newTrack);
|
||||||
|
transaction.commit();
|
||||||
groove_file_close(gfile);
|
groove_file_close(gfile);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -453,6 +462,7 @@ void GroovePlayerMgr::removeOrphanedTracks(Wt::Dbo::Session* session)
|
|||||||
item.remove();
|
item.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
transaction.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <Wt/Dbo/backend/Sqlite3>
|
#include <Wt/Dbo/backend/Sqlite3>
|
||||||
#include <Wt/Dbo/FixedSqlConnectionPool>
|
#include <Wt/Dbo/FixedSqlConnectionPool>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include "db/User.h"
|
#include "db/User.h"
|
||||||
#include "db/AudioTrack.h"
|
#include "db/AudioTrack.h"
|
||||||
@@ -48,8 +47,9 @@ public:
|
|||||||
|
|
||||||
struct GroovePlaylist* currentPlaylist;
|
struct GroovePlaylist* currentPlaylist;
|
||||||
struct GroovePlayer* currentPlayer;
|
struct GroovePlayer* currentPlayer;
|
||||||
std::list<const AudioTrack*> currentVoteBatch;
|
std::list<AudioTrack> currentVoteBatch;
|
||||||
std::map<const AudioTrack*, int> currentVoteStatus;
|
std::list<std::pair<AudioTrack, int>> currentVoteStatus;
|
||||||
|
bool voteEndedButNotNextTrackYet = false;
|
||||||
private:
|
private:
|
||||||
enum PlayerEvents {NOTHING, GROOVE_NOWPLAYING, VOTING_ENDED, VOTE_CAST, PLAYING_PAUSED, PLAYING_RESUMED, SKIP_REQUESTED, SKIP_VOTE_CAST, SKIP_VOTING_ENDED, ADMIN_FORCE_SKIP};
|
enum PlayerEvents {NOTHING, GROOVE_NOWPLAYING, VOTING_ENDED, VOTE_CAST, PLAYING_PAUSED, PLAYING_RESUMED, SKIP_REQUESTED, SKIP_VOTE_CAST, SKIP_VOTING_ENDED, ADMIN_FORCE_SKIP};
|
||||||
|
|
||||||
@@ -59,19 +59,19 @@ private:
|
|||||||
bool continueEventLoop = true;
|
bool continueEventLoop = true;
|
||||||
bool finishedLaunchScan = false;
|
bool finishedLaunchScan = false;
|
||||||
|
|
||||||
std::list<const AudioTrack*> requestQueue;
|
std::list<AudioTrack> requestQueue;
|
||||||
std::list<PlayerEvents> lastInternalEvents;
|
std::list<PlayerEvents> lastInternalEvents;
|
||||||
|
|
||||||
std::thread* grooveEvents;
|
std::thread* grooveEvents;
|
||||||
void grooveEventLoop();
|
void grooveEventLoop();
|
||||||
std::list<const AudioTrack*> getNextVoteBatch(Wt::Dbo::Session* session);
|
std::list<AudioTrack> getNextVoteBatch(Wt::Dbo::Session* session);
|
||||||
std::thread* grooveAudioScanner;
|
std::thread* grooveAudioScanner;
|
||||||
void grooveAudioScannerLoop();
|
void grooveAudioScannerLoop();
|
||||||
PlayerEvents getNextPlayerEvent(Wt::Dbo::Session* session);
|
PlayerEvents getNextPlayerEvent(Wt::Dbo::Session* session);
|
||||||
bool addFileToTrackDBIfTagged(Wt::Dbo::Session* session, std::filesystem::path file);
|
bool addFileToTrackDBIfTagged(Wt::Dbo::Session* session, std::filesystem::path file);
|
||||||
void removeOrphanedTracks(Wt::Dbo::Session* session);
|
void removeOrphanedTracks(Wt::Dbo::Session* session);
|
||||||
|
|
||||||
Wt::Dbo::ptr<AudioTrack> getCurrentTrack(Wt::Dbo::Session* session);
|
AudioTrack getCurrentTrack(Wt::Dbo::Session* session);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -57,31 +57,31 @@ void WebInterface::loginCompleted()
|
|||||||
//TODO: request current player state.
|
//TODO: request current player state.
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebInterface::playPauseActionFromServer(User* userPausing)
|
void WebInterface::playPauseActionFromServer(User userPausing)
|
||||||
{
|
{
|
||||||
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"play");
|
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"play");
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebInterface::songChangedFromServer(const AudioTrack* nextTrack)
|
void WebInterface::songChangedFromServer(AudioTrack nextTrack)
|
||||||
{
|
{
|
||||||
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"change");
|
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"change");
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebInterface::skipVotedFromServer(User* userRequestingToSkipCurrentTrack)
|
void WebInterface::skipVotedFromServer(User userRequestingToSkipCurrentTrack)
|
||||||
{
|
{
|
||||||
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"skip");
|
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"skip");
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebInterface::voteUpdateFromServer(User* userVoting, bool forSkip)
|
void WebInterface::voteUpdateFromServer(User userVoting, bool forSkip)
|
||||||
{
|
{
|
||||||
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"vote");
|
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"vote");
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebInterface::voteNextSongFromServer(User* userVoting, const AudioTrack* trackVoted)
|
void WebInterface::voteNextSongFromServer(User userVoting, AudioTrack trackVoted)
|
||||||
{
|
{
|
||||||
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"nextvote");
|
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"nextvote");
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
@@ -93,7 +93,7 @@ void WebInterface::voteNextPollClosedFromServer()
|
|||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebInterface::voteTracksUpdatedFromServer(std::list<const AudioTrack *> voteableTracks)
|
void WebInterface::voteTracksUpdatedFromServer(std::list<AudioTrack> voteableTracks)
|
||||||
{
|
{
|
||||||
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"votechanged");
|
priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"votechanged");
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ public:
|
|||||||
WebInterface(const Wt::WEnvironment& env);
|
WebInterface(const Wt::WEnvironment& env);
|
||||||
~WebInterface();
|
~WebInterface();
|
||||||
void loginCompleted();
|
void loginCompleted();
|
||||||
void playPauseActionFromServer(User* userPausing);
|
void playPauseActionFromServer(User userPausing);
|
||||||
void songChangedFromServer(const AudioTrack* nextTrack);
|
void songChangedFromServer(AudioTrack nextTrack);
|
||||||
void voteTracksUpdatedFromServer(std::list<const AudioTrack*> voteableTracks);
|
void voteTracksUpdatedFromServer(std::list<AudioTrack> voteableTracks);
|
||||||
void skipVotedFromServer(User* userRequestingToSkipCurrentTrack);
|
void skipVotedFromServer(User userRequestingToSkipCurrentTrack);
|
||||||
void voteUpdateFromServer(User* userVoting, bool forSkip);
|
void voteUpdateFromServer(User userVoting, bool forSkip);
|
||||||
void voteNextSongFromServer(User* userVoting, const AudioTrack* trackVoted);
|
void voteNextSongFromServer(User userVoting, AudioTrack trackVoted);
|
||||||
void voteNextPollClosedFromServer();
|
void voteNextPollClosedFromServer();
|
||||||
private:
|
private:
|
||||||
struct internal;
|
struct internal;
|
||||||
|
|||||||
Reference in New Issue
Block a user