mirror of
https://github.com/clangen/musikcube.git
synced 2025-02-06 03:39:50 +00:00
- 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:
parent
9d662a73bf
commit
b81488400e
@ -173,6 +173,10 @@ class MMShellHook:
|
||||
virtual void OnModeChanged(musik::core::sdk::RepeatMode repeatMode, bool shuffled) {
|
||||
|
||||
}
|
||||
|
||||
virtual void OnPlayQueueChanged() {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
static MMShellHook plugin;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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(
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
} } }
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user