},
[AUDIO_EVENT_EMERGENT_EXIT] = {
.name = "EmergentExit",
+ },
+ [AUDIO_EVENT_CLIENT_SUBSCRIBED] = {
+ .name = "ClientSubscribed",
+ },
+ [AUDIO_EVENT_CLIENT_HANDLED] = {
+ .name = "ClientSignalHandled",
}
};
GDBusConnection *conn;
GError *err = NULL;
gboolean dbus_ret;
- int ret = MM_ERROR_NONE;
if (event < 0 || event >= AUDIO_EVENT_MAX) {
debug_error ("emit signal failed, invalid argument, event_type(%d)", event);
if (!(conn = _dbus_get_connection(G_BUS_TYPE_SYSTEM))) {
debug_error("Get Dbus Connection Error");
- ret = MM_ERROR_SOUND_INTERNAL;
- goto end;
+ return MM_ERROR_SOUND_INTERNAL;
}
dbus_ret = g_dbus_connection_emit_signal (conn,
param, &err);
if (!dbus_ret) {
debug_error ("g_dbus_connection_emit_signal() error (%s)", err->message);
- ret = MM_ERROR_SOUND_INTERNAL;
+ return MM_ERROR_SOUND_INTERNAL;
}
+ g_dbus_connection_flush_sync(conn, NULL, NULL);
-end:
- debug_msg ("emit signal for [%s] %s", g_events[event].name, (ret == MM_ERROR_NONE ? "success" : "failed") );
- return ret;
+ debug_msg ("emit signal for [%s] success", g_events[event].name);
+ return MM_ERROR_NONE;
}
+EXPORT_API
+int mm_sound_dbus_get_event_name(audio_event_t event, const char **event_name)
+{
+ if (!event_name) {
+ debug_error("Invalid Parameter, event_name NULL");
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+ if (event < 0 || event >= AUDIO_EVENT_MAX) {
+ debug_error("invalid event : %d", event);
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+
+ *event_name = g_events[event].name;
+ return MM_ERROR_NONE;
+}
+
+EXPORT_API
+int mm_sound_dbus_get_method_name(audio_method_t method, const char **method_name)
+{
+ if (!method_name) {
+ debug_error("Invalid Parameter, method_name NULL");
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+ if (method < 0 || method >= AUDIO_METHOD_MAX) {
+ debug_error("invalid method : %d", method);
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+
+ *method_name = g_methods[method].name;
+ return MM_ERROR_NONE;
+}
+#include <stdint.h>
#include <glib.h>
#include <mm_error.h>
struct callback_data {
void *user_cb;
void *user_data;
- void *extra_data;
mm_sound_proxy_userdata_free free_func;
+ uint32_t subs_id;
};
-#define GET_CB_DATA(_cb_data, _func, _userdata, _freefunc, _extradata) \
+#define CB_DATA_NEW(_cb_data, _func, _userdata, _freefunc) \
do { \
_cb_data = (struct callback_data*) g_malloc0(sizeof(struct callback_data)); \
_cb_data->user_cb = _func; \
_cb_data->user_data = _userdata; \
_cb_data->free_func = _freefunc; \
- _cb_data->extra_data = _extradata; \
+ _cb_data->subs_id = 0; \
} while (0)
+/* subscribe is true when add callback,
+ * false when remove callback */
+static int _notify_subscription(audio_event_t event, uint32_t subs_id, gboolean subscribe)
+{
+ int ret = MM_ERROR_NONE;
+ GVariant* params = NULL;
+ const char *event_name = NULL;
+
+ debug_fenter();
+
+ if ((ret = mm_sound_dbus_get_event_name(event, &event_name) != MM_ERROR_NONE)) {
+ debug_error("Failed to get event name");
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ if (!(params = g_variant_new("(sub)", event_name, subs_id, subscribe))) {
+ debug_error("Construct Param failed");
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ if ((ret = mm_sound_dbus_emit_signal(AUDIO_PROVIDER_AUDIO_CLIENT, AUDIO_EVENT_CLIENT_SUBSCRIBED, params))) {
+ debug_error("dbus send signal for client subscribed failed");
+ }
+
+ debug_fleave();
+ return ret;
+}
+
+static int _notify_signal_handled(audio_event_t event, uint32_t event_id, uint32_t subs_id, GVariant *signal_params)
+{
+ int ret = MM_ERROR_NONE;
+ GVariant* params = NULL;
+ const char *event_name = NULL;
+
+ debug_fenter();
+
+ if ((ret = mm_sound_dbus_get_event_name(event, &event_name) != MM_ERROR_NONE)) {
+ debug_error("Failed to get event name");
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ if (!(params = g_variant_new("(usuv)", event_id, event_name, subs_id, signal_params))) {
+ debug_error("Construct Param failed");
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ if ((ret = mm_sound_dbus_emit_signal(AUDIO_PROVIDER_AUDIO_CLIENT, AUDIO_EVENT_CLIENT_HANDLED, params))) {
+ debug_error("dbus send signal for client handled failed");
+ }
+
+ debug_fleave();
+ return ret;
+}
/* This callback unmarshall general-formed paramters to subject specific parameters,
* and call proper callback */
static void dbus_callback(audio_event_t event, GVariant *params, void *userdata)
{
struct callback_data *cb_data = (struct callback_data*) userdata;
+ uint32_t event_id;
- if (event == AUDIO_EVENT_VOLUME_CHANGED) {
+ if (event == AUDIO_EVENT_VOLUME_CHANGED) {
char *volume_type_str = NULL, *direction = NULL;
unsigned volume_level;
gboolean is_connected = FALSE;
int device_id, io_direction, state;
- g_variant_get(params, "((i&sii&s)b)", &device_id, &device_type, &io_direction,
+ g_variant_get(params, "(u(i&sii&s)b)", &event_id, &device_id, &device_type, &io_direction,
&state, &name, &is_connected);
((mm_sound_device_connected_wrapper_cb)(cb_data->user_cb))(device_id, device_type, io_direction, state, name, is_connected, cb_data->user_data);
+ _notify_signal_handled(event, event_id, cb_data->subs_id, g_variant_new("(ib)", device_id, is_connected));
} else if (event == AUDIO_EVENT_DEVICE_INFO_CHANGED) {
const char *name = NULL, *device_type = NULL;
int changed_device_info_type = 0;
int device_id, io_direction, state;
- g_variant_get(params, "((i&sii&s)i)", &device_id, &device_type, &io_direction,
+ g_variant_get(params, "(u(i&sii&s)i)", &event_id, &device_id, &device_type, &io_direction,
&state, &name, &changed_device_info_type);
((mm_sound_device_info_changed_wrapper_cb)(cb_data->user_cb))(device_id, device_type, io_direction, state, name, changed_device_info_type, cb_data->user_data);
} else if (event == AUDIO_EVENT_FOCUS_CHANGED) {
static void simple_callback_data_free_func(void *data)
{
- struct callback_data *cb_data = (struct callback_data*) data;
-
- if (cb_data->free_func)
- cb_data->free_func(cb_data->user_data);
+ struct callback_data *cb_data = (struct callback_data*) data;
- g_free(cb_data);
+ if (cb_data) {
+ if (cb_data->free_func)
+ cb_data->free_func(cb_data->user_data);
+ g_free(cb_data);
+ }
}
int mm_sound_proxy_add_test_callback(mm_sound_test_cb func, void *userdata, mm_sound_proxy_userdata_free freefunc, unsigned *subs_id)
debug_fenter();
- GET_CB_DATA(cb_data, func, userdata, freefunc, NULL);
+ CB_DATA_NEW(cb_data, func, userdata, freefunc);
- if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_EVENT_TEST, dbus_callback, cb_data, simple_callback_data_free_func, subs_id)) != MM_ERROR_NONE) {
+ if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_EVENT_TEST, dbus_callback, cb_data, simple_callback_data_free_func, &cb_data->subs_id)) != MM_ERROR_NONE)
debug_error("add test callback failed");
- }
+ else
+ *subs_id = cb_data->subs_id;
debug_fleave();
return ret;
debug_fenter();
- GET_CB_DATA(cb_data, func, userdata, freefunc, NULL);
+ CB_DATA_NEW(cb_data, func, userdata, freefunc);
- if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_DEVICE_MANAGER, AUDIO_EVENT_DEVICE_CONNECTED, dbus_callback, cb_data, simple_callback_data_free_func, subs_id)) != MM_ERROR_NONE) {
+ if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_DEVICE_MANAGER, AUDIO_EVENT_DEVICE_CONNECTED, dbus_callback, cb_data, simple_callback_data_free_func, &cb_data->subs_id)) != MM_ERROR_NONE) {
debug_error("add device connected callback failed");
+ goto finish;
+ }
+
+ if ((ret = _notify_subscription(AUDIO_EVENT_DEVICE_CONNECTED, cb_data->subs_id, TRUE)) != MM_ERROR_NONE) {
+ debug_error("failed to notify subscription of device connected event");
+ goto finish;
}
+ *subs_id = cb_data->subs_id;
+
+finish:
debug_fleave();
return ret;
}
if ((ret = mm_sound_dbus_signal_unsubscribe(subs_id)) != MM_ERROR_NONE) {
debug_error("remove device connected callback failed");
+ goto finish;
}
+ if ((ret = _notify_subscription(AUDIO_EVENT_DEVICE_CONNECTED, subs_id, FALSE)) != MM_ERROR_NONE)
+ debug_error("failed to notify unsubscription of device connected event");
+
+finish:
debug_fleave();
return ret;
}
debug_fenter();
- GET_CB_DATA(cb_data, func, userdata, freefunc, NULL);
+ CB_DATA_NEW(cb_data, func, userdata, freefunc);
- if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_DEVICE_MANAGER, AUDIO_EVENT_DEVICE_INFO_CHANGED, dbus_callback, cb_data, simple_callback_data_free_func, subs_id)) != MM_ERROR_NONE) {
+ if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_DEVICE_MANAGER, AUDIO_EVENT_DEVICE_INFO_CHANGED, dbus_callback, cb_data, simple_callback_data_free_func, &cb_data->subs_id)) != MM_ERROR_NONE)
debug_error("Add device info changed callback failed");
- }
+ else
+ *subs_id = cb_data->subs_id;
debug_fleave();
return ret;
debug_fenter();
- GET_CB_DATA(cb_data, func, userdata, freefunc, NULL);
+ CB_DATA_NEW(cb_data, func, userdata, freefunc);
- if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_EVENT_VOLUME_CHANGED, dbus_callback, cb_data, simple_callback_data_free_func, subs_id)) != MM_ERROR_NONE) {
+ if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_EVENT_VOLUME_CHANGED, dbus_callback, cb_data, simple_callback_data_free_func, &cb_data->subs_id)) != MM_ERROR_NONE)
debug_error("Add Volume changed callback failed");
- }
+ else
+ *subs_id = cb_data->subs_id;
+
debug_fleave();
debug_fenter();
- GET_CB_DATA(cb_data, func, userdata, freefunc, NULL);
+ CB_DATA_NEW(cb_data, func, userdata, freefunc);
- if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_EVENT_PLAY_FILE_END, dbus_callback, cb_data, simple_callback_data_free_func, subs_id)) != MM_ERROR_NONE) {
+ if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_EVENT_PLAY_FILE_END, dbus_callback, cb_data, simple_callback_data_free_func, &cb_data->subs_id)) != MM_ERROR_NONE)
debug_error("add play sound end callback failed");
- }
+ else
+ *subs_id = cb_data->subs_id;
debug_fleave();
params = g_variant_new("(i)", exit_pid);
if (params) {
- if ((ret = mm_sound_dbus_emit_signal(AUDIO_PROVIDER_AUDIO_CLIENT, AUDIO_EVENT_EMERGENT_EXIT, params)) != MM_ERROR_NONE) {
+ if ((ret = mm_sound_dbus_emit_signal(AUDIO_PROVIDER_AUDIO_CLIENT, AUDIO_EVENT_EMERGENT_EXIT, params)) != MM_ERROR_NONE) {
debug_error("dbus emergent exit failed");
goto cleanup;
}
debug_error("Construct Param for method call failed");
}
- if(ret != MM_ERROR_NONE)
+ if (ret != MM_ERROR_NONE)
g_variant_get(result, "(i)", &ret);
if (result)
g_variant_unref(result);