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>
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)
55 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
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",
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);
85 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0,
NULL,
NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
91 DBusGProxy *driver_proxy;
92 unsigned int request_ret;
94 AUDDBG (
"Registering remote D-Bus interfaces.\n");
103 driver_proxy = dbus_g_proxy_new_for_name(
dbus_conn, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
107 g_warning(
"Unable to register service: %s", error->message);
113 g_warning(
"Unable to register service: %s", error->message);
117 g_object_unref(driver_proxy);
136 DBusGProxy *proxy =
object->proxy;
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);
148 AUDDBG (
"object->proxy == NULL; not adding some signals.\n");
160 DBusGProxy *proxy =
object->proxy;
163 dbus_g_proxy_add_signal(proxy,
"TrackListChange", G_TYPE_INT, G_TYPE_INVALID);
168 AUDDBG (
"object->proxy == NULL, not adding some signals.\n");
175 DBusConnection *local_conn;
177 AUDDBG (
"Trying to initialize D-Bus.\n");
178 dbus_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
181 g_warning(
"Unable to connect to dbus: %s", error->message);
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);
191 local_conn = dbus_g_connection_get_connection(
dbus_conn);
192 dbus_connection_set_exit_on_disconnect(local_conn,
FALSE);
210 val = g_new0(GValue, 1);
211 g_value_init(val, G_TYPE_STRING);
213 g_value_set_string (val, str);
219 val = g_new0(GValue, 1);
220 g_value_init(val, G_TYPE_INT);
222 g_value_set_int (val, x);
237 const char * tuple_key,
const char *key)
241 g_hash_table_insert (md, (
void *) key, value);
252 g_value_unset((GValue *) value);
253 g_free((GValue *) value);
258 GHashTable *md =
NULL;
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);
303 GHashTable * metadata =
NULL;
304 if (filename && tuple)
318 *identity = g_strdup_printf(
"Audacious %s", VERSION);
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);
385 *status = g_value_array_new(4);
402 * metadata = g_hash_table_new (g_str_hash, g_str_equal);
447 GHashTable *metadata;
454 if (filename && tuple)
458 g_hash_table_destroy (metadata);
465 return (filename && tuple);
470 GValueArray *ar = g_value_array_new(4);
481 g_value_array_free(ar);
500 GHashTable * * metadata, GError * *
error)
504 * metadata = g_hash_table_new (g_str_hash, g_str_equal);
552 *version = g_strdup(VERSION);
637 * status = strdup (
"stopped");
706 title, GError * *
error)
712 * title = strdup (title2);
724 * filename = strdup (filename2);
737 length, GError * *
error)
744 field, GValue * value, GError * *
error)
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);
820 * is_advance = !
get_bool (
NULL,
"no_playlist_advance");
856 * is_stopping =
get_bool (
NULL,
"stop_after_current_song");
869 event_queue(
"prefswin show", GINT_TO_POINTER(show));
875 event_queue(
"aboutwin show", GINT_TO_POINTER(show));
902 int * nch, GError * *
error)
910 hook_call(
"mainwin set always on top", &ontop);
953 qpos, GError * *
error)
960 is_queued, GError * *
error)
967 pos, GError * *
error)
989 * bands = g_array_new (
FALSE,
FALSE,
sizeof (
double));
1034 title, GError * *
error)
1037 * title = strdup (title2);
1044 DBusGConnection *connection =
NULL;
1046 connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
1047 g_clear_error(&error);
#define AUDACIOUS_DBUS_SERVICE
void drct_set_volume(int l, int r)
bool_t audacious_rc_play(RemoteObject *obj, GError **error)
bool_t mpris_tracklist_random(MprisTrackList *obj, bool_t random, GError **error)
int playlist_get_playing(void)
bool_t interface_is_shown(void)
void playlist_entry_insert(int playlist, int at, const char *filename, Tuple *tuple, bool_t play)
bool_t audacious_rc_show_filebrowser(RemoteObject *obj, bool_t show, GError **error)
Index Index play fast playlist_entry_get_title
void drct_set_volume_main(int volume)
bool_t mpris_player_position_set(MprisPlayer *obj, int pos, GError **error)
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)
int playlist_get_active(void)
bool_t audacious_rc_get_active_playlist_name(RemoteObject *obj, char **title, GError **error)
bool_t audacious_rc_toggle_stop_after(RemoteObject *obj, GError **error)
bool_t audacious_rc_song_title(RemoteObject *obj, unsigned int pos, char **title, GError **error)
bool_t mpris_player_get_caps(MprisPlayer *obj, int *capabilities, GError **error)
void mpris_root_init(MprisRoot *object)
bool_t mpris_tracklist_del_track(MprisTrackList *obj, int pos, GError **error)
void mpris_tracklist_class_init(MprisTrackListClass *klass)
bool_t audacious_rc_playqueue_add(RemoteObject *obj, int pos, GError **error)
void eq_set_bands(const double *values)
bool_t mpris_tracklist_get_length(MprisTrackList *obj, int *length, GError **error)
bool_t audacious_rc_paused(RemoteObject *obj, bool_t *is_paused, GError **error)
bool_t mpris_player_volume_set(MprisPlayer *obj, int vol, GError **error)
const DBusGObjectInfo dbus_glib_mpris_tracklist_object_info
void interface_show_filebrowser(bool_t play_button)
bool_t audacious_rc_playlist_ins_url_string(RemoteObject *obj, char *url, int pos, GError **error)
static unsigned int signals[LAST_SIG]
bool_t audacious_rc_repeat(RemoteObject *obj, bool_t *is_repeating, GError **error)
double get_double(const char *section, const char *name)
static Index * strings_to_index(char **strings)
bool_t audacious_rc_playlist_enqueue_to_temp(RemoteObject *obj, char *url, GError **error)
#define AUDACIOUS_DBUS_INTERFACE
bool_t audacious_rc_song_frames(RemoteObject *obj, unsigned int pos, int *length, GError **error)
bool_t audacious_rc_pause(RemoteObject *obj, GError **error)
bool_t audacious_rc_open_list(RemoteObject *obj, char **filenames, GError **error)
bool_t audacious_rc_set_eq(RemoteObject *obj, double preamp, GArray *bands, GError **error)
static DBusGConnection * dbus_conn
int playlist_entry_count(int playlist_num)
bool_t mpris_emit_track_change(MprisPlayer *obj)
void(* HookFunction)(void *data, void *user)
bool_t mpris_root_quit(MprisPlayer *obj, GError **error)
bool_t mpris_tracklist_loop(MprisTrackList *obj, bool_t loop, GError **error)
EXPORT void hook_associate(const char *name, HookFunction func, void *user)
bool_t mpris_player_prev(MprisPlayer *obj, GError **error)
bool_t audacious_rc_position(RemoteObject *obj, int *pos, GError **error)
bool_t mpris_emit_status_change(MprisPlayer *obj, PlaybackStatus status)
bool_t audacious_rc_seek(RemoteObject *obj, unsigned int pos, GError **error)
void set_bool(const char *section, const char *name, bool_t value)
static void append_int_value(GValueArray *ar, int tmp)
void drct_get_info(int *bitrate, int *samplerate, int *channels)
bool_t audacious_rc_info(RemoteObject *obj, int *rate, int *freq, int *nch, GError **error)
static unsigned int tracklist_signals[LAST_TRACKLIST_SIG]
#define AUDACIOUS_DBUS_SERVICE_MPRIS
void drct_pl_open_list(Index *filenames)
int playlist_queue_get_entry(int playlist_num, int at)
bool_t audacious_rc_balance(RemoteObject *obj, int *balance, GError **error)
#define hook_dissociate(n, f)
void audacious_rc_class_init(RemoteObjectClass *klass)
#define AUD_EQUALIZER_NBANDS
void playlist_queue_delete(int playlist_num, int at, int number)
bool_t mpris_player_stop(MprisPlayer *obj, GError **error)
bool_t audacious_rc_advance(RemoteObject *obj, GError **error)
bool_t audacious_rc_length(RemoteObject *obj, int *length, GError **error)
bool_t mpris_emit_caps_change(MprisPlayer *obj)
bool_t mpris_tracklist_get_metadata(MprisTrackList *obj, int pos, GHashTable **metadata, GError **error)
bool_t audacious_rc_equalizer_activate(RemoteObject *obj, bool_t active, GError **error)
bool_t audacious_rc_time(RemoteObject *obj, int *time, GError **error)
void drct_get_volume_main(int *volume)
bool_t audacious_rc_volume(RemoteObject *obj, int *vl, int *vr, GError **error)
bool_t mpris_tracklist_add_track(MprisTrackList *obj, char *uri, bool_t play, GError **error)
void drct_pl_open_temp(const char *filename)
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)
bool_t audacious_rc_set_volume(RemoteObject *obj, int vl, int vr, GError **error)
bool_t audacious_rc_set_eq_preamp(RemoteObject *obj, double preamp, GError **error)
bool_t audacious_rc_toggle_aot(RemoteObject *obj, bool_t ontop, GError **error)
char * playlist_get_title(int playlist_num)
bool_t audacious_rc_toggle_shuffle(RemoteObject *obj, GError **error)
bool_t audacious_rc_add_list(RemoteObject *obj, char **filenames, GError **error)
void eq_set_band(int band, double value)
static int get_playback_status(void)
static GHashTable * get_mpris_metadata(int playlist, int entry)
static void tuple_insert_to_hash(GHashTable *md, const Tuple *tuple, const char *key)
EXPORT void index_append(Index *index, void *value)
bool_t audacious_rc_quit(RemoteObject *obj, GError **error)
EXPORT void tuple_unref(Tuple *tuple)
bool_t audacious_rc_auto_advance(RemoteObject *obj, bool_t *is_advance, GError **error)
bool_t audacious_rc_show_prefs_box(RemoteObject *obj, bool_t show, GError **error)
void mpris_root_class_init(MprisRootClass *klass)
#define AUDACIOUS_DBUS_PATH_MPRIS_TRACKLIST
bool_t audacious_rc_open_list_to_temp(RemoteObject *obj, char **filenames, GError **error)
bool_t audacious_rc_get_tuple_fields(RemoteObject *obj, char ***fields, GError **error)
bool_t audacious_rc_queue_get_list_pos(RemoteObject *obj, int qpos, int *pos, GError **error)
const DBusGObjectInfo dbus_glib_mpris_player_object_info
void set_double(const char *section, const char *name, double value)
bool_t mpris_player_next(MprisPlayer *obj, GError **error)
Index Index play fast fast playlist_entry_get_length
bool_t audacious_rc_queue_get_queue_pos(RemoteObject *obj, int pos, int *qpos, GError **error)
EXPORT const char * tuple_field_get_name(int field)
bool_t audacious_rc_playing(RemoteObject *obj, bool_t *is_playing, GError **error)
bool_t get_bool(const char *section, const char *name)
bool_t audacious_rc_main_win_visible(RemoteObject *obj, bool_t *visible, GError **error)
char * playlist_entry_get_filename(int playlist_num, int entry_num)
bool_t mpris_player_position_get(MprisPlayer *obj, int *pos, GError **error)
void playlist_entry_delete(int playlist_num, int at, int number)
static void remove_metadata_value(void *value)
void mpris_tracklist_init(MprisTrackList *object)
bool_t audacious_rc_show_about_box(RemoteObject *obj, bool_t show, GError **error)
bool_t audacious_rc_playqueue_clear(RemoteObject *obj, GError **error)
DBusGProxy * audacious_get_dbus_proxy(void)
bool_t audacious_rc_reverse(RemoteObject *obj, GError **error)
bool_t audacious_rc_delete(RemoteObject *obj, unsigned int pos, GError **error)
bool_t audacious_rc_get_eq_preamp(RemoteObject *obj, double *preamp, GError **error)
void str_unref(char *str)
void eq_get_bands(double *values)
bool_t audacious_rc_playqueue_remove(RemoteObject *obj, int pos, GError **error)
bool_t audacious_rc_eject(RemoteObject *obj, GError **error)
bool_t audacious_rc_show_jtf_box(RemoteObject *obj, bool_t show, GError **error)
bool_t audacious_rc_get_playqueue_length(RemoteObject *obj, int *length, GError **error)
bool_t mpris_player_pause(MprisPlayer *obj, GError **error)
bool_t audacious_rc_playlist_add(RemoteObject *obj, void *list, GError **error)
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)
static GValue * tuple_value_to_gvalue(const Tuple *tuple, const char *key)
void drct_pl_add_list(Index *filenames, int at)
bool_t audacious_rc_stop_after(RemoteObject *obj, bool_t *is_stopping, GError **error)
bool_t drct_get_paused(void)
const DBusGObjectInfo dbus_glib_audacious_rc_object_info
#define DBUS_TYPE_G_STRING_VALUE_HASHTABLE
bool_t audacious_rc_toggle_auto_advance(RemoteObject *obj, GError **error)
void interface_show_jump_to_track(void)
double eq_get_band(int band)
#define event_queue(n, d)
void mpris_player_init(MprisPlayer *object)
EXPORT char * tuple_get_str(const Tuple *tuple, int nfield, const char *field)
void audacious_rc_init(RemoteObject *object)
bool_t audacious_rc_add_url(RemoteObject *obj, char *file, GError **error)
bool_t audacious_rc_song_filename(RemoteObject *obj, unsigned int pos, char **filename, GError **error)
const DBusGObjectInfo dbus_glib_mpris_root_object_info
void drct_pl_open_temp_list(Index *filenames)
bool_t audacious_rc_play_pause(RemoteObject *obj, GError **error)
EXPORT void hook_call(const char *name, void *data)
EXPORT TupleValueType tuple_get_value_type(const Tuple *tuple, int nfield, const char *field)
Returns TupleValueType of given #Tuple field.
bool_t audacious_rc_status(RemoteObject *obj, char **status, GError **error)
bool_t mpris_player_get_metadata(MprisPlayer *obj, GHashTable **metadata, GError **error)
bool_t audacious_rc_get_eq_band(RemoteObject *obj, int band, double *value, GError **error)
bool_t audacious_rc_show_main_win(RemoteObject *obj, bool_t show, GError **error)
static GHashTable * make_mpris_metadata(const char *filename, const Tuple *tuple)
bool_t mpris_emit_tracklist_change(MprisTrackList *obj, int playlist)
bool_t mpris_root_identity(MprisRoot *obj, char **identity, GError **error)
void drct_play_pause(void)
bool_t audacious_rc_toggle_repeat(RemoteObject *obj, GError **error)
bool_t audacious_rc_clear(RemoteObject *obj, GError **error)
bool_t mpris_tracklist_get_current_track(MprisTrackList *obj, int *pos, GError **error)
bool_t mpris_player_repeat(MprisPlayer *obj, bool_t rpt, GError **error)
void drct_get_volume_balance(int *balance)
bool_t audacious_rc_song_tuple(RemoteObject *obj, unsigned int pos, char *field, GValue *value, GError **error)
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.
int playlist_queue_count(int playlist_num)
bool_t mpris_player_volume_get(MprisPlayer *obj, int *vol, GError **error)
bool_t mpris_player_get_status(MprisPlayer *obj, GValueArray **status, GError **error)
static void mpris_playlist_update_hook(void *unused, MprisTrackList *obj)
bool_t audacious_rc_stopped(RemoteObject *obj, bool_t *is_stopped, GError **error)
int playlist_get_position(int playlist_num)
bool_t audacious_rc_shuffle(RemoteObject *obj, bool_t *is_shuffling, GError **error)
MprisTrackList * mpris_tracklist
#define AUDACIOUS_DBUS_PATH_MPRIS_ROOT
void drct_get_volume(int *l, int *r)
char * str_get(const char *str)
bool_t audacious_rc_version(RemoteObject *obj, char **version, GError **error)
bool_t audacious_rc_jump(RemoteObject *obj, unsigned int pos, GError **error)
void interface_show(bool_t show)
bool_t audacious_rc_add(RemoteObject *obj, char *file, GError **error)
bool_t audacious_rc_get_info(RemoteObject *obj, int *rate, int *freq, int *nch, GError **error)
static GValue * get_field(int playlist, int entry, const char *field)
bool_t mpris_player_play(MprisPlayer *obj, GError **error)
bool_t audacious_rc_playqueue_is_queued(RemoteObject *obj, int pos, bool_t *is_queued, GError **error)
bool_t audacious_rc_stop(RemoteObject *obj, GError **error)
#define AUDACIOUS_DBUS_PATH
#define AUDACIOUS_DBUS_PATH_MPRIS_PLAYER
bool_t audacious_rc_song_length(RemoteObject *obj, unsigned int pos, int *length, GError **error)
void mpris_player_class_init(MprisPlayerClass *klass)
bool_t drct_get_playing(void)
EXPORT int tuple_get_int(const Tuple *tuple, int nfield, const char *field)
Returns integer associated to #Tuple field.