re-apply indentation

This commit is contained in:
Bruno Morais 2019-09-09 08:43:43 -04:00
parent 88583c696a
commit e27138af76
4 changed files with 405 additions and 410 deletions

View File

@ -4,88 +4,88 @@
//wrappers
static int next_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISNext();
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISNext();
return sd_bus_reply_method_return(m, "");
}
static int prev_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPrev();
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPrev();
return sd_bus_reply_method_return(m, "");
}
static int pause_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPause();
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPause();
return sd_bus_reply_method_return(m, "");
}
static int playpause_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPlayPause();
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPlayPause();
return sd_bus_reply_method_return(m, "");
}
static int stop_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISStop();
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISStop();
return sd_bus_reply_method_return(m, "");
}
static int play_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPlay();
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
remote->MPRISPlay();
return sd_bus_reply_method_return(m, "");
}
static int seek_wrapper(sd_bus_message* m, void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
int64_t pos = 0;
int ret = sd_bus_message_read_basic(m, 'x', &pos);
if (ret < 0) {
return ret;
}
remote->MPRISSeek(pos, true);
return sd_bus_reply_method_return(m, "");
MPRISRemote* remote = (MPRISRemote*)data;
int64_t pos = 0;
int ret = sd_bus_message_read_basic(m, 'x', &pos);
if (ret < 0) {
return ret;
}
remote->MPRISSeek(pos, true);
return sd_bus_reply_method_return(m, "");
}
static int get_playback_status(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* reply,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
const char* state = remote->MPRISGetPlaybackStatus();
return sd_bus_message_append_basic(reply, 's', state);
MPRISRemote* remote = (MPRISRemote*)data;
const char* state = remote->MPRISGetPlaybackStatus();
return sd_bus_message_append_basic(reply, 's', state);
}
static int get_loop_status(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* reply,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
const char* state = remote->MPRISGetLoopStatus();
return sd_bus_message_append_basic(reply, 's', state);
MPRISRemote* remote = (MPRISRemote*)data;
const char* state = remote->MPRISGetLoopStatus();
return sd_bus_message_append_basic(reply, 's', state);
}
static int set_loop_status(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* value,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
const char* _value = NULL;
int ret = sd_bus_message_read_basic(value, 's', &_value);
if (ret < 0) {
return ret;
}
remote->MPRISSetLoopStatus(_value);
return sd_bus_reply_method_return(value, "");
const char* prop, sd_bus_message* value,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
const char* _value = NULL;
int ret = sd_bus_message_read_basic(value, 's', &_value);
if (ret < 0) {
return ret;
}
remote->MPRISSetLoopStatus(_value);
return sd_bus_reply_method_return(value, "");
}
static int get_position(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* reply,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
const uint64_t pos = remote->MPRISGetPosition();
return sd_bus_message_append_basic(reply, 'x', &pos);
MPRISRemote* remote = (MPRISRemote*)data;
const uint64_t pos = remote->MPRISGetPosition();
return sd_bus_message_append_basic(reply, 'x', &pos);
}
@ -93,122 +93,119 @@ static int get_position(sd_bus* bus, const char* path, const char *iface,
static int get_shuffle_status(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* reply,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
const unsigned int state = remote->MPRISGetShuffleStatus();
return sd_bus_message_append_basic(reply, 'b', &state);
MPRISRemote* remote = (MPRISRemote*)data;
const unsigned int state = remote->MPRISGetShuffleStatus();
return sd_bus_message_append_basic(reply, 'b', &state);
}
static int set_shuffle_status(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* value,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
unsigned int _value = 0;
int ret = sd_bus_message_read_basic(value, 'b', &_value);
if (ret < 0) {
return ret;
}
remote->MPRISSetShuffleStatus(_value);
return sd_bus_reply_method_return(value, "");
MPRISRemote* remote = (MPRISRemote*)data;
unsigned int _value = 0;
int ret = sd_bus_message_read_basic(value, 'b', &_value);
if (ret < 0) {
return ret;
}
remote->MPRISSetShuffleStatus(_value);
return sd_bus_reply_method_return(value, "");
}
static int get_volume(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* reply,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
double vol = remote->MPRISGetVolume();
return sd_bus_message_append_basic(reply, 'd', &vol);
MPRISRemote* remote = (MPRISRemote*)data;
double vol = remote->MPRISGetVolume();
return sd_bus_message_append_basic(reply, 'd', &vol);
}
static int set_volume(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* value,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
double _value = 0;
int ret = sd_bus_message_read_basic(value, 'd', &_value);
if (ret < 0) {
return ret;
}
if (_value < 0.0) {
_value = 0.0;
} else if (_value > 1.0) {
_value = 1.0;
}
remote->MPRISSetVolume(_value);
return sd_bus_reply_method_return(value, "");
MPRISRemote* remote = (MPRISRemote*)data;
double _value = 0;
int ret = sd_bus_message_read_basic(value, 'd', &_value);
if (ret < 0) {
return ret;
}
if (_value < 0.0) {
_value = 0.0;
} else if (_value > 1.0) {
_value = 1.0;
}
remote->MPRISSetVolume(_value);
return sd_bus_reply_method_return(value, "");
}
static void sd_msg_append_dict(sd_bus_message* msg, const char* key, const void* value, char type) {
const char type_str[] = {type, 0};
sd_bus_message_open_container(msg, 'e', "sv");
sd_bus_message_append_basic(msg, 's', key);
sd_bus_message_open_container(msg, 'v', type_str);
sd_bus_message_append_basic(msg, type, value);
sd_bus_message_close_container(msg);
sd_bus_message_close_container(msg);
const char type_str[] = {type, 0};
sd_bus_message_open_container(msg, 'e', "sv");
sd_bus_message_append_basic(msg, 's', key);
sd_bus_message_open_container(msg, 'v', type_str);
sd_bus_message_append_basic(msg, type, value);
sd_bus_message_close_container(msg);
sd_bus_message_close_container(msg);
}
static void sd_msg_append_strlist_dict(sd_bus_message* msg, const char* key, const void* value) {
sd_bus_message_open_container(msg, 'e', "sv");
sd_bus_message_append_basic(msg, 's', key);
sd_bus_message_open_container(msg, 'v', "as");
sd_bus_message_open_container(msg, 'a', "s");
sd_bus_message_append_basic(msg, 's', value);
sd_bus_message_close_container(msg);
sd_bus_message_close_container(msg);
sd_bus_message_close_container(msg);
sd_bus_message_open_container(msg, 'e', "sv");
sd_bus_message_append_basic(msg, 's', key);
sd_bus_message_open_container(msg, 'v', "as");
sd_bus_message_open_container(msg, 'a', "s");
sd_bus_message_append_basic(msg, 's', value);
sd_bus_message_close_container(msg);
sd_bus_message_close_container(msg);
sd_bus_message_close_container(msg);
}
static int get_metadata(sd_bus* bus, const char* path, const char *iface,
const char* prop, sd_bus_message* reply,
void* data, sd_bus_error* err) {
MPRISRemote* remote = (MPRISRemote*)data;
int ret = 0;
struct MPRISMetadataValues metadata = remote->MPRISGetMetadata();
MPRISRemote* remote = (MPRISRemote*)data;
int ret = 0;
struct MPRISMetadataValues metadata = remote->MPRISGetMetadata();
ret = sd_bus_message_open_container(reply, 'a', "{sv}");
if (ret < 0) {
return ret;
}
ret = sd_bus_message_open_container(reply, 'a', "{sv}");
if (ret < 0) {
return ret;
}
if (metadata.available) {
// append fields
sd_msg_append_dict(reply, "mpris:trackid", metadata.trackid.c_str(), 'o');
sd_msg_append_dict(reply, "mpris:length", &metadata.length, 'x');
sd_msg_append_strlist_dict(reply, "xesam:artist", metadata.artist.c_str());
sd_msg_append_dict(reply, "xesam:title", metadata.title.c_str(), 's');
sd_msg_append_dict(reply, "xesam:album", metadata.album.c_str(), 's');
sd_msg_append_strlist_dict(reply, "xesam:albumArtist", metadata.albumArtist.c_str());
sd_msg_append_strlist_dict(reply, "xesam:genre", metadata.genre.c_str());
sd_msg_append_dict(reply, "xesam:trackNumber", &metadata.trackNumber, 'i');
sd_msg_append_dict(reply, "xesam:discNumber", &metadata.discNumber, 'i');
sd_msg_append_strlist_dict(reply, "xesam:comment", metadata.comment.c_str());
}
ret = sd_bus_message_close_container(reply);
if (ret < 0) {
return ret;
}
return 0;
if (metadata.available) {
// append fields
sd_msg_append_dict(reply, "mpris:trackid", metadata.trackid.c_str(), 'o');
sd_msg_append_dict(reply, "mpris:length", &metadata.length, 'x');
sd_msg_append_strlist_dict(reply, "xesam:artist", metadata.artist.c_str());
sd_msg_append_dict(reply, "xesam:title", metadata.title.c_str(), 's');
sd_msg_append_dict(reply, "xesam:album", metadata.album.c_str(), 's');
sd_msg_append_strlist_dict(reply, "xesam:albumArtist", metadata.albumArtist.c_str());
sd_msg_append_strlist_dict(reply, "xesam:genre", metadata.genre.c_str());
sd_msg_append_dict(reply, "xesam:trackNumber", &metadata.trackNumber, 'i');
sd_msg_append_dict(reply, "xesam:discNumber", &metadata.discNumber, 'i');
sd_msg_append_strlist_dict(reply, "xesam:comment", metadata.comment.c_str());
}
ret = sd_bus_message_close_container(reply);
if (ret < 0) {
return ret;
}
return 0;
}
static int sd_response_true(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
const unsigned int resp = 1;
return sd_bus_message_append_basic(reply, 'b', &resp);
const unsigned int resp = 1;
return sd_bus_message_append_basic(reply, 'b', &resp);
}
static int sd_response_false(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
const unsigned int resp = 0;
return sd_bus_message_append_basic(reply, 'b', &resp);
const unsigned int resp = 0;
return sd_bus_message_append_basic(reply, 'b', &resp);
}
@ -216,12 +213,12 @@ static int sd_write_nop(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
return sd_bus_reply_method_return(reply, "");
return sd_bus_reply_method_return(reply, "");
}
static int sd_method_nop(sd_bus_message* m, void* data, sd_bus_error* err)
{
return sd_bus_reply_method_return(m, "");
return sd_bus_reply_method_return(m, "");
}
@ -229,8 +226,8 @@ static int sd_response_rate(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
const double resp = 1.0;
return sd_bus_message_append_basic(reply, 'd', &resp);
const double resp = 1.0;
return sd_bus_message_append_basic(reply, 'd', &resp);
}
@ -238,71 +235,70 @@ static int sd_response_id(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
const char* identity = "musikcube";
return sd_bus_message_append_basic(reply, 's', identity);
const char* identity = "musikcube";
return sd_bus_message_append_basic(reply, 's', identity);
}
static int sd_response_urischemes(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
const char* schemes[] = {"file", NULL};
return sd_bus_message_append_strv(reply, (char**)schemes);
const char* schemes[] = {"file", NULL};
return sd_bus_message_append_strv(reply, (char**)schemes);
}
static int sd_response_mimetypes(sd_bus* bus, const char* path, const char* iface,
const char* prop, sd_bus_message *reply, void* data,
sd_bus_error* err)
{
const char* mime[] = {NULL};
return sd_bus_message_append_strv(reply, (char**)mime);
const char* mime[] = {NULL};
return sd_bus_message_append_strv(reply, (char**)mime);
}
const sd_bus_vtable musikcube_mp_table[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_PROPERTY("CanQuit", "b", sd_response_false, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanRaise", "b", sd_response_false, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("HasTrackList", "b", sd_response_false, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("Identity", "s", sd_response_id, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("SupportedUriSchemes", "as", sd_response_urischemes, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("SupportedMimeTypes", "as", sd_response_mimetypes, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_METHOD("Raise", "", "", sd_method_nop, 0),
SD_BUS_METHOD("Quit", "", "", sd_method_nop, 0),
SD_BUS_VTABLE_END
};
const sd_bus_vtable musikcube_mp_table[] =
{
SD_BUS_VTABLE_START(0),
SD_BUS_PROPERTY("CanQuit", "b", sd_response_false, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanRaise", "b", sd_response_false, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("HasTrackList", "b", sd_response_false, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("Identity", "s", sd_response_id, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("SupportedUriSchemes", "as", sd_response_urischemes, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("SupportedMimeTypes", "as", sd_response_mimetypes, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_METHOD("Raise", "", "", sd_method_nop, 0),
SD_BUS_METHOD("Quit", "", "", sd_method_nop, 0),
SD_BUS_VTABLE_END
};
const sd_bus_vtable musikcube_mpp_table[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("Next", "", "", next_wrapper, 0),
SD_BUS_METHOD("Previous", "", "", prev_wrapper, 0),
SD_BUS_METHOD("Pause", "", "", pause_wrapper, 0),
SD_BUS_METHOD("PlayPause", "", "", playpause_wrapper, 0),
SD_BUS_METHOD("Stop", "", "", stop_wrapper, 0),
SD_BUS_METHOD("Play", "", "", play_wrapper, 0),
SD_BUS_METHOD("Seek", "x", "", seek_wrapper, 0),
SD_BUS_PROPERTY("PlaybackStatus", "s", get_playback_status,
0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_WRITABLE_PROPERTY("LoopStatus", "s", get_loop_status,
set_loop_status, 0,
SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_WRITABLE_PROPERTY("Shuffle", "b", get_shuffle_status,
set_shuffle_status, 0,
SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("Position", "x", get_position, 0, 0),
SD_BUS_WRITABLE_PROPERTY("Volume", "d", get_volume, set_volume,
0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("Metadata", "a{sv}", get_metadata, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanGoNext", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanGoPrevious", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanPlay", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanPause", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanSeek", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanControl", "b", sd_response_true, 0, 0),
SD_BUS_PROPERTY("MinimumRate", "d", sd_response_rate, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("MaximumRate", "d", sd_response_rate, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_WRITABLE_PROPERTY("Rate", "d", sd_response_rate, sd_write_nop, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_METHOD("SetPosition", "ox", "", sd_method_nop, 0), // TODO implement
SD_BUS_METHOD("OpenUri", "s", "", sd_method_nop, 0), // TODO verify possibility for implementation
SD_BUS_SIGNAL("Seeked", "x", 0),
SD_BUS_VTABLE_END
};
const sd_bus_vtable musikcube_mpp_table[] =
{
SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("Next", "", "", next_wrapper, 0),
SD_BUS_METHOD("Previous", "", "", prev_wrapper, 0),
SD_BUS_METHOD("Pause", "", "", pause_wrapper, 0),
SD_BUS_METHOD("PlayPause", "", "", playpause_wrapper, 0),
SD_BUS_METHOD("Stop", "", "", stop_wrapper, 0),
SD_BUS_METHOD("Play", "", "", play_wrapper, 0),
SD_BUS_METHOD("Seek", "x", "", seek_wrapper, 0),
SD_BUS_PROPERTY("PlaybackStatus", "s", get_playback_status, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_WRITABLE_PROPERTY("LoopStatus", "s", get_loop_status, set_loop_status, 0,
SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_WRITABLE_PROPERTY("Shuffle", "b", get_shuffle_status, set_shuffle_status, 0,
SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("Position", "x", get_position, 0, 0),
SD_BUS_WRITABLE_PROPERTY("Volume", "d", get_volume, set_volume,
0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("Metadata", "a{sv}", get_metadata, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanGoNext", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanGoPrevious", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanPlay", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanPause", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanSeek", "b", sd_response_true, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("CanControl", "b", sd_response_true, 0, 0),
SD_BUS_PROPERTY("MinimumRate", "d", sd_response_rate, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("MaximumRate", "d", sd_response_rate, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_WRITABLE_PROPERTY("Rate", "d", sd_response_rate, sd_write_nop, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_METHOD("SetPosition", "ox", "", sd_method_nop, 0), // TODO implement
SD_BUS_METHOD("OpenUri", "s", "", sd_method_nop, 0), // TODO verify possibility for implementation
SD_BUS_SIGNAL("Seeked", "x", 0),
SD_BUS_VTABLE_END
};

View File

@ -1,7 +1,7 @@
#pragma once
extern "C" {
#include <systemd/sd-bus.h>
#include <systemd/sd-bus.h>
}
extern const sd_bus_vtable musikcube_mp_table[];

View File

@ -7,23 +7,23 @@
#include <functional>
extern "C" {
#include <unistd.h>
#include <unistd.h>
}
thread_local char localBuffer[1024];
static MPRISRemote remote;
static const std::map<MPRISProperty, const std::vector<const char*>> MPRISPropertyNames =
{{MPRISProperty::Volume, {"Volume", NULL}},
{MPRISProperty::PlaybackStatus, {"PlaybackStatus", NULL}},
{MPRISProperty::LoopStatus, {"LoopStatus", NULL}},
{MPRISProperty::Shuffle, {"Shuffle", NULL}},
{MPRISProperty::Metadata, {"Metadata", NULL}}};
{{MPRISProperty::Volume, {"Volume", NULL}},
{MPRISProperty::PlaybackStatus, {"PlaybackStatus", NULL}},
{MPRISProperty::LoopStatus, {"LoopStatus", NULL}},
{MPRISProperty::Shuffle, {"Shuffle", NULL}},
{MPRISProperty::Metadata, {"Metadata", NULL}}};
static std::string GetMetadataString(ITrack* track, const char* key)
{
track->GetString(key, localBuffer, sizeof(localBuffer));
return std::string(localBuffer);
track->GetString(key, localBuffer, sizeof(localBuffer));
return std::string(localBuffer);
}
static class MPRISPlugin : public IPlugin {
@ -41,299 +41,299 @@ static class MPRISPlugin : public IPlugin {
} plugin;
extern "C" IPlugin* GetPlugin() {
return &plugin;
return &plugin;
}
extern "C" IPlaybackRemote* GetPlaybackRemote() {
return &remote;
return &remote;
}
bool MPRISRemote::MPRISInit() {
int ret = 0;
std::string requested_name;
int ret = 0;
std::string requested_name;
if (this->mpris_initialized) {
return true;
}
ret = sd_bus_default_user(&(this->bus));
if (ret < 0) {
MPRISDeinit();
return false;
}
// add DBUS entries
ret = sd_bus_add_object_vtable(this->bus, NULL, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2", musikcube_mp_table, this);
if (ret < 0) {
MPRISDeinit();
return false;
}
ret = sd_bus_add_object_vtable(this->bus, NULL, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player", musikcube_mpp_table, this);
if (ret < 0) {
MPRISDeinit();
return false;
}
requested_name = std::string("org.mpris.MediaPlayer2.musikcube.instance") + std::to_string(getpid());
ret = sd_bus_request_name(this->bus, requested_name.c_str(), 0);
if (ret < 0) {
MPRISDeinit();
return false;
}
// start loop
thread.reset(new std::thread(std::bind(&MPRISRemote::MPRISLoop, this)));
if (this->mpris_initialized) {
return true;
}
ret = sd_bus_default_user(&(this->bus));
if (ret < 0) {
MPRISDeinit();
return false;
}
// add DBUS entries
ret = sd_bus_add_object_vtable(this->bus, NULL, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2", musikcube_mp_table, this);
if (ret < 0) {
MPRISDeinit();
return false;
}
ret = sd_bus_add_object_vtable(this->bus, NULL, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player", musikcube_mpp_table, this);
if (ret < 0) {
MPRISDeinit();
return false;
}
requested_name = std::string("org.mpris.MediaPlayer2.musikcube.instance") + std::to_string(getpid());
ret = sd_bus_request_name(this->bus, requested_name.c_str(), 0);
if (ret < 0) {
MPRISDeinit();
return false;
}
// start loop
thread.reset(new std::thread(std::bind(&MPRISRemote::MPRISLoop, this)));
return true;
}
void MPRISRemote::MPRISDeinit() {
if (this->bus) {
sd_bus_unref(this->bus);
bus = NULL;
}
stop_processing = true;
if (thread) {
thread->join();
thread.reset();
}
if (this->bus) {
sd_bus_unref(this->bus);
bus = NULL;
}
stop_processing = true;
if (thread) {
thread->join();
thread.reset();
}
}
void MPRISRemote::MPRISEmitChange(MPRISProperty prop) {
if (bus) {
char** strv = (char**)(&MPRISPropertyNames.at(prop));
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
sd_bus_emit_properties_changed_strv(bus, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player",
strv);
sd_bus_flush(bus);
}
if (bus) {
char** strv = (char**)(&MPRISPropertyNames.at(prop));
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
sd_bus_emit_properties_changed_strv(bus, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player",
strv);
sd_bus_flush(bus);
}
};
void MPRISRemote::MPRISEmitSeek(double curpos) {
if (bus) {
int64_t position = (int64_t)(curpos*1000*1000);
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
sd_bus_emit_signal(bus, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player",
"Seeked", "x", position);
if (bus) {
int64_t position = (int64_t)(curpos*1000*1000);
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
sd_bus_emit_signal(bus, "/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player",
"Seeked", "x", position);
}
};
void MPRISRemote::MPRISLoop() {
while (!stop_processing) {
if (bus) {
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
while(sd_bus_process(bus, NULL) > 0);
while (!stop_processing) {
if (bus) {
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
while(sd_bus_process(bus, NULL) > 0);
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
void MPRISRemote::OnTrackChanged(ITrack* track) {
if (playback) {
MPRISEmitChange(MPRISProperty::Metadata);
MPRISEmitSeek(playback->GetPosition());
}
if (playback) {
MPRISEmitChange(MPRISProperty::Metadata);
MPRISEmitSeek(playback->GetPosition());
}
}
void MPRISRemote::OnPlaybackStateChanged(PlaybackState state) {
if (playback) {
MPRISEmitChange(MPRISProperty::PlaybackStatus);
}
if (playback) {
MPRISEmitChange(MPRISProperty::PlaybackStatus);
}
}
void MPRISRemote::OnVolumeChanged(double volume) {
if (playback) {
MPRISEmitChange(MPRISProperty::Volume);
}
if (playback) {
MPRISEmitChange(MPRISProperty::Volume);
}
}
void MPRISRemote::OnPlaybackTimeChanged(double time) {
if (playback) {
MPRISEmitChange(MPRISProperty::Metadata);
MPRISEmitSeek(time);
}
if (playback) {
MPRISEmitChange(MPRISProperty::Metadata);
MPRISEmitSeek(time);
}
}
void MPRISRemote::OnModeChanged(RepeatMode repeatMode, bool shuffled) {
if (playback) {
MPRISEmitChange(MPRISProperty::LoopStatus);
MPRISEmitChange(MPRISProperty::Shuffle);
}
if (playback) {
MPRISEmitChange(MPRISProperty::LoopStatus);
MPRISEmitChange(MPRISProperty::Shuffle);
}
}
struct MPRISMetadataValues MPRISRemote::MPRISGetMetadata() {
struct MPRISMetadataValues metadata;
if (playback) {
auto curTrack = playback->GetPlayingTrack();
if (curTrack) {
metadata.artist = GetMetadataString(curTrack, track::Artist);
metadata.title = GetMetadataString(curTrack, track::Title);
metadata.albumArtist = GetMetadataString(curTrack, track::AlbumArtist);
metadata.genre = GetMetadataString(curTrack, track::Genre);
// TODO implement track ID properly using track index in playlist if possible
metadata.trackid = std::string("/1");
metadata.album = GetMetadataString(curTrack, track::Album);
metadata.discNumber = curTrack->GetInt32(track::DiscNum);
metadata.trackNumber = curTrack->GetInt32(track::TrackNum);
metadata.length = curTrack->GetInt64(track::Duration)*1000*1000;
metadata.available = true;
struct MPRISMetadataValues metadata;
if (playback) {
auto curTrack = playback->GetPlayingTrack();
if (curTrack) {
metadata.artist = GetMetadataString(curTrack, track::Artist);
metadata.title = GetMetadataString(curTrack, track::Title);
metadata.albumArtist = GetMetadataString(curTrack, track::AlbumArtist);
metadata.genre = GetMetadataString(curTrack, track::Genre);
// TODO implement track ID properly using track index in playlist if possible
metadata.trackid = std::string("/1");
metadata.album = GetMetadataString(curTrack, track::Album);
metadata.discNumber = curTrack->GetInt32(track::DiscNum);
metadata.trackNumber = curTrack->GetInt32(track::TrackNum);
metadata.length = curTrack->GetInt64(track::Duration)*1000*1000;
metadata.available = true;
}
}
}
return metadata;
return metadata;
}
void MPRISRemote::SetPlaybackService(IPlaybackService* playback) {
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
this->playback = playback;
mpris_initialized = MPRISInit();
std::unique_lock<decltype(sd_mutex)> lock(sd_mutex);
this->playback = playback;
mpris_initialized = MPRISInit();
}
void MPRISRemote::MPRISNext() {
if (playback) {
playback->Next();
}
if (playback) {
playback->Next();
}
}
void MPRISRemote::MPRISPrev() {
if (playback) {
playback->Previous();
}
if (playback) {
playback->Previous();
}
}
void MPRISRemote::MPRISPause() {
if (playback) {
auto state = playback->GetPlaybackState();
if (state == PlaybackState::PlaybackPlaying) {
playback->PauseOrResume();
if (playback) {
auto state = playback->GetPlaybackState();
if (state == PlaybackState::PlaybackPlaying) {
playback->PauseOrResume();
}
}
}
}
void MPRISRemote::MPRISPlayPause() {
if (playback) {
playback->PauseOrResume();
}
if (playback) {
playback->PauseOrResume();
}
}
void MPRISRemote::MPRISStop() {
if (playback) {
playback->Stop();
}
if (playback) {
playback->Stop();
}
}
void MPRISRemote::MPRISPlay() {
if (playback) {
auto state = playback->GetPlaybackState();
if (state != PlaybackState::PlaybackPlaying) {
playback->PauseOrResume();
if (playback) {
auto state = playback->GetPlaybackState();
if (state != PlaybackState::PlaybackPlaying) {
playback->PauseOrResume();
}
}
}
}
void MPRISRemote::MPRISSeek(uint64_t position, bool relative) {
double _pos = ((double)position)/(1000*1000);
if (playback) {
}
double _pos = ((double)position)/(1000*1000);
if (playback) {
}
}
const char* MPRISRemote::MPRISGetPlaybackStatus() {
if (playback) {
auto state = playback->GetPlaybackState();
switch (state) {
case PlaybackState::PlaybackPlaying:
return "Playing";
case PlaybackState::PlaybackPaused:
return "Paused";
case PlaybackState::PlaybackPrepared:
case PlaybackState::PlaybackStopped:
default:
break;
if (playback) {
auto state = playback->GetPlaybackState();
switch (state) {
case PlaybackState::PlaybackPlaying:
return "Playing";
case PlaybackState::PlaybackPaused:
return "Paused";
case PlaybackState::PlaybackPrepared:
case PlaybackState::PlaybackStopped:
default:
break;
}
}
}
return "Stopped";
return "Stopped";
}
const char* MPRISRemote::MPRISGetLoopStatus() {
if (playback) {
auto state = playback->GetRepeatMode();
switch (state) {
case RepeatMode::RepeatTrack:
return "Track";
case RepeatMode::RepeatList:
return "Playlist";
case RepeatMode::RepeatNone:
default:
break;
if (playback) {
auto state = playback->GetRepeatMode();
switch (state) {
case RepeatMode::RepeatTrack:
return "Track";
case RepeatMode::RepeatList:
return "Playlist";
case RepeatMode::RepeatNone:
default:
break;
}
}
}
return "None";
return "None";
}
void MPRISRemote::MPRISSetLoopStatus(const char* state) {
if (playback) {
if (!strcmp(state, "None")) {
playback->SetRepeatMode(RepeatMode::RepeatNone);
if (playback) {
if (!strcmp(state, "None")) {
playback->SetRepeatMode(RepeatMode::RepeatNone);
}
else if (!strcmp(state, "Playlist")) {
playback->SetRepeatMode(RepeatMode::RepeatList);
}
else if (!strcmp(state, "Track")) {
playback->SetRepeatMode(RepeatMode::RepeatTrack);
}
}
else if (!strcmp(state, "Playlist")) {
playback->SetRepeatMode(RepeatMode::RepeatList);
}
else if (!strcmp(state, "Track")) {
playback->SetRepeatMode(RepeatMode::RepeatTrack);
}
}
}
uint64_t MPRISRemote::MPRISGetPosition() {
if (playback) {
return (uint64_t)(playback->GetPosition()*1000*1000);
}
return 0;
if (playback) {
return (uint64_t)(playback->GetPosition()*1000*1000);
}
return 0;
}
unsigned int MPRISRemote::MPRISGetShuffleStatus() {
if (playback) {
return playback->IsShuffled() ? 1: 0;
}
return 0;
if (playback) {
return playback->IsShuffled() ? 1: 0;
}
return 0;
}
void MPRISRemote::MPRISSetShuffleStatus(unsigned int state) {
if (playback)
{
unsigned int isShuffled = playback->IsShuffled() ? 1: 0;
if ((state & 0x1) ^ isShuffled) {
playback->ToggleShuffle();
}
}
if (playback)
{
unsigned int isShuffled = playback->IsShuffled() ? 1: 0;
if ((state & 0x1) ^ isShuffled) {
playback->ToggleShuffle();
}
}
}
double MPRISRemote::MPRISGetVolume() {
if (playback) {
return playback->GetVolume();
}
return 0.0;
if (playback) {
return playback->GetVolume();
}
return 0.0;
}
void MPRISRemote::MPRISSetVolume(double vol) {
if (playback) {
playback->SetVolume(vol);
}
if (playback) {
playback->SetVolume(vol);
}
}
MPRISMetadataValues::MPRISMetadataValues() {
trackid = "";
length = 0;
artist = "";
title = "";
album = "";
albumArtist = "";
genre = "";
comment = "";
trackNumber = 0;
discNumber = 0;
available = false;
trackid = "";
length = 0;
artist = "";
title = "";
album = "";
albumArtist = "";
genre = "";
comment = "";
trackNumber = 0;
discNumber = 0;
available = false;
}

View File

@ -7,32 +7,33 @@
#include <thread>
extern "C" {
#include <systemd/sd-bus.h>
#include <systemd/sd-bus.h>
}
using namespace musik::core::sdk;
enum MPRISProperty {
Volume = 1,
PlaybackStatus = 2,
LoopStatus = 3,
Shuffle = 4,
Metadata = 5,
enum MPRISProperty
{
Volume = 1,
PlaybackStatus = 2,
LoopStatus = 3,
Shuffle = 4,
Metadata = 5,
};
struct MPRISMetadataValues {
std::string trackid;
uint64_t length;
std::string artist;
std::string title;
std::string album;
std::string albumArtist;
std::string genre;
std::string comment;
uint32_t trackNumber;
uint32_t discNumber;
bool available;
MPRISMetadataValues();
std::string trackid;
uint64_t length;
std::string artist;
std::string title;
std::string album;
std::string albumArtist;
std::string genre;
std::string comment;
uint32_t trackNumber;
uint32_t discNumber;
bool available;
MPRISMetadataValues();
};
class MPRISRemote : public IPlaybackRemote {
@ -52,18 +53,16 @@ class MPRISRemote : public IPlaybackRemote {
public:
MPRISRemote()
: playback(NULL),
bus(NULL),
stop_processing(false),
mpris_initialized(false) {}
: playback(NULL),
bus(NULL),
stop_processing(false),
mpris_initialized(false) {}
~MPRISRemote() {
MPRISDeinit();
}
virtual void Release() {
MPRISDeinit();
}
virtual void Release() { }
virtual void SetPlaybackService(IPlaybackService* playback);
virtual void OnTrackChanged(ITrack* track);
virtual void OnPlaybackStateChanged(PlaybackState state);