232
231
myData.iSongLength = 0;
233
232
myData.iTrackNumber = 0;
234
233
myData.cover_exist = FALSE;
236
cd_musicplayer_dbus_detect_player ();
238
235
cd_musicplayer_update_icon (TRUE);
239
236
CD_APPLET_LEAVE ();
242
/* Fonction executée à chaque changement "paused".
239
/* Fonction executee à chaque changement "paused".
244
static void onChangePlaying (DBusGProxy *player_proxy, gpointer data) // paused
241
static void on_pause (DBusGProxy *player_proxy, gpointer data) // paused
247
244
cd_debug ("MP : %s ()\n", __func__);
248
myData.bIsRunning = TRUE;
250
246
myData.iPlayingStatus = PLAYER_PAUSED;
292
287
// Definition du backend. //
293
288
////////////////////////////
295
/* Fonction de connexion au bus de QL.
297
static gboolean _cd_quodlibet_dbus_connect_to_bus (void)
299
if (cairo_dock_dbus_is_enabled ())
301
myData.dbus_enable = cd_musicplayer_dbus_connect_to_bus (); // cree le proxy.
303
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "paused",
305
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "paused",
306
G_CALLBACK(onChangePlaying), NULL, NULL);
308
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "unpaused",
310
G_TYPE_INVALID); // idem.
311
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "unpaused",
312
G_CALLBACK(onChangePlaying2), NULL, NULL);
314
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "song-started",
315
QL_DBUS_TYPE_SONG_METADATA,
317
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "song-started",
318
G_CALLBACK(onChangeSong), NULL, NULL);
325
/* Permet de libérer la mémoire prise par le backend.
327
void cd_quodlibet_free_data (void)
329
if (myData.dbus_proxy_player != NULL)
331
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "paused",
332
G_CALLBACK(onChangePlaying), NULL);
334
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "unpaused",
335
G_CALLBACK(onChangePlaying2), NULL);
337
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "song-started",
338
G_CALLBACK(onChangeSong), NULL);
340
musicplayer_dbus_disconnect_from_bus();
343
290
/* Controle du lecteur
345
void cd_quodlibet_control (MyPlayerControl pControl, const char* song)
292
static void cd_quodlibet_control (MyPlayerControl pControl, const char* song)
347
294
const gchar *cCommand = NULL;
367
314
if (cCommand != NULL)
369
cd_debug ("MP : Handeler QuodLibet : will use '%s'", cCommand);
316
cd_debug ("MP : Handler QuodLibet : will use '%s'", cCommand);
370
317
cairo_dock_dbus_call (myData.dbus_proxy_player, cCommand);
374
321
/* Recupere le temps ecoule chaque seconde (pas de signal pour ca).
376
static void cd_quodlibet_read_data (void)
323
static void cd_quodlibet_get_data (void)
378
if (myData.dbus_enable)
325
if (myData.iPlayingStatus == PLAYER_PLAYING)
380
if (myData.bIsRunning)
382
if (myData.iPlayingStatus == PLAYER_PLAYING)
384
_quodlibet_get_time_elapsed ();
385
if (myData.iCurrentTime < 0)
386
myData.iPlayingStatus = PLAYER_STOPPED;
388
else if (myData.iPlayingStatus != PLAYER_PAUSED) // en pause le temps reste constant.
389
myData.iCurrentTime = 0;
393
myData.iCurrentTime = 0;
395
cd_message (" myData.iCurrentTime <- %d", __func__, myData.iCurrentTime);
327
_quodlibet_get_time_elapsed ();
328
if (myData.iCurrentTime < 0)
329
myData.iPlayingStatus = PLAYER_STOPPED;
331
else if (myData.iPlayingStatus != PLAYER_PAUSED) // en pause le temps reste constant.
332
myData.iCurrentTime = 0;
399
335
/* Initialise le backend de QL.
401
static void cd_quodlibet_configure (void)
337
static void cd_quodlibet_start (void)
403
myData.DBus_commands.service = "net.sacredchao.QuodLibet";
404
myData.DBus_commands.path = "/net/sacredchao/QuodLibet";
405
myData.DBus_commands.interface = "net.sacredchao.QuodLibet";
339
// register to the signals
340
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "paused",
342
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "paused",
343
G_CALLBACK(on_pause), NULL, NULL);
345
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "unpaused",
347
G_TYPE_INVALID); // idem.
348
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "unpaused",
349
G_CALLBACK(on_unpaused), NULL, NULL);
351
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "song-started",
352
QL_DBUS_TYPE_SONG_METADATA,
354
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "song-started",
355
G_CALLBACK(onChangeSong), NULL, NULL);
407
myData.dbus_enable = _cd_quodlibet_dbus_connect_to_bus (); // se connecte au bus et aux signaux de QL.
408
if (myData.dbus_enable)
410
cd_musicplayer_dbus_detect_player (); // on teste la presence de QL sur le bus <=> s'il est ouvert ou pas.
411
if(myData.bIsRunning) // player en cours d'execution, on recupere son etat.
413
cd_debug ("MP : QL is running\n");
414
_quodlibet_getPlaying ();
415
cd_quodlibet_getSongInfos ();
416
cd_musicplayer_update_icon (TRUE);
418
else // player eteint.
420
cd_musicplayer_set_surface (PLAYER_NONE);
423
else // sinon on signale par l'icone appropriee que le bus n'est pas accessible.
425
cd_musicplayer_set_surface (PLAYER_BROKEN);
357
// get the current state.
358
_quodlibet_getPlaying ();
359
cd_quodlibet_getSongInfos ();
360
cd_musicplayer_update_icon (TRUE);
432
366
void cd_musicplayer_register_quodlibet_handler (void)
434
MusicPlayerHandeler *pQuodlibet = g_new0 (MusicPlayerHandeler, 1);
435
pQuodlibet->read_data = cd_quodlibet_read_data;
436
pQuodlibet->free_data = cd_quodlibet_free_data;
437
pQuodlibet->configure = cd_quodlibet_configure; // renseigne les proprietes DBus et se connecte au bus.
438
pQuodlibet->control = cd_quodlibet_control;
439
pQuodlibet->get_cover = NULL;
440
pQuodlibet->cCoverDir = NULL; /// il me semble que QL gere les pochettes ...
442
pQuodlibet->iPlayerControls = PLAYER_PREVIOUS | PLAYER_PLAY_PAUSE | PLAYER_NEXT;
443
pQuodlibet->appclass = "quodlibet";
444
pQuodlibet->launch = "quodlibet";
445
pQuodlibet->name = "QuodLibet";
446
pQuodlibet->cMprisService = "net.sacredchao.QuodLibet";
447
pQuodlibet->iPlayer = MP_QUODLIBET;
448
pQuodlibet->bSeparateAcquisition = FALSE;
449
pQuodlibet->iLevel = PLAYER_GOOD; // n'a besoin d'une boucle que pour afficher le temps ecoule.
450
cd_musicplayer_register_my_handler (pQuodlibet, "QuodLibet");
368
MusicPlayerHandler *pHandler = g_new0 (MusicPlayerHandler, 1);
369
pHandler->name = "QuodLibet";
370
pHandler->get_data = cd_quodlibet_get_data;
371
pHandler->stop = NULL;
372
pHandler->start = cd_quodlibet_start;
373
pHandler->control = cd_quodlibet_control;
374
pHandler->get_cover = NULL;
375
pHandler->cCoverDir = NULL; /// il me semble que QL gere les pochettes ...
377
pHandler->iPlayerControls = PLAYER_PREVIOUS | PLAYER_PLAY_PAUSE | PLAYER_NEXT;
378
pHandler->appclass = "quodlibet";
379
pHandler->launch = "quodlibet";
380
pHandler->cMprisService = "net.sacredchao.QuodLibet";
381
pHandler->path = "/net/sacredchao/QuodLibet";
382
pHandler->interface = "net.sacredchao.QuodLibet";
383
pHandler->path2 = NULL;
384
pHandler->interface2 = NULL;
386
pHandler->bSeparateAcquisition = FALSE;
387
pHandler->iLevel = PLAYER_GOOD; // n'a besoin d'une boucle que pour afficher le temps ecoule.
388
cd_musicplayer_register_my_handler (pHandler);