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