]> code.delx.au - pulseaudio/commitdiff
introspect: Fix a bug in sink/source info protocol handling related to ports.
authorColin Guthrie <cguthrie@mandriva.org>
Sun, 28 Jun 2009 10:56:36 +0000 (11:56 +0100)
committerColin Guthrie <cguthrie@mandriva.org>
Mon, 29 Jun 2009 21:52:31 +0000 (22:52 +0100)
Previously the active_profile was extracted from the tagstruct regardless of
the protocol version which caused errors while speaking to older version
servers.

src/pulse/introspect.c

index ab67f59609b05a373f2dd938d3ec9f4528dec632..3414f7de60b02823c0cf79e23daa96c565582736 100644 (file)
@@ -201,42 +201,44 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
                 goto finish;
             }
 
                 goto finish;
             }
 
-            if (i.n_ports > 0) {
-                i.ports = pa_xnew(pa_sink_port_info*, i.n_ports+1);
-                i.ports[0] = pa_xnew(pa_sink_port_info, i.n_ports);
-
-                for (j = 0; j < i.n_ports; j++) {
-                    if (pa_tagstruct_gets(t, &i.ports[0][j].name) < 0 ||
-                        pa_tagstruct_gets(t, &i.ports[0][j].description) < 0 ||
-                        pa_tagstruct_getu32(t, &i.ports[0][j].priority) < 0) {
-
-                        pa_context_fail(o->context, PA_ERR_PROTOCOL);
-                        pa_xfree(i.ports);
-                        pa_xfree(i.ports[0]);
-                        pa_proplist_free(i.proplist);
-                        goto finish;
+            if (o->context->version >= 16) {
+                if (i.n_ports > 0) {
+                    i.ports = pa_xnew(pa_sink_port_info*, i.n_ports+1);
+                    i.ports[0] = pa_xnew(pa_sink_port_info, i.n_ports);
+
+                    for (j = 0; j < i.n_ports; j++) {
+                        if (pa_tagstruct_gets(t, &i.ports[0][j].name) < 0 ||
+                            pa_tagstruct_gets(t, &i.ports[0][j].description) < 0 ||
+                            pa_tagstruct_getu32(t, &i.ports[0][j].priority) < 0) {
+
+                            pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                            pa_xfree(i.ports);
+                            pa_xfree(i.ports[0]);
+                            pa_proplist_free(i.proplist);
+                            goto finish;
+                        }
+
+                        i.ports[j] = &i.ports[0][j];
                     }
 
                     }
 
-                    i.ports[j] = &i.ports[0][j];
+                    i.ports[j] = NULL;
                 }
 
                 }
 
-                i.ports[j] = NULL;
-            }
-
-            if (pa_tagstruct_gets(t, &ap) < 0) {
-                pa_context_fail(o->context, PA_ERR_PROTOCOL);
-                pa_xfree(i.ports[0]);
-                pa_xfree(i.ports);
-                pa_proplist_free(i.proplist);
-                goto finish;
-            }
+                if (pa_tagstruct_gets(t, &ap) < 0) {
+                    pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                    pa_xfree(i.ports[0]);
+                    pa_xfree(i.ports);
+                    pa_proplist_free(i.proplist);
+                    goto finish;
+                }
 
 
-            if (ap) {
-                for (j = 0; j < i.n_ports; j++)
-                    if (pa_streq(i.ports[j]->name, ap)) {
-                        i.active_port = i.ports[j];
-                        break;
-                    }
+                if (ap) {
+                    for (j = 0; j < i.n_ports; j++)
+                        if (pa_streq(i.ports[j]->name, ap)) {
+                            i.active_port = i.ports[j];
+                            break;
+                        }
+                }
             }
 
             i.mute = (int) mute;
             }
 
             i.mute = (int) mute;
@@ -428,42 +430,44 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
                 goto finish;
             }
 
                 goto finish;
             }
 
-            if (i.n_ports > 0) {
-                i.ports = pa_xnew(pa_source_port_info*, i.n_ports+1);
-                i.ports[0] = pa_xnew(pa_source_port_info, i.n_ports);
+            if (o->context->version >= 16) {
+                if (i.n_ports > 0) {
+                    i.ports = pa_xnew(pa_source_port_info*, i.n_ports+1);
+                    i.ports[0] = pa_xnew(pa_source_port_info, i.n_ports);
 
 
-                for (j = 0; j < i.n_ports; j++) {
-                    if (pa_tagstruct_gets(t, &i.ports[0][j].name) < 0 ||
-                        pa_tagstruct_gets(t, &i.ports[0][j].description) < 0 ||
-                        pa_tagstruct_getu32(t, &i.ports[0][j].priority) < 0) {
+                    for (j = 0; j < i.n_ports; j++) {
+                        if (pa_tagstruct_gets(t, &i.ports[0][j].name) < 0 ||
+                            pa_tagstruct_gets(t, &i.ports[0][j].description) < 0 ||
+                            pa_tagstruct_getu32(t, &i.ports[0][j].priority) < 0) {
 
 
-                        pa_context_fail(o->context, PA_ERR_PROTOCOL);
-                        pa_xfree(i.ports[0]);
-                        pa_xfree(i.ports);
-                        pa_proplist_free(i.proplist);
-                        goto finish;
+                            pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                            pa_xfree(i.ports[0]);
+                            pa_xfree(i.ports);
+                            pa_proplist_free(i.proplist);
+                            goto finish;
+                        }
+
+                        i.ports[j] = &i.ports[0][j];
                     }
 
                     }
 
-                    i.ports[j] = &i.ports[0][j];
+                    i.ports[j] = NULL;
                 }
 
                 }
 
-                i.ports[j] = NULL;
-            }
-
-            if (pa_tagstruct_gets(t, &ap) < 0) {
-                pa_context_fail(o->context, PA_ERR_PROTOCOL);
-                pa_xfree(i.ports[0]);
-                pa_xfree(i.ports);
-                pa_proplist_free(i.proplist);
-                goto finish;
-            }
+                if (pa_tagstruct_gets(t, &ap) < 0) {
+                    pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                    pa_xfree(i.ports[0]);
+                    pa_xfree(i.ports);
+                    pa_proplist_free(i.proplist);
+                    goto finish;
+                }
 
 
-            if (ap) {
-                for (j = 0; j < i.n_ports; j++)
-                    if (pa_streq(i.ports[j]->name, ap)) {
-                        i.active_port = i.ports[j];
-                        break;
-                    }
+                if (ap) {
+                    for (j = 0; j < i.n_ports; j++)
+                        if (pa_streq(i.ports[j]->name, ap)) {
+                            i.active_port = i.ports[j];
+                            break;
+                        }
+                }
             }
 
             i.mute = (int) mute;
             }
 
             i.mute = (int) mute;