Audacious  $Id:Doxyfile42802007-03-2104:39:00Znenolod$
dbus.c
Go to the documentation of this file.
1 /*
2  * dbus.c
3  * Copyright 2007-2011 Ben Tucker, Yoshiki Yazawa, William Pitcock,
4  * Matti Hämäläinen, Andrew Shadoura, John Lindgren, and
5  * Tomasz Moń
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  * this list of conditions, and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions, and the following disclaimer in the documentation
15  * provided with the distribution.
16  *
17  * This software is provided "as is" and without any warranty, express or
18  * implied. In no event shall the authors be liable for any damages arising from
19  * the use of this software.
20  */
21 
22 #include <glib.h>
23 #include <string.h>
24 
25 #include <dbus/dbus.h>
26 #include <dbus/dbus-glib.h>
27 #include <dbus/dbus-glib-bindings.h>
28 #include <dbus/dbus-glib-lowlevel.h>
29 #include "dbus.h"
30 #include "dbus-service.h"
31 #include "dbus-server-bindings.h"
32 
33 #include <math.h>
34 
35 #include <libaudcore/hook.h>
36 
37 #include "debug.h"
38 #include "drct.h"
39 #include "playlist.h"
40 #include "interface.h"
41 #include "misc.h"
42 
43 static DBusGConnection *dbus_conn = NULL;
44 static unsigned int signals[LAST_SIG] = { 0 };
45 static unsigned int tracklist_signals[LAST_TRACKLIST_SIG] = { 0 };
46 
49 
50 G_DEFINE_TYPE (RemoteObject, audacious_rc, G_TYPE_OBJECT)
51 G_DEFINE_TYPE (MprisRoot, mpris_root, G_TYPE_OBJECT)
52 G_DEFINE_TYPE (MprisPlayer, mpris_player, G_TYPE_OBJECT)
53 G_DEFINE_TYPE (MprisTrackList, mpris_tracklist, G_TYPE_OBJECT)
54 
55 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
56 
57 static void mpris_playlist_update_hook(void * unused, MprisTrackList *obj);
58 
60 {
61 }
62 
64 {
65 }
66 
68 {
69  signals[CAPS_CHANGE_SIG] = g_signal_new("caps_change", G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
71  g_signal_new("track_change",
72  G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, DBUS_TYPE_G_STRING_VALUE_HASHTABLE);
73 
74  GType status_type = dbus_g_type_get_struct ("GValueArray", G_TYPE_INT,
75  G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID);
77  g_signal_new ("status_change", G_OBJECT_CLASS_TYPE (klass),
78  G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL,
79  g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, status_type);
80 }
81 
83 {
84  tracklist_signals[TRACKLIST_CHANGE_SIG] = g_signal_new("track_list_change", G_OBJECT_CLASS_TYPE(klass),
85  G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
86 }
87 
89 {
90  GError *error = NULL;
91  DBusGProxy *driver_proxy;
92  unsigned int request_ret;
93 
94  AUDDBG ("Registering remote D-Bus interfaces.\n");
95 
96  dbus_g_object_type_install_info(audacious_rc_get_type(), &dbus_glib_audacious_rc_object_info);
97 
98  // Register DBUS path
99  dbus_g_connection_register_g_object(dbus_conn, AUDACIOUS_DBUS_PATH, G_OBJECT(object));
100 
101  // Register the service name, the constants here are defined in
102  // dbus-glib-bindings.h
103  driver_proxy = dbus_g_proxy_new_for_name(dbus_conn, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
104 
105  if (!org_freedesktop_DBus_request_name(driver_proxy, AUDACIOUS_DBUS_SERVICE, 0, &request_ret, &error))
106  {
107  g_warning("Unable to register service: %s", error->message);
108  g_error_free(error);
109  }
110 
111  if (!org_freedesktop_DBus_request_name(driver_proxy, AUDACIOUS_DBUS_SERVICE_MPRIS, 0, &request_ret, &error))
112  {
113  g_warning("Unable to register service: %s", error->message);
114  g_error_free(error);
115  }
116 
117  g_object_unref(driver_proxy);
118 }
119 
120 void mpris_root_init(MprisRoot * object)
121 {
122  dbus_g_object_type_install_info(mpris_root_get_type(), &dbus_glib_mpris_root_object_info);
123 
124  // Register DBUS path
125  dbus_g_connection_register_g_object(dbus_conn, AUDACIOUS_DBUS_PATH_MPRIS_ROOT, G_OBJECT(object));
126 }
127 
128 void mpris_player_init(MprisPlayer * object)
129 {
130  dbus_g_object_type_install_info(mpris_player_get_type(), &dbus_glib_mpris_player_object_info);
131 
132  // Register DBUS path
133  dbus_g_connection_register_g_object(dbus_conn, AUDACIOUS_DBUS_PATH_MPRIS_PLAYER, G_OBJECT(object));
134 
135  // Add signals
136  DBusGProxy *proxy = object->proxy;
137  if (proxy != NULL)
138  {
139  dbus_g_proxy_add_signal (proxy, "StatusChange", dbus_g_type_get_struct
140  ("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
141  G_TYPE_INVALID), G_TYPE_INVALID);
142  dbus_g_proxy_add_signal (proxy, "CapsChange", G_TYPE_INT, G_TYPE_INVALID);
143  dbus_g_proxy_add_signal(proxy, "TrackChange", DBUS_TYPE_G_STRING_VALUE_HASHTABLE, G_TYPE_INVALID);
144  }
145  else
146  {
147  /* XXX / FIXME: Why does this happen? -- ccr */
148  AUDDBG ("object->proxy == NULL; not adding some signals.\n");
149  }
150 }
151 
152 void mpris_tracklist_init(MprisTrackList * object)
153 {
154  dbus_g_object_type_install_info(mpris_tracklist_get_type(), &dbus_glib_mpris_tracklist_object_info);
155 
156  // Register DBUS path
157  dbus_g_connection_register_g_object(dbus_conn, AUDACIOUS_DBUS_PATH_MPRIS_TRACKLIST, G_OBJECT(object));
158 
159  // Add signals
160  DBusGProxy *proxy = object->proxy;
161  if (proxy != NULL)
162  {
163  dbus_g_proxy_add_signal(proxy, "TrackListChange", G_TYPE_INT, G_TYPE_INVALID);
164  }
165  else
166  {
167  /* XXX / FIXME: Why does this happen? -- ccr */
168  AUDDBG ("object->proxy == NULL, not adding some signals.\n");
169  }
170 }
171 
172 void init_dbus()
173 {
174  GError *error = NULL;
175  DBusConnection *local_conn;
176 
177  AUDDBG ("Trying to initialize D-Bus.\n");
178  dbus_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
179  if (dbus_conn == NULL)
180  {
181  g_warning("Unable to connect to dbus: %s", error->message);
182  g_error_free(error);
183  return;
184  }
185 
186  g_object_new(audacious_rc_get_type(), NULL);
187  g_object_new(mpris_root_get_type(), NULL);
188  mpris = g_object_new(mpris_player_get_type(), NULL);
189  mpris_tracklist = g_object_new(mpris_tracklist_get_type(), NULL);
190 
191  local_conn = dbus_g_connection_get_connection(dbus_conn);
192  dbus_connection_set_exit_on_disconnect(local_conn, FALSE);
193 
194  hook_associate ("playlist update",
195  (HookFunction) mpris_playlist_update_hook, mpris_tracklist);
196 }
197 
198 void cleanup_dbus (void)
199 {
201 }
202 
203 static GValue *tuple_value_to_gvalue(const Tuple * tuple, const char * key)
204 {
205  GValue *val;
206  TupleValueType type = tuple_get_value_type (tuple, -1, key);
207 
208  if (type == TUPLE_STRING)
209  {
210  val = g_new0(GValue, 1);
211  g_value_init(val, G_TYPE_STRING);
212  char * str = tuple_get_str (tuple, -1, key);
213  g_value_set_string (val, str);
214  str_unref (str);
215  return val;
216  }
217  else if (type == TUPLE_INT)
218  {
219  val = g_new0(GValue, 1);
220  g_value_init(val, G_TYPE_INT);
221  int x = tuple_get_int (tuple, -1, key);
222  g_value_set_int (val, x);
223  return val;
224  }
225  return NULL;
226 }
227 
236 static void tuple_insert_to_hash_full(GHashTable * md, const Tuple * tuple,
237  const char * tuple_key, const char *key)
238 {
239  GValue *value = tuple_value_to_gvalue(tuple, tuple_key);
240  if (value != NULL)
241  g_hash_table_insert (md, (void *) key, value);
242 }
243 
244 static void tuple_insert_to_hash(GHashTable * md, const Tuple * tuple,
245  const char *key)
246 {
247  tuple_insert_to_hash_full(md, tuple, key, key);
248 }
249 
250 static void remove_metadata_value(void * value)
251 {
252  g_value_unset((GValue *) value);
253  g_free((GValue *) value);
254 }
255 
256 static GHashTable *make_mpris_metadata(const char * filename, const Tuple * tuple)
257 {
258  GHashTable *md = NULL;
259  void * value;
260 
261  md = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, remove_metadata_value);
262 
263  value = g_malloc(sizeof(GValue));
264  memset(value, 0, sizeof(GValue));
265  g_value_init(value, G_TYPE_STRING);
266  g_value_take_string(value, g_strdup(filename));
267  g_hash_table_insert(md, "location", value);
268 
269  if (tuple != NULL)
270  {
271  tuple_insert_to_hash_full(md, tuple, "length", "mtime");
272  tuple_insert_to_hash(md, tuple, "title");
273  tuple_insert_to_hash(md, tuple, "artist");
274  tuple_insert_to_hash(md, tuple, "album");
275  tuple_insert_to_hash(md, tuple, "comment");
276  tuple_insert_to_hash(md, tuple, "genre");
277  tuple_insert_to_hash(md, tuple, "year");
278  tuple_insert_to_hash(md, tuple, "codec");
279  tuple_insert_to_hash(md, tuple, "quality");
280  tuple_insert_to_hash_full(md, tuple, "track-number", "tracknumber");
281  tuple_insert_to_hash_full(md, tuple, "bitrate", "audio-bitrate");
282  }
283 
284  return md;
285 }
286 
287 static GValue * get_field (int playlist, int entry, const char * field)
288 {
289  Tuple * tuple = playlist_entry_get_tuple (playlist, entry, FALSE);
290  GValue * value = tuple ? tuple_value_to_gvalue (tuple, field) : NULL;
291 
292  if (tuple)
293  tuple_unref (tuple);
294 
295  return value;
296 }
297 
298 static GHashTable * get_mpris_metadata (int playlist, int entry)
299 {
300  char * filename = playlist_entry_get_filename (playlist, entry);
301  Tuple * tuple = playlist_entry_get_tuple (playlist, entry, FALSE);
302 
303  GHashTable * metadata = NULL;
304  if (filename && tuple)
305  metadata = make_mpris_metadata (filename, tuple);
306 
307  str_unref (filename);
308  if (tuple)
309  tuple_unref (tuple);
310 
311  return metadata;
312 }
313 
314 /* MPRIS API */
315 // MPRIS /
316 bool_t mpris_root_identity(MprisRoot * obj, char ** identity, GError ** error)
317 {
318  *identity = g_strdup_printf("Audacious %s", VERSION);
319  return TRUE;
320 }
321 
322 bool_t mpris_root_quit(MprisPlayer * obj, GError ** error)
323 {
324  event_queue("quit", NULL);
325  return TRUE;
326 }
327 
328 // MPRIS /Player
329 
330 bool_t mpris_player_next (MprisPlayer * obj, GError * * error)
331 {
332  drct_pl_next ();
333  return TRUE;
334 }
335 
336 bool_t mpris_player_prev (MprisPlayer * obj, GError * * error)
337 {
338  drct_pl_prev ();
339  return TRUE;
340 }
341 
342 bool_t mpris_player_pause (MprisPlayer * obj, GError * * error)
343 {
344  drct_pause ();
345  return TRUE;
346 }
347 
348 bool_t mpris_player_stop (MprisPlayer * obj, GError * * error)
349 {
350  drct_stop ();
351  return TRUE;
352 }
353 
354 bool_t mpris_player_play (MprisPlayer * obj, GError * * error)
355 {
356  drct_play ();
357  return TRUE;
358 }
359 
360 bool_t mpris_player_repeat(MprisPlayer * obj, bool_t rpt, GError ** error)
361 {
362  set_bool (NULL, "repeat", rpt);
363  return TRUE;
364 }
365 
366 static void append_int_value(GValueArray * ar, int tmp)
367 {
368  GValue value;
369  memset(&value, 0, sizeof(value));
370  g_value_init(&value, G_TYPE_INT);
371  g_value_set_int(&value, tmp);
372  g_value_array_append(ar, &value);
373 }
374 
375 static int get_playback_status (void)
376 {
377  if (! drct_get_playing ())
378  return MPRIS_STATUS_STOP;
379 
381 }
382 
383 bool_t mpris_player_get_status(MprisPlayer * obj, GValueArray * *status, GError * *error)
384 {
385  *status = g_value_array_new(4);
386 
387  append_int_value(*status, (int) get_playback_status());
388  append_int_value (* status, get_bool (NULL, "shuffle"));
389  append_int_value (* status, get_bool (NULL, "no_playlist_advance"));
390  append_int_value (* status, get_bool (NULL, "repeat"));
391  return TRUE;
392 }
393 
394 bool_t mpris_player_get_metadata (MprisPlayer * obj, GHashTable * * metadata,
395  GError * * error)
396 {
398  int entry = (playlist >= 0) ? playlist_get_position (playlist) : -1;
399 
400  * metadata = (entry >= 0) ? get_mpris_metadata (playlist, entry) : NULL;
401  if (! * metadata)
402  * metadata = g_hash_table_new (g_str_hash, g_str_equal);
403 
404  return TRUE;
405 }
406 
407 bool_t mpris_player_get_caps(MprisPlayer * obj, int * capabilities, GError ** error)
408 {
410  return TRUE;
411 }
412 
413 bool_t mpris_player_volume_set(MprisPlayer * obj, int vol, GError ** error)
414 {
415  drct_set_volume_main (vol);
416  return TRUE;
417 }
418 
419 bool_t mpris_player_volume_get(MprisPlayer * obj, int * vol, GError ** error)
420 {
421  drct_get_volume_main (vol);
422  return TRUE;
423 }
424 
425 bool_t mpris_player_position_set (MprisPlayer * obj, int pos, GError * * error)
426 {
427  drct_seek (pos);
428  return TRUE;
429 }
430 
431 bool_t mpris_player_position_get (MprisPlayer * obj, int * pos, GError * * error)
432 {
433  * pos = drct_get_time ();
434  return TRUE;
435 }
436 
437 // MPRIS /Player signals
438 bool_t mpris_emit_caps_change(MprisPlayer * obj)
439 {
440  g_signal_emit(obj, signals[CAPS_CHANGE_SIG], 0, 0);
441  return TRUE;
442 }
443 
444 bool_t mpris_emit_track_change(MprisPlayer * obj)
445 {
446  int playlist, entry;
447  GHashTable *metadata;
448 
449  playlist = playlist_get_playing();
450  entry = playlist_get_position(playlist);
451  char * filename = playlist_entry_get_filename (playlist, entry);
452  Tuple * tuple = playlist_entry_get_tuple (playlist, entry, FALSE);
453 
454  if (filename && tuple)
455  {
456  metadata = make_mpris_metadata (filename, tuple);
457  g_signal_emit (obj, signals[TRACK_CHANGE_SIG], 0, metadata);
458  g_hash_table_destroy (metadata);
459  }
460 
461  str_unref (filename);
462  if (tuple)
463  tuple_unref (tuple);
464 
465  return (filename && tuple);
466 }
467 
469 {
470  GValueArray *ar = g_value_array_new(4);
471 
472  if (status == MPRIS_STATUS_INVALID)
473  status = get_playback_status ();
474 
475  append_int_value(ar, (int) status);
476  append_int_value (ar, get_bool (NULL, "shuffle"));
477  append_int_value (ar, get_bool (NULL, "no_playlist_advance"));
478  append_int_value (ar, get_bool (NULL, "repeat"));
479 
480  g_signal_emit(obj, signals[STATUS_CHANGE_SIG], 0, ar);
481  g_value_array_free(ar);
482  return TRUE;
483 }
484 
485 // MPRIS /TrackList
486 bool_t mpris_emit_tracklist_change(MprisTrackList * obj, int playlist)
487 {
488  g_signal_emit(obj, tracklist_signals[TRACKLIST_CHANGE_SIG], 0, playlist_entry_count(playlist));
489  return TRUE;
490 }
491 
492 static void mpris_playlist_update_hook(void * unused, MprisTrackList * obj)
493 {
495 
496  mpris_emit_tracklist_change(obj, playlist);
497 }
498 
499 bool_t mpris_tracklist_get_metadata (MprisTrackList * obj, int pos,
500  GHashTable * * metadata, GError * * error)
501 {
502  * metadata = get_mpris_metadata (playlist_get_active (), pos);
503  if (! * metadata)
504  * metadata = g_hash_table_new (g_str_hash, g_str_equal);
505 
506  return TRUE;
507 }
508 
509 bool_t mpris_tracklist_get_current_track (MprisTrackList * obj, int * pos,
510  GError * * error)
511 {
513  return TRUE;
514 }
515 
516 bool_t mpris_tracklist_get_length (MprisTrackList * obj, int * length, GError * * error)
517 {
519  return TRUE;
520 }
521 
522 bool_t mpris_tracklist_add_track (MprisTrackList * obj, char * uri, bool_t play,
523  GError * * error)
524 {
525  playlist_entry_insert (playlist_get_active (), -1, uri, NULL, play);
526  return TRUE;
527 }
528 
529 bool_t mpris_tracklist_del_track (MprisTrackList * obj, int pos, GError * * error)
530 {
532  return TRUE;
533 }
534 
535 bool_t mpris_tracklist_loop (MprisTrackList * obj, bool_t loop, GError * *
536  error)
537 {
538  set_bool (NULL, "repeat", loop);
539  return TRUE;
540 }
541 
542 bool_t mpris_tracklist_random (MprisTrackList * obj, bool_t random,
543  GError * * error)
544 {
545  set_bool (NULL, "shuffle", random);
546  return TRUE;
547 }
548 
549 // Audacious General Information
551 {
552  *version = g_strdup(VERSION);
553  return TRUE;
554 }
555 
557 {
558  event_queue("quit", NULL);
559  return TRUE;
560 }
561 
563 {
565  return TRUE;
566 }
567 
569  bool_t * visible, GError ** error)
570 {
571  * visible = interface_is_shown ();
572  return TRUE;
573 }
574 
576  GError * * error)
577 {
578  interface_show (show);
579  return TRUE;
580 }
581 
582 bool_t audacious_rc_get_tuple_fields(RemoteObject * obj, char *** fields, GError ** error)
583 {
584  * fields = g_new (char *, TUPLE_FIELDS);
585 
586  for (int i = 0; i < TUPLE_FIELDS; i ++)
587  (* fields)[i] = g_strdup (tuple_field_get_name (i));
588 
589  (* fields)[TUPLE_FIELDS] = NULL;
590  return TRUE;
591 }
592 
593 
594 // Playback Information/Manipulation
595 
597 {
598  drct_play ();
599  return TRUE;
600 }
601 
603 {
604  drct_pause ();
605  return TRUE;
606 }
607 
609 {
610  drct_stop ();
611  return TRUE;
612 }
613 
614 bool_t audacious_rc_playing (RemoteObject * obj, bool_t * is_playing, GError * * error)
615 {
616  * is_playing = drct_get_playing ();
617  return TRUE;
618 }
619 
620 bool_t audacious_rc_paused (RemoteObject * obj, bool_t * is_paused, GError * * error)
621 {
622  * is_paused = drct_get_paused ();
623  return TRUE;
624 }
625 
626 bool_t audacious_rc_stopped (RemoteObject * obj, bool_t * is_stopped, GError * * error)
627 {
628  * is_stopped = ! drct_get_playing ();
629  return TRUE;
630 }
631 
632 bool_t audacious_rc_status (RemoteObject * obj, char * * status, GError * * error)
633 {
634  if (drct_get_playing ())
635  * status = strdup (drct_get_paused () ? "paused" : "playing");
636  else
637  * status = strdup ("stopped");
638 
639  return TRUE;
640 }
641 
642 bool_t audacious_rc_info (RemoteObject * obj, int * rate, int * freq, int * nch,
643  GError * * error)
644 {
645  drct_get_info (rate, freq, nch);
646  return TRUE;
647 }
648 
649 bool_t audacious_rc_time (RemoteObject * obj, int * time, GError * * error)
650 {
651  * time = drct_get_time ();
652  return TRUE;
653 }
654 
655 bool_t audacious_rc_seek (RemoteObject * obj, unsigned int pos, GError * * error)
656 {
657  drct_seek (pos);
658  return TRUE;
659 }
660 
661 bool_t audacious_rc_volume(RemoteObject * obj, int * vl, int * vr, GError ** error)
662 {
663  drct_get_volume (vl, vr);
664  return TRUE;
665 }
666 
667 bool_t audacious_rc_set_volume(RemoteObject * obj, int vl, int vr, GError ** error)
668 {
669  drct_set_volume (vl, vr);
670  return TRUE;
671 }
672 
673 bool_t audacious_rc_balance(RemoteObject * obj, int * balance, GError ** error)
674 {
675  drct_get_volume_balance (balance);
676  return TRUE;
677 }
678 
679 // Playlist Information/Manipulation
680 
681 bool_t audacious_rc_position (RemoteObject * obj, int * pos, GError * * error)
682 {
684  return TRUE;
685 }
686 
688 {
689  drct_pl_next ();
690  return TRUE;
691 }
692 
694 {
695  drct_pl_prev ();
696  return TRUE;
697 }
698 
699 bool_t audacious_rc_length (RemoteObject * obj, int * length, GError * * error)
700 {
702  return TRUE;
703 }
704 
705 bool_t audacious_rc_song_title (RemoteObject * obj, unsigned int pos, char * *
706  title, GError * * error)
707 {
708  char * title2 = playlist_entry_get_title (playlist_get_active (), pos, FALSE);
709  if (! title2)
710  return FALSE;
711 
712  * title = strdup (title2);
713  str_unref (title2);
714  return TRUE;
715 }
716 
718  char * * filename, GError * * error)
719 {
720  char * filename2 = playlist_entry_get_filename (playlist_get_active (), pos);
721  if (! filename2)
722  return FALSE;
723 
724  * filename = strdup (filename2);
725  str_unref (filename2);
726  return TRUE;
727 }
728 
729 bool_t audacious_rc_song_length(RemoteObject * obj, unsigned int pos, int * length, GError * *error)
730 {
731  audacious_rc_song_frames(obj, pos, length, error);
732  *length /= 1000;
733  return TRUE;
734 }
735 
736 bool_t audacious_rc_song_frames (RemoteObject * obj, unsigned int pos, int *
737  length, GError * * error)
738 {
740  return TRUE;
741 }
742 
743 bool_t audacious_rc_song_tuple (RemoteObject * obj, unsigned int pos, char *
744  field, GValue * value, GError * * error)
745 {
746  GValue * value2 = get_field (playlist_get_active (), pos, field);
747  if (! value2)
748  return FALSE;
749 
750  memset (value, 0, sizeof (GValue));
751  g_value_init (value, G_VALUE_TYPE (value2));
752  g_value_copy (value2, value);
753  g_value_unset (value2);
754  g_free (value2);
755  return TRUE;
756 }
757 
758 bool_t audacious_rc_jump (RemoteObject * obj, unsigned int pos, GError * * error)
759 {
761  return TRUE;
762 }
763 
764 bool_t audacious_rc_add(RemoteObject * obj, char * file, GError * *error)
765 {
766  return audacious_rc_playlist_ins_url_string(obj, file, -1, error);
767 }
768 
769 bool_t audacious_rc_add_url(RemoteObject * obj, char * file, GError * *error)
770 {
771  return audacious_rc_playlist_ins_url_string(obj, file, -1, error);
772 }
773 
774 static Index * strings_to_index (char * * strings)
775 {
776  Index * index = index_new ();
777 
778  while (* strings)
779  index_append (index, str_get (* strings ++));
780 
781  return index;
782 }
783 
785  GError * * error)
786 {
787  drct_pl_add_list (strings_to_index (filenames), -1);
788  return TRUE;
789 }
790 
792  GError * * error)
793 {
794  drct_pl_open_list (strings_to_index (filenames));
795  return TRUE;
796 }
797 
799  filenames, GError * * error)
800 {
802  return TRUE;
803 }
804 
805 bool_t audacious_rc_delete (RemoteObject * obj, unsigned int pos, GError * * error)
806 {
808  return TRUE;
809 }
810 
812 {
813  int playlist = playlist_get_active ();
814  playlist_entry_delete (playlist, 0, playlist_entry_count (playlist));
815  return TRUE;
816 }
817 
819 {
820  * is_advance = ! get_bool (NULL, "no_playlist_advance");
821  return TRUE;
822 }
823 
825 {
826  set_bool (NULL, "no_playlist_advance", ! get_bool (NULL, "no_playlist_advance"));
827  return TRUE;
828 }
829 
830 bool_t audacious_rc_repeat(RemoteObject * obj, bool_t * is_repeating, GError ** error)
831 {
832  *is_repeating = get_bool (NULL, "repeat");
833  return TRUE;
834 }
835 
837 {
838  set_bool (NULL, "repeat", ! get_bool (NULL, "repeat"));
839  return TRUE;
840 }
841 
842 bool_t audacious_rc_shuffle(RemoteObject * obj, bool_t * is_shuffling, GError ** error)
843 {
844  *is_shuffling = get_bool (NULL, "shuffle");
845  return TRUE;
846 }
847 
849 {
850  set_bool (NULL, "shuffle", ! get_bool (NULL, "shuffle"));
851  return TRUE;
852 }
853 
854 bool_t audacious_rc_stop_after (RemoteObject * obj, bool_t * is_stopping, GError * * error)
855 {
856  * is_stopping = get_bool (NULL, "stop_after_current_song");
857  return TRUE;
858 }
859 
861 {
862  set_bool (NULL, "stop_after_current_song", ! get_bool (NULL, "stop_after_current_song"));
863  return TRUE;
864 }
865 
866 /* New on Oct 5 */
868 {
869  event_queue("prefswin show", GINT_TO_POINTER(show));
870  return TRUE;
871 }
872 
874 {
875  event_queue("aboutwin show", GINT_TO_POINTER(show));
876  return TRUE;
877 }
878 
880 {
881  if (show)
883 
884  return TRUE;
885 }
886 
888 {
889  if (show)
891 
892  return TRUE;
893 }
894 
896 {
897  drct_play_pause ();
898  return TRUE;
899 }
900 
901 bool_t audacious_rc_get_info (RemoteObject * obj, int * rate, int * freq,
902  int * nch, GError * * error)
903 {
904  drct_get_info (rate, freq, nch);
905  return TRUE;
906 }
907 
909 {
910  hook_call("mainwin set always on top", &ontop);
911  return TRUE;
912 }
913 
915 {
917  return TRUE;
918 }
919 
921 {
922  int playlist = playlist_get_active ();
923  int at = playlist_queue_find_entry (playlist, pos);
924 
925  if (at >= 0)
926  playlist_queue_delete (playlist, at, 1);
927 
928  return TRUE;
929 }
930 
932 {
933  int playlist = playlist_get_active ();
934  playlist_queue_delete (playlist, 0, playlist_queue_count (playlist));
935  return TRUE;
936 }
937 
939  GError * * error)
940 {
942  return TRUE;
943 }
944 
946  GError * * error)
947 {
949  return TRUE;
950 }
951 
953  qpos, GError * * error)
954 {
956  return TRUE;
957 }
958 
960  is_queued, GError * * error)
961 {
962  * is_queued = (playlist_queue_find_entry (playlist_get_active (), pos) >= 0);
963  return TRUE;
964 }
965 
967  pos, GError * * error)
968 {
970  return TRUE;
971 }
972 
973 bool_t audacious_rc_playlist_add(RemoteObject * obj, void *list, GError * *error)
974 {
975  return audacious_rc_playlist_ins_url_string(obj, list, -1, error);
976 }
977 
979  GError * * error)
980 {
981  drct_pl_open_temp (url);
982  return TRUE;
983 }
984 
985 /* New on Nov 7: Equalizer */
986 bool_t audacious_rc_get_eq(RemoteObject * obj, double * preamp, GArray ** bands, GError ** error)
987 {
988  * preamp = get_double (NULL, "equalizer_preamp");
989  * bands = g_array_new (FALSE, FALSE, sizeof (double));
990  g_array_set_size (* bands, AUD_EQUALIZER_NBANDS);
991  eq_get_bands ((double *) (* bands)->data);
992 
993  return TRUE;
994 }
995 
996 bool_t audacious_rc_get_eq_preamp(RemoteObject * obj, double * preamp, GError ** error)
997 {
998  * preamp = get_double (NULL, "equalizer_preamp");
999  return TRUE;
1000 }
1001 
1002 bool_t audacious_rc_get_eq_band(RemoteObject * obj, int band, double * value, GError ** error)
1003 {
1004  * value = eq_get_band (band);
1005  return TRUE;
1006 }
1007 
1008 bool_t audacious_rc_set_eq(RemoteObject * obj, double preamp, GArray * bands, GError ** error)
1009 {
1010  set_double (NULL, "equalizer_preamp", preamp);
1011  eq_set_bands ((double *) bands->data);
1012  return TRUE;
1013 }
1014 
1015 bool_t audacious_rc_set_eq_preamp(RemoteObject * obj, double preamp, GError ** error)
1016 {
1017  set_double (NULL, "equalizer_preamp", preamp);
1018  return TRUE;
1019 }
1020 
1021 bool_t audacious_rc_set_eq_band(RemoteObject * obj, int band, double value, GError ** error)
1022 {
1023  eq_set_band (band, value);
1024  return TRUE;
1025 }
1026 
1028 {
1029  set_bool (NULL, "equalizer_active", active);
1030  return TRUE;
1031 }
1032 
1034  title, GError * * error)
1035 {
1036  char * title2 = playlist_get_title (playlist_get_active ());
1037  * title = strdup (title2);
1038  str_unref (title2);
1039  return TRUE;
1040 }
1041 
1042 DBusGProxy *audacious_get_dbus_proxy(void)
1043 {
1044  DBusGConnection *connection = NULL;
1045  GError *error = NULL;
1046  connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
1047  g_clear_error(&error);
1048  return dbus_g_proxy_new_for_name(connection, AUDACIOUS_DBUS_SERVICE, AUDACIOUS_DBUS_PATH, AUDACIOUS_DBUS_INTERFACE);
1049 }
void drct_play(void)
Definition: drct.c:38
#define AUDACIOUS_DBUS_SERVICE
Definition: dbus.h:25
void drct_set_volume(int l, int r)
Definition: playback.c:615
bool_t audacious_rc_play(RemoteObject *obj, GError **error)
Definition: dbus.c:596
bool_t mpris_tracklist_random(MprisTrackList *obj, bool_t random, GError **error)
Definition: dbus.c:542
int playlist_get_playing(void)
Definition: playlist-new.c:921
bool_t interface_is_shown(void)
Definition: interface.c:72
void playlist_entry_insert(int playlist, int at, const char *filename, Tuple *tuple, bool_t play)
Definition: adder.c:516
bool_t audacious_rc_show_filebrowser(RemoteObject *obj, bool_t show, GError **error)
Definition: dbus.c:887
Index Index play fast playlist_entry_get_title
Definition: playlist-api.h:158
void drct_set_volume_main(int volume)
Definition: drct.c:88
bool_t mpris_player_position_set(MprisPlayer *obj, int pos, GError **error)
Definition: dbus.c:425
int playlist_queue_find_entry(int playlist_num, int entry_num)
void playlist_queue_insert(int playlist_num, int at, int entry_num)
EXPORT Index * index_new(void)
Definition: index.c:41
int playlist_get_active(void)
Definition: playlist-new.c:861
bool_t audacious_rc_get_active_playlist_name(RemoteObject *obj, char **title, GError **error)
Definition: dbus.c:1033
bool_t audacious_rc_toggle_stop_after(RemoteObject *obj, GError **error)
Definition: dbus.c:860
bool_t audacious_rc_song_title(RemoteObject *obj, unsigned int pos, char **title, GError **error)
Definition: dbus.c:705
bool_t mpris_player_get_caps(MprisPlayer *obj, int *capabilities, GError **error)
Definition: dbus.c:407
const char filename
Definition: misc-api.h:85
void mpris_root_init(MprisRoot *object)
Definition: dbus.c:120
void drct_seek(int time)
Definition: playback.c:482
bool_t mpris_tracklist_del_track(MprisTrackList *obj, int pos, GError **error)
Definition: dbus.c:529
void mpris_tracklist_class_init(MprisTrackListClass *klass)
Definition: dbus.c:82
bool_t audacious_rc_playqueue_add(RemoteObject *obj, int pos, GError **error)
Definition: dbus.c:914
void eq_set_bands(const double *values)
Definition: equalizer.c:183
bool_t mpris_tracklist_get_length(MprisTrackList *obj, int *length, GError **error)
Definition: dbus.c:516
bool_t audacious_rc_paused(RemoteObject *obj, bool_t *is_paused, GError **error)
Definition: dbus.c:620
playlist
Definition: playlist-api.h:122
bool_t mpris_player_volume_set(MprisPlayer *obj, int vol, GError **error)
Definition: dbus.c:413
int drct_get_time(void)
Definition: playback.c:186
const DBusGObjectInfo dbus_glib_mpris_tracklist_object_info
void interface_show_filebrowser(bool_t play_button)
Definition: interface.c:132
bool_t audacious_rc_playlist_ins_url_string(RemoteObject *obj, char *url, int pos, GError **error)
Definition: dbus.c:966
static unsigned int signals[LAST_SIG]
Definition: dbus.c:44
bool_t audacious_rc_repeat(RemoteObject *obj, bool_t *is_repeating, GError **error)
Definition: dbus.c:830
double get_double(const char *section, const char *name)
Definition: config.c:327
MprisPlayer * mpris
Definition: dbus.c:47
static Index * strings_to_index(char **strings)
Definition: dbus.c:774
bool_t audacious_rc_playlist_enqueue_to_temp(RemoteObject *obj, char *url, GError **error)
Definition: dbus.c:978
#define AUDACIOUS_DBUS_INTERFACE
Definition: dbus.h:27
bool_t audacious_rc_song_frames(RemoteObject *obj, unsigned int pos, int *length, GError **error)
Definition: dbus.c:736
bool_t audacious_rc_pause(RemoteObject *obj, GError **error)
Definition: dbus.c:602
bool_t play
Definition: main.c:58
bool_t audacious_rc_open_list(RemoteObject *obj, char **filenames, GError **error)
Definition: dbus.c:791
type
Definition: plugins-api.h:41
bool_t audacious_rc_set_eq(RemoteObject *obj, double preamp, GArray *bands, GError **error)
Definition: dbus.c:1008
void drct_stop(void)
Definition: drct.c:74
static DBusGConnection * dbus_conn
Definition: dbus.c:43
int playlist_entry_count(int playlist_num)
Definition: playlist-new.c:986
bool_t mpris_emit_track_change(MprisPlayer *obj)
Definition: dbus.c:444
void init_dbus()
Definition: dbus.c:172
void(* HookFunction)(void *data, void *user)
Definition: hook.h:23
bool_t mpris_root_quit(MprisPlayer *obj, GError **error)
Definition: dbus.c:322
bool_t mpris_tracklist_loop(MprisTrackList *obj, bool_t loop, GError **error)
Definition: dbus.c:535
EXPORT void hook_associate(const char *name, HookFunction func, void *user)
Definition: hook.c:36
bool_t mpris_player_prev(MprisPlayer *obj, GError **error)
Definition: dbus.c:336
bool_t audacious_rc_position(RemoteObject *obj, int *pos, GError **error)
Definition: dbus.c:681
void drct_pl_prev(void)
Definition: drct.c:140
bool_t mpris_emit_status_change(MprisPlayer *obj, PlaybackStatus status)
Definition: dbus.c:468
bool_t audacious_rc_seek(RemoteObject *obj, unsigned int pos, GError **error)
Definition: dbus.c:655
void set_bool(const char *section, const char *name, bool_t value)
Definition: config.c:289
#define FALSE
Definition: core.h:35
static void append_int_value(GValueArray *ar, int tmp)
Definition: dbus.c:366
void drct_get_info(int *bitrate, int *samplerate, int *channels)
Definition: playback.c:596
Index Index bool_t
Definition: playlist-api.h:122
bool_t audacious_rc_info(RemoteObject *obj, int *rate, int *freq, int *nch, GError **error)
Definition: dbus.c:642
static unsigned int tracklist_signals[LAST_TRACKLIST_SIG]
Definition: dbus.c:45
#define AUDACIOUS_DBUS_SERVICE_MPRIS
Definition: dbus.h:28
void drct_pl_open_list(Index *filenames)
Definition: drct.c:188
int playlist_queue_get_entry(int playlist_num, int at)
#define AUDDBG(...)
Definition: debug.h:30
bool_t audacious_rc_balance(RemoteObject *obj, int *balance, GError **error)
Definition: dbus.c:673
#define hook_dissociate(n, f)
Definition: hook.h:34
void audacious_rc_class_init(RemoteObjectClass *klass)
Definition: dbus.c:59
#define AUD_EQUALIZER_NBANDS
Definition: types.h:25
void playlist_queue_delete(int playlist_num, int at, int number)
bool_t mpris_player_stop(MprisPlayer *obj, GError **error)
Definition: dbus.c:348
bool_t audacious_rc_advance(RemoteObject *obj, GError **error)
Definition: dbus.c:687
bool_t audacious_rc_length(RemoteObject *obj, int *length, GError **error)
Definition: dbus.c:699
bool_t mpris_emit_caps_change(MprisPlayer *obj)
Definition: dbus.c:438
TupleValueType
Definition: tuple.h:82
bool_t mpris_tracklist_get_metadata(MprisTrackList *obj, int pos, GHashTable **metadata, GError **error)
Definition: dbus.c:499
bool_t audacious_rc_equalizer_activate(RemoteObject *obj, bool_t active, GError **error)
Definition: dbus.c:1027
bool_t audacious_rc_time(RemoteObject *obj, int *time, GError **error)
Definition: dbus.c:649
void drct_get_volume_main(int *volume)
Definition: drct.c:81
bool_t audacious_rc_volume(RemoteObject *obj, int *vl, int *vr, GError **error)
Definition: dbus.c:661
bool_t mpris_tracklist_add_track(MprisTrackList *obj, char *uri, bool_t play, GError **error)
Definition: dbus.c:522
void drct_pl_open_temp(const char *filename)
Definition: drct.c:193
Tuple * playlist_entry_get_tuple(int playlist_num, int entry_num, bool_t fast)
bool_t audacious_rc_get_eq(RemoteObject *obj, double *preamp, GArray **bands, GError **error)
Definition: dbus.c:986
bool_t audacious_rc_set_volume(RemoteObject *obj, int vl, int vr, GError **error)
Definition: dbus.c:667
bool_t audacious_rc_set_eq_preamp(RemoteObject *obj, double preamp, GError **error)
Definition: dbus.c:1015
bool_t audacious_rc_toggle_aot(RemoteObject *obj, bool_t ontop, GError **error)
Definition: dbus.c:908
char * playlist_get_title(int playlist_num)
Definition: playlist-new.c:822
bool_t audacious_rc_toggle_shuffle(RemoteObject *obj, GError **error)
Definition: dbus.c:848
#define NULL
Definition: core.h:27
bool_t audacious_rc_add_list(RemoteObject *obj, char **filenames, GError **error)
Definition: dbus.c:784
void eq_set_band(int band, double value)
Definition: equalizer.c:199
static int get_playback_status(void)
Definition: dbus.c:375
static GHashTable * get_mpris_metadata(int playlist, int entry)
Definition: dbus.c:298
static void tuple_insert_to_hash(GHashTable *md, const Tuple *tuple, const char *key)
Definition: dbus.c:244
EXPORT void index_append(Index *index, void *value)
Definition: index.c:104
void drct_pl_next(void)
Definition: drct.c:131
bool_t audacious_rc_quit(RemoteObject *obj, GError **error)
Definition: dbus.c:556
EXPORT void tuple_unref(Tuple *tuple)
Definition: tuple.c:284
static GError * error
Definition: audctrl.c:30
bool_t audacious_rc_auto_advance(RemoteObject *obj, bool_t *is_advance, GError **error)
Definition: dbus.c:818
bool_t audacious_rc_show_prefs_box(RemoteObject *obj, bool_t show, GError **error)
Definition: dbus.c:867
void mpris_root_class_init(MprisRootClass *klass)
Definition: dbus.c:63
#define AUDACIOUS_DBUS_PATH_MPRIS_TRACKLIST
Definition: dbus.h:32
bool_t audacious_rc_open_list_to_temp(RemoteObject *obj, char **filenames, GError **error)
Definition: dbus.c:798
bool_t audacious_rc_get_tuple_fields(RemoteObject *obj, char ***fields, GError **error)
Definition: dbus.c:582
bool_t audacious_rc_queue_get_list_pos(RemoteObject *obj, int qpos, int *pos, GError **error)
Definition: dbus.c:945
const DBusGObjectInfo dbus_glib_mpris_player_object_info
void set_double(const char *section, const char *name, double value)
Definition: config.c:319
bool_t mpris_player_next(MprisPlayer *obj, GError **error)
Definition: dbus.c:330
Index Index play fast fast playlist_entry_get_length
Definition: playlist-api.h:172
bool_t audacious_rc_queue_get_queue_pos(RemoteObject *obj, int pos, int *qpos, GError **error)
Definition: dbus.c:952
static bool_t active
Definition: equalizer.c:53
EXPORT const char * tuple_field_get_name(int field)
Definition: tuple.c:178
bool_t audacious_rc_playing(RemoteObject *obj, bool_t *is_playing, GError **error)
Definition: dbus.c:614
#define TRUE
Definition: core.h:37
bool_t get_bool(const char *section, const char *name)
Definition: config.c:294
bool_t audacious_rc_main_win_visible(RemoteObject *obj, bool_t *visible, GError **error)
Definition: dbus.c:568
char * playlist_entry_get_filename(int playlist_num, int entry_num)
bool_t mpris_player_position_get(MprisPlayer *obj, int *pos, GError **error)
Definition: dbus.c:431
at
Definition: playlist-api.h:122
void playlist_entry_delete(int playlist_num, int at, int number)
static void remove_metadata_value(void *value)
Definition: dbus.c:250
void mpris_tracklist_init(MprisTrackList *object)
Definition: dbus.c:152
bool_t audacious_rc_show_about_box(RemoteObject *obj, bool_t show, GError **error)
Definition: dbus.c:873
bool_t audacious_rc_playqueue_clear(RemoteObject *obj, GError **error)
Definition: dbus.c:931
DBusGProxy * audacious_get_dbus_proxy(void)
Definition: dbus.c:1042
bool_t audacious_rc_reverse(RemoteObject *obj, GError **error)
Definition: dbus.c:693
bool_t audacious_rc_delete(RemoteObject *obj, unsigned int pos, GError **error)
Definition: dbus.c:805
bool_t audacious_rc_get_eq_preamp(RemoteObject *obj, double *preamp, GError **error)
Definition: dbus.c:996
void str_unref(char *str)
Definition: strpool.c:89
void eq_get_bands(double *values)
Definition: equalizer.c:191
bool_t audacious_rc_playqueue_remove(RemoteObject *obj, int pos, GError **error)
Definition: dbus.c:920
bool_t audacious_rc_eject(RemoteObject *obj, GError **error)
Definition: dbus.c:562
bool_t audacious_rc_show_jtf_box(RemoteObject *obj, bool_t show, GError **error)
Definition: dbus.c:879
bool_t audacious_rc_get_playqueue_length(RemoteObject *obj, int *length, GError **error)
Definition: dbus.c:938
bool_t mpris_player_pause(MprisPlayer *obj, GError **error)
Definition: dbus.c:342
bool_t audacious_rc_playlist_add(RemoteObject *obj, void *list, GError **error)
Definition: dbus.c:973
void playlist_set_position(int playlist_num, int entry_num)
bool_t audacious_rc_set_eq_band(RemoteObject *obj, int band, double value, GError **error)
Definition: dbus.c:1021
static GValue * tuple_value_to_gvalue(const Tuple *tuple, const char *key)
Definition: dbus.c:203
void drct_pl_add_list(Index *filenames, int at)
Definition: drct.c:176
static int rate
Definition: equalizer.c:54
bool_t audacious_rc_stop_after(RemoteObject *obj, bool_t *is_stopping, GError **error)
Definition: dbus.c:854
bool_t drct_get_paused(void)
Definition: playback.c:477
const DBusGObjectInfo dbus_glib_audacious_rc_object_info
#define DBUS_TYPE_G_STRING_VALUE_HASHTABLE
Definition: dbus.c:55
bool_t audacious_rc_toggle_auto_advance(RemoteObject *obj, GError **error)
Definition: dbus.c:824
void interface_show_jump_to_track(void)
Definition: interface.c:140
double eq_get_band(int band)
Definition: equalizer.c:208
#define event_queue(n, d)
Definition: hook.h:44
void drct_pause(void)
Definition: playback.c:204
void mpris_player_init(MprisPlayer *object)
Definition: dbus.c:128
EXPORT char * tuple_get_str(const Tuple *tuple, int nfield, const char *field)
Definition: tuple.c:478
void audacious_rc_init(RemoteObject *object)
Definition: dbus.c:88
bool_t audacious_rc_add_url(RemoteObject *obj, char *file, GError **error)
Definition: dbus.c:769
bool_t audacious_rc_song_filename(RemoteObject *obj, unsigned int pos, char **filename, GError **error)
Definition: dbus.c:717
const DBusGObjectInfo dbus_glib_mpris_root_object_info
void drct_pl_open_temp_list(Index *filenames)
Definition: drct.c:200
bool_t audacious_rc_play_pause(RemoteObject *obj, GError **error)
Definition: dbus.c:895
EXPORT void hook_call(const char *name, void *data)
Definition: hook.c:98
EXPORT TupleValueType tuple_get_value_type(const Tuple *tuple, int nfield, const char *field)
Returns TupleValueType of given #Tuple field.
Definition: tuple.c:459
bool_t audacious_rc_status(RemoteObject *obj, char **status, GError **error)
Definition: dbus.c:632
bool_t version
Definition: main.c:62
bool_t mpris_player_get_metadata(MprisPlayer *obj, GHashTable **metadata, GError **error)
Definition: dbus.c:394
bool_t audacious_rc_get_eq_band(RemoteObject *obj, int band, double *value, GError **error)
Definition: dbus.c:1002
bool_t audacious_rc_show_main_win(RemoteObject *obj, bool_t show, GError **error)
Definition: dbus.c:575
static GHashTable * make_mpris_metadata(const char *filename, const Tuple *tuple)
Definition: dbus.c:256
bool_t mpris_emit_tracklist_change(MprisTrackList *obj, int playlist)
Definition: dbus.c:486
bool_t mpris_root_identity(MprisRoot *obj, char **identity, GError **error)
Definition: dbus.c:316
void drct_play_pause(void)
Definition: drct.c:59
bool_t audacious_rc_toggle_repeat(RemoteObject *obj, GError **error)
Definition: dbus.c:836
bool_t audacious_rc_clear(RemoteObject *obj, GError **error)
Definition: dbus.c:811
bool_t mpris_tracklist_get_current_track(MprisTrackList *obj, int *pos, GError **error)
Definition: dbus.c:509
PlaybackStatus
Definition: dbus-service.h:53
bool_t mpris_player_repeat(MprisPlayer *obj, bool_t rpt, GError **error)
Definition: dbus.c:360
void drct_get_volume_balance(int *balance)
Definition: drct.c:100
bool_t audacious_rc_song_tuple(RemoteObject *obj, unsigned int pos, char *field, GValue *value, GError **error)
Definition: dbus.c:743
static void tuple_insert_to_hash_full(GHashTable *md, const Tuple *tuple, const char *tuple_key, const char *key)
Retrieves value named tuple_key and inserts it inside hash table.
Definition: dbus.c:236
int playlist_queue_count(int playlist_num)
bool_t mpris_player_volume_get(MprisPlayer *obj, int *vol, GError **error)
Definition: dbus.c:419
bool_t mpris_player_get_status(MprisPlayer *obj, GValueArray **status, GError **error)
Definition: dbus.c:383
static void mpris_playlist_update_hook(void *unused, MprisTrackList *obj)
Definition: dbus.c:492
bool_t audacious_rc_stopped(RemoteObject *obj, bool_t *is_stopped, GError **error)
Definition: dbus.c:626
int playlist_get_position(int playlist_num)
char ** filenames
Definition: main.c:56
bool_t audacious_rc_shuffle(RemoteObject *obj, bool_t *is_shuffling, GError **error)
Definition: dbus.c:842
MprisTrackList * mpris_tracklist
Definition: dbus.c:48
#define AUDACIOUS_DBUS_PATH_MPRIS_ROOT
Definition: dbus.h:30
void drct_get_volume(int *l, int *r)
Definition: playback.c:606
char * str_get(const char *str)
Definition: strpool.c:42
bool_t audacious_rc_version(RemoteObject *obj, char **version, GError **error)
Definition: dbus.c:550
bool_t audacious_rc_jump(RemoteObject *obj, unsigned int pos, GError **error)
Definition: dbus.c:758
void interface_show(bool_t show)
Definition: interface.c:62
bool_t audacious_rc_add(RemoteObject *obj, char *file, GError **error)
Definition: dbus.c:764
bool_t audacious_rc_get_info(RemoteObject *obj, int *rate, int *freq, int *nch, GError **error)
Definition: dbus.c:901
void cleanup_dbus(void)
Definition: dbus.c:198
static GValue * get_field(int playlist, int entry, const char *field)
Definition: dbus.c:287
Index Index play entry
Definition: playlist-api.h:144
bool_t mpris_player_play(MprisPlayer *obj, GError **error)
Definition: dbus.c:354
bool_t audacious_rc_playqueue_is_queued(RemoteObject *obj, int pos, bool_t *is_queued, GError **error)
Definition: dbus.c:959
bool_t audacious_rc_stop(RemoteObject *obj, GError **error)
Definition: dbus.c:608
#define AUDACIOUS_DBUS_PATH
Definition: dbus.h:26
#define AUDACIOUS_DBUS_PATH_MPRIS_PLAYER
Definition: dbus.h:31
bool_t audacious_rc_song_length(RemoteObject *obj, unsigned int pos, int *length, GError **error)
Definition: dbus.c:729
void mpris_player_class_init(MprisPlayerClass *klass)
Definition: dbus.c:67
bool_t drct_get_playing(void)
Definition: playback.c:472
EXPORT int tuple_get_int(const Tuple *tuple, int nfield, const char *field)
Returns integer associated to #Tuple field.
Definition: tuple.c:509