From fc0a6ee23995b1c346cd07a7ad048a5275f17ea7 Mon Sep 17 00:00:00 2001 From: Colin Guthrie Date: Mon, 8 Aug 2011 23:29:47 +0200 Subject: [PATCH] device-restore: Various fixes for the protocol extension. * Fix extension API function export list. * Ensure we trigger a subscription event when things change. * Send the index with our subscription events. * Clear out any existing formats when saving. * Call the correct extension command for subscriptions. --- src/map-file | 1 + src/modules/module-device-restore.c | 32 ++++++++++++++++++++++++++++---- src/pulse/context.c | 2 +- src/pulse/ext-device-restore.c | 9 ++++++++- src/pulse/ext-device-restore.h | 1 + 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/map-file b/src/map-file index aacd524..dd2e7d9 100644 --- a/src/map-file +++ b/src/map-file @@ -154,6 +154,7 @@ pa_ext_device_manager_test; pa_ext_device_restore_read_sink_formats; pa_ext_device_restore_read_sink_formats_all; pa_ext_device_restore_save_sink_formats; +pa_ext_device_restore_set_subscribe_cb; pa_ext_device_restore_subscribe; pa_ext_device_restore_test; pa_ext_stream_restore_delete; diff --git a/src/modules/module-device-restore.c b/src/modules/module-device-restore.c index 7d94ffa..75b1e40 100644 --- a/src/modules/module-device-restore.c +++ b/src/modules/module-device-restore.c @@ -133,7 +133,26 @@ static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct pa_log_info("Synced."); } -static void trigger_save(struct userdata *u) { +static void trigger_save(struct userdata *u, uint32_t sink_idx) { + pa_native_connection *c; + uint32_t idx; + + if (sink_idx != PA_INVALID_INDEX) { + for (c = pa_idxset_first(u->subscribed, &idx); c; c = pa_idxset_next(u->subscribed, &idx)) { + pa_tagstruct *t; + + t = pa_tagstruct_new(NULL, 0); + pa_tagstruct_putu32(t, PA_COMMAND_EXTENSION); + pa_tagstruct_putu32(t, 0); + pa_tagstruct_putu32(t, u->module->index); + pa_tagstruct_puts(t, u->module->name); + pa_tagstruct_putu32(t, SUBCOMMAND_EVENT); + pa_tagstruct_putu32(t, sink_idx); + + pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), t); + } + } + if (u->save_time_event) return; @@ -337,7 +356,7 @@ fail: if ((e = legacy_entry_read(u, &data))) { pa_log_debug("Success. Saving new format for key: %s", name); if (entry_write(u, name, e)) - trigger_save(u); + trigger_save(u, PA_INVALID_INDEX); pa_datum_free(&data); return e; } else @@ -488,7 +507,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 pa_log_info("Storing volume/mute/port for device %s.", name); if (entry_write(u, name, entry)) - trigger_save(u); + trigger_save(u, idx); entry_free(entry); pa_xfree(name); @@ -786,6 +805,11 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio name = pa_sprintf_malloc("sink:%s", sink->name); if (!(e = entry_read(u, name))) e = entry_new(FALSE); + else { + /* Clean out any saved formats */ + pa_idxset_free(e->formats, (pa_free2_cb_t) pa_format_info_free2, NULL); + e->formats = pa_idxset_new(NULL, NULL); + } /* Read all the formats from our tagstruct */ for (i = 0; i < n_formats; ++i) { @@ -805,7 +829,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio } if (entry_write(u, name, e)) - trigger_save(u); + trigger_save(u, sink_index); else pa_log_warn("Could not save format info for sink %s", sink->name); diff --git a/src/pulse/context.c b/src/pulse/context.c index e8f3032..dbb5d42 100644 --- a/src/pulse/context.c +++ b/src/pulse/context.c @@ -1424,7 +1424,7 @@ void pa_command_extension(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_t if (pa_streq(name, "module-device-manager")) pa_ext_device_manager_command(c, tag, t); else if (pa_streq(name, "module-device-restore")) - pa_ext_device_manager_command(c, tag, t); + pa_ext_device_restore_command(c, tag, t); else if (pa_streq(name, "module-stream-restore")) pa_ext_stream_restore_command(c, tag, t); else diff --git a/src/pulse/ext-device-restore.c b/src/pulse/ext-device-restore.c index 938d466..3cbbe1a 100644 --- a/src/pulse/ext-device-restore.c +++ b/src/pulse/ext-device-restore.c @@ -324,12 +324,14 @@ pa_operation *pa_ext_device_restore_save_sink_formats( /* Command function defined in internal.h */ void pa_ext_device_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t) { uint32_t subcommand; + uint32_t idx; pa_assert(c); pa_assert(PA_REFCNT_VALUE(c) >= 1); pa_assert(t); if (pa_tagstruct_getu32(t, &subcommand) < 0 || + pa_tagstruct_getu32(t, &idx) < 0 || !pa_tagstruct_eof(t)) { pa_context_fail(c, PA_ERR_PROTOCOL); @@ -341,6 +343,11 @@ void pa_ext_device_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t) return; } + if (idx == PA_INVALID_INDEX) { + pa_context_fail(c, PA_ERR_PROTOCOL); + return; + } + if (c->ext_device_restore.callback) - c->ext_device_restore.callback(c, c->ext_device_restore.userdata); + c->ext_device_restore.callback(c, idx, c->ext_device_restore.userdata); } diff --git a/src/pulse/ext-device-restore.h b/src/pulse/ext-device-restore.h index eb0619c..f43946b 100644 --- a/src/pulse/ext-device-restore.h +++ b/src/pulse/ext-device-restore.h @@ -63,6 +63,7 @@ pa_operation *pa_ext_device_restore_subscribe( /** Callback prototype for pa_ext_device_restore_set_subscribe_cb(). \since 1.0 */ typedef void (*pa_ext_device_restore_subscribe_cb_t)( pa_context *c, + uint32_t idx, void *userdata); /** Set the subscription callback that is called when -- 2.7.4