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 /*** Source info ***/
276 static void context_get_source_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
277 pa_operation
*o
= userdata
;
282 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
287 if (command
!= PA_COMMAND_REPLY
) {
288 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
294 while (!pa_tagstruct_eof(t
)) {
300 memset(&i
, 0, sizeof(i
));
301 i
.proplist
= pa_proplist_new();
302 i
.base_volume
= PA_VOLUME_NORM
;
303 i
.n_volume_steps
= PA_VOLUME_NORM
+1;
305 state
= PA_SOURCE_INVALID_STATE
;
306 i
.card
= PA_INVALID_INDEX
;
308 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
309 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
310 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
311 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
312 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
313 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
314 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
315 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
316 pa_tagstruct_getu32(t
, &i
.monitor_of_sink
) < 0 ||
317 pa_tagstruct_gets(t
, &i
.monitor_of_sink_name
) < 0 ||
318 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
319 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
320 pa_tagstruct_getu32(t
, &flags
) < 0 ||
321 (o
->context
->version
>= 13 &&
322 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
323 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0)) ||
324 (o
->context
->version
>= 15 &&
325 (pa_tagstruct_get_volume(t
, &i
.base_volume
) < 0 ||
326 pa_tagstruct_getu32(t
, &state
) < 0 ||
327 pa_tagstruct_getu32(t
, &i
.n_volume_steps
) < 0 ||
328 pa_tagstruct_getu32(t
, &i
.card
) < 0))) {
330 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
331 pa_proplist_free(i
.proplist
);
336 i
.flags
= (pa_source_flags_t
) flags
;
337 i
.state
= (pa_source_state_t
) state
;
340 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
341 cb(o
->context
, &i
, 0, o
->userdata
);
344 pa_proplist_free(i
.proplist
);
349 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
350 cb(o
->context
, NULL
, eol
, o
->userdata
);
354 pa_operation_done(o
);
355 pa_operation_unref(o
);
358 pa_operation
* pa_context_get_source_info_list(pa_context
*c
, pa_source_info_cb_t cb
, void *userdata
) {
359 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SOURCE_INFO_LIST
, context_get_source_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
362 pa_operation
* pa_context_get_source_info_by_index(pa_context
*c
, uint32_t idx
, pa_source_info_cb_t cb
, void *userdata
) {
368 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
371 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
372 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
374 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
376 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
377 pa_tagstruct_putu32(t
, idx
);
378 pa_tagstruct_puts(t
, NULL
);
379 pa_pstream_send_tagstruct(c
->pstream
, t
);
380 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
);
385 pa_operation
* pa_context_get_source_info_by_name(pa_context
*c
, const char *name
, pa_source_info_cb_t cb
, void *userdata
) {
391 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
394 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
395 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
396 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
398 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
400 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
401 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
402 pa_tagstruct_puts(t
, name
);
403 pa_pstream_send_tagstruct(c
->pstream
, t
);
404 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
);
409 /*** Client info ***/
411 static void context_get_client_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
412 pa_operation
*o
= userdata
;
417 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
422 if (command
!= PA_COMMAND_REPLY
) {
423 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
429 while (!pa_tagstruct_eof(t
)) {
432 memset(&i
, 0, sizeof(i
));
433 i
.proplist
= pa_proplist_new();
435 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
436 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
437 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
438 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
439 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
441 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
442 pa_proplist_free(i
.proplist
);
447 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
448 cb(o
->context
, &i
, 0, o
->userdata
);
451 pa_proplist_free(i
.proplist
);
456 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
457 cb(o
->context
, NULL
, eol
, o
->userdata
);
461 pa_operation_done(o
);
462 pa_operation_unref(o
);
465 pa_operation
* pa_context_get_client_info(pa_context
*c
, uint32_t idx
, pa_client_info_cb_t cb
, void *userdata
) {
471 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
474 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
475 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
476 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
478 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
480 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CLIENT_INFO
, &tag
);
481 pa_tagstruct_putu32(t
, idx
);
482 pa_pstream_send_tagstruct(c
->pstream
, t
);
483 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
);
488 pa_operation
* pa_context_get_client_info_list(pa_context
*c
, pa_client_info_cb_t cb
, void *userdata
) {
489 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CLIENT_INFO_LIST
, context_get_client_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
494 static void context_get_card_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
495 pa_operation
*o
= userdata
;
500 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
505 if (command
!= PA_COMMAND_REPLY
) {
506 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
512 while (!pa_tagstruct_eof(t
)) {
517 memset(&i
, 0, sizeof(i
));
519 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
520 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
521 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
522 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
523 pa_tagstruct_getu32(t
, &i
.n_profiles
) < 0) {
525 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
529 if (i
.n_profiles
> 0) {
530 i
.profiles
= pa_xnew(pa_card_profile_info
, i
.n_profiles
+1);
532 for (j
= 0; j
< i
.n_profiles
; j
++) {
534 if (pa_tagstruct_gets(t
, &i
.profiles
[j
].name
) < 0 ||
535 pa_tagstruct_gets(t
, &i
.profiles
[j
].description
) < 0 ||
536 pa_tagstruct_getu32(t
, &i
.profiles
[j
].n_sinks
) < 0 ||
537 pa_tagstruct_getu32(t
, &i
.profiles
[j
].n_sources
) < 0 ||
538 pa_tagstruct_getu32(t
, &i
.profiles
[j
].priority
) < 0) {
540 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
541 pa_xfree(i
.profiles
);
546 /* Terminate with an extra NULL entry, just to make sure */
547 i
.profiles
[j
].name
= NULL
;
548 i
.profiles
[j
].description
= NULL
;
551 i
.proplist
= pa_proplist_new();
553 if (pa_tagstruct_gets(t
, &ap
) < 0 ||
554 pa_tagstruct_get_proplist(t
, i
.proplist
) < 0) {
556 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
557 pa_xfree(i
.profiles
);
558 pa_proplist_free(i
.proplist
);
563 for (j
= 0; j
< i
.n_profiles
; j
++)
564 if (pa_streq(i
.profiles
[j
].name
, ap
)) {
565 i
.active_profile
= &i
.profiles
[j
];
571 pa_card_info_cb_t cb
= (pa_card_info_cb_t
) o
->callback
;
572 cb(o
->context
, &i
, 0, o
->userdata
);
575 pa_proplist_free(i
.proplist
);
576 pa_xfree(i
.profiles
);
581 pa_card_info_cb_t cb
= (pa_card_info_cb_t
) o
->callback
;
582 cb(o
->context
, NULL
, eol
, o
->userdata
);
586 pa_operation_done(o
);
587 pa_operation_unref(o
);
590 pa_operation
* pa_context_get_card_info_by_index(pa_context
*c
, uint32_t idx
, pa_card_info_cb_t cb
, void *userdata
) {
596 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
599 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
600 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
601 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
602 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
604 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
606 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CARD_INFO
, &tag
);
607 pa_tagstruct_putu32(t
, idx
);
608 pa_tagstruct_puts(t
, NULL
);
609 pa_pstream_send_tagstruct(c
->pstream
, t
);
610 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
);
615 pa_operation
* pa_context_get_card_info_by_name(pa_context
*c
, const char*name
, pa_card_info_cb_t cb
, void *userdata
) {
621 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
624 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
625 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
626 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
627 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
629 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
631 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CARD_INFO
, &tag
);
632 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
633 pa_tagstruct_puts(t
, name
);
634 pa_pstream_send_tagstruct(c
->pstream
, t
);
635 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
);
640 pa_operation
* pa_context_get_card_info_list(pa_context
*c
, pa_card_info_cb_t cb
, void *userdata
) {
641 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CARD_INFO_LIST
, context_get_card_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
644 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
) {
650 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
652 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
653 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
654 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
655 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
657 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
659 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_CARD_PROFILE
, &tag
);
660 pa_tagstruct_putu32(t
, idx
);
661 pa_tagstruct_puts(t
, NULL
);
662 pa_tagstruct_puts(t
, profile
);
663 pa_pstream_send_tagstruct(c
->pstream
, t
);
664 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
);
669 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
) {
675 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
677 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
678 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
679 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
680 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
682 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
684 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_CARD_PROFILE
, &tag
);
685 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
686 pa_tagstruct_puts(t
, name
);
687 pa_tagstruct_puts(t
, profile
);
688 pa_pstream_send_tagstruct(c
->pstream
, t
);
689 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
);
694 /*** Module info ***/
696 static void context_get_module_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
697 pa_operation
*o
= userdata
;
702 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
707 if (command
!= PA_COMMAND_REPLY
) {
708 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
714 while (!pa_tagstruct_eof(t
)) {
716 pa_bool_t auto_unload
= FALSE
;
718 memset(&i
, 0, sizeof(i
));
719 i
.proplist
= pa_proplist_new();
721 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
722 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
723 pa_tagstruct_gets(t
, &i
.argument
) < 0 ||
724 pa_tagstruct_getu32(t
, &i
.n_used
) < 0 ||
725 (o
->context
->version
< 15 && pa_tagstruct_get_boolean(t
, &auto_unload
) < 0) ||
726 (o
->context
->version
>= 15 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
727 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
731 i
.auto_unload
= (int) auto_unload
;
734 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
735 cb(o
->context
, &i
, 0, o
->userdata
);
738 pa_proplist_free(i
.proplist
);
743 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
744 cb(o
->context
, NULL
, eol
, o
->userdata
);
748 pa_operation_done(o
);
749 pa_operation_unref(o
);
752 pa_operation
* pa_context_get_module_info(pa_context
*c
, uint32_t idx
, pa_module_info_cb_t cb
, void *userdata
) {
758 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
761 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
762 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
763 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
765 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
767 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_MODULE_INFO
, &tag
);
768 pa_tagstruct_putu32(t
, idx
);
769 pa_pstream_send_tagstruct(c
->pstream
, t
);
770 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
);
775 pa_operation
* pa_context_get_module_info_list(pa_context
*c
, pa_module_info_cb_t cb
, void *userdata
) {
776 return pa_context_send_simple_command(c
, PA_COMMAND_GET_MODULE_INFO_LIST
, context_get_module_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
779 /*** Sink input info ***/
781 static void context_get_sink_input_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
782 pa_operation
*o
= userdata
;
787 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
792 if (command
!= PA_COMMAND_REPLY
) {
793 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
799 while (!pa_tagstruct_eof(t
)) {
800 pa_sink_input_info i
;
801 pa_bool_t mute
= FALSE
;
803 memset(&i
, 0, sizeof(i
));
804 i
.proplist
= pa_proplist_new();
806 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
807 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
808 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
809 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
810 pa_tagstruct_getu32(t
, &i
.sink
) < 0 ||
811 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
812 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
813 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
814 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
815 pa_tagstruct_get_usec(t
, &i
.sink_usec
) < 0 ||
816 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
817 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
818 (o
->context
->version
>= 11 && pa_tagstruct_get_boolean(t
, &mute
) < 0) ||
819 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
821 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
822 pa_proplist_free(i
.proplist
);
829 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
830 cb(o
->context
, &i
, 0, o
->userdata
);
833 pa_proplist_free(i
.proplist
);
838 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
839 cb(o
->context
, NULL
, eol
, o
->userdata
);
843 pa_operation_done(o
);
844 pa_operation_unref(o
);
847 pa_operation
* pa_context_get_sink_input_info(pa_context
*c
, uint32_t idx
, pa_sink_input_info_cb_t cb
, void *userdata
) {
853 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
856 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
857 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
858 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
860 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
862 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INPUT_INFO
, &tag
);
863 pa_tagstruct_putu32(t
, idx
);
864 pa_pstream_send_tagstruct(c
->pstream
, t
);
865 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
);
870 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
) {
871 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
);
874 /*** Source output info ***/
876 static void context_get_source_output_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
877 pa_operation
*o
= userdata
;
882 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
887 if (command
!= PA_COMMAND_REPLY
) {
888 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
894 while (!pa_tagstruct_eof(t
)) {
895 pa_source_output_info i
;
897 memset(&i
, 0, sizeof(i
));
898 i
.proplist
= pa_proplist_new();
900 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
901 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
902 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
903 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
904 pa_tagstruct_getu32(t
, &i
.source
) < 0 ||
905 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
906 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
907 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
908 pa_tagstruct_get_usec(t
, &i
.source_usec
) < 0 ||
909 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
910 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
911 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
913 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
914 pa_proplist_free(i
.proplist
);
919 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
920 cb(o
->context
, &i
, 0, o
->userdata
);
923 pa_proplist_free(i
.proplist
);
928 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
929 cb(o
->context
, NULL
, eol
, o
->userdata
);
933 pa_operation_done(o
);
934 pa_operation_unref(o
);
937 pa_operation
* pa_context_get_source_output_info(pa_context
*c
, uint32_t idx
, pa_source_output_info_cb_t cb
, void *userdata
) {
943 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
946 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
947 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
948 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
950 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
952 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_OUTPUT_INFO
, &tag
);
953 pa_tagstruct_putu32(t
, idx
);
954 pa_pstream_send_tagstruct(c
->pstream
, t
);
955 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
);
960 pa_operation
* pa_context_get_source_output_info_list(pa_context
*c
, pa_source_output_info_cb_t cb
, void *userdata
) {
961 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
);
964 /*** Volume manipulation ***/
966 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
) {
972 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
975 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
976 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
977 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
979 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
981 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
982 pa_tagstruct_putu32(t
, idx
);
983 pa_tagstruct_puts(t
, NULL
);
984 pa_tagstruct_put_cvolume(t
, volume
);
985 pa_pstream_send_tagstruct(c
->pstream
, t
);
986 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
);
991 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
) {
997 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1001 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1002 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1003 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1004 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1006 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1008 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
1009 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1010 pa_tagstruct_puts(t
, name
);
1011 pa_tagstruct_put_cvolume(t
, volume
);
1012 pa_pstream_send_tagstruct(c
->pstream
, t
);
1013 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
);
1018 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
) {
1024 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1026 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1027 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1029 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1031 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
1032 pa_tagstruct_putu32(t
, idx
);
1033 pa_tagstruct_puts(t
, NULL
);
1034 pa_tagstruct_put_boolean(t
, mute
);
1035 pa_pstream_send_tagstruct(c
->pstream
, t
);
1036 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
);
1041 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
) {
1047 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1050 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1051 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1052 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1054 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1056 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
1057 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1058 pa_tagstruct_puts(t
, name
);
1059 pa_tagstruct_put_boolean(t
, mute
);
1060 pa_pstream_send_tagstruct(c
->pstream
, t
);
1061 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
);
1066 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
) {
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
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1078 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1080 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1082 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_VOLUME
, &tag
);
1083 pa_tagstruct_putu32(t
, idx
);
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_input_mute(pa_context
*c
, uint32_t idx
, int mute
, pa_context_success_cb_t cb
, void *userdata
) {
1097 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1099 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1100 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1101 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1102 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1104 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1106 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_MUTE
, &tag
);
1107 pa_tagstruct_putu32(t
, idx
);
1108 pa_tagstruct_put_boolean(t
, mute
);
1109 pa_pstream_send_tagstruct(c
->pstream
, t
);
1110 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
);
1115 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
) {
1121 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1124 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1125 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1126 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1128 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1130 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
1131 pa_tagstruct_putu32(t
, idx
);
1132 pa_tagstruct_puts(t
, NULL
);
1133 pa_tagstruct_put_cvolume(t
, volume
);
1134 pa_pstream_send_tagstruct(c
->pstream
, t
);
1135 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
);
1140 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
) {
1146 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
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1153 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1155 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1157 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
1158 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1159 pa_tagstruct_puts(t
, name
);
1160 pa_tagstruct_put_cvolume(t
, volume
);
1161 pa_pstream_send_tagstruct(c
->pstream
, t
);
1162 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
);
1167 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
) {
1173 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
);
1178 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1180 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
1181 pa_tagstruct_putu32(t
, idx
);
1182 pa_tagstruct_puts(t
, NULL
);
1183 pa_tagstruct_put_boolean(t
, mute
);
1184 pa_pstream_send_tagstruct(c
->pstream
, t
);
1185 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
);
1190 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
) {
1196 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
, !name
|| *name
, PA_ERR_INVALID
);
1203 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1205 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
1206 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1207 pa_tagstruct_puts(t
, name
);
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 /** Sample Cache **/
1217 static void context_get_sample_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1218 pa_operation
*o
= userdata
;
1223 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1228 if (command
!= PA_COMMAND_REPLY
) {
1229 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1235 while (!pa_tagstruct_eof(t
)) {
1237 pa_bool_t lazy
= FALSE
;
1239 memset(&i
, 0, sizeof(i
));
1240 i
.proplist
= pa_proplist_new();
1242 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
1243 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
1244 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
1245 pa_tagstruct_get_usec(t
, &i
.duration
) < 0 ||
1246 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
1247 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
1248 pa_tagstruct_getu32(t
, &i
.bytes
) < 0 ||
1249 pa_tagstruct_get_boolean(t
, &lazy
) < 0 ||
1250 pa_tagstruct_gets(t
, &i
.filename
) < 0 ||
1251 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
1253 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1257 i
.lazy
= (int) lazy
;
1260 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1261 cb(o
->context
, &i
, 0, o
->userdata
);
1264 pa_proplist_free(i
.proplist
);
1269 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1270 cb(o
->context
, NULL
, eol
, o
->userdata
);
1274 pa_operation_done(o
);
1275 pa_operation_unref(o
);
1278 pa_operation
* pa_context_get_sample_info_by_name(pa_context
*c
, const char *name
, pa_sample_info_cb_t cb
, void *userdata
) {
1284 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1287 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1288 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1289 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1291 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1293 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1294 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1295 pa_tagstruct_puts(t
, name
);
1296 pa_pstream_send_tagstruct(c
->pstream
, t
);
1297 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
);
1302 pa_operation
* pa_context_get_sample_info_by_index(pa_context
*c
, uint32_t idx
, pa_sample_info_cb_t cb
, void *userdata
) {
1308 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1311 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1312 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1313 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1315 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1317 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1318 pa_tagstruct_putu32(t
, idx
);
1319 pa_tagstruct_puts(t
, NULL
);
1320 pa_pstream_send_tagstruct(c
->pstream
, t
);
1321 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
);
1326 pa_operation
* pa_context_get_sample_info_list(pa_context
*c
, pa_sample_info_cb_t cb
, void *userdata
) {
1327 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SAMPLE_INFO_LIST
, context_get_sample_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
1330 static pa_operation
* command_kill(pa_context
*c
, uint32_t command
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1336 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1338 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1339 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1340 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1342 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1344 t
= pa_tagstruct_command(c
, command
, &tag
);
1345 pa_tagstruct_putu32(t
, idx
);
1346 pa_pstream_send_tagstruct(c
->pstream
, t
);
1347 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
);
1352 pa_operation
* pa_context_kill_client(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1353 return command_kill(c
, PA_COMMAND_KILL_CLIENT
, idx
, cb
, userdata
);
1356 pa_operation
* pa_context_kill_sink_input(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1357 return command_kill(c
, PA_COMMAND_KILL_SINK_INPUT
, idx
, cb
, userdata
);
1360 pa_operation
* pa_context_kill_source_output(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1361 return command_kill(c
, PA_COMMAND_KILL_SOURCE_OUTPUT
, idx
, cb
, userdata
);
1364 static void context_index_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1365 pa_operation
*o
= userdata
;
1370 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1375 if (command
!= PA_COMMAND_REPLY
) {
1376 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1379 idx
= PA_INVALID_INDEX
;
1380 } else if (pa_tagstruct_getu32(t
, &idx
) ||
1381 !pa_tagstruct_eof(t
)) {
1382 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1387 pa_context_index_cb_t cb
= (pa_context_index_cb_t
) o
->callback
;
1388 cb(o
->context
, idx
, o
->userdata
);
1393 pa_operation_done(o
);
1394 pa_operation_unref(o
);
1397 pa_operation
* pa_context_load_module(pa_context
*c
, const char*name
, const char *argument
, pa_context_index_cb_t cb
, void *userdata
) {
1403 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1405 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1406 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1407 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1409 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1411 t
= pa_tagstruct_command(c
, PA_COMMAND_LOAD_MODULE
, &tag
);
1412 pa_tagstruct_puts(t
, name
);
1413 pa_tagstruct_puts(t
, argument
);
1414 pa_pstream_send_tagstruct(c
->pstream
, t
);
1415 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1420 pa_operation
* pa_context_unload_module(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1421 return command_kill(c
, PA_COMMAND_UNLOAD_MODULE
, idx
, cb
, userdata
);
1424 /*** Autoload stuff ***/
1426 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_name
, "Module auto-loading no longer supported.");
1428 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
) {
1431 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1433 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1436 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_index
, "Module auto-loading no longer supported.");
1438 pa_operation
* pa_context_get_autoload_info_by_index(pa_context
*c
, uint32_t idx
, pa_autoload_info_cb_t cb
, void *userdata
) {
1440 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1442 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1445 PA_WARN_REFERENCE(pa_context_get_autoload_info_list
, "Module auto-loading no longer supported.");
1447 pa_operation
* pa_context_get_autoload_info_list(pa_context
*c
, pa_autoload_info_cb_t cb
, void *userdata
) {
1449 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1451 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1454 PA_WARN_REFERENCE(pa_context_add_autoload
, "Module auto-loading no longer supported.");
1456 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
) {
1458 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1460 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1463 PA_WARN_REFERENCE(pa_context_remove_autoload_by_name
, "Module auto-loading no longer supported.");
1465 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
) {
1467 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1469 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1472 PA_WARN_REFERENCE(pa_context_remove_autoload_by_index
, "Module auto-loading no longer supported.");
1474 pa_operation
* pa_context_remove_autoload_by_index(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void* userdata
) {
1476 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1478 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1481 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
) {
1487 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1489 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1490 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1491 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1492 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1493 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_name
&& *sink_name
, PA_ERR_INVALID
);
1495 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1497 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1498 pa_tagstruct_putu32(t
, idx
);
1499 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1500 pa_tagstruct_puts(t
, sink_name
);
1501 pa_pstream_send_tagstruct(c
->pstream
, t
);
1502 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
);
1507 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
) {
1513 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1515 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1516 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1517 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1518 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1519 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1521 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1523 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1524 pa_tagstruct_putu32(t
, idx
);
1525 pa_tagstruct_putu32(t
, sink_idx
);
1526 pa_tagstruct_puts(t
, NULL
);
1527 pa_pstream_send_tagstruct(c
->pstream
, t
);
1528 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
);
1533 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
) {
1539 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1541 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1542 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1543 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1544 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1545 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_name
&& *source_name
, PA_ERR_INVALID
);
1547 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1549 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1550 pa_tagstruct_putu32(t
, idx
);
1551 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1552 pa_tagstruct_puts(t
, source_name
);
1553 pa_pstream_send_tagstruct(c
->pstream
, t
);
1554 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
);
1559 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
) {
1565 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1567 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1568 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1569 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1570 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1571 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1573 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1575 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1576 pa_tagstruct_putu32(t
, idx
);
1577 pa_tagstruct_putu32(t
, source_idx
);
1578 pa_tagstruct_puts(t
, NULL
);
1579 pa_pstream_send_tagstruct(c
->pstream
, t
);
1580 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
);
1585 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
) {
1591 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1593 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1594 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1595 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1596 PA_CHECK_VALIDITY_RETURN_NULL(c
, !sink_name
|| *sink_name
, PA_ERR_INVALID
);
1598 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1600 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1601 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1602 pa_tagstruct_puts(t
, sink_name
);
1603 pa_tagstruct_put_boolean(t
, suspend
);
1604 pa_pstream_send_tagstruct(c
->pstream
, t
);
1605 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
);
1610 pa_operation
* pa_context_suspend_sink_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1616 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1618 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1619 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1620 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1622 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1624 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1625 pa_tagstruct_putu32(t
, idx
);
1626 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1627 pa_tagstruct_put_boolean(t
, suspend
);
1628 pa_pstream_send_tagstruct(c
->pstream
, t
);
1629 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
);
1634 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
) {
1640 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1642 PA_CHECK_VALIDITY_RETURN_NULL(c
, !pa_detect_fork(), PA_ERR_FORKED
);
1643 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1644 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
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_SUSPEND_SOURCE
, &tag
);
1650 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1651 pa_tagstruct_puts(t
, source_name
);
1652 pa_tagstruct_put_boolean(t
, suspend
);
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_suspend_source_by_index(pa_context
*c
, uint32_t idx
, int suspend
, 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
>= 11, PA_ERR_NOTSUPPORTED
);
1671 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1673 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1674 pa_tagstruct_putu32(t
, idx
);
1675 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1676 pa_tagstruct_put_boolean(t
, suspend
);
1677 pa_pstream_send_tagstruct(c
->pstream
, t
);
1678 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
);