2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
27 #include <pulse/context.h>
28 #include <pulse/xmalloc.h>
29 #include <pulse/fork-detect.h>
31 #include <pulsecore/macro.h>
32 #include <pulsecore/core-util.h>
33 #include <pulsecore/pstream-util.h>
36 #include "introspect.h"
40 static void context_stat_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
41 pa_operation *o = userdata;
42 pa_stat_info i, *p = &i;
46 pa_assert(PA_REFCNT_VALUE(o) >= 1);
53 if (command != PA_COMMAND_REPLY) {
54 if (pa_context_handle_error(o->context, command, t, false) < 0)
58 } else if (pa_tagstruct_getu32(t, &i.memblock_total) < 0 ||
59 pa_tagstruct_getu32(t, &i.memblock_total_size) < 0 ||
60 pa_tagstruct_getu32(t, &i.memblock_allocated) < 0 ||
61 pa_tagstruct_getu32(t, &i.memblock_allocated_size) < 0 ||
62 pa_tagstruct_getu32(t, &i.scache_size) < 0 ||
63 !pa_tagstruct_eof(t)) {
64 pa_context_fail(o->context, PA_ERR_PROTOCOL);
69 pa_stat_info_cb_t cb = (pa_stat_info_cb_t) o->callback;
70 cb(o->context, p, o->userdata);
75 pa_operation_unref(o);
78 pa_operation* pa_context_stat(pa_context *c, pa_stat_info_cb_t cb, void *userdata) {
79 return pa_context_send_simple_command(c, PA_COMMAND_STAT, context_stat_callback, (pa_operation_cb_t) cb, userdata);
84 static void context_get_server_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
85 pa_operation *o = userdata;
86 pa_server_info i, *p = &i;
90 pa_assert(PA_REFCNT_VALUE(o) >= 1);
97 if (command != PA_COMMAND_REPLY) {
98 if (pa_context_handle_error(o->context, command, t, false) < 0)
102 } else if (pa_tagstruct_gets(t, &i.server_name) < 0 ||
103 pa_tagstruct_gets(t, &i.server_version) < 0 ||
104 pa_tagstruct_gets(t, &i.user_name) < 0 ||
105 pa_tagstruct_gets(t, &i.host_name) < 0 ||
106 pa_tagstruct_get_sample_spec(t, &i.sample_spec) < 0 ||
107 pa_tagstruct_gets(t, &i.default_sink_name) < 0 ||
108 pa_tagstruct_gets(t, &i.default_source_name) < 0 ||
109 pa_tagstruct_getu32(t, &i.cookie) < 0 ||
110 (o->context->version >= 15 &&
111 pa_tagstruct_get_channel_map(t, &i.channel_map) < 0) ||
112 !pa_tagstruct_eof(t)) {
114 pa_context_fail(o->context, PA_ERR_PROTOCOL);
118 if (p && o->context->version < 15)
119 pa_channel_map_init_extend(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
122 pa_server_info_cb_t cb = (pa_server_info_cb_t) o->callback;
123 cb(o->context, p, o->userdata);
127 pa_operation_done(o);
128 pa_operation_unref(o);
131 pa_operation* pa_context_get_server_info(pa_context *c, pa_server_info_cb_t cb, void *userdata) {
132 return pa_context_send_simple_command(c, PA_COMMAND_GET_SERVER_INFO, context_get_server_info_callback, (pa_operation_cb_t) cb, userdata);
137 static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
138 pa_operation *o = userdata;
145 pa_assert(PA_REFCNT_VALUE(o) >= 1);
147 /* For safety in case someone use fail: outside the while loop below */
153 if (command != PA_COMMAND_REPLY) {
154 if (pa_context_handle_error(o->context, command, t, false) < 0)
160 while (!pa_tagstruct_eof(t)) {
164 const char *ap = NULL;
167 i.proplist = pa_proplist_new();
168 i.base_volume = PA_VOLUME_NORM;
169 i.n_volume_steps = PA_VOLUME_NORM+1;
171 state = PA_SINK_INVALID_STATE;
172 i.card = PA_INVALID_INDEX;
174 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
175 pa_tagstruct_gets(t, &i.name) < 0 ||
176 pa_tagstruct_gets(t, &i.description) < 0 ||
177 pa_tagstruct_get_sample_spec(t, &i.sample_spec) < 0 ||
178 pa_tagstruct_get_channel_map(t, &i.channel_map) < 0 ||
179 pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
180 pa_tagstruct_get_cvolume(t, &i.volume) < 0 ||
181 pa_tagstruct_get_boolean(t, &mute) < 0 ||
182 pa_tagstruct_getu32(t, &i.monitor_source) < 0 ||
183 pa_tagstruct_gets(t, &i.monitor_source_name) < 0 ||
184 pa_tagstruct_get_usec(t, &i.latency) < 0 ||
185 pa_tagstruct_gets(t, &i.driver) < 0 ||
186 pa_tagstruct_getu32(t, &flags) < 0 ||
187 (o->context->version >= 13 &&
188 (pa_tagstruct_get_proplist(t, i.proplist) < 0 ||
189 pa_tagstruct_get_usec(t, &i.configured_latency) < 0)) ||
190 (o->context->version >= 15 &&
191 (pa_tagstruct_get_volume(t, &i.base_volume) < 0 ||
192 pa_tagstruct_getu32(t, &state) < 0 ||
193 pa_tagstruct_getu32(t, &i.n_volume_steps) < 0 ||
194 pa_tagstruct_getu32(t, &i.card) < 0)) ||
195 (o->context->version >= 16 &&
196 (pa_tagstruct_getu32(t, &i.n_ports)))) {
201 if (o->context->version >= 16) {
203 i.ports = pa_xnew(pa_sink_port_info*, i.n_ports+1);
204 i.ports[0] = pa_xnew(pa_sink_port_info, i.n_ports);
206 for (j = 0; j < i.n_ports; j++) {
207 i.ports[j] = &i.ports[0][j];
209 if (pa_tagstruct_gets(t, &i.ports[j]->name) < 0 ||
210 pa_tagstruct_gets(t, &i.ports[j]->description) < 0 ||
211 pa_tagstruct_getu32(t, &i.ports[j]->priority) < 0) {
216 i.ports[j]->available = PA_PORT_AVAILABLE_UNKNOWN;
217 if (o->context->version >= 24) {
219 if (pa_tagstruct_getu32(t, &av) < 0 || av > PA_PORT_AVAILABLE_YES)
221 i.ports[j]->available = av;
228 if (pa_tagstruct_gets(t, &ap) < 0)
232 for (j = 0; j < i.n_ports; j++)
233 if (pa_streq(i.ports[j]->name, ap)) {
234 i.active_port = i.ports[j];
240 if (o->context->version >= 21) {
242 if (pa_tagstruct_getu8(t, &n_formats) < 0 || n_formats < 1)
245 i.formats = pa_xnew0(pa_format_info*, n_formats);
247 for (j = 0; j < n_formats; j++) {
249 i.formats[j] = pa_format_info_new();
251 if (pa_tagstruct_get_format_info(t, i.formats[j]) < 0)
257 i.flags = (pa_sink_flags_t) flags;
258 i.state = (pa_sink_state_t) state;
261 pa_sink_info_cb_t cb = (pa_sink_info_cb_t) o->callback;
262 cb(o->context, &i, 0, o->userdata);
266 for (j = 0; j < i.n_formats; j++)
267 pa_format_info_free(i.formats[j]);
271 pa_xfree(i.ports[0]);
274 pa_proplist_free(i.proplist);
279 pa_sink_info_cb_t cb = (pa_sink_info_cb_t) o->callback;
280 cb(o->context, NULL, eol, o->userdata);
284 pa_operation_done(o);
285 pa_operation_unref(o);
289 pa_assert(i.proplist);
291 pa_context_fail(o->context, PA_ERR_PROTOCOL);
294 for (j = 0; j < i.n_formats; j++)
295 pa_format_info_free(i.formats[j]);
299 pa_xfree(i.ports[0]);
302 pa_proplist_free(i.proplist);
307 pa_operation* pa_context_get_sink_info_list(pa_context *c, pa_sink_info_cb_t cb, void *userdata) {
308 return pa_context_send_simple_command(c, PA_COMMAND_GET_SINK_INFO_LIST, context_get_sink_info_callback, (pa_operation_cb_t) cb, userdata);
311 pa_operation* pa_context_get_sink_info_by_index(pa_context *c, uint32_t idx, pa_sink_info_cb_t cb, void *userdata) {
317 pa_assert(PA_REFCNT_VALUE(c) >= 1);
320 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
321 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
323 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
325 t = pa_tagstruct_command(c, PA_COMMAND_GET_SINK_INFO, &tag);
326 pa_tagstruct_putu32(t, idx);
327 pa_tagstruct_puts(t, NULL);
328 pa_pstream_send_tagstruct(c->pstream, t);
329 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_sink_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
334 pa_operation* pa_context_get_sink_info_by_name(pa_context *c, const char *name, pa_sink_info_cb_t cb, void *userdata) {
340 pa_assert(PA_REFCNT_VALUE(c) >= 1);
343 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
344 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
345 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
347 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
349 t = pa_tagstruct_command(c, PA_COMMAND_GET_SINK_INFO, &tag);
350 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
351 pa_tagstruct_puts(t, name);
352 pa_pstream_send_tagstruct(c->pstream, t);
353 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_sink_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
358 pa_operation* pa_context_set_sink_port_by_index(pa_context *c, uint32_t idx, const char*port, pa_context_success_cb_t cb, void *userdata) {
364 pa_assert(PA_REFCNT_VALUE(c) >= 1);
366 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
367 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
368 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
369 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 16, PA_ERR_NOTSUPPORTED);
371 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
373 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_PORT, &tag);
374 pa_tagstruct_putu32(t, idx);
375 pa_tagstruct_puts(t, NULL);
376 pa_tagstruct_puts(t, port);
377 pa_pstream_send_tagstruct(c->pstream, t);
378 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
383 pa_operation* pa_context_set_sink_port_by_name(pa_context *c, const char *name, const char*port, pa_context_success_cb_t cb, void *userdata) {
389 pa_assert(PA_REFCNT_VALUE(c) >= 1);
391 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
392 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
393 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
394 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 16, PA_ERR_NOTSUPPORTED);
396 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
398 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_PORT, &tag);
399 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
400 pa_tagstruct_puts(t, name);
401 pa_tagstruct_puts(t, port);
402 pa_pstream_send_tagstruct(c->pstream, t);
403 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
408 /*** Source info ***/
410 static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
411 pa_operation *o = userdata;
418 pa_assert(PA_REFCNT_VALUE(o) >= 1);
420 /* For safety in case someone use fail: outside the while loop below */
426 if (command != PA_COMMAND_REPLY) {
427 if (pa_context_handle_error(o->context, command, t, false) < 0)
433 while (!pa_tagstruct_eof(t)) {
440 i.proplist = pa_proplist_new();
441 i.base_volume = PA_VOLUME_NORM;
442 i.n_volume_steps = PA_VOLUME_NORM+1;
444 state = PA_SOURCE_INVALID_STATE;
445 i.card = PA_INVALID_INDEX;
447 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
448 pa_tagstruct_gets(t, &i.name) < 0 ||
449 pa_tagstruct_gets(t, &i.description) < 0 ||
450 pa_tagstruct_get_sample_spec(t, &i.sample_spec) < 0 ||
451 pa_tagstruct_get_channel_map(t, &i.channel_map) < 0 ||
452 pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
453 pa_tagstruct_get_cvolume(t, &i.volume) < 0 ||
454 pa_tagstruct_get_boolean(t, &mute) < 0 ||
455 pa_tagstruct_getu32(t, &i.monitor_of_sink) < 0 ||
456 pa_tagstruct_gets(t, &i.monitor_of_sink_name) < 0 ||
457 pa_tagstruct_get_usec(t, &i.latency) < 0 ||
458 pa_tagstruct_gets(t, &i.driver) < 0 ||
459 pa_tagstruct_getu32(t, &flags) < 0 ||
460 (o->context->version >= 13 &&
461 (pa_tagstruct_get_proplist(t, i.proplist) < 0 ||
462 pa_tagstruct_get_usec(t, &i.configured_latency) < 0)) ||
463 (o->context->version >= 15 &&
464 (pa_tagstruct_get_volume(t, &i.base_volume) < 0 ||
465 pa_tagstruct_getu32(t, &state) < 0 ||
466 pa_tagstruct_getu32(t, &i.n_volume_steps) < 0 ||
467 pa_tagstruct_getu32(t, &i.card) < 0)) ||
468 (o->context->version >= 16 &&
469 (pa_tagstruct_getu32(t, &i.n_ports)))) {
474 if (o->context->version >= 16) {
476 i.ports = pa_xnew(pa_source_port_info*, i.n_ports+1);
477 i.ports[0] = pa_xnew(pa_source_port_info, i.n_ports);
479 for (j = 0; j < i.n_ports; j++) {
480 i.ports[j] = &i.ports[0][j];
482 if (pa_tagstruct_gets(t, &i.ports[j]->name) < 0 ||
483 pa_tagstruct_gets(t, &i.ports[j]->description) < 0 ||
484 pa_tagstruct_getu32(t, &i.ports[j]->priority) < 0) {
489 i.ports[j]->available = PA_PORT_AVAILABLE_UNKNOWN;
490 if (o->context->version >= 24) {
492 if (pa_tagstruct_getu32(t, &av) < 0 || av > PA_PORT_AVAILABLE_YES)
494 i.ports[j]->available = av;
501 if (pa_tagstruct_gets(t, &ap) < 0)
505 for (j = 0; j < i.n_ports; j++)
506 if (pa_streq(i.ports[j]->name, ap)) {
507 i.active_port = i.ports[j];
513 if (o->context->version >= 22) {
515 if (pa_tagstruct_getu8(t, &n_formats) < 0 || n_formats < 1)
518 i.formats = pa_xnew0(pa_format_info*, n_formats);
520 for (j = 0; j < n_formats; j++) {
522 i.formats[j] = pa_format_info_new();
524 if (pa_tagstruct_get_format_info(t, i.formats[j]) < 0)
530 i.flags = (pa_source_flags_t) flags;
531 i.state = (pa_source_state_t) state;
534 pa_source_info_cb_t cb = (pa_source_info_cb_t) o->callback;
535 cb(o->context, &i, 0, o->userdata);
539 for (j = 0; j < i.n_formats; j++)
540 pa_format_info_free(i.formats[j]);
544 pa_xfree(i.ports[0]);
547 pa_proplist_free(i.proplist);
552 pa_source_info_cb_t cb = (pa_source_info_cb_t) o->callback;
553 cb(o->context, NULL, eol, o->userdata);
557 pa_operation_done(o);
558 pa_operation_unref(o);
562 pa_assert(i.proplist);
564 pa_context_fail(o->context, PA_ERR_PROTOCOL);
567 for (j = 0; j < i.n_formats; j++)
568 pa_format_info_free(i.formats[j]);
572 pa_xfree(i.ports[0]);
575 pa_proplist_free(i.proplist);
580 pa_operation* pa_context_get_source_info_list(pa_context *c, pa_source_info_cb_t cb, void *userdata) {
581 return pa_context_send_simple_command(c, PA_COMMAND_GET_SOURCE_INFO_LIST, context_get_source_info_callback, (pa_operation_cb_t) cb, userdata);
584 pa_operation* pa_context_get_source_info_by_index(pa_context *c, uint32_t idx, pa_source_info_cb_t cb, void *userdata) {
590 pa_assert(PA_REFCNT_VALUE(c) >= 1);
593 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
594 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
596 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
598 t = pa_tagstruct_command(c, PA_COMMAND_GET_SOURCE_INFO, &tag);
599 pa_tagstruct_putu32(t, idx);
600 pa_tagstruct_puts(t, NULL);
601 pa_pstream_send_tagstruct(c->pstream, t);
602 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_source_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
607 pa_operation* pa_context_get_source_info_by_name(pa_context *c, const char *name, pa_source_info_cb_t cb, void *userdata) {
613 pa_assert(PA_REFCNT_VALUE(c) >= 1);
616 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
617 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
618 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
620 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
622 t = pa_tagstruct_command(c, PA_COMMAND_GET_SOURCE_INFO, &tag);
623 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
624 pa_tagstruct_puts(t, name);
625 pa_pstream_send_tagstruct(c->pstream, t);
626 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_source_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
631 pa_operation* pa_context_set_source_port_by_index(pa_context *c, uint32_t idx, const char*port, pa_context_success_cb_t cb, void *userdata) {
637 pa_assert(PA_REFCNT_VALUE(c) >= 1);
639 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
640 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
641 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
642 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 16, PA_ERR_NOTSUPPORTED);
644 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
646 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_PORT, &tag);
647 pa_tagstruct_putu32(t, idx);
648 pa_tagstruct_puts(t, NULL);
649 pa_tagstruct_puts(t, port);
650 pa_pstream_send_tagstruct(c->pstream, t);
651 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
656 pa_operation* pa_context_set_source_port_by_name(pa_context *c, const char *name, const char*port, pa_context_success_cb_t cb, void *userdata) {
662 pa_assert(PA_REFCNT_VALUE(c) >= 1);
664 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
665 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
666 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
667 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 16, PA_ERR_NOTSUPPORTED);
669 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
671 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_PORT, &tag);
672 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
673 pa_tagstruct_puts(t, name);
674 pa_tagstruct_puts(t, port);
675 pa_pstream_send_tagstruct(c->pstream, t);
676 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
681 /*** Client info ***/
683 static void context_get_client_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
684 pa_operation *o = userdata;
689 pa_assert(PA_REFCNT_VALUE(o) >= 1);
694 if (command != PA_COMMAND_REPLY) {
695 if (pa_context_handle_error(o->context, command, t, false) < 0)
701 while (!pa_tagstruct_eof(t)) {
705 i.proplist = pa_proplist_new();
707 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
708 pa_tagstruct_gets(t, &i.name) < 0 ||
709 pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
710 pa_tagstruct_gets(t, &i.driver) < 0 ||
711 (o->context->version >= 13 && pa_tagstruct_get_proplist(t, i.proplist) < 0)) {
713 pa_context_fail(o->context, PA_ERR_PROTOCOL);
714 pa_proplist_free(i.proplist);
719 pa_client_info_cb_t cb = (pa_client_info_cb_t) o->callback;
720 cb(o->context, &i, 0, o->userdata);
723 pa_proplist_free(i.proplist);
728 pa_client_info_cb_t cb = (pa_client_info_cb_t) o->callback;
729 cb(o->context, NULL, eol, o->userdata);
733 pa_operation_done(o);
734 pa_operation_unref(o);
737 pa_operation* pa_context_get_client_info(pa_context *c, uint32_t idx, pa_client_info_cb_t cb, void *userdata) {
743 pa_assert(PA_REFCNT_VALUE(c) >= 1);
746 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
747 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
748 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
750 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
752 t = pa_tagstruct_command(c, PA_COMMAND_GET_CLIENT_INFO, &tag);
753 pa_tagstruct_putu32(t, idx);
754 pa_pstream_send_tagstruct(c->pstream, t);
755 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_client_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
760 pa_operation* pa_context_get_client_info_list(pa_context *c, pa_client_info_cb_t cb, void *userdata) {
761 return pa_context_send_simple_command(c, PA_COMMAND_GET_CLIENT_INFO_LIST, context_get_client_info_callback, (pa_operation_cb_t) cb, userdata);
766 static void card_info_free(pa_card_info* i) {
768 pa_proplist_free(i->proplist);
770 pa_xfree(i->profiles);
775 for (j = 0; j < i->n_ports; j++) {
777 if (i->ports[j]->profiles)
778 pa_xfree(i->ports[j]->profiles);
779 if (i->ports[j]->proplist)
780 pa_proplist_free(i->ports[j]->proplist);
784 pa_xfree(i->ports[0]);
789 static int fill_card_port_info(pa_context *context, pa_tagstruct* t, pa_card_info* i) {
792 if (pa_tagstruct_getu32(t, &i->n_ports) < 0)
793 return -PA_ERR_PROTOCOL;
795 if (i->n_ports == 0) {
800 i->ports = pa_xnew0(pa_card_port_info*, i->n_ports+1);
801 i->ports[0] = pa_xnew0(pa_card_port_info, i->n_ports);
803 for (j = 0; j < i->n_ports; j++) {
806 pa_card_port_info* port = i->ports[j] = &i->ports[0][j];
808 port->proplist = pa_proplist_new();
810 if (pa_tagstruct_gets(t, &port->name) < 0 ||
811 pa_tagstruct_gets(t, &port->description) < 0 ||
812 pa_tagstruct_getu32(t, &port->priority) < 0 ||
813 pa_tagstruct_getu32(t, &available) < 0 ||
814 pa_tagstruct_getu8(t, &direction) < 0 ||
815 pa_tagstruct_get_proplist(t, port->proplist) < 0 ||
816 pa_tagstruct_getu32(t, &port->n_profiles) < 0) {
818 return -PA_ERR_PROTOCOL;
821 if (available > PA_PORT_AVAILABLE_YES ||
822 direction > PA_DIRECTION_OUTPUT + PA_DIRECTION_INPUT) {
824 return -PA_ERR_PROTOCOL;
827 port->direction = direction;
828 port->available = available;
830 if (port->n_profiles > 0) {
831 port->profiles = pa_xnew0(pa_card_profile_info*, i->n_profiles+1);
833 for (k = 0; k < port->n_profiles; k++) {
834 const char* profilename;
836 if (pa_tagstruct_gets(t, &profilename) < 0)
837 return -PA_ERR_PROTOCOL;
839 for (l = 0; l < i->n_profiles; l++) {
840 if (pa_streq(i->profiles[l].name, profilename)) {
841 port->profiles[k] = &i->profiles[l];
846 if (l >= i->n_profiles)
847 return -PA_ERR_PROTOCOL;
850 if (context->version >= 27) {
851 if (pa_tagstruct_gets64(t, &port->latency_offset) < 0)
852 return -PA_ERR_PROTOCOL;
854 port->latency_offset = 0;
860 static void context_get_card_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
861 pa_operation *o = userdata;
867 pa_assert(PA_REFCNT_VALUE(o) >= 1);
872 if (command != PA_COMMAND_REPLY) {
873 if (pa_context_handle_error(o->context, command, t, false) < 0)
879 while (!pa_tagstruct_eof(t)) {
885 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
886 pa_tagstruct_gets(t, &i.name) < 0 ||
887 pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
888 pa_tagstruct_gets(t, &i.driver) < 0 ||
889 pa_tagstruct_getu32(t, &i.n_profiles) < 0)
892 if (i.n_profiles > 0) {
893 i.profiles = pa_xnew0(pa_card_profile_info, i.n_profiles+1);
895 for (j = 0; j < i.n_profiles; j++) {
897 if (pa_tagstruct_gets(t, &i.profiles[j].name) < 0 ||
898 pa_tagstruct_gets(t, &i.profiles[j].description) < 0 ||
899 pa_tagstruct_getu32(t, &i.profiles[j].n_sinks) < 0 ||
900 pa_tagstruct_getu32(t, &i.profiles[j].n_sources) < 0 ||
901 pa_tagstruct_getu32(t, &i.profiles[j].priority) < 0)
904 i.profiles[j].available = 1;
905 if (o->context->version >= 29) {
907 if (pa_tagstruct_getu32(t, &av) < 0)
909 i.profiles[j].available = av;
913 /* Terminate with an extra NULL entry, just to make sure */
914 i.profiles[j].name = NULL;
915 i.profiles[j].description = NULL;
918 i.proplist = pa_proplist_new();
920 if (pa_tagstruct_gets(t, &ap) < 0 ||
921 pa_tagstruct_get_proplist(t, i.proplist) < 0) {
923 pa_context_fail(o->context, PA_ERR_PROTOCOL);
929 for (j = 0; j < i.n_profiles; j++)
930 if (pa_streq(i.profiles[j].name, ap)) {
931 i.active_profile = &i.profiles[j];
936 if (o->context->version >= 26) {
937 if (fill_card_port_info(o->context, t, &i) < 0)
942 pa_card_info_cb_t cb = (pa_card_info_cb_t) o->callback;
943 cb(o->context, &i, 0, o->userdata);
951 pa_card_info_cb_t cb = (pa_card_info_cb_t) o->callback;
952 cb(o->context, NULL, eol, o->userdata);
956 pa_operation_done(o);
957 pa_operation_unref(o);
961 pa_context_fail(o->context, PA_ERR_PROTOCOL);
966 pa_operation* pa_context_get_card_info_by_index(pa_context *c, uint32_t idx, pa_card_info_cb_t cb, void *userdata) {
972 pa_assert(PA_REFCNT_VALUE(c) >= 1);
975 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
976 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
977 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
978 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 15, PA_ERR_NOTSUPPORTED);
980 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
982 t = pa_tagstruct_command(c, PA_COMMAND_GET_CARD_INFO, &tag);
983 pa_tagstruct_putu32(t, idx);
984 pa_tagstruct_puts(t, NULL);
985 pa_pstream_send_tagstruct(c->pstream, t);
986 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_card_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
991 pa_operation* pa_context_get_card_info_by_name(pa_context *c, const char*name, pa_card_info_cb_t cb, void *userdata) {
997 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1000 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1001 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1002 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
1003 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 15, PA_ERR_NOTSUPPORTED);
1005 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1007 t = pa_tagstruct_command(c, PA_COMMAND_GET_CARD_INFO, &tag);
1008 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1009 pa_tagstruct_puts(t, name);
1010 pa_pstream_send_tagstruct(c->pstream, t);
1011 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_card_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1016 pa_operation* pa_context_get_card_info_list(pa_context *c, pa_card_info_cb_t cb, void *userdata) {
1017 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 15, PA_ERR_NOTSUPPORTED);
1019 return pa_context_send_simple_command(c, PA_COMMAND_GET_CARD_INFO_LIST, context_get_card_info_callback, (pa_operation_cb_t) cb, userdata);
1022 pa_operation* pa_context_set_card_profile_by_index(pa_context *c, uint32_t idx, const char*profile, pa_context_success_cb_t cb, void *userdata) {
1028 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1030 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1031 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1032 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1033 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 15, PA_ERR_NOTSUPPORTED);
1035 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1037 t = pa_tagstruct_command(c, PA_COMMAND_SET_CARD_PROFILE, &tag);
1038 pa_tagstruct_putu32(t, idx);
1039 pa_tagstruct_puts(t, NULL);
1040 pa_tagstruct_puts(t, profile);
1041 pa_pstream_send_tagstruct(c->pstream, t);
1042 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1047 pa_operation* pa_context_set_card_profile_by_name(pa_context *c, const char *name, const char*profile, pa_context_success_cb_t cb, void *userdata) {
1053 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1055 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1056 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1057 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
1058 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 15, PA_ERR_NOTSUPPORTED);
1060 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1062 t = pa_tagstruct_command(c, PA_COMMAND_SET_CARD_PROFILE, &tag);
1063 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1064 pa_tagstruct_puts(t, name);
1065 pa_tagstruct_puts(t, profile);
1066 pa_pstream_send_tagstruct(c->pstream, t);
1067 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1072 /*** Module info ***/
1074 static void context_get_module_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
1075 pa_operation *o = userdata;
1080 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1085 if (command != PA_COMMAND_REPLY) {
1086 if (pa_context_handle_error(o->context, command, t, false) < 0)
1092 while (!pa_tagstruct_eof(t)) {
1094 bool auto_unload = false;
1097 i.proplist = pa_proplist_new();
1099 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
1100 pa_tagstruct_gets(t, &i.name) < 0 ||
1101 pa_tagstruct_gets(t, &i.argument) < 0 ||
1102 pa_tagstruct_getu32(t, &i.n_used) < 0 ||
1103 (o->context->version < 15 && pa_tagstruct_get_boolean(t, &auto_unload) < 0) ||
1104 (o->context->version >= 15 && pa_tagstruct_get_proplist(t, i.proplist) < 0)) {
1105 pa_context_fail(o->context, PA_ERR_PROTOCOL);
1109 i.auto_unload = (int) auto_unload;
1112 pa_module_info_cb_t cb = (pa_module_info_cb_t) o->callback;
1113 cb(o->context, &i, 0, o->userdata);
1116 pa_proplist_free(i.proplist);
1121 pa_module_info_cb_t cb = (pa_module_info_cb_t) o->callback;
1122 cb(o->context, NULL, eol, o->userdata);
1126 pa_operation_done(o);
1127 pa_operation_unref(o);
1130 pa_operation* pa_context_get_module_info(pa_context *c, uint32_t idx, pa_module_info_cb_t cb, void *userdata) {
1136 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1139 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1140 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1141 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1143 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1145 t = pa_tagstruct_command(c, PA_COMMAND_GET_MODULE_INFO, &tag);
1146 pa_tagstruct_putu32(t, idx);
1147 pa_pstream_send_tagstruct(c->pstream, t);
1148 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_module_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1153 pa_operation* pa_context_get_module_info_list(pa_context *c, pa_module_info_cb_t cb, void *userdata) {
1154 return pa_context_send_simple_command(c, PA_COMMAND_GET_MODULE_INFO_LIST, context_get_module_info_callback, (pa_operation_cb_t) cb, userdata);
1157 /*** Sink input info ***/
1159 static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
1160 pa_operation *o = userdata;
1165 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1170 if (command != PA_COMMAND_REPLY) {
1171 if (pa_context_handle_error(o->context, command, t, false) < 0)
1177 while (!pa_tagstruct_eof(t)) {
1178 pa_sink_input_info i;
1179 bool mute = false, corked = false, has_volume = false, volume_writable = true;
1182 i.proplist = pa_proplist_new();
1183 i.format = pa_format_info_new();
1185 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
1186 pa_tagstruct_gets(t, &i.name) < 0 ||
1187 pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
1188 pa_tagstruct_getu32(t, &i.client) < 0 ||
1189 pa_tagstruct_getu32(t, &i.sink) < 0 ||
1190 pa_tagstruct_get_sample_spec(t, &i.sample_spec) < 0 ||
1191 pa_tagstruct_get_channel_map(t, &i.channel_map) < 0 ||
1192 pa_tagstruct_get_cvolume(t, &i.volume) < 0 ||
1193 pa_tagstruct_get_usec(t, &i.buffer_usec) < 0 ||
1194 pa_tagstruct_get_usec(t, &i.sink_usec) < 0 ||
1195 pa_tagstruct_gets(t, &i.resample_method) < 0 ||
1196 pa_tagstruct_gets(t, &i.driver) < 0 ||
1197 (o->context->version >= 11 && pa_tagstruct_get_boolean(t, &mute) < 0) ||
1198 (o->context->version >= 13 && pa_tagstruct_get_proplist(t, i.proplist) < 0) ||
1199 (o->context->version >= 19 && pa_tagstruct_get_boolean(t, &corked) < 0) ||
1200 (o->context->version >= 20 && (pa_tagstruct_get_boolean(t, &has_volume) < 0 ||
1201 pa_tagstruct_get_boolean(t, &volume_writable) < 0)) ||
1202 (o->context->version >= 21 && pa_tagstruct_get_format_info(t, i.format) < 0)) {
1204 pa_context_fail(o->context, PA_ERR_PROTOCOL);
1205 pa_proplist_free(i.proplist);
1206 pa_format_info_free(i.format);
1210 i.mute = (int) mute;
1211 i.corked = (int) corked;
1212 i.has_volume = (int) has_volume;
1213 i.volume_writable = (int) volume_writable;
1216 pa_sink_input_info_cb_t cb = (pa_sink_input_info_cb_t) o->callback;
1217 cb(o->context, &i, 0, o->userdata);
1220 pa_proplist_free(i.proplist);
1221 pa_format_info_free(i.format);
1226 pa_sink_input_info_cb_t cb = (pa_sink_input_info_cb_t) o->callback;
1227 cb(o->context, NULL, eol, o->userdata);
1231 pa_operation_done(o);
1232 pa_operation_unref(o);
1235 pa_operation* pa_context_get_sink_input_info(pa_context *c, uint32_t idx, pa_sink_input_info_cb_t cb, void *userdata) {
1241 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1244 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1245 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1246 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1248 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1250 t = pa_tagstruct_command(c, PA_COMMAND_GET_SINK_INPUT_INFO, &tag);
1251 pa_tagstruct_putu32(t, idx);
1252 pa_pstream_send_tagstruct(c->pstream, t);
1253 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_sink_input_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1258 pa_operation* pa_context_get_sink_input_info_list(pa_context *c, void (*cb)(pa_context *c, const pa_sink_input_info*i, int is_last, void *userdata), void *userdata) {
1259 return pa_context_send_simple_command(c, PA_COMMAND_GET_SINK_INPUT_INFO_LIST, context_get_sink_input_info_callback, (pa_operation_cb_t) cb, userdata);
1262 /*** Source output info ***/
1264 static void context_get_source_output_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
1265 pa_operation *o = userdata;
1270 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1275 if (command != PA_COMMAND_REPLY) {
1276 if (pa_context_handle_error(o->context, command, t, false) < 0)
1282 while (!pa_tagstruct_eof(t)) {
1283 pa_source_output_info i;
1284 bool mute = false, corked = false, has_volume = false, volume_writable = true;
1287 i.proplist = pa_proplist_new();
1288 i.format = pa_format_info_new();
1290 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
1291 pa_tagstruct_gets(t, &i.name) < 0 ||
1292 pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
1293 pa_tagstruct_getu32(t, &i.client) < 0 ||
1294 pa_tagstruct_getu32(t, &i.source) < 0 ||
1295 pa_tagstruct_get_sample_spec(t, &i.sample_spec) < 0 ||
1296 pa_tagstruct_get_channel_map(t, &i.channel_map) < 0 ||
1297 pa_tagstruct_get_usec(t, &i.buffer_usec) < 0 ||
1298 pa_tagstruct_get_usec(t, &i.source_usec) < 0 ||
1299 pa_tagstruct_gets(t, &i.resample_method) < 0 ||
1300 pa_tagstruct_gets(t, &i.driver) < 0 ||
1301 (o->context->version >= 13 && pa_tagstruct_get_proplist(t, i.proplist) < 0) ||
1302 (o->context->version >= 19 && pa_tagstruct_get_boolean(t, &corked) < 0) ||
1303 (o->context->version >= 22 && (pa_tagstruct_get_cvolume(t, &i.volume) < 0 ||
1304 pa_tagstruct_get_boolean(t, &mute) < 0 ||
1305 pa_tagstruct_get_boolean(t, &has_volume) < 0 ||
1306 pa_tagstruct_get_boolean(t, &volume_writable) < 0 ||
1307 pa_tagstruct_get_format_info(t, i.format) < 0))) {
1309 pa_context_fail(o->context, PA_ERR_PROTOCOL);
1310 pa_proplist_free(i.proplist);
1311 pa_format_info_free(i.format);
1315 i.mute = (int) mute;
1316 i.corked = (int) corked;
1317 i.has_volume = (int) has_volume;
1318 i.volume_writable = (int) volume_writable;
1321 pa_source_output_info_cb_t cb = (pa_source_output_info_cb_t) o->callback;
1322 cb(o->context, &i, 0, o->userdata);
1325 pa_proplist_free(i.proplist);
1326 pa_format_info_free(i.format);
1331 pa_source_output_info_cb_t cb = (pa_source_output_info_cb_t) o->callback;
1332 cb(o->context, NULL, eol, o->userdata);
1336 pa_operation_done(o);
1337 pa_operation_unref(o);
1340 pa_operation* pa_context_get_source_output_info(pa_context *c, uint32_t idx, pa_source_output_info_cb_t cb, void *userdata) {
1346 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1349 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1350 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1351 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1353 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1355 t = pa_tagstruct_command(c, PA_COMMAND_GET_SOURCE_OUTPUT_INFO, &tag);
1356 pa_tagstruct_putu32(t, idx);
1357 pa_pstream_send_tagstruct(c->pstream, t);
1358 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_source_output_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1363 pa_operation* pa_context_get_source_output_info_list(pa_context *c, pa_source_output_info_cb_t cb, void *userdata) {
1364 return pa_context_send_simple_command(c, PA_COMMAND_GET_SOURCE_OUTPUT_INFO_LIST, context_get_source_output_info_callback, (pa_operation_cb_t) cb, userdata);
1367 /*** Volume manipulation ***/
1369 pa_operation* pa_context_set_sink_volume_by_index(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata) {
1375 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1378 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1379 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1380 PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
1382 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1384 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_VOLUME, &tag);
1385 pa_tagstruct_putu32(t, idx);
1386 pa_tagstruct_puts(t, NULL);
1387 pa_tagstruct_put_cvolume(t, volume);
1388 pa_pstream_send_tagstruct(c->pstream, t);
1389 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1394 pa_operation* pa_context_set_sink_volume_by_name(pa_context *c, const char *name, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata) {
1400 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1404 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1405 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1406 PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
1407 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
1409 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1411 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_VOLUME, &tag);
1412 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1413 pa_tagstruct_puts(t, name);
1414 pa_tagstruct_put_cvolume(t, volume);
1415 pa_pstream_send_tagstruct(c->pstream, t);
1416 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1421 pa_operation* pa_context_set_sink_mute_by_index(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata) {
1427 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1429 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1430 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1432 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1434 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_MUTE, &tag);
1435 pa_tagstruct_putu32(t, idx);
1436 pa_tagstruct_puts(t, NULL);
1437 pa_tagstruct_put_boolean(t, mute);
1438 pa_pstream_send_tagstruct(c->pstream, t);
1439 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1444 pa_operation* pa_context_set_sink_mute_by_name(pa_context *c, const char *name, int mute, pa_context_success_cb_t cb, void *userdata) {
1450 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1453 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1454 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1455 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
1457 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1459 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_MUTE, &tag);
1460 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1461 pa_tagstruct_puts(t, name);
1462 pa_tagstruct_put_boolean(t, mute);
1463 pa_pstream_send_tagstruct(c->pstream, t);
1464 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1469 pa_operation* pa_context_set_sink_input_volume(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata) {
1475 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1478 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1479 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1480 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1481 PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
1483 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1485 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_INPUT_VOLUME, &tag);
1486 pa_tagstruct_putu32(t, idx);
1487 pa_tagstruct_put_cvolume(t, volume);
1488 pa_pstream_send_tagstruct(c->pstream, t);
1489 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1494 pa_operation* pa_context_set_sink_input_mute(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata) {
1500 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1502 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1503 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1504 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1505 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 11, PA_ERR_NOTSUPPORTED);
1507 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1509 t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_INPUT_MUTE, &tag);
1510 pa_tagstruct_putu32(t, idx);
1511 pa_tagstruct_put_boolean(t, mute);
1512 pa_pstream_send_tagstruct(c->pstream, t);
1513 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1518 pa_operation* pa_context_set_source_volume_by_index(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata) {
1524 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1527 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1528 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1529 PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
1531 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1533 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_VOLUME, &tag);
1534 pa_tagstruct_putu32(t, idx);
1535 pa_tagstruct_puts(t, NULL);
1536 pa_tagstruct_put_cvolume(t, volume);
1537 pa_pstream_send_tagstruct(c->pstream, t);
1538 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1543 pa_operation* pa_context_set_source_volume_by_name(pa_context *c, const char *name, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata) {
1549 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1553 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1554 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1555 PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
1556 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
1558 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1560 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_VOLUME, &tag);
1561 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1562 pa_tagstruct_puts(t, name);
1563 pa_tagstruct_put_cvolume(t, volume);
1564 pa_pstream_send_tagstruct(c->pstream, t);
1565 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1570 pa_operation* pa_context_set_source_mute_by_index(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata) {
1576 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1578 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1579 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1581 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1583 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_MUTE, &tag);
1584 pa_tagstruct_putu32(t, idx);
1585 pa_tagstruct_puts(t, NULL);
1586 pa_tagstruct_put_boolean(t, mute);
1587 pa_pstream_send_tagstruct(c->pstream, t);
1588 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1593 pa_operation* pa_context_set_source_mute_by_name(pa_context *c, const char *name, int mute, pa_context_success_cb_t cb, void *userdata) {
1599 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1602 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1603 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1604 PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
1606 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1608 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_MUTE, &tag);
1609 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1610 pa_tagstruct_puts(t, name);
1611 pa_tagstruct_put_boolean(t, mute);
1612 pa_pstream_send_tagstruct(c->pstream, t);
1613 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1618 pa_operation* pa_context_set_source_output_volume(pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata) {
1624 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1627 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1628 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1629 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1630 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 22, PA_ERR_NOTSUPPORTED);
1631 PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
1633 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1635 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME, &tag);
1636 pa_tagstruct_putu32(t, idx);
1637 pa_tagstruct_put_cvolume(t, volume);
1638 pa_pstream_send_tagstruct(c->pstream, t);
1639 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1644 pa_operation* pa_context_set_source_output_mute(pa_context *c, uint32_t idx, int mute, pa_context_success_cb_t cb, void *userdata) {
1650 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1652 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1653 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1654 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1655 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 22, PA_ERR_NOTSUPPORTED);
1657 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1659 t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_OUTPUT_MUTE, &tag);
1660 pa_tagstruct_putu32(t, idx);
1661 pa_tagstruct_put_boolean(t, mute);
1662 pa_pstream_send_tagstruct(c->pstream, t);
1663 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1668 /** Sample Cache **/
1670 static void context_get_sample_info_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
1671 pa_operation *o = userdata;
1676 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1681 if (command != PA_COMMAND_REPLY) {
1682 if (pa_context_handle_error(o->context, command, t, false) < 0)
1688 while (!pa_tagstruct_eof(t)) {
1693 i.proplist = pa_proplist_new();
1695 if (pa_tagstruct_getu32(t, &i.index) < 0 ||
1696 pa_tagstruct_gets(t, &i.name) < 0 ||
1697 pa_tagstruct_get_cvolume(t, &i.volume) < 0 ||
1698 pa_tagstruct_get_usec(t, &i.duration) < 0 ||
1699 pa_tagstruct_get_sample_spec(t, &i.sample_spec) < 0 ||
1700 pa_tagstruct_get_channel_map(t, &i.channel_map) < 0 ||
1701 pa_tagstruct_getu32(t, &i.bytes) < 0 ||
1702 pa_tagstruct_get_boolean(t, &lazy) < 0 ||
1703 pa_tagstruct_gets(t, &i.filename) < 0 ||
1704 (o->context->version >= 13 && pa_tagstruct_get_proplist(t, i.proplist) < 0)) {
1706 pa_context_fail(o->context, PA_ERR_PROTOCOL);
1710 i.lazy = (int) lazy;
1713 pa_sample_info_cb_t cb = (pa_sample_info_cb_t) o->callback;
1714 cb(o->context, &i, 0, o->userdata);
1717 pa_proplist_free(i.proplist);
1722 pa_sample_info_cb_t cb = (pa_sample_info_cb_t) o->callback;
1723 cb(o->context, NULL, eol, o->userdata);
1727 pa_operation_done(o);
1728 pa_operation_unref(o);
1731 pa_operation* pa_context_get_sample_info_by_name(pa_context *c, const char *name, pa_sample_info_cb_t cb, void *userdata) {
1737 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1740 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1741 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1742 PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
1744 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1746 t = pa_tagstruct_command(c, PA_COMMAND_GET_SAMPLE_INFO, &tag);
1747 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1748 pa_tagstruct_puts(t, name);
1749 pa_pstream_send_tagstruct(c->pstream, t);
1750 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_sample_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1755 pa_operation* pa_context_get_sample_info_by_index(pa_context *c, uint32_t idx, pa_sample_info_cb_t cb, void *userdata) {
1761 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1764 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1765 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1766 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1768 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1770 t = pa_tagstruct_command(c, PA_COMMAND_GET_SAMPLE_INFO, &tag);
1771 pa_tagstruct_putu32(t, idx);
1772 pa_tagstruct_puts(t, NULL);
1773 pa_pstream_send_tagstruct(c->pstream, t);
1774 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_get_sample_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1779 pa_operation* pa_context_get_sample_info_list(pa_context *c, pa_sample_info_cb_t cb, void *userdata) {
1780 return pa_context_send_simple_command(c, PA_COMMAND_GET_SAMPLE_INFO_LIST, context_get_sample_info_callback, (pa_operation_cb_t) cb, userdata);
1783 static pa_operation* command_kill(pa_context *c, uint32_t command, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
1789 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1791 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1792 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1793 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1795 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1797 t = pa_tagstruct_command(c, command, &tag);
1798 pa_tagstruct_putu32(t, idx);
1799 pa_pstream_send_tagstruct(c->pstream, t);
1800 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1805 pa_operation* pa_context_kill_client(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
1806 return command_kill(c, PA_COMMAND_KILL_CLIENT, idx, cb, userdata);
1809 pa_operation* pa_context_kill_sink_input(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
1810 return command_kill(c, PA_COMMAND_KILL_SINK_INPUT, idx, cb, userdata);
1813 pa_operation* pa_context_kill_source_output(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
1814 return command_kill(c, PA_COMMAND_KILL_SOURCE_OUTPUT, idx, cb, userdata);
1817 static void context_index_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
1818 pa_operation *o = userdata;
1823 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1828 if (command != PA_COMMAND_REPLY) {
1829 if (pa_context_handle_error(o->context, command, t, false) < 0)
1832 idx = PA_INVALID_INDEX;
1833 } else if (pa_tagstruct_getu32(t, &idx) ||
1834 !pa_tagstruct_eof(t)) {
1835 pa_context_fail(o->context, PA_ERR_PROTOCOL);
1840 pa_context_index_cb_t cb = (pa_context_index_cb_t) o->callback;
1841 cb(o->context, idx, o->userdata);
1845 pa_operation_done(o);
1846 pa_operation_unref(o);
1849 pa_operation* pa_context_load_module(pa_context *c, const char*name, const char *argument, pa_context_index_cb_t cb, void *userdata) {
1855 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1857 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1858 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1859 PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
1861 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1863 t = pa_tagstruct_command(c, PA_COMMAND_LOAD_MODULE, &tag);
1864 pa_tagstruct_puts(t, name);
1865 pa_tagstruct_puts(t, argument);
1866 pa_pstream_send_tagstruct(c->pstream, t);
1867 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, context_index_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1872 pa_operation* pa_context_unload_module(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
1873 return command_kill(c, PA_COMMAND_UNLOAD_MODULE, idx, cb, userdata);
1876 pa_operation* pa_context_set_port_latency_offset(pa_context *c, const char *card_name, const char *port_name, int64_t offset, pa_context_success_cb_t cb, void *userdata) {
1882 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1884 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1885 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1886 PA_CHECK_VALIDITY_RETURN_NULL(c, card_name && *card_name, PA_ERR_INVALID);
1887 PA_CHECK_VALIDITY_RETURN_NULL(c, port_name && *port_name, PA_ERR_INVALID);
1888 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 27, PA_ERR_NOTSUPPORTED);
1890 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1892 t = pa_tagstruct_command(c, PA_COMMAND_SET_PORT_LATENCY_OFFSET, &tag);
1893 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1894 pa_tagstruct_puts(t, card_name);
1895 pa_tagstruct_puts(t, port_name);
1896 pa_tagstruct_puts64(t, offset);
1897 pa_pstream_send_tagstruct(c->pstream, t);
1898 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1903 /*** Autoload stuff ***/
1905 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_name, "Module auto-loading no longer supported.");
1907 pa_operation* pa_context_get_autoload_info_by_name(pa_context *c, const char *name, pa_autoload_type_t type, pa_autoload_info_cb_t cb, void *userdata) {
1910 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1912 PA_FAIL_RETURN_NULL(c, PA_ERR_OBSOLETE);
1915 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_index, "Module auto-loading no longer supported.");
1917 pa_operation* pa_context_get_autoload_info_by_index(pa_context *c, uint32_t idx, pa_autoload_info_cb_t cb, void *userdata) {
1919 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1921 PA_FAIL_RETURN_NULL(c, PA_ERR_OBSOLETE);
1924 PA_WARN_REFERENCE(pa_context_get_autoload_info_list, "Module auto-loading no longer supported.");
1926 pa_operation* pa_context_get_autoload_info_list(pa_context *c, pa_autoload_info_cb_t cb, void *userdata) {
1928 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1930 PA_FAIL_RETURN_NULL(c, PA_ERR_OBSOLETE);
1933 PA_WARN_REFERENCE(pa_context_add_autoload, "Module auto-loading no longer supported.");
1935 pa_operation* pa_context_add_autoload(pa_context *c, const char *name, pa_autoload_type_t type, const char *module, const char*argument, pa_context_index_cb_t cb, void* userdata) {
1937 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1939 PA_FAIL_RETURN_NULL(c, PA_ERR_OBSOLETE);
1942 PA_WARN_REFERENCE(pa_context_remove_autoload_by_name, "Module auto-loading no longer supported.");
1944 pa_operation* pa_context_remove_autoload_by_name(pa_context *c, const char *name, pa_autoload_type_t type, pa_context_success_cb_t cb, void* userdata) {
1946 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1948 PA_FAIL_RETURN_NULL(c, PA_ERR_OBSOLETE);
1951 PA_WARN_REFERENCE(pa_context_remove_autoload_by_index, "Module auto-loading no longer supported.");
1953 pa_operation* pa_context_remove_autoload_by_index(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void* userdata) {
1955 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1957 PA_FAIL_RETURN_NULL(c, PA_ERR_OBSOLETE);
1960 pa_operation* pa_context_move_sink_input_by_name(pa_context *c, uint32_t idx, const char *sink_name, pa_context_success_cb_t cb, void* userdata) {
1966 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1968 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1969 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1970 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 10, PA_ERR_NOTSUPPORTED);
1971 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1972 PA_CHECK_VALIDITY_RETURN_NULL(c, sink_name && *sink_name, PA_ERR_INVALID);
1974 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
1976 t = pa_tagstruct_command(c, PA_COMMAND_MOVE_SINK_INPUT, &tag);
1977 pa_tagstruct_putu32(t, idx);
1978 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
1979 pa_tagstruct_puts(t, sink_name);
1980 pa_pstream_send_tagstruct(c->pstream, t);
1981 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
1986 pa_operation* pa_context_move_sink_input_by_index(pa_context *c, uint32_t idx, uint32_t sink_idx, pa_context_success_cb_t cb, void* userdata) {
1992 pa_assert(PA_REFCNT_VALUE(c) >= 1);
1994 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
1995 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
1996 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 10, PA_ERR_NOTSUPPORTED);
1997 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
1998 PA_CHECK_VALIDITY_RETURN_NULL(c, sink_idx != PA_INVALID_INDEX, PA_ERR_INVALID);
2000 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2002 t = pa_tagstruct_command(c, PA_COMMAND_MOVE_SINK_INPUT, &tag);
2003 pa_tagstruct_putu32(t, idx);
2004 pa_tagstruct_putu32(t, sink_idx);
2005 pa_tagstruct_puts(t, NULL);
2006 pa_pstream_send_tagstruct(c->pstream, t);
2007 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
2012 pa_operation* pa_context_move_source_output_by_name(pa_context *c, uint32_t idx, const char *source_name, pa_context_success_cb_t cb, void* userdata) {
2018 pa_assert(PA_REFCNT_VALUE(c) >= 1);
2020 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
2021 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
2022 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 10, PA_ERR_NOTSUPPORTED);
2023 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
2024 PA_CHECK_VALIDITY_RETURN_NULL(c, source_name && *source_name, PA_ERR_INVALID);
2026 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2028 t = pa_tagstruct_command(c, PA_COMMAND_MOVE_SOURCE_OUTPUT, &tag);
2029 pa_tagstruct_putu32(t, idx);
2030 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
2031 pa_tagstruct_puts(t, source_name);
2032 pa_pstream_send_tagstruct(c->pstream, t);
2033 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
2038 pa_operation* pa_context_move_source_output_by_index(pa_context *c, uint32_t idx, uint32_t source_idx, pa_context_success_cb_t cb, void* userdata) {
2044 pa_assert(PA_REFCNT_VALUE(c) >= 1);
2046 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
2047 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
2048 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 10, PA_ERR_NOTSUPPORTED);
2049 PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
2050 PA_CHECK_VALIDITY_RETURN_NULL(c, source_idx != PA_INVALID_INDEX, PA_ERR_INVALID);
2052 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2054 t = pa_tagstruct_command(c, PA_COMMAND_MOVE_SOURCE_OUTPUT, &tag);
2055 pa_tagstruct_putu32(t, idx);
2056 pa_tagstruct_putu32(t, source_idx);
2057 pa_tagstruct_puts(t, NULL);
2058 pa_pstream_send_tagstruct(c->pstream, t);
2059 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
2064 pa_operation* pa_context_suspend_sink_by_name(pa_context *c, const char *sink_name, int suspend, pa_context_success_cb_t cb, void* userdata) {
2070 pa_assert(PA_REFCNT_VALUE(c) >= 1);
2072 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
2073 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
2074 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 11, PA_ERR_NOTSUPPORTED);
2075 PA_CHECK_VALIDITY_RETURN_NULL(c, !sink_name || *sink_name, PA_ERR_INVALID);
2077 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2079 t = pa_tagstruct_command(c, PA_COMMAND_SUSPEND_SINK, &tag);
2080 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
2081 pa_tagstruct_puts(t, sink_name);
2082 pa_tagstruct_put_boolean(t, suspend);
2083 pa_pstream_send_tagstruct(c->pstream, t);
2084 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
2089 pa_operation* pa_context_suspend_sink_by_index(pa_context *c, uint32_t idx, int suspend, pa_context_success_cb_t cb, void* userdata) {
2095 pa_assert(PA_REFCNT_VALUE(c) >= 1);
2097 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
2098 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
2099 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 11, PA_ERR_NOTSUPPORTED);
2101 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2103 t = pa_tagstruct_command(c, PA_COMMAND_SUSPEND_SINK, &tag);
2104 pa_tagstruct_putu32(t, idx);
2105 pa_tagstruct_puts(t, idx == PA_INVALID_INDEX ? "" : NULL);
2106 pa_tagstruct_put_boolean(t, suspend);
2107 pa_pstream_send_tagstruct(c->pstream, t);
2108 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
2113 pa_operation* pa_context_suspend_source_by_name(pa_context *c, const char *source_name, int suspend, pa_context_success_cb_t cb, void* userdata) {
2119 pa_assert(PA_REFCNT_VALUE(c) >= 1);
2121 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
2122 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
2123 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 11, PA_ERR_NOTSUPPORTED);
2124 PA_CHECK_VALIDITY_RETURN_NULL(c, !source_name || *source_name, PA_ERR_INVALID);
2126 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2128 t = pa_tagstruct_command(c, PA_COMMAND_SUSPEND_SOURCE, &tag);
2129 pa_tagstruct_putu32(t, PA_INVALID_INDEX);
2130 pa_tagstruct_puts(t, source_name);
2131 pa_tagstruct_put_boolean(t, suspend);
2132 pa_pstream_send_tagstruct(c->pstream, t);
2133 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
2138 pa_operation* pa_context_suspend_source_by_index(pa_context *c, uint32_t idx, int suspend, pa_context_success_cb_t cb, void* userdata) {
2144 pa_assert(PA_REFCNT_VALUE(c) >= 1);
2146 PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
2147 PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
2148 PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 11, PA_ERR_NOTSUPPORTED);
2150 o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
2152 t = pa_tagstruct_command(c, PA_COMMAND_SUSPEND_SOURCE, &tag);
2153 pa_tagstruct_putu32(t, idx);
2154 pa_tagstruct_puts(t, idx == PA_INVALID_INDEX ? "" : NULL);
2155 pa_tagstruct_put_boolean(t, suspend);
2156 pa_pstream_send_tagstruct(c->pstream, t);
2157 pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);