4 This file is part of polypaudio.
6 polypaudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2 of the License,
9 or (at your option) any later version.
11 polypaudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with polypaudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
28 #include <polyp/context.h>
30 #include <polypcore/gccmacro.h>
31 #include <polypcore/pstream-util.h>
35 #include "introspect.h"
39 static void context_stat_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
40 pa_operation
*o
= userdata
;
41 pa_stat_info i
, *p
= &i
;
48 if (command
!= PA_COMMAND_REPLY
) {
49 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
53 } else if (pa_tagstruct_getu32(t
, &i
.memblock_total
) < 0 ||
54 pa_tagstruct_getu32(t
, &i
.memblock_total_size
) < 0 ||
55 pa_tagstruct_getu32(t
, &i
.memblock_allocated
) < 0 ||
56 pa_tagstruct_getu32(t
, &i
.memblock_allocated_size
) < 0 ||
57 pa_tagstruct_getu32(t
, &i
.scache_size
) < 0 ||
58 !pa_tagstruct_eof(t
)) {
59 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
64 pa_stat_info_cb_t cb
= (pa_stat_info_cb_t
) o
->callback
;
65 cb(o
->context
, p
, o
->userdata
);
70 pa_operation_unref(o
);
73 pa_operation
* pa_context_stat(pa_context
*c
, pa_stat_info_cb_t cb
, void *userdata
) {
74 return pa_context_send_simple_command(c
, PA_COMMAND_STAT
, context_stat_callback
, (pa_operation_cb_t
) cb
, userdata
);
79 static void context_get_server_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
80 pa_operation
*o
= userdata
;
81 pa_server_info i
, *p
= &i
;
88 if (command
!= PA_COMMAND_REPLY
) {
89 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
93 } else if (pa_tagstruct_gets(t
, &i
.server_name
) < 0 ||
94 pa_tagstruct_gets(t
, &i
.server_version
) < 0 ||
95 pa_tagstruct_gets(t
, &i
.user_name
) < 0 ||
96 pa_tagstruct_gets(t
, &i
.host_name
) < 0 ||
97 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
98 pa_tagstruct_gets(t
, &i
.default_sink_name
) < 0 ||
99 pa_tagstruct_gets(t
, &i
.default_source_name
) < 0 ||
100 pa_tagstruct_getu32(t
, &i
.cookie
) < 0 ||
101 !pa_tagstruct_eof(t
)) {
103 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
108 pa_server_info_cb_t cb
= (pa_server_info_cb_t
) o
->callback
;
109 cb(o
->context
, p
, o
->userdata
);
113 pa_operation_done(o
);
114 pa_operation_unref(o
);
117 pa_operation
* pa_context_get_server_info(pa_context
*c
, pa_server_info_cb_t cb
, void *userdata
) {
118 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SERVER_INFO
, context_get_server_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
123 static void context_get_sink_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
124 pa_operation
*o
= userdata
;
132 if (command
!= PA_COMMAND_REPLY
) {
133 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
139 while (!pa_tagstruct_eof(t
)) {
142 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
143 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
144 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
145 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
146 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
147 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
148 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
149 pa_tagstruct_get_boolean(t
, &i
.mute
) < 0 ||
150 pa_tagstruct_getu32(t
, &i
.monitor_source
) < 0 ||
151 pa_tagstruct_gets(t
, &i
.monitor_source_name
) < 0 ||
152 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
153 pa_tagstruct_gets(t
, &i
.driver
) < 0) {
155 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
160 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
161 cb(o
->context
, &i
, 0, o
->userdata
);
167 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
168 cb(o
->context
, NULL
, eol
, o
->userdata
);
172 pa_operation_done(o
);
173 pa_operation_unref(o
);
176 pa_operation
* pa_context_get_sink_info_list(pa_context
*c
, pa_sink_info_cb_t cb
, void *userdata
) {
177 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SINK_INFO_LIST
, context_get_sink_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
180 pa_operation
* pa_context_get_sink_info_by_index(pa_context
*c
, uint32_t idx
, pa_sink_info_cb_t cb
, void *userdata
) {
189 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
191 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
193 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
194 pa_tagstruct_putu32(t
, idx
);
195 pa_tagstruct_puts(t
, NULL
);
196 pa_pstream_send_tagstruct(c
->pstream
, t
);
197 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_sink_info_callback
, pa_operation_ref(o
));
202 pa_operation
* pa_context_get_sink_info_by_name(pa_context
*c
, const char *name
, pa_sink_info_cb_t cb
, void *userdata
) {
211 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
212 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
214 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
216 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
217 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
218 pa_tagstruct_puts(t
, name
);
219 pa_pstream_send_tagstruct(c
->pstream
, t
);
220 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_sink_info_callback
, pa_operation_ref(o
));
225 /*** Source info ***/
227 static void context_get_source_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
228 pa_operation
*o
= userdata
;
236 if (command
!= PA_COMMAND_REPLY
) {
237 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
243 while (!pa_tagstruct_eof(t
)) {
246 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
247 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
248 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
249 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
250 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
251 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
252 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
253 pa_tagstruct_get_boolean(t
, &i
.mute
) < 0 ||
254 pa_tagstruct_getu32(t
, &i
.monitor_of_sink
) < 0 ||
255 pa_tagstruct_gets(t
, &i
.monitor_of_sink_name
) < 0 ||
256 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
257 pa_tagstruct_gets(t
, &i
.driver
) < 0) {
259 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
264 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
265 cb(o
->context
, &i
, 0, o
->userdata
);
271 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
272 cb(o
->context
, NULL
, eol
, o
->userdata
);
276 pa_operation_done(o
);
277 pa_operation_unref(o
);
280 pa_operation
* pa_context_get_source_info_list(pa_context
*c
, pa_source_info_cb_t cb
, void *userdata
) {
281 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SOURCE_INFO_LIST
, context_get_source_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
284 pa_operation
* pa_context_get_source_info_by_index(pa_context
*c
, uint32_t idx
, pa_source_info_cb_t cb
, void *userdata
) {
293 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
295 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
297 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
298 pa_tagstruct_putu32(t
, idx
);
299 pa_tagstruct_puts(t
, NULL
);
300 pa_pstream_send_tagstruct(c
->pstream
, t
);
301 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_source_info_callback
, pa_operation_ref(o
));
306 pa_operation
* pa_context_get_source_info_by_name(pa_context
*c
, const char *name
, pa_source_info_cb_t cb
, void *userdata
) {
315 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
316 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
318 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
320 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
321 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
322 pa_tagstruct_puts(t
, name
);
323 pa_pstream_send_tagstruct(c
->pstream
, t
);
324 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_source_info_callback
, o
);
326 return pa_operation_ref(o
);
329 /*** Client info ***/
331 static void context_get_client_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
332 pa_operation
*o
= userdata
;
340 if (command
!= PA_COMMAND_REPLY
) {
341 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
347 while (!pa_tagstruct_eof(t
)) {
350 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
351 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
352 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
353 pa_tagstruct_gets(t
, &i
.driver
) < 0 ) {
354 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
359 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
360 cb(o
->context
, &i
, 0, o
->userdata
);
366 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
367 cb(o
->context
, NULL
, eol
, o
->userdata
);
371 pa_operation_done(o
);
372 pa_operation_unref(o
);
375 pa_operation
* pa_context_get_client_info(pa_context
*c
, uint32_t idx
, pa_client_info_cb_t cb
, void *userdata
) {
384 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
385 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
387 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
389 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CLIENT_INFO
, &tag
);
390 pa_tagstruct_putu32(t
, idx
);
391 pa_pstream_send_tagstruct(c
->pstream
, t
);
392 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_client_info_callback
, pa_operation_ref(o
));
397 pa_operation
* pa_context_get_client_info_list(pa_context
*c
, pa_client_info_cb_t cb
, void *userdata
) {
398 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CLIENT_INFO_LIST
, context_get_client_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
401 /*** Module info ***/
403 static void context_get_module_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
404 pa_operation
*o
= userdata
;
412 if (command
!= PA_COMMAND_REPLY
) {
413 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
419 while (!pa_tagstruct_eof(t
)) {
422 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
423 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
424 pa_tagstruct_gets(t
, &i
.argument
) < 0 ||
425 pa_tagstruct_getu32(t
, &i
.n_used
) < 0 ||
426 pa_tagstruct_get_boolean(t
, &i
.auto_unload
) < 0) {
427 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
432 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
433 cb(o
->context
, &i
, 0, o
->userdata
);
439 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
440 cb(o
->context
, NULL
, eol
, o
->userdata
);
444 pa_operation_done(o
);
445 pa_operation_unref(o
);
448 pa_operation
* pa_context_get_module_info(pa_context
*c
, uint32_t idx
, pa_module_info_cb_t cb
, void *userdata
) {
457 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
458 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
460 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
462 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_MODULE_INFO
, &tag
);
463 pa_tagstruct_putu32(t
, idx
);
464 pa_pstream_send_tagstruct(c
->pstream
, t
);
465 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_module_info_callback
, pa_operation_ref(o
));
470 pa_operation
* pa_context_get_module_info_list(pa_context
*c
, pa_module_info_cb_t cb
, void *userdata
) {
471 return pa_context_send_simple_command(c
, PA_COMMAND_GET_MODULE_INFO_LIST
, context_get_module_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
474 /*** Sink input info ***/
476 static void context_get_sink_input_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
477 pa_operation
*o
= userdata
;
485 if (command
!= PA_COMMAND_REPLY
) {
486 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
492 while (!pa_tagstruct_eof(t
)) {
493 pa_sink_input_info i
;
495 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
496 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
497 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
498 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
499 pa_tagstruct_getu32(t
, &i
.sink
) < 0 ||
500 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
501 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
502 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
503 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
504 pa_tagstruct_get_usec(t
, &i
.sink_usec
) < 0 ||
505 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
506 pa_tagstruct_gets(t
, &i
.driver
) < 0) {
508 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
513 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
514 cb(o
->context
, &i
, 0, o
->userdata
);
520 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
521 cb(o
->context
, NULL
, eol
, o
->userdata
);
525 pa_operation_done(o
);
526 pa_operation_unref(o
);
529 pa_operation
* pa_context_get_sink_input_info(pa_context
*c
, uint32_t idx
, pa_sink_input_info_cb_t cb
, void *userdata
) {
538 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
539 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
541 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
543 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INPUT_INFO
, &tag
);
544 pa_tagstruct_putu32(t
, idx
);
545 pa_pstream_send_tagstruct(c
->pstream
, t
);
546 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_sink_input_info_callback
, pa_operation_ref(o
));
551 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
) {
552 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
);
555 /*** Source output info ***/
557 static void context_get_source_output_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
558 pa_operation
*o
= userdata
;
566 if (command
!= PA_COMMAND_REPLY
) {
567 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
573 while (!pa_tagstruct_eof(t
)) {
574 pa_source_output_info i
;
576 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
577 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
578 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
579 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
580 pa_tagstruct_getu32(t
, &i
.source
) < 0 ||
581 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
582 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
583 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
584 pa_tagstruct_get_usec(t
, &i
.source_usec
) < 0 ||
585 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
586 pa_tagstruct_gets(t
, &i
.driver
) < 0) {
588 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
593 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
594 cb(o
->context
, &i
, 0, o
->userdata
);
600 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
601 cb(o
->context
, NULL
, eol
, o
->userdata
);
605 pa_operation_done(o
);
606 pa_operation_unref(o
);
609 pa_operation
* pa_context_get_source_output_info(pa_context
*c
, uint32_t idx
, pa_source_output_info_cb_t cb
, void *userdata
) {
618 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
619 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
621 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
623 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_OUTPUT_INFO
, &tag
);
624 pa_tagstruct_putu32(t
, idx
);
625 pa_pstream_send_tagstruct(c
->pstream
, t
);
626 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_source_output_info_callback
, pa_operation_ref(o
));
631 pa_operation
* pa_context_get_source_output_info_list(pa_context
*c
, pa_source_output_info_cb_t cb
, void *userdata
) {
632 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
);
635 /*** Volume manipulation ***/
637 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
) {
646 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
647 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
649 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
651 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
652 pa_tagstruct_putu32(t
, idx
);
653 pa_tagstruct_puts(t
, NULL
);
654 pa_tagstruct_put_cvolume(t
, volume
);
655 pa_pstream_send_tagstruct(c
->pstream
, t
);
656 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
661 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
) {
671 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
672 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
673 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
675 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
677 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
678 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
679 pa_tagstruct_puts(t
, name
);
680 pa_tagstruct_put_cvolume(t
, volume
);
681 pa_pstream_send_tagstruct(c
->pstream
, t
);
682 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
687 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
) {
695 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
697 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
699 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
700 pa_tagstruct_putu32(t
, idx
);
701 pa_tagstruct_puts(t
, NULL
);
702 pa_tagstruct_put_boolean(t
, mute
);
703 pa_pstream_send_tagstruct(c
->pstream
, t
);
704 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
709 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
) {
718 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
719 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
721 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
723 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
724 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
725 pa_tagstruct_puts(t
, name
);
726 pa_tagstruct_put_boolean(t
, mute
);
727 pa_pstream_send_tagstruct(c
->pstream
, t
);
728 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
733 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
) {
742 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
743 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
744 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
746 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
748 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_VOLUME
, &tag
);
749 pa_tagstruct_putu32(t
, idx
);
750 pa_tagstruct_put_cvolume(t
, volume
);
751 pa_pstream_send_tagstruct(c
->pstream
, t
);
752 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
757 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
) {
766 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
767 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
769 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
771 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
772 pa_tagstruct_putu32(t
, idx
);
773 pa_tagstruct_puts(t
, NULL
);
774 pa_tagstruct_put_cvolume(t
, volume
);
775 pa_pstream_send_tagstruct(c
->pstream
, t
);
776 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
781 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
) {
791 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
792 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
793 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
795 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
797 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
798 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
799 pa_tagstruct_puts(t
, name
);
800 pa_tagstruct_put_cvolume(t
, volume
);
801 pa_pstream_send_tagstruct(c
->pstream
, t
);
802 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
807 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
) {
815 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
817 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
819 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
820 pa_tagstruct_putu32(t
, idx
);
821 pa_tagstruct_puts(t
, NULL
);
822 pa_tagstruct_put_boolean(t
, mute
);
823 pa_pstream_send_tagstruct(c
->pstream
, t
);
824 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
829 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
) {
838 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
839 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
841 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
843 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
844 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
845 pa_tagstruct_puts(t
, name
);
846 pa_tagstruct_put_boolean(t
, mute
);
847 pa_pstream_send_tagstruct(c
->pstream
, t
);
848 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
855 static void context_get_sample_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
856 pa_operation
*o
= userdata
;
864 if (command
!= PA_COMMAND_REPLY
) {
865 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
871 while (!pa_tagstruct_eof(t
)) {
874 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
875 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
876 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
877 pa_tagstruct_get_usec(t
, &i
.duration
) < 0 ||
878 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
879 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
880 pa_tagstruct_getu32(t
, &i
.bytes
) < 0 ||
881 pa_tagstruct_get_boolean(t
, &i
.lazy
) < 0 ||
882 pa_tagstruct_gets(t
, &i
.filename
) < 0) {
884 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
889 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
890 cb(o
->context
, &i
, 0, o
->userdata
);
896 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
897 cb(o
->context
, NULL
, eol
, o
->userdata
);
901 pa_operation_done(o
);
902 pa_operation_unref(o
);
905 pa_operation
* pa_context_get_sample_info_by_name(pa_context
*c
, const char *name
, pa_sample_info_cb_t cb
, void *userdata
) {
914 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
915 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
917 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
919 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
920 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
921 pa_tagstruct_puts(t
, name
);
922 pa_pstream_send_tagstruct(c
->pstream
, t
);
923 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_sample_info_callback
, pa_operation_ref(o
));
928 pa_operation
* pa_context_get_sample_info_by_index(pa_context
*c
, uint32_t idx
, pa_sample_info_cb_t cb
, void *userdata
) {
937 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
938 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
940 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
942 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
943 pa_tagstruct_putu32(t
, idx
);
944 pa_tagstruct_puts(t
, NULL
);
945 pa_pstream_send_tagstruct(c
->pstream
, t
);
946 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_sample_info_callback
, pa_operation_ref(o
));
951 pa_operation
* pa_context_get_sample_info_list(pa_context
*c
, pa_sample_info_cb_t cb
, void *userdata
) {
952 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SAMPLE_INFO_LIST
, context_get_sample_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
955 static pa_operation
* command_kill(pa_context
*c
, uint32_t command
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
963 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
964 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
966 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
968 t
= pa_tagstruct_command(c
, command
, &tag
);
969 pa_tagstruct_putu32(t
, idx
);
970 pa_pstream_send_tagstruct(c
->pstream
, t
);
971 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
976 pa_operation
* pa_context_kill_client(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
977 return command_kill(c
, PA_COMMAND_KILL_CLIENT
, idx
, cb
, userdata
);
980 pa_operation
* pa_context_kill_sink_input(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
981 return command_kill(c
, PA_COMMAND_KILL_SINK_INPUT
, idx
, cb
, userdata
);
984 pa_operation
* pa_context_kill_source_output(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
985 return command_kill(c
, PA_COMMAND_KILL_SOURCE_OUTPUT
, idx
, cb
, userdata
);
988 static void context_index_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
989 pa_operation
*o
= userdata
;
997 if (command
!= PA_COMMAND_REPLY
) {
998 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
1001 idx
= PA_INVALID_INDEX
;
1002 } else if (pa_tagstruct_getu32(t
, &idx
) ||
1003 !pa_tagstruct_eof(t
)) {
1004 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1009 pa_context_index_cb_t cb
= (pa_context_index_cb_t
) o
->callback
;
1010 cb(o
->context
, idx
, o
->userdata
);
1015 pa_operation_done(o
);
1016 pa_operation_unref(o
);
1019 pa_operation
* pa_context_load_module(pa_context
*c
, const char*name
, const char *argument
, pa_context_index_cb_t cb
, void *userdata
) {
1025 assert(c
->ref
>= 1);
1027 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1028 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1030 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1032 t
= pa_tagstruct_command(c
, PA_COMMAND_LOAD_MODULE
, &tag
);
1033 pa_tagstruct_puts(t
, name
);
1034 pa_tagstruct_puts(t
, argument
);
1035 pa_pstream_send_tagstruct(c
->pstream
, t
);
1036 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
));
1041 pa_operation
* pa_context_unload_module(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1042 return command_kill(c
, PA_COMMAND_UNLOAD_MODULE
, idx
, cb
, userdata
);
1045 /*** Autoload stuff ***/
1047 static void context_get_autoload_info_callback(pa_pdispatch
*pd
, uint32_t command
, PA_GCC_UNUSED
uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1048 pa_operation
*o
= userdata
;
1053 assert(o
->ref
>= 1);
1056 if (command
!= PA_COMMAND_REPLY
) {
1057 if (pa_context_handle_error(o
->context
, command
, t
) < 0)
1063 while (!pa_tagstruct_eof(t
)) {
1066 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
1067 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
1068 pa_tagstruct_getu32(t
, &i
.type
) < 0 ||
1069 pa_tagstruct_gets(t
, &i
.module
) < 0 ||
1070 pa_tagstruct_gets(t
, &i
.argument
) < 0) {
1071 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1076 pa_autoload_info_cb_t cb
= (pa_autoload_info_cb_t
) o
->callback
;
1077 cb(o
->context
, &i
, 0, o
->userdata
);
1083 pa_autoload_info_cb_t cb
= (pa_autoload_info_cb_t
) o
->callback
;
1084 cb(o
->context
, NULL
, eol
, o
->userdata
);
1088 pa_operation_done(o
);
1089 pa_operation_unref(o
);
1092 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
) {
1098 assert(c
->ref
>= 1);
1101 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1102 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1103 PA_CHECK_VALIDITY_RETURN_NULL(c
, type
== PA_AUTOLOAD_SINK
|| type
== PA_AUTOLOAD_SOURCE
, PA_ERR_INVALID
);
1105 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1107 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_AUTOLOAD_INFO
, &tag
);
1108 pa_tagstruct_puts(t
, name
);
1109 pa_tagstruct_putu32(t
, type
);
1110 pa_pstream_send_tagstruct(c
->pstream
, t
);
1111 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_autoload_info_callback
, pa_operation_ref(o
));
1116 pa_operation
* pa_context_get_autoload_info_by_index(pa_context
*c
, uint32_t idx
, pa_autoload_info_cb_t cb
, void *userdata
) {
1122 assert(c
->ref
>= 1);
1125 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1126 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1128 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1130 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_AUTOLOAD_INFO
, &tag
);
1131 pa_tagstruct_putu32(t
, idx
);
1132 pa_pstream_send_tagstruct(c
->pstream
, t
);
1133 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_autoload_info_callback
, pa_operation_ref(o
));
1138 pa_operation
* pa_context_get_autoload_info_list(pa_context
*c
, pa_autoload_info_cb_t cb
, void *userdata
) {
1139 return pa_context_send_simple_command(c
, PA_COMMAND_GET_AUTOLOAD_INFO_LIST
, context_get_autoload_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
1142 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
) {
1148 assert(c
->ref
>= 1);
1150 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1151 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1152 PA_CHECK_VALIDITY_RETURN_NULL(c
, type
== PA_AUTOLOAD_SINK
|| type
== PA_AUTOLOAD_SOURCE
, PA_ERR_INVALID
);
1153 PA_CHECK_VALIDITY_RETURN_NULL(c
, module
&& *module
, PA_ERR_INVALID
);
1155 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1157 t
= pa_tagstruct_command(c
, PA_COMMAND_ADD_AUTOLOAD
, &tag
);
1158 pa_tagstruct_puts(t
, name
);
1159 pa_tagstruct_putu32(t
, type
);
1160 pa_tagstruct_puts(t
, module
);
1161 pa_tagstruct_puts(t
, argument
);
1162 pa_pstream_send_tagstruct(c
->pstream
, t
);
1163 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
));
1168 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
) {
1174 assert(c
->ref
>= 1);
1176 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1177 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1178 PA_CHECK_VALIDITY_RETURN_NULL(c
, type
== PA_AUTOLOAD_SINK
|| type
== PA_AUTOLOAD_SOURCE
, PA_ERR_INVALID
);
1180 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1182 t
= pa_tagstruct_command(c
, PA_COMMAND_REMOVE_AUTOLOAD
, &tag
);
1183 pa_tagstruct_puts(t
, name
);
1184 pa_tagstruct_putu32(t
, type
);
1185 pa_pstream_send_tagstruct(c
->pstream
, t
);
1186 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));
1191 pa_operation
* pa_context_remove_autoload_by_index(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void* userdata
) {
1197 assert(c
->ref
>= 1);
1199 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1200 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1202 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1204 t
= pa_tagstruct_command(c
, PA_COMMAND_REMOVE_AUTOLOAD
, &tag
);
1205 pa_tagstruct_putu32(t
, idx
);
1206 pa_pstream_send_tagstruct(c
->pstream
, t
);
1207 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
));