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 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
29 #include <pulse/context.h>
30 #include <pulse/gccmacro.h>
32 #include <pulsecore/macro.h>
33 #include <pulsecore/pstream-util.h>
37 #include "introspect.h"
41 static void context_stat_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
42 pa_operation
*o
= userdata
;
43 pa_stat_info i
, *p
= &i
;
47 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
49 memset(&i
, 0, sizeof(i
));
54 if (command
!= PA_COMMAND_REPLY
) {
55 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
59 } else if (pa_tagstruct_getu32(t
, &i
.memblock_total
) < 0 ||
60 pa_tagstruct_getu32(t
, &i
.memblock_total_size
) < 0 ||
61 pa_tagstruct_getu32(t
, &i
.memblock_allocated
) < 0 ||
62 pa_tagstruct_getu32(t
, &i
.memblock_allocated_size
) < 0 ||
63 pa_tagstruct_getu32(t
, &i
.scache_size
) < 0) {
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);
92 memset(&i
, 0, sizeof(i
));
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 !pa_tagstruct_eof(t
)) {
112 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
117 pa_server_info_cb_t cb
= (pa_server_info_cb_t
) o
->callback
;
118 cb(o
->context
, p
, o
->userdata
);
122 pa_operation_done(o
);
123 pa_operation_unref(o
);
126 pa_operation
* pa_context_get_server_info(pa_context
*c
, pa_server_info_cb_t cb
, void *userdata
) {
127 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SERVER_INFO
, context_get_server_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
132 static void context_get_sink_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
133 pa_operation
*o
= userdata
;
138 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
143 if (command
!= PA_COMMAND_REPLY
) {
144 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
151 while (!pa_tagstruct_eof(t
)) {
153 pa_bool_t mute
= FALSE
;
155 memset(&i
, 0, sizeof(i
));
156 i
.proplist
= pa_proplist_new();
158 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
159 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
160 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
161 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
162 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
163 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
164 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
165 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
166 pa_tagstruct_getu32(t
, &i
.monitor_source
) < 0 ||
167 pa_tagstruct_gets(t
, &i
.monitor_source_name
) < 0 ||
168 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
169 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
170 pa_tagstruct_getu32(t
, &flags
) < 0 ||
171 (o
->context
->version
>= 13 &&
172 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
173 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0))) {
175 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
176 pa_proplist_free(i
.proplist
);
181 i
.flags
= (pa_sink_flags_t
) flags
;
184 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
185 cb(o
->context
, &i
, 0, o
->userdata
);
188 pa_proplist_free(i
.proplist
);
193 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
194 cb(o
->context
, NULL
, eol
, o
->userdata
);
198 pa_operation_done(o
);
199 pa_operation_unref(o
);
202 pa_operation
* pa_context_get_sink_info_list(pa_context
*c
, pa_sink_info_cb_t cb
, void *userdata
) {
203 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SINK_INFO_LIST
, context_get_sink_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
206 pa_operation
* pa_context_get_sink_info_by_index(pa_context
*c
, uint32_t idx
, pa_sink_info_cb_t cb
, void *userdata
) {
212 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
215 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
217 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
219 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
220 pa_tagstruct_putu32(t
, idx
);
221 pa_tagstruct_puts(t
, NULL
);
222 pa_pstream_send_tagstruct(c
->pstream
, t
);
223 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
);
228 pa_operation
* pa_context_get_sink_info_by_name(pa_context
*c
, const char *name
, pa_sink_info_cb_t cb
, void *userdata
) {
234 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
237 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
238 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
240 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
242 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
243 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
244 pa_tagstruct_puts(t
, name
);
245 pa_pstream_send_tagstruct(c
->pstream
, t
);
246 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
);
251 /*** Source info ***/
253 static void context_get_source_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
254 pa_operation
*o
= userdata
;
259 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
264 if (command
!= PA_COMMAND_REPLY
) {
265 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
271 while (!pa_tagstruct_eof(t
)) {
274 pa_bool_t mute
= FALSE
;
276 memset(&i
, 0, sizeof(i
));
277 i
.proplist
= pa_proplist_new();
279 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
280 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
281 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
282 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
283 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
284 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
285 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
286 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
287 pa_tagstruct_getu32(t
, &i
.monitor_of_sink
) < 0 ||
288 pa_tagstruct_gets(t
, &i
.monitor_of_sink_name
) < 0 ||
289 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
290 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
291 pa_tagstruct_getu32(t
, &flags
) < 0 ||
292 (o
->context
->version
>= 13 &&
293 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
294 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0))) {
296 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
297 pa_proplist_free(i
.proplist
);
302 i
.flags
= (pa_source_flags_t
) flags
;
305 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
306 cb(o
->context
, &i
, 0, o
->userdata
);
309 pa_proplist_free(i
.proplist
);
314 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
315 cb(o
->context
, NULL
, eol
, o
->userdata
);
319 pa_operation_done(o
);
320 pa_operation_unref(o
);
323 pa_operation
* pa_context_get_source_info_list(pa_context
*c
, pa_source_info_cb_t cb
, void *userdata
) {
324 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SOURCE_INFO_LIST
, context_get_source_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
327 pa_operation
* pa_context_get_source_info_by_index(pa_context
*c
, uint32_t idx
, pa_source_info_cb_t cb
, void *userdata
) {
333 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
336 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
338 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
340 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
341 pa_tagstruct_putu32(t
, idx
);
342 pa_tagstruct_puts(t
, NULL
);
343 pa_pstream_send_tagstruct(c
->pstream
, t
);
344 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
);
349 pa_operation
* pa_context_get_source_info_by_name(pa_context
*c
, const char *name
, pa_source_info_cb_t cb
, void *userdata
) {
355 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
358 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
359 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
361 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
363 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
364 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
365 pa_tagstruct_puts(t
, name
);
366 pa_pstream_send_tagstruct(c
->pstream
, t
);
367 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
);
372 /*** Client info ***/
374 static void context_get_client_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
375 pa_operation
*o
= userdata
;
380 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
385 if (command
!= PA_COMMAND_REPLY
) {
386 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
392 while (!pa_tagstruct_eof(t
)) {
395 memset(&i
, 0, sizeof(i
));
396 i
.proplist
= pa_proplist_new();
398 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
399 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
400 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
401 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
402 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
404 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
405 pa_proplist_free(i
.proplist
);
410 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
411 cb(o
->context
, &i
, 0, o
->userdata
);
414 pa_proplist_free(i
.proplist
);
419 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
420 cb(o
->context
, NULL
, eol
, o
->userdata
);
424 pa_operation_done(o
);
425 pa_operation_unref(o
);
428 pa_operation
* pa_context_get_client_info(pa_context
*c
, uint32_t idx
, pa_client_info_cb_t cb
, void *userdata
) {
434 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
437 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
438 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
440 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
442 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CLIENT_INFO
, &tag
);
443 pa_tagstruct_putu32(t
, idx
);
444 pa_pstream_send_tagstruct(c
->pstream
, t
);
445 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
);
450 pa_operation
* pa_context_get_client_info_list(pa_context
*c
, pa_client_info_cb_t cb
, void *userdata
) {
451 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CLIENT_INFO_LIST
, context_get_client_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
454 /*** Module info ***/
456 static void context_get_module_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
457 pa_operation
*o
= userdata
;
462 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
467 if (command
!= PA_COMMAND_REPLY
) {
468 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
474 while (!pa_tagstruct_eof(t
)) {
476 pa_bool_t auto_unload
= FALSE
;
477 memset(&i
, 0, sizeof(i
));
479 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
480 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
481 pa_tagstruct_gets(t
, &i
.argument
) < 0 ||
482 pa_tagstruct_getu32(t
, &i
.n_used
) < 0 ||
483 pa_tagstruct_get_boolean(t
, &auto_unload
) < 0) {
484 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
488 i
.auto_unload
= (int) auto_unload
;
491 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
492 cb(o
->context
, &i
, 0, o
->userdata
);
498 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
499 cb(o
->context
, NULL
, eol
, o
->userdata
);
503 pa_operation_done(o
);
504 pa_operation_unref(o
);
507 pa_operation
* pa_context_get_module_info(pa_context
*c
, uint32_t idx
, pa_module_info_cb_t cb
, void *userdata
) {
513 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
516 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
517 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
519 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
521 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_MODULE_INFO
, &tag
);
522 pa_tagstruct_putu32(t
, idx
);
523 pa_pstream_send_tagstruct(c
->pstream
, t
);
524 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
);
529 pa_operation
* pa_context_get_module_info_list(pa_context
*c
, pa_module_info_cb_t cb
, void *userdata
) {
530 return pa_context_send_simple_command(c
, PA_COMMAND_GET_MODULE_INFO_LIST
, context_get_module_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
533 /*** Sink input info ***/
535 static void context_get_sink_input_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
536 pa_operation
*o
= userdata
;
541 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
546 if (command
!= PA_COMMAND_REPLY
) {
547 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
553 while (!pa_tagstruct_eof(t
)) {
554 pa_sink_input_info i
;
555 pa_bool_t mute
= FALSE
;
557 memset(&i
, 0, sizeof(i
));
558 i
.proplist
= pa_proplist_new();
560 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
561 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
562 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
563 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
564 pa_tagstruct_getu32(t
, &i
.sink
) < 0 ||
565 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
566 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
567 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
568 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
569 pa_tagstruct_get_usec(t
, &i
.sink_usec
) < 0 ||
570 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
571 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
572 (o
->context
->version
>= 11 && pa_tagstruct_get_boolean(t
, &mute
) < 0) ||
573 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
575 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
576 pa_proplist_free(i
.proplist
);
583 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
584 cb(o
->context
, &i
, 0, o
->userdata
);
587 pa_proplist_free(i
.proplist
);
592 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
593 cb(o
->context
, NULL
, eol
, o
->userdata
);
597 pa_operation_done(o
);
598 pa_operation_unref(o
);
601 pa_operation
* pa_context_get_sink_input_info(pa_context
*c
, uint32_t idx
, pa_sink_input_info_cb_t cb
, void *userdata
) {
607 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
610 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
611 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
613 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
615 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INPUT_INFO
, &tag
);
616 pa_tagstruct_putu32(t
, idx
);
617 pa_pstream_send_tagstruct(c
->pstream
, t
);
618 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
);
623 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
) {
624 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
);
627 /*** Source output info ***/
629 static void context_get_source_output_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
630 pa_operation
*o
= userdata
;
635 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
640 if (command
!= PA_COMMAND_REPLY
) {
641 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
647 while (!pa_tagstruct_eof(t
)) {
648 pa_source_output_info i
;
650 memset(&i
, 0, sizeof(i
));
651 i
.proplist
= pa_proplist_new();
653 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
654 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
655 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
656 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
657 pa_tagstruct_getu32(t
, &i
.source
) < 0 ||
658 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
659 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
660 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
661 pa_tagstruct_get_usec(t
, &i
.source_usec
) < 0 ||
662 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
663 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
664 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
666 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
667 pa_proplist_free(i
.proplist
);
672 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
673 cb(o
->context
, &i
, 0, o
->userdata
);
676 pa_proplist_free(i
.proplist
);
681 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
682 cb(o
->context
, NULL
, eol
, o
->userdata
);
686 pa_operation_done(o
);
687 pa_operation_unref(o
);
690 pa_operation
* pa_context_get_source_output_info(pa_context
*c
, uint32_t idx
, pa_source_output_info_cb_t cb
, void *userdata
) {
696 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
699 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
700 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
702 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
704 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_OUTPUT_INFO
, &tag
);
705 pa_tagstruct_putu32(t
, idx
);
706 pa_pstream_send_tagstruct(c
->pstream
, t
);
707 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
);
712 pa_operation
* pa_context_get_source_output_info_list(pa_context
*c
, pa_source_output_info_cb_t cb
, void *userdata
) {
713 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
);
716 /*** Volume manipulation ***/
718 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
) {
724 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
727 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
728 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
730 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
732 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
733 pa_tagstruct_putu32(t
, idx
);
734 pa_tagstruct_puts(t
, NULL
);
735 pa_tagstruct_put_cvolume(t
, volume
);
736 pa_pstream_send_tagstruct(c
->pstream
, t
);
737 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
);
742 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
) {
748 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
752 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
753 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
754 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
756 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
758 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
759 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
760 pa_tagstruct_puts(t
, name
);
761 pa_tagstruct_put_cvolume(t
, volume
);
762 pa_pstream_send_tagstruct(c
->pstream
, t
);
763 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
);
768 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
) {
774 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
776 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
778 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
780 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
781 pa_tagstruct_putu32(t
, idx
);
782 pa_tagstruct_puts(t
, NULL
);
783 pa_tagstruct_put_boolean(t
, mute
);
784 pa_pstream_send_tagstruct(c
->pstream
, t
);
785 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
);
790 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
) {
796 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
799 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
800 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
802 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
804 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
805 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
806 pa_tagstruct_puts(t
, name
);
807 pa_tagstruct_put_boolean(t
, mute
);
808 pa_pstream_send_tagstruct(c
->pstream
, t
);
809 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
);
814 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
) {
820 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
823 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
824 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
825 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
827 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
829 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_VOLUME
, &tag
);
830 pa_tagstruct_putu32(t
, idx
);
831 pa_tagstruct_put_cvolume(t
, volume
);
832 pa_pstream_send_tagstruct(c
->pstream
, t
);
833 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
);
838 pa_operation
* pa_context_set_sink_input_mute(pa_context
*c
, uint32_t idx
, int mute
, pa_context_success_cb_t cb
, void *userdata
) {
844 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
846 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
847 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
848 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
850 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
852 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_MUTE
, &tag
);
853 pa_tagstruct_putu32(t
, idx
);
854 pa_tagstruct_put_boolean(t
, mute
);
855 pa_pstream_send_tagstruct(c
->pstream
, t
);
856 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
);
861 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
) {
867 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
870 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
871 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
873 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
875 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
876 pa_tagstruct_putu32(t
, idx
);
877 pa_tagstruct_puts(t
, NULL
);
878 pa_tagstruct_put_cvolume(t
, volume
);
879 pa_pstream_send_tagstruct(c
->pstream
, t
);
880 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
);
885 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
) {
891 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
895 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
896 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
897 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
899 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
901 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
902 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
903 pa_tagstruct_puts(t
, name
);
904 pa_tagstruct_put_cvolume(t
, volume
);
905 pa_pstream_send_tagstruct(c
->pstream
, t
);
906 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
);
911 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
) {
917 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
919 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
921 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
923 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
924 pa_tagstruct_putu32(t
, idx
);
925 pa_tagstruct_puts(t
, NULL
);
926 pa_tagstruct_put_boolean(t
, mute
);
927 pa_pstream_send_tagstruct(c
->pstream
, t
);
928 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
);
933 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
) {
939 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
942 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
943 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
945 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
947 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
948 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
949 pa_tagstruct_puts(t
, name
);
950 pa_tagstruct_put_boolean(t
, mute
);
951 pa_pstream_send_tagstruct(c
->pstream
, t
);
952 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
);
959 static void context_get_sample_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
960 pa_operation
*o
= userdata
;
965 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
970 if (command
!= PA_COMMAND_REPLY
) {
971 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
977 while (!pa_tagstruct_eof(t
)) {
979 pa_bool_t lazy
= FALSE
;
981 memset(&i
, 0, sizeof(i
));
982 i
.proplist
= pa_proplist_new();
984 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
985 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
986 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
987 pa_tagstruct_get_usec(t
, &i
.duration
) < 0 ||
988 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
989 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
990 pa_tagstruct_getu32(t
, &i
.bytes
) < 0 ||
991 pa_tagstruct_get_boolean(t
, &lazy
) < 0 ||
992 pa_tagstruct_gets(t
, &i
.filename
) < 0 ||
993 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
995 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1002 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1003 cb(o
->context
, &i
, 0, o
->userdata
);
1006 pa_proplist_free(i
.proplist
);
1011 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1012 cb(o
->context
, NULL
, eol
, o
->userdata
);
1016 pa_operation_done(o
);
1017 pa_operation_unref(o
);
1020 pa_operation
* pa_context_get_sample_info_by_name(pa_context
*c
, const char *name
, pa_sample_info_cb_t cb
, void *userdata
) {
1026 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1029 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1030 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1032 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1034 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1035 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1036 pa_tagstruct_puts(t
, name
);
1037 pa_pstream_send_tagstruct(c
->pstream
, t
);
1038 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
);
1043 pa_operation
* pa_context_get_sample_info_by_index(pa_context
*c
, uint32_t idx
, pa_sample_info_cb_t cb
, void *userdata
) {
1049 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1052 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1053 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1055 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1057 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1058 pa_tagstruct_putu32(t
, idx
);
1059 pa_tagstruct_puts(t
, NULL
);
1060 pa_pstream_send_tagstruct(c
->pstream
, t
);
1061 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
);
1066 pa_operation
* pa_context_get_sample_info_list(pa_context
*c
, pa_sample_info_cb_t cb
, void *userdata
) {
1067 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SAMPLE_INFO_LIST
, context_get_sample_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
1070 static pa_operation
* command_kill(pa_context
*c
, uint32_t command
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1076 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1078 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1079 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1081 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1083 t
= pa_tagstruct_command(c
, command
, &tag
);
1084 pa_tagstruct_putu32(t
, idx
);
1085 pa_pstream_send_tagstruct(c
->pstream
, t
);
1086 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
);
1091 pa_operation
* pa_context_kill_client(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1092 return command_kill(c
, PA_COMMAND_KILL_CLIENT
, idx
, cb
, userdata
);
1095 pa_operation
* pa_context_kill_sink_input(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1096 return command_kill(c
, PA_COMMAND_KILL_SINK_INPUT
, idx
, cb
, userdata
);
1099 pa_operation
* pa_context_kill_source_output(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1100 return command_kill(c
, PA_COMMAND_KILL_SOURCE_OUTPUT
, idx
, cb
, userdata
);
1103 static void context_index_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1104 pa_operation
*o
= userdata
;
1109 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1114 if (command
!= PA_COMMAND_REPLY
) {
1115 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1118 idx
= PA_INVALID_INDEX
;
1119 } else if (pa_tagstruct_getu32(t
, &idx
) ||
1120 !pa_tagstruct_eof(t
)) {
1121 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1126 pa_context_index_cb_t cb
= (pa_context_index_cb_t
) o
->callback
;
1127 cb(o
->context
, idx
, o
->userdata
);
1132 pa_operation_done(o
);
1133 pa_operation_unref(o
);
1136 pa_operation
* pa_context_load_module(pa_context
*c
, const char*name
, const char *argument
, pa_context_index_cb_t cb
, void *userdata
) {
1142 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1144 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1145 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1147 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1149 t
= pa_tagstruct_command(c
, PA_COMMAND_LOAD_MODULE
, &tag
);
1150 pa_tagstruct_puts(t
, name
);
1151 pa_tagstruct_puts(t
, argument
);
1152 pa_pstream_send_tagstruct(c
->pstream
, t
);
1153 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1158 pa_operation
* pa_context_unload_module(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1159 return command_kill(c
, PA_COMMAND_UNLOAD_MODULE
, idx
, cb
, userdata
);
1162 /*** Autoload stuff ***/
1164 static void context_get_autoload_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1165 pa_operation
*o
= userdata
;
1170 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1175 if (command
!= PA_COMMAND_REPLY
) {
1176 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1182 while (!pa_tagstruct_eof(t
)) {
1185 memset(&i
, 0, sizeof(i
));
1187 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
1188 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
1189 pa_tagstruct_getu32(t
, &i
.type
) < 0 ||
1190 pa_tagstruct_gets(t
, &i
.module
) < 0 ||
1191 pa_tagstruct_gets(t
, &i
.argument
) < 0) {
1192 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1197 pa_autoload_info_cb_t cb
= (pa_autoload_info_cb_t
) o
->callback
;
1198 cb(o
->context
, &i
, 0, o
->userdata
);
1204 pa_autoload_info_cb_t cb
= (pa_autoload_info_cb_t
) o
->callback
;
1205 cb(o
->context
, NULL
, eol
, o
->userdata
);
1209 pa_operation_done(o
);
1210 pa_operation_unref(o
);
1213 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_name
, "Autoload will no longer be implemented by future versions of the PulseAudio server.");
1215 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
) {
1221 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1224 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1225 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1226 PA_CHECK_VALIDITY_RETURN_NULL(c
, type
== PA_AUTOLOAD_SINK
|| type
== PA_AUTOLOAD_SOURCE
, PA_ERR_INVALID
);
1228 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1230 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_AUTOLOAD_INFO
, &tag
);
1231 pa_tagstruct_puts(t
, name
);
1232 pa_tagstruct_putu32(t
, type
);
1233 pa_pstream_send_tagstruct(c
->pstream
, t
);
1234 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_autoload_info_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1239 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_index
, "Autoload will no longer be implemented by future versions of the PulseAudio server.");
1241 pa_operation
* pa_context_get_autoload_info_by_index(pa_context
*c
, uint32_t idx
, pa_autoload_info_cb_t cb
, void *userdata
) {
1247 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1250 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1251 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1253 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1255 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_AUTOLOAD_INFO
, &tag
);
1256 pa_tagstruct_putu32(t
, idx
);
1257 pa_pstream_send_tagstruct(c
->pstream
, t
);
1258 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_autoload_info_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1264 PA_WARN_REFERENCE(pa_context_get_autoload_info_list
, "Autoload will no longer be implemented by future versions of the PulseAudio server.");
1266 pa_operation
* pa_context_get_autoload_info_list(pa_context
*c
, pa_autoload_info_cb_t cb
, void *userdata
) {
1267 return pa_context_send_simple_command(c
, PA_COMMAND_GET_AUTOLOAD_INFO_LIST
, context_get_autoload_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
1270 PA_WARN_REFERENCE(pa_context_add_autoload
, "Autoload will no longer be implemented by future versions of the PulseAudio server.");
1272 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
) {
1278 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1280 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1281 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1282 PA_CHECK_VALIDITY_RETURN_NULL(c
, type
== PA_AUTOLOAD_SINK
|| type
== PA_AUTOLOAD_SOURCE
, PA_ERR_INVALID
);
1283 PA_CHECK_VALIDITY_RETURN_NULL(c
, module
&& *module
, PA_ERR_INVALID
);
1285 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1287 t
= pa_tagstruct_command(c
, PA_COMMAND_ADD_AUTOLOAD
, &tag
);
1288 pa_tagstruct_puts(t
, name
);
1289 pa_tagstruct_putu32(t
, type
);
1290 pa_tagstruct_puts(t
, module
);
1291 pa_tagstruct_puts(t
, argument
);
1292 pa_pstream_send_tagstruct(c
->pstream
, t
);
1293 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1298 PA_WARN_REFERENCE(pa_context_remove_autoload_by_name
, "Autoload will no longer be implemented by future versions of the PulseAudio server.");
1300 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
) {
1306 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1308 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1309 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1310 PA_CHECK_VALIDITY_RETURN_NULL(c
, type
== PA_AUTOLOAD_SINK
|| type
== PA_AUTOLOAD_SOURCE
, PA_ERR_INVALID
);
1312 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1314 t
= pa_tagstruct_command(c
, PA_COMMAND_REMOVE_AUTOLOAD
, &tag
);
1315 pa_tagstruct_puts(t
, name
);
1316 pa_tagstruct_putu32(t
, type
);
1317 pa_pstream_send_tagstruct(c
->pstream
, t
);
1318 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
);
1323 PA_WARN_REFERENCE(pa_context_remove_autoload_by_index
, "Autoload will no longer be implemented by future versions of the PulseAudio server.");
1325 pa_operation
* pa_context_remove_autoload_by_index(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void* userdata
) {
1331 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1333 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1334 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1336 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1338 t
= pa_tagstruct_command(c
, PA_COMMAND_REMOVE_AUTOLOAD
, &tag
);
1339 pa_tagstruct_putu32(t
, idx
);
1340 pa_pstream_send_tagstruct(c
->pstream
, t
);
1341 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
);
1346 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
) {
1352 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1354 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1355 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1356 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1357 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_name
&& *sink_name
, PA_ERR_INVALID
);
1359 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1361 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1362 pa_tagstruct_putu32(t
, idx
);
1363 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1364 pa_tagstruct_puts(t
, sink_name
);
1365 pa_pstream_send_tagstruct(c
->pstream
, t
);
1366 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
);
1371 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
) {
1377 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1379 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1380 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1381 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1382 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1384 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1386 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1387 pa_tagstruct_putu32(t
, idx
);
1388 pa_tagstruct_putu32(t
, sink_idx
);
1389 pa_tagstruct_puts(t
, NULL
);
1390 pa_pstream_send_tagstruct(c
->pstream
, t
);
1391 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
);
1396 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
) {
1402 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1404 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1405 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1406 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1407 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_name
&& *source_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_MOVE_SOURCE_OUTPUT
, &tag
);
1412 pa_tagstruct_putu32(t
, idx
);
1413 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1414 pa_tagstruct_puts(t
, source_name
);
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_move_source_output_by_index(pa_context
*c
, uint32_t idx
, uint32_t source_idx
, pa_context_success_cb_t cb
, void* userdata
) {
1427 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1429 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1430 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1431 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1432 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1434 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1436 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1437 pa_tagstruct_putu32(t
, idx
);
1438 pa_tagstruct_putu32(t
, source_idx
);
1439 pa_tagstruct_puts(t
, NULL
);
1440 pa_pstream_send_tagstruct(c
->pstream
, t
);
1441 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
);
1446 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
) {
1452 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1454 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1455 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1456 PA_CHECK_VALIDITY_RETURN_NULL(c
, !sink_name
|| *sink_name
, PA_ERR_INVALID
);
1458 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1460 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1461 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1462 pa_tagstruct_puts(t
, sink_name
);
1463 pa_tagstruct_put_boolean(t
, suspend
);
1464 pa_pstream_send_tagstruct(c
->pstream
, t
);
1465 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
);
1470 pa_operation
* pa_context_suspend_sink_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1476 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1478 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1479 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1481 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1483 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1484 pa_tagstruct_putu32(t
, idx
);
1485 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1486 pa_tagstruct_put_boolean(t
, suspend
);
1487 pa_pstream_send_tagstruct(c
->pstream
, t
);
1488 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
);
1493 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
) {
1499 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1501 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1502 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1503 PA_CHECK_VALIDITY_RETURN_NULL(c
, !source_name
|| *source_name
, PA_ERR_INVALID
);
1505 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1507 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1508 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1509 pa_tagstruct_puts(t
, source_name
);
1510 pa_tagstruct_put_boolean(t
, suspend
);
1511 pa_pstream_send_tagstruct(c
->pstream
, t
);
1512 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
);
1517 pa_operation
* pa_context_suspend_source_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1523 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1525 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1526 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1528 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1530 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1531 pa_tagstruct_putu32(t
, idx
);
1532 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1533 pa_tagstruct_put_boolean(t
, suspend
);
1534 pa_pstream_send_tagstruct(c
->pstream
, t
);
1535 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
);