- Updated IPlaybackRemote interface to get a callback when the play queue

changes
- Updated ISimpleDataProvider to accept limit and offset input paramters
  when querying tracklists
This commit is contained in:
casey langen 2017-02-09 20:20:41 -08:00
parent 9d662a73bf
commit b81488400e
9 changed files with 67 additions and 10 deletions

View File

@ -173,6 +173,10 @@ class MMShellHook:
virtual void OnModeChanged(musik::core::sdk::RepeatMode repeatMode, bool shuffled) {
}
virtual void OnPlayQueueChanged() {
}
};
static MMShellHook plugin;

View File

@ -71,6 +71,7 @@ using Editor = PlaybackService::Editor;
#define MESSAGE_MODE_CHANGED 1005
#define MESSAGE_SHUFFLED 1006
#define MESSAGE_NOTIFY_EDITED 1007
#define MESSAGE_NOTIFY_RESET 1008
class StreamMessage : public Message {
public:
@ -336,7 +337,13 @@ void PlaybackService::ProcessMessage(IMessage &message) {
else if (type == MESSAGE_TIME_CHANGED) {
this->TimeChanged(transport.Position());
}
else if (type == MESSAGE_NOTIFY_EDITED) {
else if (type == MESSAGE_NOTIFY_EDITED ||
type == MESSAGE_NOTIFY_RESET)
{
for (auto it = remotes.begin(); it != remotes.end(); it++) {
(*it)->OnPlayQueueChanged();
}
this->QueueEdited();
}
}
@ -446,6 +453,8 @@ void PlaybackService::Play(const TrackList& tracks, size_t index) {
if (index <= tracks.Count()) {
this->Play(index);
}
POST(this, MESSAGE_NOTIFY_RESET, 0, 0);
}
void PlaybackService::Play(const musik::core::sdk::ITrackList* source, size_t index) {
@ -468,6 +477,8 @@ void PlaybackService::Play(const musik::core::sdk::ITrackList* source, size_t in
if (index <= source->Count()) {
this->Play(index);
}
POST(this, MESSAGE_NOTIFY_RESET, 0, 0);
}
}

View File

@ -58,11 +58,15 @@ LocalSimpleDataProvider::~LocalSimpleDataProvider() {
}
ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query) {
ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query, int limit, int offset) {
try {
std::shared_ptr<SearchTrackListQuery> search(
new SearchTrackListQuery(this->library, std::string(query ? query : "")));
if (limit >= 0) {
search->SetLimitAndOffset(limit, offset);
}
this->library->Enqueue(search, ILibrary::QuerySynchronous);
if (search->GetStatus() == IQuery::Finished) {
@ -77,12 +81,16 @@ ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query) {
}
ITrackList* LocalSimpleDataProvider::QueryTracksByCategory(
const char* categoryType, unsigned long long selectedId)
const char* categoryType, unsigned long long selectedId, int limit, int offset)
{
try {
std::shared_ptr<CategoryTrackListQuery> search(
new CategoryTrackListQuery(this->library, categoryType, selectedId));
if (limit >= 0) {
search->SetLimitAndOffset(limit, offset);
}
this->library->Enqueue(search, ILibrary::QuerySynchronous);
if (search->GetStatus() == IQuery::Finished) {

View File

@ -46,12 +46,17 @@ namespace musik { namespace core { namespace db { namespace local {
virtual ~LocalSimpleDataProvider();
virtual musik::core::sdk::ITrackList*
QueryTracks(const char* query = "");
QueryTracks(
const char* query = "",
int limit = -1,
int offset = 0);
virtual musik::core::sdk::ITrackList*
QueryTracksByCategory(
const char* categoryType,
unsigned long long selectedId);
unsigned long long selectedId,
int limit = -1,
int offset = 0);
virtual musik::core::sdk::IMetadataValueList*
QueryCategory(

View File

@ -109,7 +109,7 @@ bool CategoryTrackListQuery::OnRun(Connection& db) {
"SELECT DISTINCT t.id, al.name " \
"FROM tracks t, albums al, artists ar, genres gn " \
"WHERE t.%s=? AND t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id "
"ORDER BY al.name, disc, track, ar.name") % this->column);
"ORDER BY al.name, disc, track, ar.name %s") % this->column % this->GetLimitAndOffset());
Statement trackQuery(query.c_str(), db);
trackQuery.BindInt(0, this->id);

View File

@ -101,16 +101,18 @@ bool SearchTrackListQuery::OnRun(Connection& db) {
"WHERE "
"(t.title LIKE ? OR al.name LIKE ? OR ar.name LIKE ? OR gn.name LIKE ?) "
" AND t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id "
"ORDER BY al.name, disc, track, ar.name";
"ORDER BY al.name, disc, track, ar.name ";
}
else {
query =
"SELECT DISTINCT t.id, al.name "
"FROM tracks t, albums al, artists ar, genres gn "
"WHERE t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id "
"ORDER BY al.name, disc, track, ar.name";
"ORDER BY al.name, disc, track, ar.name ";
}
query += this->GetLimitAndOffset();
Statement trackQuery(query.c_str(), db);
if (hasFilter) {

View File

@ -38,6 +38,7 @@
#include <core/db/Connection.h>
#include <core/library/track/Track.h>
#include <core/library/track/TrackList.h>
#include <boost/format.hpp>
namespace musik { namespace core { namespace db { namespace local {
@ -46,17 +47,38 @@ namespace musik { namespace core { namespace db { namespace local {
typedef std::shared_ptr<musik::core::TrackList> Result;
typedef std::shared_ptr<std::set<size_t> > Headers;
TrackListQueryBase() {
this->limit = -1;
this->offset = 0;
}
virtual ~TrackListQueryBase() { };
virtual std::string Name() = 0;
virtual Result GetResult() = 0;
virtual Headers GetHeaders() = 0;
virtual size_t GetQueryHash() = 0;
virtual void SetLimitAndOffset(int limit, int offset = 0) {
this->limit = limit;
this->offset = offset;
}
virtual musik::core::sdk::ITrackList* GetSdkResult() {
return new WrappedTrackList(GetResult());
}
protected:
std::string GetLimitAndOffset() {
if (this->limit > 0 && this->offset >= 0) {
return boost::str(boost::format("LIMIT %d OFFSET %d")
% this->limit % this->offset);
}
return "";
}
private:
int limit, offset;
class WrappedTrackList : public musik::core::sdk::ITrackList {
public:
WrappedTrackList(Result wrapped) {

View File

@ -47,6 +47,7 @@ namespace musik { namespace core { namespace sdk {
virtual void OnPlaybackStateChanged(PlaybackState state) = 0;
virtual void OnVolumeChanged(double volume) = 0;
virtual void OnModeChanged(RepeatMode repeatMode, bool shuffled) = 0;
virtual void OnPlayQueueChanged() = 0;
};
} } }

View File

@ -43,11 +43,15 @@ namespace musik { namespace core { namespace sdk {
class ISimpleDataProvider {
public:
virtual ITrackList* QueryTracks(
const char* query = nullptr) = 0;
const char* query = nullptr,
int limit = -1,
int offset = 0) = 0;
virtual ITrackList* QueryTracksByCategory(
const char* categoryType,
unsigned long long selectedId) = 0;
unsigned long long selectedId,
int limit = -1,
int offset = 0) = 0;
virtual IMetadataValueList* QueryCategory(
const char* type,