diff options
author | Colin Guthrie <colin@mageia.org> | 2011-08-18 16:37:54 +0100 |
---|---|---|
committer | Colin Guthrie <colin@mageia.org> | 2011-08-18 17:33:08 +0100 |
commit | d6b9e61b90c4b242fa6dcff4f258c62213e18a47 (patch) | |
tree | 189489573aa6720dba97dab692f04ef76fc2d04d | |
parent | 9600d0c4b1c726c3aec31c69b0ebbdf701d05194 (diff) |
device-restore: Change the API to include type information (sink vs. source)
This changes the API, but as we have not released yet, this is OK.
-rw-r--r-- | src/map-file | 6 | ||||
-rw-r--r-- | src/modules/module-device-restore.c | 43 | ||||
-rw-r--r-- | src/pulse/ext-device-restore.c | 44 | ||||
-rw-r--r-- | src/pulse/ext-device-restore.h | 14 | ||||
-rw-r--r-- | src/utils/pactl.c | 2 |
5 files changed, 77 insertions, 32 deletions
diff --git a/src/map-file b/src/map-file index dd2e7d9c..903f0bdd 100644 --- a/src/map-file +++ b/src/map-file @@ -151,9 +151,9 @@ pa_ext_device_manager_set_device_description; pa_ext_device_manager_set_subscribe_cb; pa_ext_device_manager_subscribe; 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_read_formats; +pa_ext_device_restore_read_formats_all; +pa_ext_device_restore_save_formats; pa_ext_device_restore_set_subscribe_cb; pa_ext_device_restore_subscribe; pa_ext_device_restore_test; diff --git a/src/modules/module-device-restore.c b/src/modules/module-device-restore.c index 914febe0..2973b1bc 100644 --- a/src/modules/module-device-restore.c +++ b/src/modules/module-device-restore.c @@ -104,9 +104,9 @@ enum { SUBCOMMAND_TEST, SUBCOMMAND_SUBSCRIBE, SUBCOMMAND_EVENT, - SUBCOMMAND_READ_SINK_FORMATS_ALL, - SUBCOMMAND_READ_SINK_FORMATS, - SUBCOMMAND_SAVE_SINK_FORMATS + SUBCOMMAND_READ_FORMATS_ALL, + SUBCOMMAND_READ_FORMATS, + SUBCOMMAND_SAVE_FORMATS }; @@ -137,7 +137,7 @@ 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, uint32_t sink_idx) { +static void trigger_save(struct userdata *u, pa_device_type_t type, uint32_t sink_idx) { pa_native_connection *c; uint32_t idx; @@ -151,6 +151,7 @@ static void trigger_save(struct userdata *u, uint32_t sink_idx) { pa_tagstruct_putu32(t, u->module->index); pa_tagstruct_puts(t, u->module->name); pa_tagstruct_putu32(t, SUBCOMMAND_EVENT); + pa_tagstruct_putu32(t, type); pa_tagstruct_putu32(t, sink_idx); pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), t); @@ -360,7 +361,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, PA_INVALID_INDEX); + trigger_save(u, PA_DEVICE_TYPE_SINK, PA_INVALID_INDEX); pa_datum_free(&data); return e; } else @@ -421,6 +422,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 struct userdata *u = userdata; struct entry *entry, *old; char *name; + pa_device_type_t type; pa_assert(c); pa_assert(u); @@ -437,6 +439,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 if (!(sink = pa_idxset_get_by_index(c->sinks, idx))) return; + type = PA_DEVICE_TYPE_SINK; name = pa_sprintf_malloc("sink:%s", sink->name); if ((old = entry_read(u, name))) @@ -469,6 +472,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 if (!(source = pa_idxset_get_by_index(c->sources, idx))) return; + type = PA_DEVICE_TYPE_SOURCE; name = pa_sprintf_malloc("source:%s", source->name); if ((old = entry_read(u, name))) @@ -511,7 +515,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, idx); + trigger_save(u, type, idx); entry_free(entry); pa_xfree(name); @@ -705,6 +709,7 @@ static void read_sink_format_reply(struct userdata *u, pa_tagstruct *reply, pa_s pa_assert(reply); pa_assert(sink); + pa_tagstruct_putu32(reply, PA_DEVICE_TYPE_SINK); pa_tagstruct_putu32(reply, sink->index); /* Read or create an entry */ @@ -775,7 +780,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio break; } - case SUBCOMMAND_READ_SINK_FORMATS_ALL: { + case SUBCOMMAND_READ_FORMATS_ALL: { pa_sink *sink; uint32_t idx; @@ -788,16 +793,23 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio break; } - case SUBCOMMAND_READ_SINK_FORMATS: { + case SUBCOMMAND_READ_FORMATS: { + pa_device_type_t type; uint32_t sink_index; pa_sink *sink; pa_assert(reply); /* Get the sink index and the number of formats from the tagstruct */ - if (pa_tagstruct_getu32(t, &sink_index) < 0) + if (pa_tagstruct_getu32(t, &type) < 0 || + pa_tagstruct_getu32(t, &sink_index) < 0) goto fail; + if (type != PA_DEVICE_TYPE_SINK) { + pa_log("Device format reading is only supported on sinks"); + goto fail; + } + if (!pa_tagstruct_eof(t)) goto fail; @@ -810,21 +822,28 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio break; } - case SUBCOMMAND_SAVE_SINK_FORMATS: { + case SUBCOMMAND_SAVE_FORMATS: { struct entry *e; + pa_device_type_t type; uint32_t sink_index; char *name; pa_sink *sink; uint8_t i, n_formats; /* Get the sink index and the number of formats from the tagstruct */ - if (pa_tagstruct_getu32(t, &sink_index) < 0 || + if (pa_tagstruct_getu32(t, &type) < 0 || + pa_tagstruct_getu32(t, &sink_index) < 0 || pa_tagstruct_getu8(t, &n_formats) < 0 || n_formats < 1) { goto fail; } + if (type != PA_DEVICE_TYPE_SINK) { + pa_log("Device format saving is only supported on sinks"); + goto fail; + } + /* Now find our sink */ if (!(sink = pa_idxset_get_by_index(u->core->sinks, sink_index))) { pa_log("Could not find sink #%d", sink_index); @@ -859,7 +878,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio } if (pa_sink_set_formats(sink, e->formats) && entry_write(u, name, e)) - trigger_save(u, sink_index); + trigger_save(u, type, sink_index); else pa_log_warn("Could not save format info for sink %s", sink->name); diff --git a/src/pulse/ext-device-restore.c b/src/pulse/ext-device-restore.c index 3cbbe1a6..fdfaf291 100644 --- a/src/pulse/ext-device-restore.c +++ b/src/pulse/ext-device-restore.c @@ -42,9 +42,9 @@ enum { SUBCOMMAND_TEST, SUBCOMMAND_SUBSCRIBE, SUBCOMMAND_EVENT, - SUBCOMMAND_READ_SINK_FORMATS_ALL, - SUBCOMMAND_READ_SINK_FORMATS, - SUBCOMMAND_SAVE_SINK_FORMATS + SUBCOMMAND_READ_FORMATS_ALL, + SUBCOMMAND_READ_FORMATS, + SUBCOMMAND_SAVE_FORMATS }; static void ext_device_restore_test_cb(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) { @@ -175,13 +175,24 @@ static void ext_device_restore_read_device_formats_cb(pa_pdispatch *pd, uint32_t pa_ext_device_restore_info i; pa_zero(i); - if (pa_tagstruct_getu32(t, &i.index) < 0 || + if (pa_tagstruct_getu32(t, &i.type) < 0 || + pa_tagstruct_getu32(t, &i.index) < 0 || pa_tagstruct_getu8(t, &i.n_formats) < 0) { pa_context_fail(o->context, PA_ERR_PROTOCOL); goto finish; } + if (PA_DEVICE_TYPE_SINK != i.type && PA_DEVICE_TYPE_SOURCE != i.type) { + pa_context_fail(o->context, PA_ERR_PROTOCOL); + goto finish; + } + + if (i.index == PA_INVALID_INDEX) { + pa_context_fail(o->context, PA_ERR_PROTOCOL); + goto finish; + } + if (i.n_formats > 0) { i.formats = pa_xnew0(pa_format_info*, i.n_formats); @@ -221,7 +232,7 @@ finish: pa_operation_unref(o); } -pa_operation *pa_ext_device_restore_read_sink_formats_all( +pa_operation *pa_ext_device_restore_read_formats_all( pa_context *c, pa_ext_device_restore_read_device_formats_cb_t cb, void *userdata) { @@ -242,15 +253,16 @@ pa_operation *pa_ext_device_restore_read_sink_formats_all( t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag); pa_tagstruct_putu32(t, PA_INVALID_INDEX); pa_tagstruct_puts(t, "module-device-restore"); - pa_tagstruct_putu32(t, SUBCOMMAND_READ_SINK_FORMATS_ALL); + pa_tagstruct_putu32(t, SUBCOMMAND_READ_FORMATS_ALL); pa_pstream_send_tagstruct(c->pstream, t); pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, ext_device_restore_read_device_formats_cb, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref); return o; } -pa_operation *pa_ext_device_restore_read_sink_formats( +pa_operation *pa_ext_device_restore_read_formats( pa_context *c, + pa_device_type_t type, uint32_t idx, pa_ext_device_restore_read_device_formats_cb_t cb, void *userdata) { @@ -272,7 +284,8 @@ pa_operation *pa_ext_device_restore_read_sink_formats( t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag); pa_tagstruct_putu32(t, PA_INVALID_INDEX); pa_tagstruct_puts(t, "module-device-restore"); - pa_tagstruct_putu32(t, SUBCOMMAND_READ_SINK_FORMATS); + pa_tagstruct_putu32(t, SUBCOMMAND_READ_FORMATS); + pa_tagstruct_putu32(t, type); pa_tagstruct_putu32(t, idx); pa_pstream_send_tagstruct(c->pstream, t); pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, ext_device_restore_read_device_formats_cb, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref); @@ -280,8 +293,9 @@ pa_operation *pa_ext_device_restore_read_sink_formats( return o; } -pa_operation *pa_ext_device_restore_save_sink_formats( +pa_operation *pa_ext_device_restore_save_formats( pa_context *c, + pa_device_type_t type, uint32_t idx, uint8_t n_formats, pa_format_info **formats, @@ -308,8 +322,9 @@ pa_operation *pa_ext_device_restore_save_sink_formats( t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag); pa_tagstruct_putu32(t, PA_INVALID_INDEX); pa_tagstruct_puts(t, "module-device-restore"); - pa_tagstruct_putu32(t, SUBCOMMAND_SAVE_SINK_FORMATS); + pa_tagstruct_putu32(t, SUBCOMMAND_SAVE_FORMATS); + pa_tagstruct_putu32(t, type); pa_tagstruct_putu32(t, idx); pa_tagstruct_putu8(t, n_formats); for (j = 0; j < n_formats; j++) @@ -324,6 +339,7 @@ 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; + pa_device_type_t type; uint32_t idx; pa_assert(c); @@ -331,6 +347,7 @@ void pa_ext_device_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t) pa_assert(t); if (pa_tagstruct_getu32(t, &subcommand) < 0 || + pa_tagstruct_getu32(t, &type) < 0 || pa_tagstruct_getu32(t, &idx) < 0 || !pa_tagstruct_eof(t)) { @@ -343,11 +360,16 @@ void pa_ext_device_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t) return; } + if (PA_DEVICE_TYPE_SINK != type && PA_DEVICE_TYPE_SOURCE != type) { + pa_context_fail(c, PA_ERR_PROTOCOL); + 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, idx, c->ext_device_restore.userdata); + c->ext_device_restore.callback(c, type, idx, c->ext_device_restore.userdata); } diff --git a/src/pulse/ext-device-restore.h b/src/pulse/ext-device-restore.h index 65dab431..e6857f49 100644 --- a/src/pulse/ext-device-restore.h +++ b/src/pulse/ext-device-restore.h @@ -37,6 +37,7 @@ PA_C_DECL_BEGIN /** Stores information about one device in the device database that is * maintained by module-device-manager. \since 1.0 */ typedef struct pa_ext_device_restore_info { + pa_device_type_t type; /**< Device type sink or source? */ uint32_t index; /**< The device index */ uint8_t n_formats; /**< How many formats do we have? */ pa_format_info **formats; /**< An array of formats (may be NULL if n_formats == 0) */ @@ -64,6 +65,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, + pa_device_type_t type, uint32_t idx, void *userdata); @@ -74,29 +76,31 @@ void pa_ext_device_restore_set_subscribe_cb( pa_ext_device_restore_subscribe_cb_t cb, void *userdata); -/** Callback prototype for pa_ext_device_restore_read_sink_formats(). \since 1.0 */ +/** Callback prototype for pa_ext_device_restore_read_formats(). \since 1.0 */ typedef void (*pa_ext_device_restore_read_device_formats_cb_t)( pa_context *c, const pa_ext_device_restore_info *info, int eol, void *userdata); -/** Read the formats for all present sinks from the device database. \since 1.0 */ -pa_operation *pa_ext_device_restore_read_sink_formats_all( +/** Read the formats for all present devices from the device database. \since 1.0 */ +pa_operation *pa_ext_device_restore_read_formats_all( pa_context *c, pa_ext_device_restore_read_device_formats_cb_t cb, void *userdata); /** Read an entry from the device database. \since 1.0 */ -pa_operation *pa_ext_device_restore_read_sink_formats( +pa_operation *pa_ext_device_restore_read_formats( pa_context *c, + pa_device_type_t type, uint32_t idx, pa_ext_device_restore_read_device_formats_cb_t cb, void *userdata); /** Read an entry from the device database. \since 1.0 */ -pa_operation *pa_ext_device_restore_save_sink_formats( +pa_operation *pa_ext_device_restore_save_formats( pa_context *c, + pa_device_type_t type, uint32_t idx, uint8_t n_formats, pa_format_info **formats, diff --git a/src/utils/pactl.c b/src/utils/pactl.c index b35e397b..b1a0064b 100644 --- a/src/utils/pactl.c +++ b/src/utils/pactl.c @@ -909,7 +909,7 @@ static void set_sink_formats(pa_context *c, uint32_t sink, const char *str) { pa_xfree(format); } - pa_operation_unref(pa_ext_device_restore_save_sink_formats(c, sink, i, f_arr, simple_callback, NULL)); + pa_operation_unref(pa_ext_device_restore_save_formats(c, PA_DEVICE_TYPE_SINK, sink, i, f_arr, simple_callback, NULL)); done: if (format) |