28
28
#include "applet-dbus.h"
29
29
#include "applet-draw.h"
30
30
#include "applet-cover.h"
31
#include "applet-mpris.h"
31
32
#include "applet-audacious.h"
33
34
#define MP_DBUS_TYPE_PLAYER_STATUS_MPRIS (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
34
35
#define MP_DBUS_TYPE_PLAYER_STATUS G_TYPE_INT
36
gboolean bMpris = FALSE;
39
38
<node name="/Player">
40
39
22 <interface name="org.freedesktop.MediaPlayer">
132
131
/////////////////////////////////
133
132
// Les Fonctions propres a AU. //
134
133
/////////////////////////////////
135
static inline void _extract_playing_status_mpris (GValueArray *status)
137
cd_debug ("%s ()\n", __func__);
139
GValue *value = g_value_array_get_nth (status, 0);
140
if (value != NULL && G_VALUE_HOLDS_INT(value))
141
iStatus = g_value_get_int (value);
143
cd_warning ("value : %x doesn't hold an int\n", value);
144
cd_debug (" => iStatus : %d\n", iStatus);
149
myData.iPlayingStatus = PLAYER_PLAYING;
152
myData.iPlayingStatus = PLAYER_PAUSED;
156
myData.iPlayingStatus = PLAYER_STOPPED;
160
static inline void _extract_playing_status (gint status)
162
cd_debug ("%s ()\n", __func__);
163
int iStatus = status;
164
cd_debug (" => iStatus : %d\n", iStatus);
169
myData.iPlayingStatus = PLAYER_PLAYING;
172
myData.iPlayingStatus = PLAYER_PAUSED;
176
myData.iPlayingStatus = PLAYER_STOPPED;
182
/* Teste si Audacious joue de la musique ou non
184
static void _audacious_getPlaying_mpris (void)
186
cd_debug ("%s ()\n", __func__);
187
GError *erreur = NULL;
189
dbus_g_proxy_call (myData.dbus_proxy_player, "GetStatus", &erreur, // Audacious's GetStatus() does not comply with MPRIS spec, it returns a single Int32
191
MP_DBUS_TYPE_PLAYER_STATUS_MPRIS, &status,
195
cd_warning (erreur->message);
196
g_error_free (erreur);
197
myData.iPlayingStatus = PLAYER_NONE;
201
_extract_playing_status_mpris (status);
204
static void _audacious_getPlaying (void)
206
cd_debug ("%s ()\n", __func__);
207
GError *erreur = NULL;
209
dbus_g_proxy_call (myData.dbus_proxy_player, "GetStatus", &erreur, // Audacious's GetStatus() does not comply with MPRIS spec, it returns a single Int32
211
MP_DBUS_TYPE_PLAYER_STATUS, &status,
215
cd_warning (erreur->message);
216
g_error_free (erreur);
217
myData.iPlayingStatus = PLAYER_NONE;
221
_extract_playing_status (status);
226
/* Renvoie le temps ecoule en secondes..
228
static void _audacious_get_time_elapsed (void)
230
myData.iCurrentTime = cairo_dock_dbus_get_integer (myData.dbus_proxy_player, "PositionGet") / 1000;
231
//cd_debug ("myData.iCurrentTime <- %d\n", myData.iCurrentTime);
235
135
static inline void _extract_metadata (GHashTable *data_list)
270
170
cd_message (" cTitle <- %s", myData.cTitle);
272
value = (GValue *) g_hash_table_lookup(data_list, "track-number");
172
value = (GValue *) g_hash_table_lookup(data_list, "tracknumber");
273
173
if (value == NULL)
274
value = (GValue *) g_hash_table_lookup(data_list, "tracknumber");
174
value = (GValue *) g_hash_table_lookup(data_list, "track-number"); // old parameter.
275
175
if (value != NULL && G_VALUE_HOLDS_INT(value))
276
176
myData.iTrackNumber = g_value_get_int(value);
278
myData.iTrackNumber = cairo_dock_dbus_get_integer (myData.dbus_proxy_shell, "GetCurrentTrack");
178
myData.iTrackNumber = 0.;
279
179
cd_message (" iTrackNumber <- %d", myData.iTrackNumber);
281
value = (GValue *) g_hash_table_lookup(data_list, "length");
181
value = (GValue *) g_hash_table_lookup(data_list, "mtime");
183
value = (GValue *) g_hash_table_lookup(data_list, "length"); // old parameter.
282
184
if (value != NULL && G_VALUE_HOLDS_INT(value)) myData.iSongLength = g_value_get_int(value) / 1000;
283
185
else myData.iSongLength = 0;
284
186
cd_message (" iSongLength <- %ds", myData.iSongLength);
364
269
CD_APPLET_LEAVE ();
367
/* Fonction executée à chaque changement play/pause
369
static void onChangePlaying_mpris (DBusGProxy *player_proxy, GValueArray *status, gpointer data)
372
cd_debug ("MP : %s (%x)\n", __func__, status);
373
myData.bIsRunning = TRUE;
374
_extract_playing_status_mpris (status);
376
if(! myData.cover_exist && (myData.cPlayingUri != NULL || myData.cTitle != NULL))
378
cd_musicplayer_set_surface (myData.iPlayingStatus);
382
CD_APPLET_REDRAW_MY_ICON;
386
static void onChangePlaying(DBusGProxy *player_proxy, gint status, gpointer data)
389
cd_debug ("MP : %s (%d)\n", __func__, status);
390
myData.bIsRunning = TRUE;
391
//_extract_playing_status (status);
393
_audacious_getPlaying_mpris (); // Audacious 2.1 is buggy, the signal marshaller doesn't comply with MPRIS but the "get" function does, so we use it to get the status when we receive the signal.
395
if (myData.iPlayingStatus == PLAYER_PLAYING)
396
cd_musicplayer_relaunch_handler ();
397
if(! myData.cover_exist && myData.cPlayingUri != NULL)
399
cd_musicplayer_set_surface (myData.iPlayingStatus);
403
CD_APPLET_REDRAW_MY_ICON;
410
273
////////////////////////////
411
274
// Definition du backend. //
416
279
static gboolean _cd_audacious_dbus_connect_to_bus (void)
418
if (cairo_dock_bdus_is_enabled ())
281
if (cairo_dock_dbus_is_enabled ())
420
283
myData.dbus_enable = cd_musicplayer_dbus_connect_to_bus (); // cree le proxy.
422
285
myData.dbus_enable_shell = musicplayer_dbus_connect_to_bus_Shell (); // cree le proxy pour la 2eme interface car AU en a 2.
426
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "StatusChange",
427
MP_DBUS_TYPE_PLAYER_STATUS_MPRIS,
429
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "StatusChange",
430
G_CALLBACK(onChangePlaying_mpris), NULL, NULL);
432
else // buggy version (2.1), the signal marshaller is wrong, but is sent correctly.
434
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "StatusChange",
435
MP_DBUS_TYPE_PLAYER_STATUS,
437
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "StatusChange",
438
G_CALLBACK(onChangePlaying), NULL, NULL);
287
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "StatusChange",
288
MP_DBUS_TYPE_PLAYER_STATUS_MPRIS,
290
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "StatusChange",
291
G_CALLBACK(onChangePlaying_mpris), NULL, NULL);
441
293
dbus_g_proxy_add_signal(myData.dbus_proxy_player, "TrackChange",
442
294
MP_DBUS_TYPE_SONG_METADATA,
444
296
dbus_g_proxy_connect_signal(myData.dbus_proxy_player, "TrackChange",
445
G_CALLBACK(onChangeSong), NULL, NULL);
297
G_CALLBACK(onChangeSong), NULL, NULL); // pas de TrackListChange, donc on fera tout dedans.
456
308
if (myData.dbus_proxy_player != NULL)
459
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "StatusChange",
460
G_CALLBACK(onChangePlaying_mpris), NULL);
462
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "StatusChange",
463
G_CALLBACK(onChangePlaying), NULL);
310
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "StatusChange",
311
G_CALLBACK(onChangePlaying_mpris), NULL);
465
313
dbus_g_proxy_disconnect_signal(myData.dbus_proxy_player, "TrackChange",
466
314
G_CALLBACK(onChangeSong), NULL);
624
475
pAudacious->get_cover = NULL;
625
476
pAudacious->cCoverDir = NULL; /// a confirmer...
627
pAudacious->appclass = "audacious"; // en fait Audacious.
478
pAudacious->appclass = "audacious"; // les classes sont passees en minuscule par le dock.
628
479
pAudacious->name = "Audacious";
629
480
pAudacious->launch = "audacious2";
630
481
pAudacious->cMprisService = "org.mpris.audacious";