--- src/modules/dbus/iface-core.c | 96 +++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 35 deletions(-) diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c index 9555703..90c8d13 100644 --- a/src/modules/dbus/iface-core.c +++ b/src/modules/dbus/iface-core.c @@ -111,6 +111,8 @@ struct pa_dbusiface_core { pa_hook_slot *default_sink_changed_slot; pa_hook_slot *default_source_changed_slot; + pa_hook_slot *sample_cache_new_slot; + pa_hook_slot *sample_cache_removed_slot; pa_hook_slot *card_put_slot; pa_hook_slot *card_unlink_slot; pa_hook_slot *sink_input_put_slot; @@ -1578,7 +1580,6 @@ static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage * static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { pa_dbusiface_core *c = userdata; - pa_dbusiface_sample *sample_iface = NULL; pa_dbusiface_module *module_iface = NULL; DBusMessage *signal_msg = NULL; const char *object_path = NULL; @@ -1586,40 +1587,6 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 pa_assert(c); switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { - case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE: - if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { - pa_scache_entry *sample = NULL; - - if (!(sample = pa_idxset_get_by_index(core->scache, idx))) - return; /* The sample was removed immediately after creation. */ - - if (!(sample_iface = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) { - sample_iface = pa_dbusiface_sample_new(c, sample); - pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample_iface); - } - - object_path = pa_dbusiface_sample_get_path(sample_iface); - - pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, - PA_DBUS_CORE_INTERFACE, - signals[SIGNAL_NEW_SAMPLE].name))); - pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); - - } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { - if (!(sample_iface = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(idx)))) - return; - - object_path = pa_dbusiface_sample_get_path(sample_iface); - - pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, - PA_DBUS_CORE_INTERFACE, - signals[SIGNAL_SAMPLE_REMOVED].name))); - pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); - - pa_dbusiface_sample_free(sample_iface); - } - break; - case PA_SUBSCRIPTION_EVENT_MODULE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { pa_module *module = NULL; @@ -1661,6 +1628,59 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 } } +static pa_hook_result_t sample_cache_new_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_scache_entry *sample = call_data; + pa_dbusiface_sample *sample_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(sample); + + sample_iface = pa_dbusiface_sample_new(c, sample); + pa_assert_se(pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(sample->index), sample_iface) >= 0); + + object_path = pa_dbusiface_sample_get_path(sample_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_SAMPLE].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sample_cache_removed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_scache_entry *sample = call_data; + pa_dbusiface_sample *sample_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(sample); + + pa_assert_se((sample_iface = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(sample->index)))); + + object_path = pa_dbusiface_sample_get_path(sample_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_SAMPLE_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_sample_free(sample_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + static pa_hook_result_t default_sink_changed_cb(void *hook_data, void *call_data, void *slot_data) { pa_dbusiface_core *c = slot_data; pa_sink *new_fallback_sink = call_data; @@ -2138,6 +2158,10 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) { PA_HOOK_NORMAL, default_sink_changed_cb, c); c->default_source_changed_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_DEFAULT_SOURCE_CHANGED], PA_HOOK_NORMAL, default_source_changed_cb, c); + c->sample_cache_new_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SAMPLE_CACHE_NEW], + PA_HOOK_NORMAL, sample_cache_new_cb, c); + c->sample_cache_removed_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SAMPLE_CACHE_REMOVED], + PA_HOOK_NORMAL, sample_cache_removed_cb, c); c->card_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_CARD_PUT], PA_HOOK_NORMAL, card_put_cb, c); c->card_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_CARD_UNLINK], @@ -2230,6 +2254,8 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) { pa_hashmap_free(c->clients); pa_hook_slot_free(c->default_sink_changed_slot); pa_hook_slot_free(c->default_source_changed_slot); + pa_hook_slot_free(c->sample_cache_new_slot); + pa_hook_slot_free(c->sample_cache_removed_slot); pa_hook_slot_free(c->card_put_slot); pa_hook_slot_free(c->card_unlink_slot); pa_hook_slot_free(c->sink_input_put_slot); -- 1.9.1