]> code.delx.au - pulseaudio/blobdiff - src/pulse/introspect.c
format: Add some convenience API for setting properties
[pulseaudio] / src / pulse / introspect.c
index ec27b928ec276d9879211a2a100a7322e07026c6..e28a78c4d74c776c1c07a86e3c21b1d51e61cb4b 100644 (file)
@@ -240,6 +240,33 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
                 }
             }
 
+            if (o->context->version >= 21) {
+                i.formats = NULL;
+
+                if (pa_tagstruct_getu8(t, &i.n_formats)) {
+                    pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                    pa_proplist_free(i.proplist);
+                    goto finish;
+                }
+
+                pa_assert(i.n_formats > 0);
+                i.formats = pa_xnew0(pa_format_info*, i.n_formats);
+
+                for (j = 0; j < i.n_formats; j++) {
+                    i.formats[j] = pa_format_info_new();
+                    if (pa_tagstruct_get_format_info(t, i.formats[j]) < 0) {
+                        do {
+                            pa_format_info_free(i.formats[j]);
+                        } while (j--);
+                        pa_xfree(i.formats);
+
+                        pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                        pa_proplist_free(i.proplist);
+                        goto finish;
+                    }
+                }
+            }
+
             i.mute = (int) mute;
             i.flags = (pa_sink_flags_t) flags;
             i.state = (pa_sink_state_t) state;
@@ -253,6 +280,13 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
                 pa_xfree(i.ports[0]);
                 pa_xfree(i.ports);
             }
+
+            if (i.formats) {
+                for (j = 0; j < i.n_formats; j++)
+                    pa_format_info_free(i.formats[j]);
+                pa_xfree(i.formats);
+            }
+
             pa_proplist_free(i.proplist);
         }
     }
@@ -995,10 +1029,11 @@ static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t comm
 
         while (!pa_tagstruct_eof(t)) {
             pa_sink_input_info i;
-            pa_bool_t mute = FALSE, corked = FALSE, has_volume = FALSE, read_only_volume = FALSE;
+            pa_bool_t mute = FALSE, corked = FALSE, has_volume = FALSE, volume_writable = TRUE;
 
             pa_zero(i);
             i.proplist = pa_proplist_new();
+            i.format = pa_format_info_new();
 
             if (pa_tagstruct_getu32(t, &i.index) < 0 ||
                 pa_tagstruct_gets(t, &i.name) < 0 ||
@@ -1016,17 +1051,19 @@ static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t comm
                 (o->context->version >= 13 && pa_tagstruct_get_proplist(t, i.proplist) < 0) ||
                 (o->context->version >= 19 && pa_tagstruct_get_boolean(t, &corked) < 0) ||
                 (o->context->version >= 20 && (pa_tagstruct_get_boolean(t, &has_volume) < 0 ||
-                                               pa_tagstruct_get_boolean(t, &read_only_volume) < 0))) {
+                                               pa_tagstruct_get_boolean(t, &volume_writable) < 0)) ||
+                (o->context->version >= 21 && pa_tagstruct_get_format_info(t, i.format) < 0)) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 pa_proplist_free(i.proplist);
+                pa_format_info_free(i.format);
                 goto finish;
             }
 
             i.mute = (int) mute;
             i.corked = (int) corked;
             i.has_volume = (int) has_volume;
-            i.read_only_volume = (int) read_only_volume;
+            i.volume_writable = (int) volume_writable;
 
             if (o->callback) {
                 pa_sink_input_info_cb_t cb = (pa_sink_input_info_cb_t) o->callback;
@@ -1034,6 +1071,7 @@ static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t comm
             }
 
             pa_proplist_free(i.proplist);
+            pa_format_info_free(i.format);
         }
     }