2017-11-17 05:45:31 -08:00
|
|
|
#include <Elementary.h>
|
|
|
|
#include "main.h"
|
|
|
|
#include "win.h"
|
|
|
|
#include "browser.h"
|
|
|
|
#include "video.h"
|
|
|
|
#include "winvid.h"
|
|
|
|
#include "winlist.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include "mpris.h"
|
|
|
|
|
|
|
|
static Evas_Object *mainwin = NULL;
|
|
|
|
static Eldbus_Connection *conn = NULL;
|
|
|
|
static Eldbus_Service_Interface *iface = NULL;
|
|
|
|
static Eldbus_Service_Interface *iface_player = NULL;
|
|
|
|
|
|
|
|
#define SERVICE "org.mpris.MediaPlayer2.rage"
|
|
|
|
#define PATH "/org/mpris/MediaPlayer2"
|
|
|
|
|
|
|
|
static void
|
2017-11-17 19:23:16 -08:00
|
|
|
_cb_name_request(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED,
|
2017-11-17 05:45:31 -08:00
|
|
|
Eldbus_Pending *pending EINA_UNUSED)
|
|
|
|
{
|
2017-11-17 19:23:16 -08:00
|
|
|
return;
|
|
|
|
/*
|
2017-11-17 05:45:31 -08:00
|
|
|
unsigned int flag;
|
|
|
|
|
|
|
|
if (eldbus_message_error_get(msg, NULL, NULL))
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Could not request bus name");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!eldbus_message_arguments_get(msg, "u", &flag))
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Could not get arguments on on_name_request");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER))
|
|
|
|
fprintf(stderr, "Name already in use\n");
|
2017-11-17 19:23:16 -08:00
|
|
|
*/
|
2017-11-17 05:45:31 -08:00
|
|
|
}
|
|
|
|
|
2017-11-17 19:23:16 -08:00
|
|
|
/* Implementing almost all of:
|
|
|
|
*
|
2017-11-17 05:45:31 -08:00
|
|
|
https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html
|
2017-11-17 19:23:16 -08:00
|
|
|
*
|
|
|
|
* Not implemented:
|
|
|
|
* Tracklist objects
|
|
|
|
* Metadata
|
|
|
|
* SetPosition (requires Tracklist objects)
|
|
|
|
*
|
|
|
|
* In rage generally and here:
|
|
|
|
*
|
|
|
|
* Loop playlist vs just loop current
|
|
|
|
* Shuffle play
|
|
|
|
* Playback rate
|
2017-11-17 05:45:31 -08:00
|
|
|
*/
|
|
|
|
|
|
|
|
#define API(fn) \
|
|
|
|
static Eldbus_Message * \
|
|
|
|
_cb_api_##fn(const Eldbus_Service_Interface *iface EINA_UNUSED, \
|
|
|
|
const Eldbus_Message *msg)
|
|
|
|
#define GETTER(fn) \
|
|
|
|
static Eina_Bool \
|
|
|
|
_cb_prop_##fn##_get(const Eldbus_Service_Interface *iface EINA_UNUSED, \
|
|
|
|
const char *propname EINA_UNUSED, \
|
|
|
|
Eldbus_Message_Iter *iter, \
|
|
|
|
const Eldbus_Message *request_msg EINA_UNUSED, \
|
|
|
|
Eldbus_Message **error EINA_UNUSED)
|
|
|
|
|
|
|
|
#define SETTER(fn) \
|
|
|
|
static Eldbus_Message * \
|
|
|
|
_cb_prop_##fn##_set(const Eldbus_Service_Interface *iface EINA_UNUSED, \
|
|
|
|
const char *propname EINA_UNUSED, \
|
|
|
|
Eldbus_Message_Iter *iter, \
|
|
|
|
const Eldbus_Message *msg)
|
|
|
|
#define PROP_RO(str, type, prop) \
|
|
|
|
{ str, type, _cb_prop_##prop##_get, NULL, 0 }
|
|
|
|
#define PROP_RW(str, type, prop) \
|
|
|
|
{ str, type, _cb_prop_##prop##_get, _cb_prop_##prop##_set, 0 }
|
|
|
|
#define METHOD(str, type, fn) \
|
|
|
|
{ str, NULL, type, _cb_api_##fn, 0 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
GETTER(can_quit)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(fullscreen)
|
|
|
|
{
|
|
|
|
Eina_Bool fs = elm_win_fullscreen_get(mainwin);
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", fs);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
SETTER(fullscreen)
|
|
|
|
{
|
|
|
|
Eina_Bool fs = EINA_FALSE;
|
|
|
|
eldbus_message_iter_arguments_get(iter, "d", &fs);
|
|
|
|
elm_win_fullscreen_set(mainwin, fs);
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_set_fullscreen)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_raise)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(has_track_list)
|
|
|
|
{
|
2017-11-17 19:23:16 -08:00
|
|
|
// XXX: Implement Tracklist
|
2017-11-17 05:45:31 -08:00
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_FALSE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(identity)
|
|
|
|
{
|
|
|
|
char buf[] = "Rage";
|
|
|
|
eldbus_message_iter_arguments_append(iter, "s", buf);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(desktop_entry)
|
|
|
|
{
|
|
|
|
char buf[] = "rage";
|
|
|
|
eldbus_message_iter_arguments_append(iter, "s", buf);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(supported_mime_types)
|
|
|
|
{
|
|
|
|
Eldbus_Message_Iter *array = NULL;
|
|
|
|
|
|
|
|
eldbus_message_iter_arguments_append(iter, "as", &array);
|
2017-11-17 19:23:16 -08:00
|
|
|
#define A(s) eldbus_message_iter_arguments_append(array, "s", s)
|
|
|
|
A("application/ogg");
|
|
|
|
|
|
|
|
A("audio/1d-interleaved-parityfec");
|
|
|
|
A("audio/32kadpcm");
|
|
|
|
A("audio/3gpp");
|
|
|
|
A("audio/3gpp2");
|
|
|
|
A("audio/AMR");
|
|
|
|
A("audio/AMR-WB");
|
|
|
|
A("audio/ATRAC-ADVANCED-LOSSLESS");
|
|
|
|
A("audio/ATRAC-X");
|
|
|
|
A("audio/ATRAC3");
|
|
|
|
A("audio/BV16");
|
|
|
|
A("audio/BV32");
|
|
|
|
A("audio/CN");
|
|
|
|
A("audio/DAT12");
|
|
|
|
A("audio/DV");
|
|
|
|
A("audio/DVI4");
|
|
|
|
A("audio/EVRC");
|
|
|
|
A("audio/EVRC-QCP");
|
|
|
|
A("audio/EVRC0");
|
|
|
|
A("audio/EVRC1");
|
|
|
|
A("audio/EVRCB");
|
|
|
|
A("audio/EVRCB0");
|
|
|
|
A("audio/EVRCB1");
|
|
|
|
A("audio/EVRCWB");
|
|
|
|
A("audio/EVRCWB0");
|
|
|
|
A("audio/EVRCWB1");
|
|
|
|
A("audio/G719");
|
|
|
|
A("audio/G722");
|
|
|
|
A("audio/G7221");
|
|
|
|
A("audio/G723");
|
|
|
|
A("audio/G726-16");
|
|
|
|
A("audio/G726-24");
|
|
|
|
A("audio/G726-32");
|
|
|
|
A("audio/G726-40");
|
|
|
|
A("audio/G728");
|
|
|
|
A("audio/G729");
|
|
|
|
A("audio/G7291");
|
|
|
|
A("audio/G729D");
|
|
|
|
A("audio/G729E");
|
|
|
|
A("audio/GSM");
|
|
|
|
A("audio/GSM-EFR");
|
|
|
|
A("audio/GSM-HR-08");
|
|
|
|
A("audio/L16");
|
|
|
|
A("audio/L20");
|
|
|
|
A("audio/L24");
|
|
|
|
A("audio/L8");
|
|
|
|
A("audio/LPC");
|
|
|
|
A("audio/MP4A-LATM");
|
|
|
|
A("audio/MPA");
|
|
|
|
A("audio/PCMA");
|
|
|
|
A("audio/PCMA-WB");
|
|
|
|
A("audio/PCMU");
|
|
|
|
A("audio/PCMU-WB");
|
|
|
|
A("audio/QCELP");
|
|
|
|
A("audio/RED");
|
|
|
|
A("audio/SMV");
|
|
|
|
A("audio/SMV-QCP");
|
|
|
|
A("audio/SMV0");
|
|
|
|
A("audio/UEMCLIP");
|
|
|
|
A("audio/VDVI");
|
|
|
|
A("audio/VMR-WB");
|
|
|
|
A("audio/aac");
|
|
|
|
A("audio/ac3");
|
|
|
|
A("audio/adpcm");
|
|
|
|
A("audio/amr");
|
|
|
|
A("audio/amr-wb");
|
|
|
|
A("audio/amr-wb+");
|
|
|
|
A("audio/annodex");
|
|
|
|
A("audio/asc");
|
|
|
|
A("audio/basic");
|
|
|
|
A("audio/bv16");
|
|
|
|
A("audio/bv32");
|
|
|
|
A("audio/clearmode");
|
|
|
|
A("audio/cn");
|
|
|
|
A("audio/csound");
|
|
|
|
A("audio/dat12");
|
|
|
|
A("audio/dls");
|
|
|
|
A("audio/dsr-es201108");
|
|
|
|
A("audio/dsr-es202050");
|
|
|
|
A("audio/dsr-es202211");
|
|
|
|
A("audio/dsr-es202212");
|
|
|
|
A("audio/dvi4");
|
|
|
|
A("audio/eac3");
|
|
|
|
A("audio/evrc");
|
|
|
|
A("audio/evrc-qcp");
|
|
|
|
A("audio/evrc0");
|
|
|
|
A("audio/evrc1");
|
|
|
|
A("audio/evrcb");
|
|
|
|
A("audio/evrcb0");
|
|
|
|
A("audio/evrcb1");
|
|
|
|
A("audio/evrcwb");
|
|
|
|
A("audio/evrcwb0");
|
|
|
|
A("audio/evrcwb1");
|
|
|
|
A("audio/example");
|
|
|
|
A("audio/flac");
|
|
|
|
A("audio/fwdred");
|
|
|
|
A("audio/g.722.1");
|
|
|
|
A("audio/g719");
|
|
|
|
A("audio/g722");
|
|
|
|
A("audio/g7221");
|
|
|
|
A("audio/g723");
|
|
|
|
A("audio/g726-16");
|
|
|
|
A("audio/g726-24");
|
|
|
|
A("audio/g726-32");
|
|
|
|
A("audio/g726-40");
|
|
|
|
A("audio/g728");
|
|
|
|
A("audio/g729");
|
|
|
|
A("audio/g7291");
|
|
|
|
A("audio/g729d");
|
|
|
|
A("audio/g729e");
|
|
|
|
A("audio/gsm");
|
|
|
|
A("audio/gsm-efr");
|
|
|
|
A("audio/iLBC");
|
|
|
|
A("audio/ilbc");
|
|
|
|
A("audio/ip-mr_v2.5");
|
|
|
|
A("audio/l16");
|
|
|
|
A("audio/l20");
|
|
|
|
A("audio/l24");
|
|
|
|
A("audio/l8");
|
|
|
|
A("audio/lpc");
|
|
|
|
A("audio/midi");
|
|
|
|
A("audio/mobile-xmf");
|
|
|
|
A("audio/mp2");
|
|
|
|
A("audio/mp4");
|
|
|
|
A("audio/mp4a-latm");
|
|
|
|
A("audio/mpa");
|
|
|
|
A("audio/mpa-robust");
|
|
|
|
A("audio/mpeg");
|
|
|
|
A("audio/mpeg4-generic");
|
|
|
|
A("audio/mpegurl");
|
|
|
|
A("audio/ogg");
|
|
|
|
A("audio/parityfec");
|
|
|
|
A("audio/pcma");
|
|
|
|
A("audio/pcma-wb");
|
|
|
|
A("audio/pcmu");
|
|
|
|
A("audio/pcmu-wb");
|
|
|
|
A("audio/prs.sid");
|
|
|
|
A("audio/qcelp");
|
|
|
|
A("audio/raptorfec");
|
|
|
|
A("audio/red");
|
|
|
|
A("audio/rtp-enc-aescm128");
|
|
|
|
A("audio/rtp-midi");
|
|
|
|
A("audio/rtx");
|
|
|
|
A("audio/s3m");
|
|
|
|
A("audio/silk");
|
|
|
|
A("audio/smv");
|
|
|
|
A("audio/smv-qcp");
|
|
|
|
A("audio/smv0");
|
|
|
|
A("audio/sp-midi");
|
|
|
|
A("audio/speex");
|
|
|
|
A("audio/t140c");
|
|
|
|
A("audio/t38");
|
|
|
|
A("audio/telephone-event");
|
|
|
|
A("audio/tone");
|
|
|
|
A("audio/ulpfec");
|
|
|
|
A("audio/vdvi");
|
|
|
|
A("audio/vmr-wb");
|
|
|
|
A("audio/vnd.3gpp.iufp");
|
|
|
|
A("audio/vnd.4SB");
|
|
|
|
A("audio/vnd.4sb");
|
|
|
|
A("audio/vnd.CELP");
|
|
|
|
A("audio/vnd.audiokoz");
|
|
|
|
A("audio/vnd.celp");
|
|
|
|
A("audio/vnd.cisco.nse");
|
|
|
|
A("audio/vnd.cmles.radio-events");
|
|
|
|
A("audio/vnd.cns.anp1");
|
|
|
|
A("audio/vnd.cns.inf1");
|
|
|
|
A("audio/vnd.dece.audio");
|
|
|
|
A("audio/vnd.digital-winds");
|
|
|
|
A("audio/vnd.dlna.adts");
|
|
|
|
A("audio/vnd.dolby.heaac.1");
|
|
|
|
A("audio/vnd.dolby.heaac.2");
|
|
|
|
A("audio/vnd.dolby.mlp");
|
|
|
|
A("audio/vnd.dolby.mps");
|
|
|
|
A("audio/vnd.dolby.pl2");
|
|
|
|
A("audio/vnd.dolby.pl2x");
|
|
|
|
A("audio/vnd.dolby.pl2z");
|
|
|
|
A("audio/vnd.dolby.pulse.1");
|
|
|
|
A("audio/vnd.dra");
|
|
|
|
A("audio/vnd.dts");
|
|
|
|
A("audio/vnd.dts.hd");
|
|
|
|
A("audio/vnd.dvb.file");
|
|
|
|
A("audio/vnd.everad.plj");
|
|
|
|
A("audio/vnd.hns.audio");
|
|
|
|
A("audio/vnd.lucent.voice");
|
|
|
|
A("audio/vnd.rn-realaudio");
|
|
|
|
A("audio/vnd.ms-playready.media.pya");
|
|
|
|
A("audio/vnd.nokia.mobile-xmf");
|
|
|
|
A("audio/vnd.nortel.vbk");
|
|
|
|
A("audio/vnd.nuera.ecelp4800");
|
|
|
|
A("audio/vnd.nuera.ecelp7470");
|
|
|
|
A("audio/vnd.nuera.ecelp9600");
|
|
|
|
A("audio/vnd.octel.sbc");
|
|
|
|
A("audio/vnd.qcelp");
|
|
|
|
A("audio/vnd.rhetorex.32kadpcm");
|
|
|
|
A("audio/vnd.rip");
|
|
|
|
A("audio/vnd.sealedmedia.softseal.mpeg");
|
|
|
|
A("audio/vnd.vmx.cvsd");
|
|
|
|
A("audio/vorbis");
|
|
|
|
A("audio/vorbis-config");
|
|
|
|
A("audio/webm");
|
|
|
|
A("audio/x-aac");
|
|
|
|
A("audio/x-adpcm");
|
|
|
|
A("audio/x-aifc");
|
|
|
|
A("audio/x-aiff");
|
|
|
|
A("audio/x-amzxml");
|
|
|
|
A("audio/x-ape");
|
|
|
|
A("audio/x-caf");
|
|
|
|
A("audio/x-flac");
|
|
|
|
A("audio/x-flac+ogg");
|
|
|
|
A("audio/x-gsm");
|
|
|
|
A("audio/x-iriver-pla");
|
|
|
|
A("audio/x-it");
|
|
|
|
A("audio/x-m4b");
|
|
|
|
A("audio/x-matroska");
|
|
|
|
A("audio/x-minipsf");
|
|
|
|
A("audio/x-mo3");
|
|
|
|
A("audio/x-mod");
|
|
|
|
A("audio/x-mpegurl");
|
|
|
|
A("audio/x-ms-asx");
|
|
|
|
A("audio/x-ms-wax");
|
|
|
|
A("audio/x-ms-wma");
|
|
|
|
A("audio/x-musepack");
|
|
|
|
A("audio/x-opus+ogg");
|
|
|
|
A("audio/x-pn-audibleaudio");
|
|
|
|
A("audio/x-pn-realaudio");
|
|
|
|
A("audio/x-pn-realaudio-plugin");
|
|
|
|
A("audio/x-psf");
|
|
|
|
A("audio/x-psflib");
|
|
|
|
A("audio/x-realaudio");
|
|
|
|
A("audio/x-riff");
|
|
|
|
A("audio/x-s3m");
|
|
|
|
A("audio/x-scpls");
|
|
|
|
A("audio/x-sd2");
|
|
|
|
A("audio/x-speex");
|
|
|
|
A("audio/x-speex+ogg");
|
|
|
|
A("audio/x-stm");
|
|
|
|
A("audio/x-tta");
|
|
|
|
A("audio/x-voc");
|
|
|
|
A("audio/x-vorbis+ogg");
|
|
|
|
A("audio/x-wav");
|
|
|
|
A("audio/x-wavpack");
|
|
|
|
A("audio/x-wavpack-correction");
|
|
|
|
A("audio/x-xi");
|
|
|
|
A("audio/x-xm");
|
|
|
|
A("audio/x-xmf");
|
|
|
|
A("audio/xm");
|
|
|
|
|
|
|
|
A("video/1d-interleaved-parityfec");
|
|
|
|
A("video/3gpp");
|
|
|
|
A("video/3gpp-tt");
|
|
|
|
A("video/3gpp2");
|
|
|
|
A("video/BMPEG");
|
|
|
|
A("video/BT656");
|
|
|
|
A("video/CelB");
|
|
|
|
A("video/DV");
|
|
|
|
A("video/H261");
|
|
|
|
A("video/H263");
|
|
|
|
A("video/H263-1998");
|
|
|
|
A("video/H263-2000");
|
|
|
|
A("video/H264");
|
|
|
|
A("video/H264-RCDO");
|
|
|
|
A("video/H264-SVC");
|
|
|
|
A("video/JPEG");
|
|
|
|
A("video/MJ2");
|
|
|
|
A("video/MP1S");
|
|
|
|
A("video/MP2P");
|
|
|
|
A("video/MP2T");
|
|
|
|
A("video/MP4V-ES");
|
|
|
|
A("video/MPV");
|
|
|
|
A("video/SMPTE292M");
|
|
|
|
A("video/annodex");
|
|
|
|
A("video/bmpeg");
|
|
|
|
A("video/bt656");
|
|
|
|
A("video/celb");
|
|
|
|
A("video/dl");
|
|
|
|
A("video/dv");
|
|
|
|
A("video/example");
|
|
|
|
A("video/fli");
|
|
|
|
A("video/gl");
|
|
|
|
A("video/h261");
|
|
|
|
A("video/h263");
|
|
|
|
A("video/h263-1998");
|
|
|
|
A("video/h263-2000");
|
|
|
|
A("video/h264");
|
|
|
|
A("video/isivideo");
|
|
|
|
A("video/jpeg");
|
|
|
|
A("video/jpeg2000");
|
|
|
|
A("video/jpm");
|
|
|
|
A("video/mj2");
|
|
|
|
A("video/mp1s");
|
|
|
|
A("video/mp2p");
|
|
|
|
A("video/mp2t");
|
|
|
|
A("video/mp4");
|
|
|
|
A("video/mp4v-es");
|
|
|
|
A("video/mpeg");
|
|
|
|
A("video/mpeg4-generic");
|
|
|
|
A("video/mpv");
|
|
|
|
A("video/nv");
|
|
|
|
A("video/ogg");
|
|
|
|
A("video/parityfec");
|
|
|
|
A("video/pointer");
|
|
|
|
A("video/quicktime");
|
|
|
|
A("video/raptorfec");
|
|
|
|
A("video/raw");
|
|
|
|
A("video/rtp-enc-aescm128");
|
|
|
|
A("video/rtx");
|
|
|
|
A("video/smpte292m");
|
|
|
|
A("video/ulpfec");
|
|
|
|
A("video/vc1");
|
|
|
|
A("video/vnd.CCTV");
|
|
|
|
A("video/vnd.cctv");
|
|
|
|
A("video/vnd.dece.hd");
|
|
|
|
A("video/vnd.dece.mobile");
|
|
|
|
A("video/vnd.dece.mp4");
|
|
|
|
A("video/vnd.dece.pd");
|
|
|
|
A("video/vnd.dece.sd");
|
|
|
|
A("video/vnd.dece.video");
|
|
|
|
A("video/vnd.directv.mpeg");
|
|
|
|
A("video/vnd.directv.mpeg-tts");
|
|
|
|
A("video/vnd.dlna.mpeg-tts");
|
|
|
|
A("video/vnd.dvb.file");
|
|
|
|
A("video/vnd.fvt");
|
|
|
|
A("video/vnd.hns.video");
|
|
|
|
A("video/vnd.iptvforum.1dparityfec-1010");
|
|
|
|
A("video/vnd.iptvforum.1dparityfec-2005");
|
|
|
|
A("video/vnd.iptvforum.2dparityfec-1010");
|
|
|
|
A("video/vnd.iptvforum.2dparityfec-2005");
|
|
|
|
A("video/vnd.iptvforum.ttsavc");
|
|
|
|
A("video/vnd.iptvforum.ttsmpeg2");
|
|
|
|
A("video/vnd.motorola.video");
|
|
|
|
A("video/vnd.motorola.videop");
|
|
|
|
A("video/vnd.mpegurl");
|
|
|
|
A("video/vnd.ms-playready.media.pyv");
|
|
|
|
A("video/vnd.mts");
|
|
|
|
A("video/vnd.nokia.interleaved-multimedia");
|
|
|
|
A("video/vnd.nokia.videovoip");
|
|
|
|
A("video/vnd.objectvideo");
|
|
|
|
A("video/vnd.rn-realvideo");
|
|
|
|
A("video/vnd.sealed.mpeg1");
|
|
|
|
A("video/vnd.sealed.mpeg4");
|
|
|
|
A("video/vnd.sealed.swf");
|
|
|
|
A("video/vnd.sealedmedia.softseal.mov");
|
|
|
|
A("video/vnd.uvvu.mp4");
|
|
|
|
A("video/vnd.vivo");
|
|
|
|
A("video/wavelet");
|
|
|
|
A("video/webm");
|
|
|
|
A("video/x-anim");
|
|
|
|
A("video/x-f4v");
|
|
|
|
A("video/x-fli");
|
|
|
|
A("video/x-flic");
|
|
|
|
A("video/x-flv");
|
|
|
|
A("video/x-javafx");
|
|
|
|
A("video/x-la-asf");
|
|
|
|
A("video/x-m4v");
|
|
|
|
A("video/x-matroska");
|
|
|
|
A("video/x-matroska-3d");
|
|
|
|
A("video/x-mng");
|
|
|
|
A("video/x-ms-asf");
|
|
|
|
A("video/x-ms-vob");
|
|
|
|
A("video/x-ms-wm");
|
|
|
|
A("video/x-ms-wmp");
|
|
|
|
A("video/x-ms-wmv");
|
|
|
|
A("video/x-ms-wmx");
|
|
|
|
A("video/x-ms-wvx");
|
|
|
|
A("video/x-msvideo");
|
|
|
|
A("video/x-nsv");
|
|
|
|
A("video/x-ogm+ogg");
|
|
|
|
A("video/x-sgi-movie");
|
|
|
|
A("video/x-smv");
|
|
|
|
A("video/x-theora+ogg");
|
|
|
|
|
|
|
|
// hope the other end understands globs?
|
|
|
|
A("video/*");
|
|
|
|
A("audio/*");
|
2017-11-17 05:45:31 -08:00
|
|
|
eldbus_message_iter_container_close(iter, array);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(supported_uri_schemes)
|
|
|
|
{
|
|
|
|
Eldbus_Message_Iter *array = NULL;
|
|
|
|
|
|
|
|
eldbus_message_iter_arguments_append(iter, "as", &array);
|
2017-11-17 19:23:16 -08:00
|
|
|
A("file");
|
|
|
|
A("http");
|
|
|
|
A("https");
|
|
|
|
A("rtsp");
|
2017-11-17 05:45:31 -08:00
|
|
|
eldbus_message_iter_container_close(iter, array);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const Eldbus_Property properties[] =
|
|
|
|
{
|
|
|
|
PROP_RO("CanQuit", "b", can_quit),
|
|
|
|
PROP_RW("Fullscreen", "b", fullscreen),
|
|
|
|
PROP_RO("CanSetFullscreen", "b", can_set_fullscreen),
|
|
|
|
PROP_RO("CanRaise", "b", can_raise),
|
|
|
|
PROP_RO("HasTrackList", "b", has_track_list),
|
|
|
|
PROP_RO("Identity", "s", identity),
|
|
|
|
PROP_RO("DesktopEntry", "s", desktop_entry),
|
|
|
|
PROP_RO("SupportedMimeTypes", "as", supported_mime_types),
|
|
|
|
PROP_RO("SupportedUriSchemes", "as", supported_uri_schemes),
|
|
|
|
{ 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
API(quit)
|
|
|
|
{
|
|
|
|
evas_object_del(mainwin);
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(raize)
|
|
|
|
{
|
|
|
|
elm_win_raise(mainwin);
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
static const Eldbus_Method methods[] =
|
|
|
|
{
|
|
|
|
METHOD("Quit", NULL, quit),
|
|
|
|
METHOD("Raise", NULL, raize),
|
|
|
|
{ 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const Eldbus_Service_Interface_Desc desc = {
|
|
|
|
"org.mpris.MediaPlayer2", methods, NULL, properties, NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
GETTER(playback_status)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
const char *buf = "Stopped";
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
if (video_play_get(inf->vid)) buf = "Playing";
|
|
|
|
else buf = "Paused";
|
|
|
|
end:
|
|
|
|
eldbus_message_iter_arguments_append(iter, "s", buf);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(loop_status)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
const char *buf = "None";
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
if (video_loop_get(inf->vid)) buf = "Track";
|
|
|
|
else buf = "None";
|
|
|
|
// "Playlist";
|
|
|
|
end:
|
|
|
|
eldbus_message_iter_arguments_append(iter, "s", buf);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
SETTER(loop_status)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
const char *buf = NULL;
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
eldbus_message_iter_arguments_get(iter, "s", &buf);
|
|
|
|
if (buf)
|
|
|
|
{
|
|
|
|
if (!strcmp(buf, "None"))
|
|
|
|
{
|
|
|
|
video_loop_set(inf->vid, EINA_FALSE);
|
|
|
|
mpris_loop_status_change();
|
|
|
|
}
|
|
|
|
else if (!strcmp(buf, "Track"))
|
|
|
|
{
|
|
|
|
video_loop_set(inf->vid, EINA_TRUE);
|
|
|
|
mpris_loop_status_change();
|
|
|
|
}
|
|
|
|
else if (!strcmp(buf, "Playlist"))
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Cannot do playlist loop yet.\n");
|
|
|
|
}
|
|
|
|
if (video_loop_get(inf->vid))
|
|
|
|
elm_layout_signal_emit(inf->lay, "action,loop", "rage");
|
|
|
|
else
|
|
|
|
elm_layout_signal_emit(inf->lay, "action,sequential", "rage");
|
|
|
|
}
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(rate)
|
|
|
|
{
|
|
|
|
double rate = 1.0;
|
2017-11-17 19:23:16 -08:00
|
|
|
// XXX: Implement playback rate
|
2017-11-17 05:45:31 -08:00
|
|
|
eldbus_message_iter_arguments_append(iter, "d", rate);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
SETTER(rate)
|
|
|
|
{
|
|
|
|
double rate = 1.0;
|
2017-11-17 19:23:16 -08:00
|
|
|
// XXX: Implement playback rate
|
2017-11-17 05:45:31 -08:00
|
|
|
eldbus_message_iter_arguments_get(iter, "d", &rate);
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(shuffle)
|
|
|
|
{
|
|
|
|
Eina_Bool shuffle = EINA_FALSE;
|
2017-11-17 19:23:16 -08:00
|
|
|
// XXX: Implement shuffle mode
|
2017-11-17 05:45:31 -08:00
|
|
|
eldbus_message_iter_arguments_append(iter, "b", shuffle);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
SETTER(shuffle)
|
|
|
|
{
|
|
|
|
Eina_Bool shuffle = EINA_FALSE;
|
2017-11-17 19:23:16 -08:00
|
|
|
// XXX: Implement shuffle mode
|
2017-11-17 05:45:31 -08:00
|
|
|
fprintf(stderr, "Cannot set shuffle mode yet.\n");
|
|
|
|
eldbus_message_iter_arguments_get(iter, "b", &shuffle);
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
GETTER(metadata)
|
|
|
|
{
|
|
|
|
// XXX: return metadata
|
|
|
|
eldbus_message_iter_arguments_append(iter, "a{sv}", NULL);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
GETTER(volume)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
double vol = 1.0;
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
vol = video_volume_get(inf->vid);
|
|
|
|
end:
|
|
|
|
eldbus_message_iter_arguments_append(iter, "d", vol);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
SETTER(volume)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
double vol = 1.0; // max
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
eldbus_message_iter_arguments_get(iter, "d", &vol);
|
|
|
|
if (vol < 0.0) vol = 0.0;
|
|
|
|
if (vol > 1.0) vol = 1.0;
|
|
|
|
video_volume_set(inf->vid, vol);
|
|
|
|
mpris_volume_change();
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(position)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
uint64_t pos = 0;
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
pos = video_position_get(inf->vid) * 1000000.0;
|
|
|
|
end:
|
|
|
|
eldbus_message_iter_arguments_append(iter, "x", pos);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(minimum_rate)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "d", 1.0);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(maximum_rate)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "d", 1.0);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_go_next)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_go_previous)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_play)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_pause)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_seek)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GETTER(can_control)
|
|
|
|
{
|
|
|
|
eldbus_message_iter_arguments_append(iter, "b", EINA_TRUE);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const Eldbus_Property properties_player[] =
|
|
|
|
{
|
|
|
|
PROP_RO("PlaybackStatus", "s", playback_status),
|
|
|
|
PROP_RW("LoopStatus", "s", loop_status),
|
|
|
|
PROP_RW("Rate", "d", rate),
|
|
|
|
PROP_RW("Shuffle", "b", shuffle),
|
|
|
|
// PROP_RO("Metadata", "a{sv}", metadata),
|
|
|
|
PROP_RW("Volume", "d", volume),
|
|
|
|
PROP_RO("Position", "x", position),
|
|
|
|
PROP_RO("MinimumRate", "d", minimum_rate),
|
|
|
|
PROP_RO("MaximumRate", "d", maximum_rate),
|
|
|
|
PROP_RO("CanGoNext", "b", can_go_next),
|
|
|
|
PROP_RO("CanGoPrevious", "b", can_go_previous),
|
|
|
|
PROP_RO("CanPlay", "b", can_play),
|
|
|
|
PROP_RO("CanPause", "b", can_pause),
|
|
|
|
PROP_RO("CanSeek", "b", can_seek),
|
|
|
|
PROP_RO("CanControl", "b", can_control),
|
|
|
|
{ 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
API(next)
|
|
|
|
{
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
win_do_next(mainwin);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(previous)
|
|
|
|
{
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
win_do_prev(mainwin);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(pause)
|
|
|
|
{
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
win_do_pause(mainwin);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(play_pause)
|
|
|
|
{
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
win_do_play_pause(mainwin);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(stop)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
video_stop(inf->vid);
|
|
|
|
elm_layout_signal_emit(inf->lay, "action,stop", "rage");
|
|
|
|
elm_layout_signal_emit(inf->lay, "state,default", "rage");
|
|
|
|
if (inf->browse_mode) browser_show(mainwin);
|
|
|
|
else evas_object_del(mainwin);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(play)
|
|
|
|
{
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
win_do_play(mainwin);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
API(seek)
|
|
|
|
{
|
|
|
|
Inf *inf = evas_object_data_get(mainwin, "inf");
|
|
|
|
uint64_t pos = 0;
|
|
|
|
|
|
|
|
if (!inf) goto end;
|
|
|
|
if (browser_visible()) goto end;
|
|
|
|
if (!eldbus_message_arguments_get(msg, "x", &pos))
|
|
|
|
return eldbus_message_error_new(msg, "Invalid arguments", "Error getting position");
|
|
|
|
video_position_set(inf->vid, (double)pos / 1000000.0);
|
|
|
|
end:
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
2017-11-17 19:23:16 -08:00
|
|
|
/*
|
2017-11-17 05:45:31 -08:00
|
|
|
API(set_position)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Cannot do set_position yet.\n");
|
|
|
|
// XXX: get track + position
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
2017-11-17 19:23:16 -08:00
|
|
|
*/
|
2017-11-17 05:45:31 -08:00
|
|
|
|
|
|
|
API(open_uri)
|
|
|
|
{
|
|
|
|
char *uri = NULL;
|
|
|
|
|
|
|
|
if (!eldbus_message_arguments_get(msg, "s", &uri))
|
|
|
|
return eldbus_message_error_new(msg, "Invalid arguments", "Error getting URI string");
|
|
|
|
win_video_insert(mainwin, uri);
|
|
|
|
win_video_next(mainwin);
|
|
|
|
win_list_content_update(mainwin);
|
|
|
|
browser_hide(mainwin);
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
static const Eldbus_Method methods_player[] =
|
|
|
|
{
|
|
|
|
METHOD("Next", NULL, next),
|
|
|
|
METHOD("Previous", NULL, previous),
|
|
|
|
METHOD("Pause", NULL, pause),
|
|
|
|
METHOD("PlayPause", NULL, play_pause),
|
|
|
|
METHOD("Stop", NULL, stop),
|
|
|
|
METHOD("Play", NULL, play),
|
|
|
|
METHOD("Seek", ELDBUS_ARGS({"x", "Offset"}), seek),
|
2017-11-17 19:23:16 -08:00
|
|
|
// METHOD("SetPosition", ELDBUS_ARGS({ "ox", "Path,Position"}), set_position),
|
2017-11-17 05:45:31 -08:00
|
|
|
METHOD("OpenUri", ELDBUS_ARGS({"s", "Uri"}), open_uri),
|
|
|
|
{ 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const Eldbus_Signal signals_player[] =
|
|
|
|
{
|
|
|
|
[ 0 ] = { "Seeked", ELDBUS_ARGS({ "x", "Position" }), 0 },
|
|
|
|
{ 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const Eldbus_Service_Interface_Desc desc_player = {
|
|
|
|
"org.mpris.MediaPlayer2.Player", methods_player, signals_player, properties_player, NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_fullscreen_change(void)
|
|
|
|
{
|
|
|
|
if (!iface) return;
|
|
|
|
eldbus_service_property_changed(iface, "Fullscreen");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_volume_change(void)
|
|
|
|
{
|
|
|
|
if (!iface_player) return;
|
|
|
|
eldbus_service_property_changed(iface_player, "Volume");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_loop_status_change(void)
|
|
|
|
{
|
|
|
|
if (!iface_player) return;
|
|
|
|
eldbus_service_property_changed(iface_player, "LoopStatus");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_playback_status_change(void)
|
|
|
|
{
|
|
|
|
if (!iface_player) return;
|
|
|
|
eldbus_service_property_changed(iface_player, "PlaybackStatus");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_position_change(double pos)
|
|
|
|
{
|
|
|
|
uint64_t p = pos * 1000000.0;
|
|
|
|
|
|
|
|
if (!iface_player) return;
|
|
|
|
eldbus_service_signal_emit(iface_player, 0, p);
|
|
|
|
eldbus_service_property_changed(iface_player, "Position");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_init(Evas_Object *win)
|
|
|
|
{
|
|
|
|
elm_need_eldbus();
|
|
|
|
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
|
|
|
|
if (!conn) return;
|
|
|
|
mainwin = win;
|
|
|
|
eldbus_name_request(conn, SERVICE, 0, _cb_name_request, NULL);
|
|
|
|
iface = eldbus_service_interface_register(conn, PATH, &desc);
|
|
|
|
iface_player = eldbus_service_interface_register(conn, PATH, &desc_player);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mpris_shutdown(void)
|
|
|
|
{
|
|
|
|
if (!conn) return;
|
|
|
|
mainwin = NULL;
|
|
|
|
// if (iface_player) eldbus_service_object_unregister(iface_player);
|
|
|
|
iface_player = NULL;
|
|
|
|
// if (iface) eldbus_service_object_unregister(iface);
|
|
|
|
iface = NULL;
|
|
|
|
// eldbus_name_release(conn, SERVICE, NULL, NULL);
|
|
|
|
// eldbus_connection_unref(conn);
|
|
|
|
conn = NULL;
|
|
|
|
}
|