device-restore: Change the API to include type information (sink vs. source)
authorColin Guthrie <colin@mageia.org>
Thu, 18 Aug 2011 15:37:54 +0000 (16:37 +0100)
committerColin Guthrie <colin@mageia.org>
Thu, 18 Aug 2011 16:33:08 +0000 (17:33 +0100)
This changes the API, but as we have not released yet, this is OK.

src/map-file
src/modules/module-device-restore.c
src/pulse/ext-device-restore.c
src/pulse/ext-device-restore.h
src/utils/pactl.c

index dd2e7d9..903f0bd 100644 (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;
index 914febe..2973b1b 100644 (file)
@@ -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);
 
index 3cbbe1a..fdfaf29 100644 (file)
@@ -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);
 }
index 65dab43..e6857f4 100644 (file)
@@ -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,
index b35e397..b1a0064 100644 (file)
@@ -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)