mirror of
https://github.com/clangen/musikcube.git
synced 2024-10-02 04:52:32 +00:00
- Renamed Query::Tracks to Query::TrackMetadata for clarity.
- Wrote some documentation on the PlaybackQueue.
This commit is contained in:
parent
cd328eca08
commit
5f9a97cfea
@ -44,6 +44,12 @@ using namespace musik::core;
|
||||
PlaybackQueue PlaybackQueue::sInstance;
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Constructor
|
||||
///
|
||||
///Will connect the appropiate signals in the transport
|
||||
//////////////////////////////////////////
|
||||
PlaybackQueue::PlaybackQueue(void) :
|
||||
nowPlaying( new musik::core::tracklist::Standard() ),
|
||||
signalDisabled(false),
|
||||
@ -53,11 +59,19 @@ PlaybackQueue::PlaybackQueue(void) :
|
||||
// this->transport.PlaybackStoppedFail.connect(this,&PlaybackQueue::OnPlaybackEndOrFail);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Destructor
|
||||
//////////////////////////////////////////
|
||||
PlaybackQueue::~PlaybackQueue(void)
|
||||
{
|
||||
this->transport.Stop(0);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Private method for the transporters signals
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::OnPlaybackEndOrFail(){
|
||||
this->playing = false;
|
||||
if(!this->signalDisabled){
|
||||
@ -65,10 +79,18 @@ void PlaybackQueue::OnPlaybackEndOrFail(){
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Return a shared_ptr to the now playing tracklist
|
||||
//////////////////////////////////////////
|
||||
tracklist::Standard::Ptr PlaybackQueue::NowPlayingTracklist(){
|
||||
return this->nowPlaying;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Start playing the current track.
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::Play(){
|
||||
|
||||
TrackPtr track(this->CurrentTrack());
|
||||
@ -85,6 +107,10 @@ void PlaybackQueue::Play(){
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Start playing the next track.
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::Next(){
|
||||
musik::core::TrackPtr track( this->nowPlaying->NextTrack() );
|
||||
if(track){
|
||||
@ -93,6 +119,10 @@ void PlaybackQueue::Next(){
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Start playing the previous track.
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::Previous(){
|
||||
musik::core::TrackPtr track( this->nowPlaying->PreviousTrack() );
|
||||
if(track){
|
||||
@ -101,6 +131,10 @@ void PlaybackQueue::Previous(){
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Stop playing
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::Stop(){
|
||||
this->signalDisabled = true;
|
||||
if( this->playing ){
|
||||
@ -110,6 +144,10 @@ void PlaybackQueue::Stop(){
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Return the current running track
|
||||
//////////////////////////////////////////
|
||||
TrackPtr PlaybackQueue::CurrentTrack(){
|
||||
if(!this->currentTrack){
|
||||
// If the current track is empty, get a track from the nowPlaying tracklist
|
||||
@ -119,6 +157,13 @@ TrackPtr PlaybackQueue::CurrentTrack(){
|
||||
return this->currentTrack;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Set the current track
|
||||
///
|
||||
///Setting the current track will also query
|
||||
///for all the tracks metadata
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::SetCurrentTrack(TrackPtr track){
|
||||
if(this->currentTrack!=track){
|
||||
this->currentTrack = track;
|
||||
@ -136,6 +181,13 @@ void PlaybackQueue::SetCurrentTrack(TrackPtr track){
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Copy the tracklist to the now playing and start playing it
|
||||
///
|
||||
///\param tracklist
|
||||
///Tracklist that should be copied to now playing
|
||||
//////////////////////////////////////////
|
||||
void PlaybackQueue::Play(tracklist::IRandomAccess &tracklist){
|
||||
this->currentTrack.reset();
|
||||
this->nowPlaying->CopyTracks(tracklist);
|
||||
|
@ -37,33 +37,59 @@
|
||||
|
||||
#include <core/audio/Transport.h>
|
||||
#include <core/tracklist/Standard.h>
|
||||
#include <core/Query/Tracks.h>
|
||||
#include <core/Query/TrackMetadata.h>
|
||||
#include <sigslot/sigslot.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace musik { namespace core {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///PlaybackQueue is a singleton that controlls transporter playback and "now playing" tracklist.
|
||||
///
|
||||
///\see
|
||||
///musik::core::audio::Transport|musik::core::tracklist::Standard
|
||||
//////////////////////////////////////////
|
||||
class PlaybackQueue : public sigslot::has_slots<>{
|
||||
private:
|
||||
PlaybackQueue(void);
|
||||
static PlaybackQueue sInstance;
|
||||
|
||||
audio::Transport transport;
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///The one and only instance of the PlaybackQueue
|
||||
//////////////////////////////////////////
|
||||
static PlaybackQueue sInstance;
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///The only instance of the audio::Transport
|
||||
//////////////////////////////////////////
|
||||
audio::Transport transport;
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///The "now playing" tracklist
|
||||
//////////////////////////////////////////
|
||||
tracklist::Standard::Ptr nowPlaying;
|
||||
|
||||
bool playing;
|
||||
|
||||
public:
|
||||
~PlaybackQueue(void);
|
||||
static PlaybackQueue& Instance(){ return sInstance; };
|
||||
|
||||
//////////////////////////////////////////
|
||||
///\brief
|
||||
///Access to the PlaybackQueue singleton
|
||||
//////////////////////////////////////////
|
||||
static PlaybackQueue& Instance(){ return sInstance; };
|
||||
|
||||
// Now Playing control
|
||||
tracklist::Standard::Ptr NowPlayingTracklist();
|
||||
void Play(tracklist::IRandomAccess &tracklist);
|
||||
void Append(tracklist::IRandomAccess &tracklist);
|
||||
void Append(tracklist::IRandomAccess &tracklist);
|
||||
|
||||
// Playback Control
|
||||
void Play();
|
||||
@ -79,7 +105,7 @@ class PlaybackQueue : public sigslot::has_slots<>{
|
||||
private:
|
||||
TrackPtr currentTrack;
|
||||
void SetCurrentTrack(TrackPtr track);
|
||||
musik::core::Query::Tracks metadataQuery;
|
||||
musik::core::Query::TrackMetadata metadataQuery;
|
||||
|
||||
void OnPlaybackEndOrFail();
|
||||
|
||||
|
@ -36,28 +36,28 @@
|
||||
|
||||
#include "pch.hpp"
|
||||
|
||||
#include <core/Query/Tracks.h>
|
||||
#include <core/Query/TrackMetadata.h>
|
||||
#include <core/Library/Base.h>
|
||||
|
||||
using namespace musik::core;
|
||||
using namespace musik::core::Query;
|
||||
|
||||
Tracks::Tracks(void) : requestAllFields(false){
|
||||
TrackMetadata::TrackMetadata(void) : requestAllFields(false){
|
||||
|
||||
}
|
||||
|
||||
Tracks::~Tracks(void){
|
||||
TrackMetadata::~TrackMetadata(void){
|
||||
}
|
||||
|
||||
void Tracks::RequestTrack(TrackPtr track){
|
||||
void TrackMetadata::RequestTrack(TrackPtr track){
|
||||
this->aRequestTracks.push_back(track);
|
||||
}
|
||||
|
||||
void Tracks::Clear(){
|
||||
void TrackMetadata::Clear(){
|
||||
this->aRequestTracks.clear();
|
||||
}
|
||||
|
||||
void Tracks::CreateSQL(){
|
||||
void TrackMetadata::CreateSQL(){
|
||||
std::set<std::string> fields(this->requestedFields);
|
||||
std::set<std::string>::iterator field;
|
||||
|
||||
@ -121,7 +121,7 @@ void Tracks::CreateSQL(){
|
||||
|
||||
}
|
||||
|
||||
void Tracks::GetFixedTrackMetakeys(std::string &fieldName,std::set<std::string> &fields){
|
||||
void TrackMetadata::GetFixedTrackMetakeys(std::string &fieldName,std::set<std::string> &fields){
|
||||
std::set<std::string>::iterator field;
|
||||
if( (field=fields.find(fieldName))!=fields.end() ){
|
||||
this->sSQL += ",t."+fieldName;
|
||||
@ -131,7 +131,7 @@ void Tracks::GetFixedTrackMetakeys(std::string &fieldName,std::set<std::string>
|
||||
}
|
||||
|
||||
|
||||
bool Tracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
|
||||
bool TrackMetadata::ParseQuery(Library::Base *oLibrary,db::Connection &db){
|
||||
|
||||
db::CachedStatement genres("SELECT g.name FROM genres g,track_genres tg WHERE tg.genre_id=g.id AND tg.track_id=? ORDER BY tg.id",db);
|
||||
db::CachedStatement artists("SELECT ar.name FROM artists ar,track_artists ta WHERE ta.artist_id=ar.id AND ta.track_id=? ORDER BY ta.id",db);
|
||||
@ -236,7 +236,7 @@ bool Tracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Tracks::RunCallbacks(Library::Base *oLibrary){
|
||||
bool TrackMetadata::RunCallbacks(Library::Base *oLibrary){
|
||||
|
||||
TrackVector aResultCopy;
|
||||
bool bReturn(false);
|
||||
@ -260,13 +260,13 @@ bool Tracks::RunCallbacks(Library::Base *oLibrary){
|
||||
return bReturn;
|
||||
}
|
||||
|
||||
void Tracks::RequestMetakeys(const std::set<std::string> &fields){
|
||||
void TrackMetadata::RequestMetakeys(const std::set<std::string> &fields){
|
||||
this->requestAllFields = false;
|
||||
this->requestedFields = fields;
|
||||
this->CreateSQL();
|
||||
}
|
||||
|
||||
void Tracks::RequestAllMetakeys(){
|
||||
void TrackMetadata::RequestAllMetakeys(){
|
||||
this->requestAllFields = true;
|
||||
|
||||
this->requestedFields.insert("track");
|
||||
@ -287,11 +287,11 @@ void Tracks::RequestAllMetakeys(){
|
||||
|
||||
}
|
||||
|
||||
Query::Ptr Tracks::copy() const{
|
||||
return Query::Ptr(new Query::Tracks(*this));
|
||||
Query::Ptr TrackMetadata::copy() const{
|
||||
return Query::Ptr(new Query::TrackMetadata(*this));
|
||||
}
|
||||
|
||||
void Tracks::PreAddQuery(Library::Base *library){
|
||||
void TrackMetadata::PreAddQuery(Library::Base *library){
|
||||
for(TrackVector::iterator track=this->aRequestTracks.begin();track!=this->aRequestTracks.end();++track){
|
||||
(*track)->InitMeta(library);
|
||||
}
|
@ -36,9 +36,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/function.hpp>
|
||||
#include <sqlite/sqlite3.h>
|
||||
|
||||
#include <core/Query/Base.h>
|
||||
#include <core/config.h>
|
||||
@ -46,47 +47,54 @@
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace musik{ namespace core{
|
||||
namespace Query{
|
||||
class Base;
|
||||
class Tracks : public Query::Base {
|
||||
public:
|
||||
Tracks(void);
|
||||
~Tracks(void);
|
||||
namespace musik{ namespace core{ namespace Query{
|
||||
|
||||
bool RunCallbacks(Library::Base *oLibrary);
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Forward declaration
|
||||
class Base;
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Clear();
|
||||
void RequestTrack(TrackPtr track);
|
||||
void RequestMetakeys(const std::set<std::string> &fields);
|
||||
void RequestAllMetakeys();
|
||||
class TrackMetadata : public Query::Base {
|
||||
public:
|
||||
TrackMetadata(void);
|
||||
~TrackMetadata(void);
|
||||
|
||||
typedef sigslot::signal1<TrackVector*> TracksEvent;
|
||||
TracksEvent OnTracksEvent;
|
||||
bool RunCallbacks(Library::Base *oLibrary);
|
||||
|
||||
private:
|
||||
std::set<std::string> requestedFields;
|
||||
std::vector<std::string> fieldOrder;
|
||||
std::set<std::string> metaFields;
|
||||
std::set<std::string> categoryFields;
|
||||
std::string sSQL;
|
||||
std::string sSQLTables;
|
||||
std::string sSQLWhere;
|
||||
bool requestAllFields;
|
||||
void Clear();
|
||||
void RequestTrack(TrackPtr track);
|
||||
void RequestMetakeys(const std::set<std::string> &fields);
|
||||
void RequestAllMetakeys();
|
||||
|
||||
TrackVector aRequestTracks;
|
||||
TrackVector aResultTracks;
|
||||
typedef sigslot::signal1<TrackVector*> TrackMetadataEvent;
|
||||
TrackMetadataEvent OnTracksEvent;
|
||||
|
||||
void CreateSQL();
|
||||
void GetFixedTrackMetakeys(std::string &fieldName,std::set<std::string> &fields);
|
||||
protected:
|
||||
friend class Library::Base;
|
||||
friend class Library::LocalDB;
|
||||
bool ParseQuery(Library::Base *oLibrary,db::Connection &db);
|
||||
Ptr copy() const;
|
||||
void PreAddQuery(Library::Base *library);
|
||||
};
|
||||
}
|
||||
} }
|
||||
private:
|
||||
std::set<std::string> requestedFields;
|
||||
std::vector<std::string> fieldOrder;
|
||||
std::set<std::string> metaFields;
|
||||
std::set<std::string> categoryFields;
|
||||
std::string sSQL;
|
||||
std::string sSQLTables;
|
||||
std::string sSQLWhere;
|
||||
bool requestAllFields;
|
||||
|
||||
TrackVector aRequestTracks;
|
||||
TrackVector aResultTracks;
|
||||
|
||||
void CreateSQL();
|
||||
void GetFixedTrackMetakeys(std::string &fieldName,std::set<std::string> &fields);
|
||||
protected:
|
||||
friend class Library::Base;
|
||||
friend class Library::LocalDB;
|
||||
bool ParseQuery(Library::Base *oLibrary,db::Connection &db);
|
||||
Ptr copy() const;
|
||||
void PreAddQuery(Library::Base *library);
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
} } } // musik::core::Query
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -315,11 +315,11 @@
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Query\Tracks.cpp"
|
||||
RelativePath=".\Query\TrackMetadata.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Query\Tracks.h"
|
||||
RelativePath=".\Query\TrackMetadata.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
#include <core/tracklist/IRandomAccess.h>
|
||||
#include <core/Query/ListBase.h>
|
||||
#include <core/Query/Tracks.h>
|
||||
#include <core/Query/TrackMetadata.h>
|
||||
#include <core/Library/Base.h>
|
||||
|
||||
#include <sigslot/sigslot.h>
|
||||
@ -106,7 +106,7 @@ namespace musik{ namespace core{
|
||||
|
||||
musik::core::TrackVector tracks;
|
||||
|
||||
musik::core::Query::Tracks trackQuery;
|
||||
musik::core::Query::TrackMetadata trackQuery;
|
||||
|
||||
void OnTracksFromQuery(musik::core::TrackVector *newTracks,bool clear);
|
||||
void OnTracksMetaFromQuery(musik::core::TrackVector *metaTracks);
|
||||
|
Loading…
Reference in New Issue
Block a user