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
29 #include <pulse/context.h>
30 #include <pulse/gccmacro.h>
31 #include <pulse/xmalloc.h>
33 #include <pulsecore/macro.h>
34 #include <pulsecore/core-util.h>
35 #include <pulsecore/pstream-util.h>
38 #include "fork-detect.h"
40 #include "introspect.h"
44 static void context_stat_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
45 pa_operation
*o
= userdata
;
46 pa_stat_info i
, *p
= &i
;
50 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
52 memset(&i
, 0, sizeof(i
));
57 if (command
!= PA_COMMAND_REPLY
) {
58 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
62 } else if (pa_tagstruct_getu32(t
, &i
.memblock_total
) < 0 ||
63 pa_tagstruct_getu32(t
, &i
.memblock_total_size
) < 0 ||
64 pa_tagstruct_getu32(t
, &i
.memblock_allocated
) < 0 ||
65 pa_tagstruct_getu32(t
, &i
.memblock_allocated_size
) < 0 ||
66 pa_tagstruct_getu32(t
, &i
.scache_size
) < 0 ||
67 !pa_tagstruct_eof(t
)) {
68 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
73 pa_stat_info_cb_t cb
= (pa_stat_info_cb_t
) o
->callback
;
74 cb(o
->context
, p
, o
->userdata
);
79 pa_operation_unref(o
);
82 pa_operation
* pa_context_stat(pa_context
*c
, pa_stat_info_cb_t cb
, void *userdata
) {
83 return pa_context_send_simple_command(c
, PA_COMMAND_STAT
, context_stat_callback
, (pa_operation_cb_t
) cb
, userdata
);
88 static void context_get_server_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
89 pa_operation
*o
= userdata
;
90 pa_server_info i
, *p
= &i
;
94 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
96 memset(&i
, 0, sizeof(i
));
101 if (command
!= PA_COMMAND_REPLY
) {
102 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
106 } else if (pa_tagstruct_gets(t
, &i
.server_name
) < 0 ||
107 pa_tagstruct_gets(t
, &i
.server_version
) < 0 ||
108 pa_tagstruct_gets(t
, &i
.user_name
) < 0 ||
109 pa_tagstruct_gets(t
, &i
.host_name
) < 0 ||
110 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
111 pa_tagstruct_gets(t
, &i
.default_sink_name
) < 0 ||
112 pa_tagstruct_gets(t
, &i
.default_source_name
) < 0 ||
113 pa_tagstruct_getu32(t
, &i
.cookie
) < 0 ||
114 (o
->context
->version
>= 15 &&
115 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0) ||
116 !pa_tagstruct_eof(t
)) {
118 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
122 if (p
&& o
->context
->version
< 15)
123 pa_channel_map_init_extend(&i
.channel_map
, i
.sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
126 pa_server_info_cb_t cb
= (pa_server_info_cb_t
) o
->callback
;
127 cb(o
->context
, p
, o
->userdata
);
131 pa_operation_done(o
);
132 pa_operation_unref(o
);
135 pa_operation
* pa_context_get_server_info(pa_context
*c
, pa_server_info_cb_t cb
, void *userdata
) {
136 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SERVER_INFO
, context_get_server_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
141 static void context_get_sink_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
142 pa_operation
*o
= userdata
;
147 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
152 if (command
!= PA_COMMAND_REPLY
) {
153 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
159 while (!pa_tagstruct_eof(t
)) {
165 memset(&i
, 0, sizeof(i
));
166 i
.proplist
= pa_proplist_new();
167 i
.base_volume
= PA_VOLUME_NORM
;
168 i
.n_volume_steps
= PA_VOLUME_NORM
+1;
170 state
= PA_SINK_INVALID_STATE
;
171 i
.card
= PA_INVALID_INDEX
;
173 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
174 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
175 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
176 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
177 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
178 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
179 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
180 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
181 pa_tagstruct_getu32(t
, &i
.monitor_source
) < 0 ||
182 pa_tagstruct_gets(t
, &i
.monitor_source_name
) < 0 ||
183 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
184 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
185 pa_tagstruct_getu32(t
, &flags
) < 0 ||
186 (o
->context
->version
>= 13 &&
187 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
188 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0)) ||
189 (o
->context
->version
>= 15 &&
190 (pa_tagstruct_get_volume(t
, &i
.base_volume
) < 0 ||
191 pa_tagstruct_getu32(t
, &state
) < 0 ||
192 pa_tagstruct_getu32(t
, &i
.n_volume_steps
) < 0 ||
193 pa_tagstruct_getu32(t
, &i
.card
) < 0))) {
195 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
196 pa_proplist_free(i
.proplist
);
201 i
.flags
= (pa_sink_flags_t
) flags
;
202 i
.state
= (pa_sink_state_t
) state
;
205 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
206 cb(o
->context
, &i
, 0, o
->userdata
);
209 pa_proplist_free(i
.proplist
);
214 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
215 cb(o
->context
, NULL
, eol
, o
->userdata
);
219 pa_operation_done(o
);
220 pa_operation_unref(o
);
223 pa_operation
* pa_context_get_sink_info_list(pa_context
*c
, pa_sink_info_cb_t cb
, void *userdata
) {
224 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SINK_INFO_LIST
, context_get_sink_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
227 pa_operation
* pa_context_get_sink_info_by_index(pa_context
*c
, uint32_t idx
, pa_sink_info_cb_t cb
, void *userdata
) {
233 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
236 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
237 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
239 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
241 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
242 pa_tagstruct_putu32(t
, idx
);
243 pa_tagstruct_puts(t
, NULL
);
244 pa_pstream_send_tagstruct(c
->pstream
, t
);
245 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
);
250 pa_operation
* pa_context_get_sink_info_by_name(pa_context
*c
, const char *name
, pa_sink_info_cb_t cb
, void *userdata
) {
256 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
259 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
260 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
261 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
263 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
265 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
266 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
267 pa_tagstruct_puts(t
, name
);
268 pa_pstream_send_tagstruct(c
->pstream
, t
);
269 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
);
274 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
) {
280 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
282 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
283 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
284 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
285 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 16, PA_ERR_NOTSUPPORTED
);
287 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
289 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_PORT
, &tag
);
290 pa_tagstruct_putu32(t
, idx
);
291 pa_tagstruct_puts(t
, NULL
);
292 pa_tagstruct_puts(t
, port
);
293 pa_pstream_send_tagstruct(c
->pstream
, t
);
294 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
);
299 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
) {
305 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
307 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
308 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
309 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
310 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 16, PA_ERR_NOTSUPPORTED
);
312 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
314 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_PORT
, &tag
);
315 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
316 pa_tagstruct_puts(t
, name
);
317 pa_tagstruct_puts(t
, port
);
318 pa_pstream_send_tagstruct(c
->pstream
, t
);
319 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
);
324 /*** Source info ***/
326 static void context_get_source_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
327 pa_operation
*o
= userdata
;
332 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
337 if (command
!= PA_COMMAND_REPLY
) {
338 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
344 while (!pa_tagstruct_eof(t
)) {
350 memset(&i
, 0, sizeof(i
));
351 i
.proplist
= pa_proplist_new();
352 i
.base_volume
= PA_VOLUME_NORM
;
353 i
.n_volume_steps
= PA_VOLUME_NORM
+1;
355 state
= PA_SOURCE_INVALID_STATE
;
356 i
.card
= PA_INVALID_INDEX
;
358 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
359 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
360 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
361 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
362 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
363 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
364 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
365 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
366 pa_tagstruct_getu32(t
, &i
.monitor_of_sink
) < 0 ||
367 pa_tagstruct_gets(t
, &i
.monitor_of_sink_name
) < 0 ||
368 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
369 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
370 pa_tagstruct_getu32(t
, &flags
) < 0 ||
371 (o
->context
->version
>= 13 &&
372 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
373 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0)) ||
374 (o
->context
->version
>= 15 &&
375 (pa_tagstruct_get_volume(t
, &i
.base_volume
) < 0 ||
376 pa_tagstruct_getu32(t
, &state
) < 0 ||
377 pa_tagstruct_getu32(t
, &i
.n_volume_steps
) < 0 ||
378 pa_tagstruct_getu32(t
, &i
.card
) < 0))) {
380 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
381 pa_proplist_free(i
.proplist
);
386 i
.flags
= (pa_source_flags_t
) flags
;
387 i
.state
= (pa_source_state_t
) state
;
390 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
391 cb(o
->context
, &i
, 0, o
->userdata
);
394 pa_proplist_free(i
.proplist
);
399 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
400 cb(o
->context
, NULL
, eol
, o
->userdata
);
404 pa_operation_done(o
);
405 pa_operation_unref(o
);
408 pa_operation
* pa_context_get_source_info_list(pa_context
*c
, pa_source_info_cb_t cb
, void *userdata
) {
409 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SOURCE_INFO_LIST
, context_get_source_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
412 pa_operation
* pa_context_get_source_info_by_index(pa_context
*c
, uint32_t idx
, pa_source_info_cb_t cb
, void *userdata
) {
418 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
421 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
422 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
424 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
426 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
427 pa_tagstruct_putu32(t
, idx
);
428 pa_tagstruct_puts(t
, NULL
);
429 pa_pstream_send_tagstruct(c
->pstream
, t
);
430 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
);
435 pa_operation
* pa_context_get_source_info_by_name(pa_context
*c
, const char *name
, pa_source_info_cb_t cb
, void *userdata
) {
441 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
444 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
445 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
446 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
448 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
450 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
451 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
452 pa_tagstruct_puts(t
, name
);
453 pa_pstream_send_tagstruct(c
->pstream
, t
);
454 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
);
459 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
) {
465 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
467 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
468 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
469 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
470 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 16, PA_ERR_NOTSUPPORTED
);
472 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
474 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_PORT
, &tag
);
475 pa_tagstruct_putu32(t
, idx
);
476 pa_tagstruct_puts(t
, NULL
);
477 pa_tagstruct_puts(t
, port
);
478 pa_pstream_send_tagstruct(c
->pstream
, t
);
479 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
);
484 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
) {
490 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
492 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
493 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
494 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
495 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 16, PA_ERR_NOTSUPPORTED
);
497 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
499 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_PORT
, &tag
);
500 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
501 pa_tagstruct_puts(t
, name
);
502 pa_tagstruct_puts(t
, port
);
503 pa_pstream_send_tagstruct(c
->pstream
, t
);
504 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
);
509 /*** Client info ***/
511 static void context_get_client_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
512 pa_operation
*o
= userdata
;
517 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
522 if (command
!= PA_COMMAND_REPLY
) {
523 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
529 while (!pa_tagstruct_eof(t
)) {
532 memset(&i
, 0, sizeof(i
));
533 i
.proplist
= pa_proplist_new();
535 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
536 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
537 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
538 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
539 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
541 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
542 pa_proplist_free(i
.proplist
);
547 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
548 cb(o
->context
, &i
, 0, o
->userdata
);
551 pa_proplist_free(i
.proplist
);
556 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
557 cb(o
->context
, NULL
, eol
, o
->userdata
);
561 pa_operation_done(o
);
562 pa_operation_unref(o
);
565 pa_operation
* pa_context_get_client_info(pa_context
*c
, uint32_t idx
, pa_client_info_cb_t cb
, void *userdata
) {
571 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
574 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
575 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
576 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
578 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
580 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CLIENT_INFO
, &tag
);
581 pa_tagstruct_putu32(t
, idx
);
582 pa_pstream_send_tagstruct(c
->pstream
, t
);
583 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
);
588 pa_operation
* pa_context_get_client_info_list(pa_context
*c
, pa_client_info_cb_t cb
, void *userdata
) {
589 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CLIENT_INFO_LIST
, context_get_client_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
594 static void context_get_card_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
595 pa_operation
*o
= userdata
;
600 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
605 if (command
!= PA_COMMAND_REPLY
) {
606 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
612 while (!pa_tagstruct_eof(t
)) {
617 memset(&i
, 0, sizeof(i
));
619 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
620 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
621 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
622 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
623 pa_tagstruct_getu32(t
, &i
.n_profiles
) < 0) {
625 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
629 if (i
.n_profiles
> 0) {
630 i
.profiles
= pa_xnew(pa_card_profile_info
, i
.n_profiles
+1);
632 for (j
= 0; j
< i
.n_profiles
; j
++) {
634 if (pa_tagstruct_gets(t
, &i
.profiles
[j
].name
) < 0 ||
635 pa_tagstruct_gets(t
, &i
.profiles
[j
].description
) < 0 ||
636 pa_tagstruct_getu32(t
, &i
.profiles
[j
].n_sinks
) < 0 ||
637 pa_tagstruct_getu32(t
, &i
.profiles
[j
].n_sources
) < 0 ||
638 pa_tagstruct_getu32(t
, &i
.profiles
[j
].priority
) < 0) {
640 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
641 pa_xfree(i
.profiles
);
646 /* Terminate with an extra NULL entry, just to make sure */
647 i
.profiles
[j
].name
= NULL
;
648 i
.profiles
[j
].description
= NULL
;
651 i
.proplist
= pa_proplist_new();
653 if (pa_tagstruct_gets(t
, &ap
) < 0 ||
654 pa_tagstruct_get_proplist(t
, i
.proplist
) < 0) {
656 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
657 pa_xfree(i
.profiles
);
658 pa_proplist_free(i
.proplist
);
663 for (j
= 0; j
< i
.n_profiles
; j
++)
664 if (pa_streq(i
.profiles
[j
].name
, ap
)) {
665 i
.active_profile
= &i
.profiles
[j
];
671 pa_card_info_cb_t cb
= (pa_card_info_cb_t
) o
->callback
;
672 cb(o
->context
, &i
, 0, o
->userdata
);
675 pa_proplist_free(i
.proplist
);
676 pa_xfree(i
.profiles
);
681 pa_card_info_cb_t cb
= (pa_card_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_card_info_by_index(pa_context
*c
, uint32_t idx
, pa_card_info_cb_t cb
, void *userdata
) {
696 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
699 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
700 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
701 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
702 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
704 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
706 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CARD_INFO
, &tag
);
707 pa_tagstruct_putu32(t
, idx
);
708 pa_tagstruct_puts(t
, NULL
);
709 pa_pstream_send_tagstruct(c
->pstream
, t
);
710 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
);
715 pa_operation
* pa_context_get_card_info_by_name(pa_context
*c
, const char*name
, pa_card_info_cb_t cb
, void *userdata
) {
721 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
724 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
725 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
726 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
727 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
729 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
731 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CARD_INFO
, &tag
);
732 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
733 pa_tagstruct_puts(t
, name
);
734 pa_pstream_send_tagstruct(c
->pstream
, t
);
735 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
);
740 pa_operation
* pa_context_get_card_info_list(pa_context
*c
, pa_card_info_cb_t cb
, void *userdata
) {
741 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CARD_INFO_LIST
, context_get_card_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
744 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
) {
750 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
752 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
753 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
754 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
755 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
757 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
759 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_CARD_PROFILE
, &tag
);
760 pa_tagstruct_putu32(t
, idx
);
761 pa_tagstruct_puts(t
, NULL
);
762 pa_tagstruct_puts(t
, profile
);
763 pa_pstream_send_tagstruct(c
->pstream
, t
);
764 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
);
769 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
) {
775 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
777 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
778 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
779 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
780 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
782 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
784 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_CARD_PROFILE
, &tag
);
785 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
786 pa_tagstruct_puts(t
, name
);
787 pa_tagstruct_puts(t
, profile
);
788 pa_pstream_send_tagstruct(c
->pstream
, t
);
789 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
);
794 /*** Module info ***/
796 static void context_get_module_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
797 pa_operation
*o
= userdata
;
802 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
807 if (command
!= PA_COMMAND_REPLY
) {
808 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
814 while (!pa_tagstruct_eof(t
)) {
816 pa_bool_t auto_unload
= FALSE
;
818 memset(&i
, 0, sizeof(i
));
819 i
.proplist
= pa_proplist_new();
821 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
822 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
823 pa_tagstruct_gets(t
, &i
.argument
) < 0 ||
824 pa_tagstruct_getu32(t
, &i
.n_used
) < 0 ||
825 (o
->context
->version
< 15 && pa_tagstruct_get_boolean(t
, &auto_unload
) < 0) ||
826 (o
->context
->version
>= 15 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
827 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
831 i
.auto_unload
= (int) auto_unload
;
834 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
835 cb(o
->context
, &i
, 0, o
->userdata
);
838 pa_proplist_free(i
.proplist
);
843 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
844 cb(o
->context
, NULL
, eol
, o
->userdata
);
848 pa_operation_done(o
);
849 pa_operation_unref(o
);
852 pa_operation
* pa_context_get_module_info(pa_context
*c
, uint32_t idx
, pa_module_info_cb_t cb
, void *userdata
) {
858 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
861 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
862 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
863 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
865 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
867 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_MODULE_INFO
, &tag
);
868 pa_tagstruct_putu32(t
, idx
);
869 pa_pstream_send_tagstruct(c
->pstream
, t
);
870 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
);
875 pa_operation
* pa_context_get_module_info_list(pa_context
*c
, pa_module_info_cb_t cb
, void *userdata
) {
876 return pa_context_send_simple_command(c
, PA_COMMAND_GET_MODULE_INFO_LIST
, context_get_module_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
879 /*** Sink input info ***/
881 static void context_get_sink_input_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
882 pa_operation
*o
= userdata
;
887 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
892 if (command
!= PA_COMMAND_REPLY
) {
893 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
899 while (!pa_tagstruct_eof(t
)) {
900 pa_sink_input_info i
;
901 pa_bool_t mute
= FALSE
;
903 memset(&i
, 0, sizeof(i
));
904 i
.proplist
= pa_proplist_new();
906 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
907 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
908 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
909 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
910 pa_tagstruct_getu32(t
, &i
.sink
) < 0 ||
911 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
912 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
913 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
914 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
915 pa_tagstruct_get_usec(t
, &i
.sink_usec
) < 0 ||
916 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
917 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
918 (o
->context
->version
>= 11 && pa_tagstruct_get_boolean(t
, &mute
) < 0) ||
919 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
921 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
922 pa_proplist_free(i
.proplist
);
929 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
930 cb(o
->context
, &i
, 0, o
->userdata
);
933 pa_proplist_free(i
.proplist
);
938 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
939 cb(o
->context
, NULL
, eol
, o
->userdata
);
943 pa_operation_done(o
);
944 pa_operation_unref(o
);
947 pa_operation
* pa_context_get_sink_input_info(pa_context
*c
, uint32_t idx
, pa_sink_input_info_cb_t cb
, void *userdata
) {
953 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
956 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
957 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
958 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
960 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
962 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INPUT_INFO
, &tag
);
963 pa_tagstruct_putu32(t
, idx
);
964 pa_pstream_send_tagstruct(c
->pstream
, t
);
965 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
);
970 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
) {
971 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
);
974 /*** Source output info ***/
976 static void context_get_source_output_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
977 pa_operation
*o
= userdata
;
982 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
987 if (command
!= PA_COMMAND_REPLY
) {
988 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
994 while (!pa_tagstruct_eof(t
)) {
995 pa_source_output_info i
;
997 memset(&i
, 0, sizeof(i
));
998 i
.proplist
= pa_proplist_new();
1000 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
1001 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
1002 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
1003 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
1004 pa_tagstruct_getu32(t
, &i
.source
) < 0 ||
1005 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
1006 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
1007 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
1008 pa_tagstruct_get_usec(t
, &i
.source_usec
) < 0 ||
1009 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
1010 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
1011 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
1013 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1014 pa_proplist_free(i
.proplist
);
1019 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
1020 cb(o
->context
, &i
, 0, o
->userdata
);
1023 pa_proplist_free(i
.proplist
);
1028 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
1029 cb(o
->context
, NULL
, eol
, o
->userdata
);
1033 pa_operation_done(o
);
1034 pa_operation_unref(o
);
1037 pa_operation
* pa_context_get_source_output_info(pa_context
*c
, uint32_t idx
, pa_source_output_info_cb_t cb
, void *userdata
) {
1043 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1046 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1047 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1048 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1050 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1052 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_OUTPUT_INFO
, &tag
);
1053 pa_tagstruct_putu32(t
, idx
);
1054 pa_pstream_send_tagstruct(c
->pstream
, t
);
1055 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
);
1060 pa_operation
* pa_context_get_source_output_info_list(pa_context
*c
, pa_source_output_info_cb_t cb
, void *userdata
) {
1061 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
);
1064 /*** Volume manipulation ***/
1066 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
) {
1072 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1075 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1076 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1077 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1079 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1081 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
1082 pa_tagstruct_putu32(t
, idx
);
1083 pa_tagstruct_puts(t
, NULL
);
1084 pa_tagstruct_put_cvolume(t
, volume
);
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_set_sink_volume_by_name(pa_context
*c
, const char *name
, const pa_cvolume
*volume
, pa_context_success_cb_t cb
, void *userdata
) {
1097 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1101 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1102 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1103 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1104 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1106 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1108 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
1109 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1110 pa_tagstruct_puts(t
, name
);
1111 pa_tagstruct_put_cvolume(t
, volume
);
1112 pa_pstream_send_tagstruct(c
->pstream
, t
);
1113 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
);
1118 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
) {
1124 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1126 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1127 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1129 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1131 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
1132 pa_tagstruct_putu32(t
, idx
);
1133 pa_tagstruct_puts(t
, NULL
);
1134 pa_tagstruct_put_boolean(t
, mute
);
1135 pa_pstream_send_tagstruct(c
->pstream
, t
);
1136 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
);
1141 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
) {
1147 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1150 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1151 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1152 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1154 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1156 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
1157 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1158 pa_tagstruct_puts(t
, name
);
1159 pa_tagstruct_put_boolean(t
, mute
);
1160 pa_pstream_send_tagstruct(c
->pstream
, t
);
1161 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
);
1166 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
) {
1172 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1175 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1176 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1177 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1178 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1180 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1182 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_VOLUME
, &tag
);
1183 pa_tagstruct_putu32(t
, idx
);
1184 pa_tagstruct_put_cvolume(t
, volume
);
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
), (pa_free_cb_t
) pa_operation_unref
);
1191 pa_operation
* pa_context_set_sink_input_mute(pa_context
*c
, uint32_t idx
, int mute
, pa_context_success_cb_t cb
, void *userdata
) {
1197 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1199 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1200 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1201 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1202 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1204 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1206 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_MUTE
, &tag
);
1207 pa_tagstruct_putu32(t
, idx
);
1208 pa_tagstruct_put_boolean(t
, mute
);
1209 pa_pstream_send_tagstruct(c
->pstream
, t
);
1210 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
);
1215 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
) {
1221 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1224 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1225 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1226 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1228 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1230 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
1231 pa_tagstruct_putu32(t
, idx
);
1232 pa_tagstruct_puts(t
, NULL
);
1233 pa_tagstruct_put_cvolume(t
, volume
);
1234 pa_pstream_send_tagstruct(c
->pstream
, t
);
1235 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
);
1240 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
) {
1246 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1250 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1251 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1252 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1253 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1255 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1257 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
1258 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1259 pa_tagstruct_puts(t
, name
);
1260 pa_tagstruct_put_cvolume(t
, volume
);
1261 pa_pstream_send_tagstruct(c
->pstream
, t
);
1262 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
);
1267 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
) {
1273 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1275 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1276 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1278 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1280 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
1281 pa_tagstruct_putu32(t
, idx
);
1282 pa_tagstruct_puts(t
, NULL
);
1283 pa_tagstruct_put_boolean(t
, mute
);
1284 pa_pstream_send_tagstruct(c
->pstream
, t
);
1285 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
);
1290 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
) {
1296 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1299 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1300 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1301 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1303 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1305 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
1306 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1307 pa_tagstruct_puts(t
, name
);
1308 pa_tagstruct_put_boolean(t
, mute
);
1309 pa_pstream_send_tagstruct(c
->pstream
, t
);
1310 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
);
1315 /** Sample Cache **/
1317 static void context_get_sample_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1318 pa_operation
*o
= userdata
;
1323 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1328 if (command
!= PA_COMMAND_REPLY
) {
1329 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1335 while (!pa_tagstruct_eof(t
)) {
1337 pa_bool_t lazy
= FALSE
;
1339 memset(&i
, 0, sizeof(i
));
1340 i
.proplist
= pa_proplist_new();
1342 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
1343 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
1344 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
1345 pa_tagstruct_get_usec(t
, &i
.duration
) < 0 ||
1346 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
1347 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
1348 pa_tagstruct_getu32(t
, &i
.bytes
) < 0 ||
1349 pa_tagstruct_get_boolean(t
, &lazy
) < 0 ||
1350 pa_tagstruct_gets(t
, &i
.filename
) < 0 ||
1351 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
1353 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1357 i
.lazy
= (int) lazy
;
1360 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1361 cb(o
->context
, &i
, 0, o
->userdata
);
1364 pa_proplist_free(i
.proplist
);
1369 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1370 cb(o
->context
, NULL
, eol
, o
->userdata
);
1374 pa_operation_done(o
);
1375 pa_operation_unref(o
);
1378 pa_operation
* pa_context_get_sample_info_by_name(pa_context
*c
, const char *name
, pa_sample_info_cb_t cb
, void *userdata
) {
1384 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1387 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1388 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1389 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1391 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1393 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1394 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1395 pa_tagstruct_puts(t
, name
);
1396 pa_pstream_send_tagstruct(c
->pstream
, t
);
1397 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
);
1402 pa_operation
* pa_context_get_sample_info_by_index(pa_context
*c
, uint32_t idx
, pa_sample_info_cb_t cb
, void *userdata
) {
1408 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1411 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1412 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1413 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1415 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1417 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1418 pa_tagstruct_putu32(t
, idx
);
1419 pa_tagstruct_puts(t
, NULL
);
1420 pa_pstream_send_tagstruct(c
->pstream
, t
);
1421 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
);
1426 pa_operation
* pa_context_get_sample_info_list(pa_context
*c
, pa_sample_info_cb_t cb
, void *userdata
) {
1427 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SAMPLE_INFO_LIST
, context_get_sample_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
1430 static pa_operation
* command_kill(pa_context
*c
, uint32_t command
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1436 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1438 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1439 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1440 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1442 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1444 t
= pa_tagstruct_command(c
, command
, &tag
);
1445 pa_tagstruct_putu32(t
, idx
);
1446 pa_pstream_send_tagstruct(c
->pstream
, t
);
1447 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
);
1452 pa_operation
* pa_context_kill_client(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1453 return command_kill(c
, PA_COMMAND_KILL_CLIENT
, idx
, cb
, userdata
);
1456 pa_operation
* pa_context_kill_sink_input(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1457 return command_kill(c
, PA_COMMAND_KILL_SINK_INPUT
, idx
, cb
, userdata
);
1460 pa_operation
* pa_context_kill_source_output(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1461 return command_kill(c
, PA_COMMAND_KILL_SOURCE_OUTPUT
, idx
, cb
, userdata
);
1464 static void context_index_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1465 pa_operation
*o
= userdata
;
1470 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1475 if (command
!= PA_COMMAND_REPLY
) {
1476 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1479 idx
= PA_INVALID_INDEX
;
1480 } else if (pa_tagstruct_getu32(t
, &idx
) ||
1481 !pa_tagstruct_eof(t
)) {
1482 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1487 pa_context_index_cb_t cb
= (pa_context_index_cb_t
) o
->callback
;
1488 cb(o
->context
, idx
, o
->userdata
);
1493 pa_operation_done(o
);
1494 pa_operation_unref(o
);
1497 pa_operation
* pa_context_load_module(pa_context
*c
, const char*name
, const char *argument
, pa_context_index_cb_t cb
, void *userdata
) {
1503 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1505 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1506 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1507 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1509 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1511 t
= pa_tagstruct_command(c
, PA_COMMAND_LOAD_MODULE
, &tag
);
1512 pa_tagstruct_puts(t
, name
);
1513 pa_tagstruct_puts(t
, argument
);
1514 pa_pstream_send_tagstruct(c
->pstream
, t
);
1515 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1520 pa_operation
* pa_context_unload_module(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1521 return command_kill(c
, PA_COMMAND_UNLOAD_MODULE
, idx
, cb
, userdata
);
1524 /*** Autoload stuff ***/
1526 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_name
, "Module auto-loading no longer supported.");
1528 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
) {
1531 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1533 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1536 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_index
, "Module auto-loading no longer supported.");
1538 pa_operation
* pa_context_get_autoload_info_by_index(pa_context
*c
, uint32_t idx
, pa_autoload_info_cb_t cb
, void *userdata
) {
1540 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1542 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1545 PA_WARN_REFERENCE(pa_context_get_autoload_info_list
, "Module auto-loading no longer supported.");
1547 pa_operation
* pa_context_get_autoload_info_list(pa_context
*c
, pa_autoload_info_cb_t cb
, void *userdata
) {
1549 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1551 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1554 PA_WARN_REFERENCE(pa_context_add_autoload
, "Module auto-loading no longer supported.");
1556 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
) {
1558 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1560 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1563 PA_WARN_REFERENCE(pa_context_remove_autoload_by_name
, "Module auto-loading no longer supported.");
1565 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
) {
1567 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1569 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1572 PA_WARN_REFERENCE(pa_context_remove_autoload_by_index
, "Module auto-loading no longer supported.");
1574 pa_operation
* pa_context_remove_autoload_by_index(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void* userdata
) {
1576 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1578 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1581 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
) {
1587 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1589 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1590 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1591 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1592 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1593 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_name
&& *sink_name
, PA_ERR_INVALID
);
1595 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1597 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1598 pa_tagstruct_putu32(t
, idx
);
1599 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1600 pa_tagstruct_puts(t
, sink_name
);
1601 pa_pstream_send_tagstruct(c
->pstream
, t
);
1602 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
);
1607 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
) {
1613 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1615 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1616 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1617 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1618 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1619 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1621 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1623 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1624 pa_tagstruct_putu32(t
, idx
);
1625 pa_tagstruct_putu32(t
, sink_idx
);
1626 pa_tagstruct_puts(t
, NULL
);
1627 pa_pstream_send_tagstruct(c
->pstream
, t
);
1628 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
);
1633 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
) {
1639 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1641 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1642 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1643 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1644 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1645 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_name
&& *source_name
, PA_ERR_INVALID
);
1647 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1649 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1650 pa_tagstruct_putu32(t
, idx
);
1651 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1652 pa_tagstruct_puts(t
, source_name
);
1653 pa_pstream_send_tagstruct(c
->pstream
, t
);
1654 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
);
1659 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
) {
1665 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1667 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1668 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1669 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1670 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1671 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1673 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1675 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1676 pa_tagstruct_putu32(t
, idx
);
1677 pa_tagstruct_putu32(t
, source_idx
);
1678 pa_tagstruct_puts(t
, NULL
);
1679 pa_pstream_send_tagstruct(c
->pstream
, t
);
1680 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
);
1685 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
) {
1691 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1693 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1694 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1695 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1696 PA_CHECK_VALIDITY_RETURN_NULL(c
, !sink_name
|| *sink_name
, PA_ERR_INVALID
);
1698 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1700 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1701 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1702 pa_tagstruct_puts(t
, sink_name
);
1703 pa_tagstruct_put_boolean(t
, suspend
);
1704 pa_pstream_send_tagstruct(c
->pstream
, t
);
1705 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
);
1710 pa_operation
* pa_context_suspend_sink_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1716 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1718 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1719 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1720 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1722 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1724 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1725 pa_tagstruct_putu32(t
, idx
);
1726 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1727 pa_tagstruct_put_boolean(t
, suspend
);
1728 pa_pstream_send_tagstruct(c
->pstream
, t
);
1729 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
);
1734 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
) {
1740 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1742 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1743 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1744 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1745 PA_CHECK_VALIDITY_RETURN_NULL(c
, !source_name
|| *source_name
, PA_ERR_INVALID
);
1747 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1749 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1750 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1751 pa_tagstruct_puts(t
, source_name
);
1752 pa_tagstruct_put_boolean(t
, suspend
);
1753 pa_pstream_send_tagstruct(c
->pstream
, t
);
1754 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
);
1759 pa_operation
* pa_context_suspend_source_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1765 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1767 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1768 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1769 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1771 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1773 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1774 pa_tagstruct_putu32(t
, idx
);
1775 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1776 pa_tagstruct_put_boolean(t
, suspend
);
1777 pa_pstream_send_tagstruct(c
->pstream
, t
);
1778 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
);