- Renamed Query::Tracks to Query::TrackMetadata for clarity.

- Wrote some documentation on the PlaybackQueue.
This commit is contained in:
Daniel Önnerby 2008-04-19 21:52:59 +00:00
parent cd328eca08
commit 5f9a97cfea
6 changed files with 148 additions and 62 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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);
}

View File

@ -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
//////////////////////////////////////////////////////////////////////////////

View File

@ -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>

View File

@ -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);