239
237
// Definition du backend. //
240
238
////////////////////////////
242
/* Fonction de connexion au bus de rhythmbox.
244
gboolean cd_rhythmbox_dbus_connect_to_bus (void)
246
if (cairo_dock_dbus_is_enabled ())
248
myData.dbus_enable = cd_musicplayer_dbus_connect_to_bus (); // cree le proxy.
250
myData.dbus_enable_shell = musicplayer_dbus_connect_to_bus_Shell (); // cree le proxy pour la 2eme interface car RB en a 2.
252
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "playingChanged",
256
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "playingUriChanged",
260
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "elapsedChanged",
265
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "playingSongPropertyChanged",
272
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "playingChanged",
273
G_CALLBACK(onChangePlaying), NULL, NULL);
275
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "playingUriChanged",
276
G_CALLBACK(onChangeSong), NULL, NULL);
278
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "elapsedChanged",
279
G_CALLBACK(onElapsedChanged), NULL, NULL);
281
/*dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "playingSongPropertyChanged",
282
G_CALLBACK(onSongPropertyChanged), NULL, NULL);*/
289
/* Permet de libérer la mémoire prise par notre controleur
291
void cd_rhythmbox_free_data (void) {
292
if (myData.dbus_proxy_player != NULL)
294
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "playingChanged",
295
G_CALLBACK(onChangePlaying), NULL);
297
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "playingUriChanged",
298
G_CALLBACK(onChangeSong), NULL);
300
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "elapsedChanged",
301
G_CALLBACK(onElapsedChanged), NULL);
303
/*dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "playingSongPropertyChanged",
304
G_CALLBACK(onSongPropertyChanged), NULL);*/
307
musicplayer_dbus_disconnect_from_bus();
308
musicplayer_dbus_disconnect_from_bus_Shell();
312
240
/* Controle du lecteur (permet d'effectuer les actions de bases sur le lecteur)
314
242
void cd_rhythmbox_control (MyPlayerControl pControl, const char* song)
365
293
/* Initialise le backend de RB.
367
void cd_rhythmbox_configure (void)
370
myData.DBus_commands.service = "org.gnome.Rhythmbox";
371
myData.DBus_commands.path = "/org/gnome/Rhythmbox/Player";
372
myData.DBus_commands.path2 = "/org/gnome/Rhythmbox/Shell";
373
myData.DBus_commands.interface = "org.gnome.Rhythmbox.Player";
374
myData.DBus_commands.interface2 = "org.gnome.Rhythmbox.Shell";
375
myData.DBus_commands.play = "playPause";
376
myData.DBus_commands.pause = "playPause";
377
myData.DBus_commands.stop = "";
378
myData.DBus_commands.next = "next";
379
myData.DBus_commands.previous = "previous";
381
myData.dbus_enable = cd_rhythmbox_dbus_connect_to_bus (); // se connecte au bus et aux signaux de RB.
382
if (myData.dbus_enable)
384
cd_musicplayer_dbus_detect_player (); // on teste la presence de RB sur le bus <=> s'il est ouvert ou pas.
385
if(myData.bIsRunning) // player en cours d'execution, on recupere son etat.
387
cd_debug ("MP : RB is running");
388
_rhythmbox_getPlaying();
389
_rhythmbox_getPlayingUri();
390
cd_rhythmbox_getSongInfos (TRUE); // TRUE <=> get all
391
cd_musicplayer_update_icon (TRUE);
393
else // player eteint.
395
cd_musicplayer_set_surface (PLAYER_NONE);
398
else // sinon on signale par l'icone appropriee que le bus n'est pas accessible.
400
cd_musicplayer_set_surface (PLAYER_BROKEN);
295
static void cd_rhythmbox_start (void)
297
// register to the signals
298
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "playingChanged",
301
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "playingChanged",
302
G_CALLBACK(onChangePlaying), NULL, NULL);
304
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "playingUriChanged",
307
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "playingUriChanged",
308
G_CALLBACK(onChangeSong), NULL, NULL);
310
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "elapsedChanged",
313
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "elapsedChanged",
314
G_CALLBACK(onElapsedChanged), NULL, NULL);
316
/*TODO (or maybe not, if they included MPRIS2)
317
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "playingSongPropertyChanged",
323
/*dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "playingSongPropertyChanged",
324
G_CALLBACK(onSongPropertyChanged), NULL, NULL);*/
326
// get the current state.
327
_rhythmbox_getPlaying();
328
_rhythmbox_getPlayingUri();
329
cd_rhythmbox_getSongInfos (TRUE); // TRUE <=> get all
330
cd_musicplayer_update_icon (TRUE);
334
* We can't test if a bus is available because the dock is launched after.
335
* Or we have to connect to a bus before and react if there is something after...
336
* but it's a bit annoying because we have to register the handler and then disable it (e.g. MPRIS vs MPRIS2)!
337
* But with the version 2.90 of RB, we have to use MPRIS2 because rhythmbox-client is unavailable.
339
static gboolean _is_MPRIS2_available (void)
341
gchar *cResult = cairo_dock_launch_command_sync ("which rhythmbox-client");
342
gboolean bResult = ! (cResult != NULL && *cResult == '/');
404
347
/* On enregistre notre lecteur.
406
349
void cd_musicplayer_register_rhythmbox_handler (void)
409
MusicPlayerHandeler *pRhythmbox = g_new0 (MusicPlayerHandeler, 1);
410
pRhythmbox->read_data = NULL; // rien a faire vu que l'echange de donnees se fait entierement avec les proxys DBus.
411
pRhythmbox->free_data = cd_rhythmbox_free_data;
412
pRhythmbox->configure = cd_rhythmbox_configure; // renseigne les proprietes DBus et se connecte au bus.
413
pRhythmbox->control = cd_rhythmbox_control;
414
pRhythmbox->get_cover = cd_rhythmbox_get_cover_path;
416
pRhythmbox->appclass = "rhythmbox";
417
pRhythmbox->name = "Rhythmbox";
418
pRhythmbox->launch = "rhythmbox";
419
pRhythmbox->cMprisService = "org.gnome.Rhythmbox";
420
pRhythmbox->cCoverDir = g_strdup_printf ("%s/.cache/rhythmbox/covers", g_getenv ("HOME"));
421
pRhythmbox->iPlayer = MP_RHYTHMBOX;
422
pRhythmbox->bSeparateAcquisition = FALSE;
423
pRhythmbox->iPlayerControls = PLAYER_PREVIOUS | PLAYER_PLAY_PAUSE | PLAYER_NEXT | PLAYER_ENQUEUE;
424
pRhythmbox->iLevel = PLAYER_EXCELLENT;
426
cd_musicplayer_register_my_handler(pRhythmbox, "rhythmbox");
351
if (_is_MPRIS2_available ())
353
cd_debug ("MP - MPRIS2 for RB seems to be available");
354
MusicPlayerHandler *pHandler = cd_mpris_new_handler ();
355
pHandler->cMprisService = "org.mpris.MediaPlayer2.rhythmbox";
356
pHandler->appclass = "rhythmbox";
357
pHandler->launch = "rhythmbox";
358
pHandler->name = "Rhythmbox";
359
cd_musicplayer_register_my_handler (pHandler);
360
myData.bForceCoverNeedsTest = TRUE; // it seems RB copy the cover on its cache but it takes a few time...
364
cd_debug ("MP - Used RB DBus methods");
365
MusicPlayerHandler *pHandler = g_new0 (MusicPlayerHandler, 1);
366
pHandler->name = "Rhythmbox";
367
pHandler->get_data = NULL; // rien a faire vu que l'echange de donnees se fait entierement avec les proxys DBus.
368
pHandler->stop = NULL; // signals are disconnected when the proxy is destroyed.
369
pHandler->start = cd_rhythmbox_start; // renseigne les proprietes DBus et se connecte au bus.
370
pHandler->control = cd_rhythmbox_control;
371
pHandler->get_cover = cd_rhythmbox_get_cover_path;
373
pHandler->appclass = "rhythmbox";
374
pHandler->launch = "rhythmbox";
375
pHandler->cMprisService = "org.gnome.Rhythmbox";
376
pHandler->path = "/org/gnome/Rhythmbox/Player";
377
pHandler->interface = "org.gnome.Rhythmbox.Player";
378
pHandler->path2 = "/org/gnome/Rhythmbox/Shell";
379
pHandler->interface2 = "org.gnome.Rhythmbox.Shell";
381
pHandler->cCoverDir = g_strdup_printf ("%s/.cache/rhythmbox/covers", g_getenv ("HOME"));
382
pHandler->bSeparateAcquisition = FALSE;
383
pHandler->iPlayerControls = PLAYER_PREVIOUS | PLAYER_PLAY_PAUSE | PLAYER_NEXT | PLAYER_ENQUEUE;
384
pHandler->iLevel = PLAYER_EXCELLENT;
386
cd_musicplayer_register_my_handler(pHandler);