From de57f6735cacf007e72dc57c1e6c3947f8725a4b Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Sat, 18 Nov 2017 12:23:16 +0900 Subject: [PATCH] mpris support - tidy up make sure XXX's are for things to do still, list all the mime types fully that i can find (well ok - should get from emotion but it doesnt expose this), and dont expose functions that don't work in the dbus api and note what is imcomplete at the top this should dot i's and cross t's on the mpris support for now. --- src/bin/mpris.c | 422 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 406 insertions(+), 16 deletions(-) diff --git a/src/bin/mpris.c b/src/bin/mpris.c index 17303b6..2820c12 100644 --- a/src/bin/mpris.c +++ b/src/bin/mpris.c @@ -17,9 +17,11 @@ static Eldbus_Service_Interface *iface_player = NULL; #define PATH "/org/mpris/MediaPlayer2" static void -_cb_name_request(void *data EINA_UNUSED, const Eldbus_Message *msg, +_cb_name_request(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED) { + return; +/* unsigned int flag; if (eldbus_message_error_get(msg, NULL, NULL)) @@ -34,10 +36,23 @@ _cb_name_request(void *data EINA_UNUSED, const Eldbus_Message *msg, } if (!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER)) fprintf(stderr, "Name already in use\n"); + */ } -/* +/* Implementing almost all of: + * https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html + * + * Not implemented: + * Tracklist objects + * Metadata + * SetPosition (requires Tracklist objects) + * + * In rage generally and here: + * + * Loop playlist vs just loop current + * Shuffle play + * Playback rate */ #define API(fn) \ @@ -106,6 +121,7 @@ GETTER(can_raise) GETTER(has_track_list) { + // XXX: Implement Tracklist eldbus_message_iter_arguments_append(iter, "b", EINA_FALSE); return EINA_TRUE; } @@ -113,7 +129,6 @@ GETTER(has_track_list) GETTER(identity) { char buf[] = "Rage"; - eldbus_message_iter_arguments_append(iter, "s", buf); return EINA_TRUE; } @@ -130,11 +145,383 @@ GETTER(supported_mime_types) Eldbus_Message_Iter *array = NULL; eldbus_message_iter_arguments_append(iter, "as", &array); - eldbus_message_iter_arguments_append(array, "s", "application/ogg"); - eldbus_message_iter_arguments_append(array, "s", "video/mpeg"); - eldbus_message_iter_arguments_append(array, "s", "audio/*"); - eldbus_message_iter_arguments_append(array, "s", "video/*"); - eldbus_message_iter_arguments_append(array, "s", "item3"); +#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/*"); eldbus_message_iter_container_close(iter, array); return EINA_TRUE; } @@ -144,10 +531,10 @@ GETTER(supported_uri_schemes) Eldbus_Message_Iter *array = NULL; eldbus_message_iter_arguments_append(iter, "as", &array); - eldbus_message_iter_arguments_append(array, "s", "file"); - eldbus_message_iter_arguments_append(array, "s", "http"); - eldbus_message_iter_arguments_append(array, "s", "https"); - eldbus_message_iter_arguments_append(array, "s", "rtsp"); + A("file"); + A("http"); + A("https"); + A("rtsp"); eldbus_message_iter_container_close(iter, array); return EINA_TRUE; } @@ -260,6 +647,7 @@ end: GETTER(rate) { double rate = 1.0; + // XXX: Implement playback rate eldbus_message_iter_arguments_append(iter, "d", rate); return EINA_TRUE; } @@ -267,6 +655,7 @@ GETTER(rate) SETTER(rate) { double rate = 1.0; + // XXX: Implement playback rate eldbus_message_iter_arguments_get(iter, "d", &rate); return eldbus_message_method_return_new(msg); } @@ -274,6 +663,7 @@ SETTER(rate) GETTER(shuffle) { Eina_Bool shuffle = EINA_FALSE; + // XXX: Implement shuffle mode eldbus_message_iter_arguments_append(iter, "b", shuffle); return EINA_TRUE; } @@ -281,6 +671,7 @@ GETTER(shuffle) SETTER(shuffle) { Eina_Bool shuffle = EINA_FALSE; + // XXX: Implement shuffle mode fprintf(stderr, "Cannot set shuffle mode yet.\n"); eldbus_message_iter_arguments_get(iter, "b", &shuffle); return eldbus_message_method_return_new(msg); @@ -467,7 +858,6 @@ API(seek) if (!inf) goto end; if (browser_visible()) goto end; - // XXX: seek to pos in usec 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); @@ -475,18 +865,19 @@ end: return eldbus_message_method_return_new(msg); } +/* API(set_position) { fprintf(stderr, "Cannot do set_position yet.\n"); // XXX: get track + position return eldbus_message_method_return_new(msg); } +*/ API(open_uri) { char *uri = NULL; - // XXX: handle uri open 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); @@ -505,7 +896,7 @@ static const Eldbus_Method methods_player[] = METHOD("Stop", NULL, stop), METHOD("Play", NULL, play), METHOD("Seek", ELDBUS_ARGS({"x", "Offset"}), seek), - METHOD("SetPosition", ELDBUS_ARGS({ "ox", "Path,Position"}), set_position), +// METHOD("SetPosition", ELDBUS_ARGS({ "ox", "Path,Position"}), set_position), METHOD("OpenUri", ELDBUS_ARGS({"s", "Uri"}), open_uri), { 0 } }; @@ -515,7 +906,6 @@ static const Eldbus_Signal signals_player[] = [ 0 ] = { "Seeked", ELDBUS_ARGS({ "x", "Position" }), 0 }, { 0 } }; -// XXX: Signal: Seeked (x: Position) static const Eldbus_Service_Interface_Desc desc_player = { "org.mpris.MediaPlayer2.Player", methods_player, signals_player, properties_player, NULL, NULL