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>
39 #include "introspect.h"
43 static void context_stat_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
44 pa_operation
*o
= userdata
;
45 pa_stat_info i
, *p
= &i
;
49 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
51 memset(&i
, 0, sizeof(i
));
56 if (command
!= PA_COMMAND_REPLY
) {
57 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
61 } else if (pa_tagstruct_getu32(t
, &i
.memblock_total
) < 0 ||
62 pa_tagstruct_getu32(t
, &i
.memblock_total_size
) < 0 ||
63 pa_tagstruct_getu32(t
, &i
.memblock_allocated
) < 0 ||
64 pa_tagstruct_getu32(t
, &i
.memblock_allocated_size
) < 0 ||
65 pa_tagstruct_getu32(t
, &i
.scache_size
) < 0 ||
66 !pa_tagstruct_eof(t
)) {
67 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
72 pa_stat_info_cb_t cb
= (pa_stat_info_cb_t
) o
->callback
;
73 cb(o
->context
, p
, o
->userdata
);
78 pa_operation_unref(o
);
81 pa_operation
* pa_context_stat(pa_context
*c
, pa_stat_info_cb_t cb
, void *userdata
) {
82 return pa_context_send_simple_command(c
, PA_COMMAND_STAT
, context_stat_callback
, (pa_operation_cb_t
) cb
, userdata
);
87 static void context_get_server_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
88 pa_operation
*o
= userdata
;
89 pa_server_info i
, *p
= &i
;
93 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
95 memset(&i
, 0, sizeof(i
));
100 if (command
!= PA_COMMAND_REPLY
) {
101 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
105 } else if (pa_tagstruct_gets(t
, &i
.server_name
) < 0 ||
106 pa_tagstruct_gets(t
, &i
.server_version
) < 0 ||
107 pa_tagstruct_gets(t
, &i
.user_name
) < 0 ||
108 pa_tagstruct_gets(t
, &i
.host_name
) < 0 ||
109 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
110 pa_tagstruct_gets(t
, &i
.default_sink_name
) < 0 ||
111 pa_tagstruct_gets(t
, &i
.default_source_name
) < 0 ||
112 pa_tagstruct_getu32(t
, &i
.cookie
) < 0 ||
113 (o
->context
->version
>= 15 &&
114 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0) ||
115 !pa_tagstruct_eof(t
)) {
117 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
121 if (p
&& o
->context
->version
< 15)
122 pa_channel_map_init_extend(&i
.channel_map
, i
.sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
125 pa_server_info_cb_t cb
= (pa_server_info_cb_t
) o
->callback
;
126 cb(o
->context
, p
, o
->userdata
);
130 pa_operation_done(o
);
131 pa_operation_unref(o
);
134 pa_operation
* pa_context_get_server_info(pa_context
*c
, pa_server_info_cb_t cb
, void *userdata
) {
135 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SERVER_INFO
, context_get_server_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
140 static void context_get_sink_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
141 pa_operation
*o
= userdata
;
146 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
151 if (command
!= PA_COMMAND_REPLY
) {
152 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
158 while (!pa_tagstruct_eof(t
)) {
164 memset(&i
, 0, sizeof(i
));
165 i
.proplist
= pa_proplist_new();
166 i
.base_volume
= PA_VOLUME_NORM
;
167 i
.n_volume_steps
= PA_VOLUME_NORM
+1;
169 state
= PA_SINK_INVALID_STATE
;
170 i
.card
= PA_INVALID_INDEX
;
172 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
173 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
174 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
175 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
176 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
177 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
178 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
179 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
180 pa_tagstruct_getu32(t
, &i
.monitor_source
) < 0 ||
181 pa_tagstruct_gets(t
, &i
.monitor_source_name
) < 0 ||
182 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
183 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
184 pa_tagstruct_getu32(t
, &flags
) < 0 ||
185 (o
->context
->version
>= 13 &&
186 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
187 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0)) ||
188 (o
->context
->version
>= 15 &&
189 (pa_tagstruct_get_volume(t
, &i
.base_volume
) < 0 ||
190 pa_tagstruct_getu32(t
, &state
) < 0 ||
191 pa_tagstruct_getu32(t
, &i
.n_volume_steps
) < 0 ||
192 pa_tagstruct_getu32(t
, &i
.card
) < 0))) {
194 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
195 pa_proplist_free(i
.proplist
);
200 i
.flags
= (pa_sink_flags_t
) flags
;
201 i
.state
= (pa_sink_state_t
) state
;
204 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
205 cb(o
->context
, &i
, 0, o
->userdata
);
208 pa_proplist_free(i
.proplist
);
213 pa_sink_info_cb_t cb
= (pa_sink_info_cb_t
) o
->callback
;
214 cb(o
->context
, NULL
, eol
, o
->userdata
);
218 pa_operation_done(o
);
219 pa_operation_unref(o
);
222 pa_operation
* pa_context_get_sink_info_list(pa_context
*c
, pa_sink_info_cb_t cb
, void *userdata
) {
223 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SINK_INFO_LIST
, context_get_sink_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
226 pa_operation
* pa_context_get_sink_info_by_index(pa_context
*c
, uint32_t idx
, pa_sink_info_cb_t cb
, void *userdata
) {
232 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
235 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
237 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
239 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
240 pa_tagstruct_putu32(t
, idx
);
241 pa_tagstruct_puts(t
, NULL
);
242 pa_pstream_send_tagstruct(c
->pstream
, t
);
243 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
);
248 pa_operation
* pa_context_get_sink_info_by_name(pa_context
*c
, const char *name
, pa_sink_info_cb_t cb
, void *userdata
) {
254 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
257 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
258 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
260 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
262 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INFO
, &tag
);
263 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
264 pa_tagstruct_puts(t
, name
);
265 pa_pstream_send_tagstruct(c
->pstream
, t
);
266 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
);
271 /*** Source info ***/
273 static void context_get_source_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
274 pa_operation
*o
= userdata
;
279 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
284 if (command
!= PA_COMMAND_REPLY
) {
285 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
291 while (!pa_tagstruct_eof(t
)) {
297 memset(&i
, 0, sizeof(i
));
298 i
.proplist
= pa_proplist_new();
299 i
.base_volume
= PA_VOLUME_NORM
;
300 i
.n_volume_steps
= PA_VOLUME_NORM
+1;
302 state
= PA_SOURCE_INVALID_STATE
;
303 i
.card
= PA_INVALID_INDEX
;
305 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
306 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
307 pa_tagstruct_gets(t
, &i
.description
) < 0 ||
308 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
309 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
310 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
311 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
312 pa_tagstruct_get_boolean(t
, &mute
) < 0 ||
313 pa_tagstruct_getu32(t
, &i
.monitor_of_sink
) < 0 ||
314 pa_tagstruct_gets(t
, &i
.monitor_of_sink_name
) < 0 ||
315 pa_tagstruct_get_usec(t
, &i
.latency
) < 0 ||
316 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
317 pa_tagstruct_getu32(t
, &flags
) < 0 ||
318 (o
->context
->version
>= 13 &&
319 (pa_tagstruct_get_proplist(t
, i
.proplist
) < 0 ||
320 pa_tagstruct_get_usec(t
, &i
.configured_latency
) < 0)) ||
321 (o
->context
->version
>= 15 &&
322 (pa_tagstruct_get_volume(t
, &i
.base_volume
) < 0 ||
323 pa_tagstruct_getu32(t
, &state
) < 0 ||
324 pa_tagstruct_getu32(t
, &i
.n_volume_steps
) < 0 ||
325 pa_tagstruct_getu32(t
, &i
.card
) < 0))) {
327 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
328 pa_proplist_free(i
.proplist
);
333 i
.flags
= (pa_source_flags_t
) flags
;
334 i
.state
= (pa_source_state_t
) state
;
337 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
338 cb(o
->context
, &i
, 0, o
->userdata
);
341 pa_proplist_free(i
.proplist
);
346 pa_source_info_cb_t cb
= (pa_source_info_cb_t
) o
->callback
;
347 cb(o
->context
, NULL
, eol
, o
->userdata
);
351 pa_operation_done(o
);
352 pa_operation_unref(o
);
355 pa_operation
* pa_context_get_source_info_list(pa_context
*c
, pa_source_info_cb_t cb
, void *userdata
) {
356 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SOURCE_INFO_LIST
, context_get_source_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
359 pa_operation
* pa_context_get_source_info_by_index(pa_context
*c
, uint32_t idx
, pa_source_info_cb_t cb
, void *userdata
) {
365 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
368 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
370 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
372 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
373 pa_tagstruct_putu32(t
, idx
);
374 pa_tagstruct_puts(t
, NULL
);
375 pa_pstream_send_tagstruct(c
->pstream
, t
);
376 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
);
381 pa_operation
* pa_context_get_source_info_by_name(pa_context
*c
, const char *name
, pa_source_info_cb_t cb
, void *userdata
) {
387 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
390 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
391 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
393 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
395 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_INFO
, &tag
);
396 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
397 pa_tagstruct_puts(t
, name
);
398 pa_pstream_send_tagstruct(c
->pstream
, t
);
399 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
);
404 /*** Client info ***/
406 static void context_get_client_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
407 pa_operation
*o
= userdata
;
412 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
417 if (command
!= PA_COMMAND_REPLY
) {
418 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
424 while (!pa_tagstruct_eof(t
)) {
427 memset(&i
, 0, sizeof(i
));
428 i
.proplist
= pa_proplist_new();
430 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
431 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
432 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
433 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
434 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
436 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
437 pa_proplist_free(i
.proplist
);
442 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
443 cb(o
->context
, &i
, 0, o
->userdata
);
446 pa_proplist_free(i
.proplist
);
451 pa_client_info_cb_t cb
= (pa_client_info_cb_t
) o
->callback
;
452 cb(o
->context
, NULL
, eol
, o
->userdata
);
456 pa_operation_done(o
);
457 pa_operation_unref(o
);
460 pa_operation
* pa_context_get_client_info(pa_context
*c
, uint32_t idx
, pa_client_info_cb_t cb
, void *userdata
) {
466 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
469 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
470 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
472 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
474 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CLIENT_INFO
, &tag
);
475 pa_tagstruct_putu32(t
, idx
);
476 pa_pstream_send_tagstruct(c
->pstream
, t
);
477 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
);
482 pa_operation
* pa_context_get_client_info_list(pa_context
*c
, pa_client_info_cb_t cb
, void *userdata
) {
483 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CLIENT_INFO_LIST
, context_get_client_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
488 static void context_get_card_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
489 pa_operation
*o
= userdata
;
494 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
499 if (command
!= PA_COMMAND_REPLY
) {
500 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
506 while (!pa_tagstruct_eof(t
)) {
511 memset(&i
, 0, sizeof(i
));
513 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
514 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
515 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
516 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
517 pa_tagstruct_getu32(t
, &i
.n_profiles
) < 0) {
519 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
523 if (i
.n_profiles
> 0) {
524 i
.profiles
= pa_xnew(pa_card_profile_info
, i
.n_profiles
+1);
526 for (j
= 0; j
< i
.n_profiles
; j
++) {
528 if (pa_tagstruct_gets(t
, &i
.profiles
[j
].name
) < 0 ||
529 pa_tagstruct_gets(t
, &i
.profiles
[j
].description
) < 0 ||
530 pa_tagstruct_getu32(t
, &i
.profiles
[j
].n_sinks
) < 0 ||
531 pa_tagstruct_getu32(t
, &i
.profiles
[j
].n_sources
)< 0) {
533 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
534 pa_xfree(i
.profiles
);
539 /* Terminate with an extra NULL entry, just to make sure */
540 i
.profiles
[j
].name
= NULL
;
541 i
.profiles
[j
].description
= NULL
;
544 i
.proplist
= pa_proplist_new();
546 if (pa_tagstruct_gets(t
, &ap
) < 0 ||
547 pa_tagstruct_get_proplist(t
, i
.proplist
) < 0) {
549 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
550 pa_xfree(i
.profiles
);
551 pa_proplist_free(i
.proplist
);
556 for (j
= 0; j
< i
.n_profiles
; j
++)
557 if (pa_streq(i
.profiles
[j
].name
, ap
)) {
558 i
.active_profile
= &i
.profiles
[j
];
564 pa_card_info_cb_t cb
= (pa_card_info_cb_t
) o
->callback
;
565 cb(o
->context
, &i
, 0, o
->userdata
);
568 pa_proplist_free(i
.proplist
);
569 pa_xfree(i
.profiles
);
574 pa_card_info_cb_t cb
= (pa_card_info_cb_t
) o
->callback
;
575 cb(o
->context
, NULL
, eol
, o
->userdata
);
579 pa_operation_done(o
);
580 pa_operation_unref(o
);
583 pa_operation
* pa_context_get_card_info_by_index(pa_context
*c
, uint32_t idx
, pa_card_info_cb_t cb
, void *userdata
) {
589 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
592 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
593 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
594 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
596 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
598 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CARD_INFO
, &tag
);
599 pa_tagstruct_putu32(t
, idx
);
600 pa_tagstruct_puts(t
, NULL
);
601 pa_pstream_send_tagstruct(c
->pstream
, t
);
602 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_card_info_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
607 pa_operation
* pa_context_get_card_info_by_name(pa_context
*c
, const char*name
, pa_card_info_cb_t cb
, void *userdata
) {
613 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
616 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
617 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
618 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
620 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
622 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_CARD_INFO
, &tag
);
623 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
624 pa_tagstruct_puts(t
, name
);
625 pa_pstream_send_tagstruct(c
->pstream
, t
);
626 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_get_card_info_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
631 pa_operation
* pa_context_get_card_info_list(pa_context
*c
, pa_card_info_cb_t cb
, void *userdata
) {
632 return pa_context_send_simple_command(c
, PA_COMMAND_GET_CARD_INFO_LIST
, context_get_card_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
635 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
) {
641 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
643 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
644 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
645 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
647 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
649 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_CARD_PROFILE
, &tag
);
650 pa_tagstruct_putu32(t
, idx
);
651 pa_tagstruct_puts(t
, NULL
);
652 pa_tagstruct_puts(t
, profile
);
653 pa_pstream_send_tagstruct(c
->pstream
, t
);
654 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
);
659 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
) {
665 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
667 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
668 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
669 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 15, PA_ERR_NOTSUPPORTED
);
671 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
673 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_CARD_PROFILE
, &tag
);
674 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
675 pa_tagstruct_puts(t
, name
);
676 pa_tagstruct_puts(t
, profile
);
677 pa_pstream_send_tagstruct(c
->pstream
, t
);
678 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
);
683 /*** Module info ***/
685 static void context_get_module_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
686 pa_operation
*o
= userdata
;
691 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
696 if (command
!= PA_COMMAND_REPLY
) {
697 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
703 while (!pa_tagstruct_eof(t
)) {
705 pa_bool_t auto_unload
= FALSE
;
707 memset(&i
, 0, sizeof(i
));
708 i
.proplist
= pa_proplist_new();
710 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
711 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
712 pa_tagstruct_gets(t
, &i
.argument
) < 0 ||
713 pa_tagstruct_getu32(t
, &i
.n_used
) < 0 ||
714 (o
->context
->version
< 15 && pa_tagstruct_get_boolean(t
, &auto_unload
) < 0) ||
715 (o
->context
->version
>= 15 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
716 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
720 i
.auto_unload
= (int) auto_unload
;
723 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
724 cb(o
->context
, &i
, 0, o
->userdata
);
727 pa_proplist_free(i
.proplist
);
732 pa_module_info_cb_t cb
= (pa_module_info_cb_t
) o
->callback
;
733 cb(o
->context
, NULL
, eol
, o
->userdata
);
737 pa_operation_done(o
);
738 pa_operation_unref(o
);
741 pa_operation
* pa_context_get_module_info(pa_context
*c
, uint32_t idx
, pa_module_info_cb_t cb
, void *userdata
) {
747 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
750 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
751 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
753 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
755 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_MODULE_INFO
, &tag
);
756 pa_tagstruct_putu32(t
, idx
);
757 pa_pstream_send_tagstruct(c
->pstream
, t
);
758 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
);
763 pa_operation
* pa_context_get_module_info_list(pa_context
*c
, pa_module_info_cb_t cb
, void *userdata
) {
764 return pa_context_send_simple_command(c
, PA_COMMAND_GET_MODULE_INFO_LIST
, context_get_module_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
767 /*** Sink input info ***/
769 static void context_get_sink_input_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
770 pa_operation
*o
= userdata
;
775 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
780 if (command
!= PA_COMMAND_REPLY
) {
781 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
787 while (!pa_tagstruct_eof(t
)) {
788 pa_sink_input_info i
;
789 pa_bool_t mute
= FALSE
;
791 memset(&i
, 0, sizeof(i
));
792 i
.proplist
= pa_proplist_new();
794 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
795 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
796 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
797 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
798 pa_tagstruct_getu32(t
, &i
.sink
) < 0 ||
799 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
800 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
801 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
802 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
803 pa_tagstruct_get_usec(t
, &i
.sink_usec
) < 0 ||
804 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
805 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
806 (o
->context
->version
>= 11 && pa_tagstruct_get_boolean(t
, &mute
) < 0) ||
807 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
809 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
810 pa_proplist_free(i
.proplist
);
817 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
818 cb(o
->context
, &i
, 0, o
->userdata
);
821 pa_proplist_free(i
.proplist
);
826 pa_sink_input_info_cb_t cb
= (pa_sink_input_info_cb_t
) o
->callback
;
827 cb(o
->context
, NULL
, eol
, o
->userdata
);
831 pa_operation_done(o
);
832 pa_operation_unref(o
);
835 pa_operation
* pa_context_get_sink_input_info(pa_context
*c
, uint32_t idx
, pa_sink_input_info_cb_t cb
, void *userdata
) {
841 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
844 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
845 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
847 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
849 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SINK_INPUT_INFO
, &tag
);
850 pa_tagstruct_putu32(t
, idx
);
851 pa_pstream_send_tagstruct(c
->pstream
, t
);
852 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
);
857 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
) {
858 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
);
861 /*** Source output info ***/
863 static void context_get_source_output_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
864 pa_operation
*o
= userdata
;
869 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
874 if (command
!= PA_COMMAND_REPLY
) {
875 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
881 while (!pa_tagstruct_eof(t
)) {
882 pa_source_output_info i
;
884 memset(&i
, 0, sizeof(i
));
885 i
.proplist
= pa_proplist_new();
887 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
888 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
889 pa_tagstruct_getu32(t
, &i
.owner_module
) < 0 ||
890 pa_tagstruct_getu32(t
, &i
.client
) < 0 ||
891 pa_tagstruct_getu32(t
, &i
.source
) < 0 ||
892 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
893 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
894 pa_tagstruct_get_usec(t
, &i
.buffer_usec
) < 0 ||
895 pa_tagstruct_get_usec(t
, &i
.source_usec
) < 0 ||
896 pa_tagstruct_gets(t
, &i
.resample_method
) < 0 ||
897 pa_tagstruct_gets(t
, &i
.driver
) < 0 ||
898 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
900 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
901 pa_proplist_free(i
.proplist
);
906 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
907 cb(o
->context
, &i
, 0, o
->userdata
);
910 pa_proplist_free(i
.proplist
);
915 pa_source_output_info_cb_t cb
= (pa_source_output_info_cb_t
) o
->callback
;
916 cb(o
->context
, NULL
, eol
, o
->userdata
);
920 pa_operation_done(o
);
921 pa_operation_unref(o
);
924 pa_operation
* pa_context_get_source_output_info(pa_context
*c
, uint32_t idx
, pa_source_output_info_cb_t cb
, void *userdata
) {
930 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
933 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
934 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
936 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
938 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SOURCE_OUTPUT_INFO
, &tag
);
939 pa_tagstruct_putu32(t
, idx
);
940 pa_pstream_send_tagstruct(c
->pstream
, t
);
941 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
);
946 pa_operation
* pa_context_get_source_output_info_list(pa_context
*c
, pa_source_output_info_cb_t cb
, void *userdata
) {
947 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
);
950 /*** Volume manipulation ***/
952 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
) {
958 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
961 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
962 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
964 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
966 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
967 pa_tagstruct_putu32(t
, idx
);
968 pa_tagstruct_puts(t
, NULL
);
969 pa_tagstruct_put_cvolume(t
, volume
);
970 pa_pstream_send_tagstruct(c
->pstream
, t
);
971 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
976 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
) {
982 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
986 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
987 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
988 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
990 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
992 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_VOLUME
, &tag
);
993 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
994 pa_tagstruct_puts(t
, name
);
995 pa_tagstruct_put_cvolume(t
, volume
);
996 pa_pstream_send_tagstruct(c
->pstream
, t
);
997 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
);
1002 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
) {
1008 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1010 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1012 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1014 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
1015 pa_tagstruct_putu32(t
, idx
);
1016 pa_tagstruct_puts(t
, NULL
);
1017 pa_tagstruct_put_boolean(t
, mute
);
1018 pa_pstream_send_tagstruct(c
->pstream
, t
);
1019 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
);
1024 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
) {
1030 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1033 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1034 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1036 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1038 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_MUTE
, &tag
);
1039 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1040 pa_tagstruct_puts(t
, name
);
1041 pa_tagstruct_put_boolean(t
, mute
);
1042 pa_pstream_send_tagstruct(c
->pstream
, t
);
1043 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
);
1048 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
) {
1054 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1057 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1058 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1059 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1061 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1063 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_VOLUME
, &tag
);
1064 pa_tagstruct_putu32(t
, idx
);
1065 pa_tagstruct_put_cvolume(t
, volume
);
1066 pa_pstream_send_tagstruct(c
->pstream
, t
);
1067 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, pa_context_simple_ack_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1072 pa_operation
* pa_context_set_sink_input_mute(pa_context
*c
, uint32_t idx
, int mute
, pa_context_success_cb_t cb
, void *userdata
) {
1078 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1080 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1081 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1082 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1084 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1086 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SINK_INPUT_MUTE
, &tag
);
1087 pa_tagstruct_putu32(t
, idx
);
1088 pa_tagstruct_put_boolean(t
, mute
);
1089 pa_pstream_send_tagstruct(c
->pstream
, t
);
1090 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
);
1095 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
) {
1101 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1104 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1105 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1107 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1109 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
1110 pa_tagstruct_putu32(t
, idx
);
1111 pa_tagstruct_puts(t
, NULL
);
1112 pa_tagstruct_put_cvolume(t
, volume
);
1113 pa_pstream_send_tagstruct(c
->pstream
, t
);
1114 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
);
1119 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
) {
1125 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1129 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1130 PA_CHECK_VALIDITY_RETURN_NULL(c
, pa_cvolume_valid(volume
), PA_ERR_INVALID
);
1131 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1133 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1135 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_VOLUME
, &tag
);
1136 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1137 pa_tagstruct_puts(t
, name
);
1138 pa_tagstruct_put_cvolume(t
, volume
);
1139 pa_pstream_send_tagstruct(c
->pstream
, t
);
1140 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
);
1145 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
) {
1151 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1153 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1155 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1157 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
1158 pa_tagstruct_putu32(t
, idx
);
1159 pa_tagstruct_puts(t
, NULL
);
1160 pa_tagstruct_put_boolean(t
, mute
);
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_name(pa_context
*c
, const char *name
, int mute
, pa_context_success_cb_t cb
, void *userdata
) {
1173 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1176 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1177 PA_CHECK_VALIDITY_RETURN_NULL(c
, !name
|| *name
, PA_ERR_INVALID
);
1179 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1181 t
= pa_tagstruct_command(c
, PA_COMMAND_SET_SOURCE_MUTE
, &tag
);
1182 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1183 pa_tagstruct_puts(t
, name
);
1184 pa_tagstruct_put_boolean(t
, mute
);
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 /** Sample Cache **/
1193 static void context_get_sample_info_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1194 pa_operation
*o
= userdata
;
1199 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1204 if (command
!= PA_COMMAND_REPLY
) {
1205 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1211 while (!pa_tagstruct_eof(t
)) {
1213 pa_bool_t lazy
= FALSE
;
1215 memset(&i
, 0, sizeof(i
));
1216 i
.proplist
= pa_proplist_new();
1218 if (pa_tagstruct_getu32(t
, &i
.index
) < 0 ||
1219 pa_tagstruct_gets(t
, &i
.name
) < 0 ||
1220 pa_tagstruct_get_cvolume(t
, &i
.volume
) < 0 ||
1221 pa_tagstruct_get_usec(t
, &i
.duration
) < 0 ||
1222 pa_tagstruct_get_sample_spec(t
, &i
.sample_spec
) < 0 ||
1223 pa_tagstruct_get_channel_map(t
, &i
.channel_map
) < 0 ||
1224 pa_tagstruct_getu32(t
, &i
.bytes
) < 0 ||
1225 pa_tagstruct_get_boolean(t
, &lazy
) < 0 ||
1226 pa_tagstruct_gets(t
, &i
.filename
) < 0 ||
1227 (o
->context
->version
>= 13 && pa_tagstruct_get_proplist(t
, i
.proplist
) < 0)) {
1229 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1233 i
.lazy
= (int) lazy
;
1236 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1237 cb(o
->context
, &i
, 0, o
->userdata
);
1240 pa_proplist_free(i
.proplist
);
1245 pa_sample_info_cb_t cb
= (pa_sample_info_cb_t
) o
->callback
;
1246 cb(o
->context
, NULL
, eol
, o
->userdata
);
1250 pa_operation_done(o
);
1251 pa_operation_unref(o
);
1254 pa_operation
* pa_context_get_sample_info_by_name(pa_context
*c
, const char *name
, pa_sample_info_cb_t cb
, void *userdata
) {
1260 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1263 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1264 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1266 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1268 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1269 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1270 pa_tagstruct_puts(t
, name
);
1271 pa_pstream_send_tagstruct(c
->pstream
, t
);
1272 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
);
1277 pa_operation
* pa_context_get_sample_info_by_index(pa_context
*c
, uint32_t idx
, pa_sample_info_cb_t cb
, void *userdata
) {
1283 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1286 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1287 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1289 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1291 t
= pa_tagstruct_command(c
, PA_COMMAND_GET_SAMPLE_INFO
, &tag
);
1292 pa_tagstruct_putu32(t
, idx
);
1293 pa_tagstruct_puts(t
, NULL
);
1294 pa_pstream_send_tagstruct(c
->pstream
, t
);
1295 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
);
1300 pa_operation
* pa_context_get_sample_info_list(pa_context
*c
, pa_sample_info_cb_t cb
, void *userdata
) {
1301 return pa_context_send_simple_command(c
, PA_COMMAND_GET_SAMPLE_INFO_LIST
, context_get_sample_info_callback
, (pa_operation_cb_t
) cb
, userdata
);
1304 static pa_operation
* command_kill(pa_context
*c
, uint32_t command
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1310 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
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
, command
, &tag
);
1318 pa_tagstruct_putu32(t
, idx
);
1319 pa_pstream_send_tagstruct(c
->pstream
, t
);
1320 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
);
1325 pa_operation
* pa_context_kill_client(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1326 return command_kill(c
, PA_COMMAND_KILL_CLIENT
, idx
, cb
, userdata
);
1329 pa_operation
* pa_context_kill_sink_input(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1330 return command_kill(c
, PA_COMMAND_KILL_SINK_INPUT
, idx
, cb
, userdata
);
1333 pa_operation
* pa_context_kill_source_output(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1334 return command_kill(c
, PA_COMMAND_KILL_SOURCE_OUTPUT
, idx
, cb
, userdata
);
1337 static void context_index_callback(pa_pdispatch
*pd
, uint32_t command
, uint32_t tag
, pa_tagstruct
*t
, void *userdata
) {
1338 pa_operation
*o
= userdata
;
1343 pa_assert(PA_REFCNT_VALUE(o
) >= 1);
1348 if (command
!= PA_COMMAND_REPLY
) {
1349 if (pa_context_handle_error(o
->context
, command
, t
, FALSE
) < 0)
1352 idx
= PA_INVALID_INDEX
;
1353 } else if (pa_tagstruct_getu32(t
, &idx
) ||
1354 !pa_tagstruct_eof(t
)) {
1355 pa_context_fail(o
->context
, PA_ERR_PROTOCOL
);
1360 pa_context_index_cb_t cb
= (pa_context_index_cb_t
) o
->callback
;
1361 cb(o
->context
, idx
, o
->userdata
);
1366 pa_operation_done(o
);
1367 pa_operation_unref(o
);
1370 pa_operation
* pa_context_load_module(pa_context
*c
, const char*name
, const char *argument
, pa_context_index_cb_t cb
, void *userdata
) {
1376 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1378 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1379 PA_CHECK_VALIDITY_RETURN_NULL(c
, name
&& *name
, PA_ERR_INVALID
);
1381 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1383 t
= pa_tagstruct_command(c
, PA_COMMAND_LOAD_MODULE
, &tag
);
1384 pa_tagstruct_puts(t
, name
);
1385 pa_tagstruct_puts(t
, argument
);
1386 pa_pstream_send_tagstruct(c
->pstream
, t
);
1387 pa_pdispatch_register_reply(c
->pdispatch
, tag
, DEFAULT_TIMEOUT
, context_index_callback
, pa_operation_ref(o
), (pa_free_cb_t
) pa_operation_unref
);
1392 pa_operation
* pa_context_unload_module(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void *userdata
) {
1393 return command_kill(c
, PA_COMMAND_UNLOAD_MODULE
, idx
, cb
, userdata
);
1396 /*** Autoload stuff ***/
1398 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_name
, "Module auto-loading no longer supported.");
1400 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
) {
1403 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1405 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1408 PA_WARN_REFERENCE(pa_context_get_autoload_info_by_index
, "Module auto-loading no longer supported.");
1410 pa_operation
* pa_context_get_autoload_info_by_index(pa_context
*c
, uint32_t idx
, pa_autoload_info_cb_t cb
, void *userdata
) {
1412 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1414 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1417 PA_WARN_REFERENCE(pa_context_get_autoload_info_list
, "Module auto-loading no longer supported.");
1419 pa_operation
* pa_context_get_autoload_info_list(pa_context
*c
, pa_autoload_info_cb_t cb
, void *userdata
) {
1421 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1423 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1426 PA_WARN_REFERENCE(pa_context_add_autoload
, "Module auto-loading no longer supported.");
1428 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
) {
1430 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1432 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1435 PA_WARN_REFERENCE(pa_context_remove_autoload_by_name
, "Module auto-loading no longer supported.");
1437 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
) {
1439 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1441 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1444 PA_WARN_REFERENCE(pa_context_remove_autoload_by_index
, "Module auto-loading no longer supported.");
1446 pa_operation
* pa_context_remove_autoload_by_index(pa_context
*c
, uint32_t idx
, pa_context_success_cb_t cb
, void* userdata
) {
1448 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1450 PA_FAIL_RETURN_NULL(c
, PA_ERR_OBSOLETE
);
1453 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
) {
1459 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1461 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1462 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1463 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1464 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_name
&& *sink_name
, PA_ERR_INVALID
);
1466 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1468 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1469 pa_tagstruct_putu32(t
, idx
);
1470 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1471 pa_tagstruct_puts(t
, sink_name
);
1472 pa_pstream_send_tagstruct(c
->pstream
, t
);
1473 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
);
1478 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
) {
1484 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1486 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1487 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1488 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1489 PA_CHECK_VALIDITY_RETURN_NULL(c
, sink_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1491 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1493 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SINK_INPUT
, &tag
);
1494 pa_tagstruct_putu32(t
, idx
);
1495 pa_tagstruct_putu32(t
, sink_idx
);
1496 pa_tagstruct_puts(t
, NULL
);
1497 pa_pstream_send_tagstruct(c
->pstream
, t
);
1498 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
);
1503 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
) {
1509 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1511 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1512 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1513 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1514 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_name
&& *source_name
, PA_ERR_INVALID
);
1516 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1518 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1519 pa_tagstruct_putu32(t
, idx
);
1520 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1521 pa_tagstruct_puts(t
, source_name
);
1522 pa_pstream_send_tagstruct(c
->pstream
, t
);
1523 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
);
1528 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
) {
1534 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1536 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1537 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 10, PA_ERR_NOTSUPPORTED
);
1538 PA_CHECK_VALIDITY_RETURN_NULL(c
, idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1539 PA_CHECK_VALIDITY_RETURN_NULL(c
, source_idx
!= PA_INVALID_INDEX
, PA_ERR_INVALID
);
1541 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1543 t
= pa_tagstruct_command(c
, PA_COMMAND_MOVE_SOURCE_OUTPUT
, &tag
);
1544 pa_tagstruct_putu32(t
, idx
);
1545 pa_tagstruct_putu32(t
, source_idx
);
1546 pa_tagstruct_puts(t
, NULL
);
1547 pa_pstream_send_tagstruct(c
->pstream
, t
);
1548 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
);
1553 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
) {
1559 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1561 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1562 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1563 PA_CHECK_VALIDITY_RETURN_NULL(c
, !sink_name
|| *sink_name
, PA_ERR_INVALID
);
1565 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1567 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1568 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1569 pa_tagstruct_puts(t
, sink_name
);
1570 pa_tagstruct_put_boolean(t
, suspend
);
1571 pa_pstream_send_tagstruct(c
->pstream
, t
);
1572 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
);
1577 pa_operation
* pa_context_suspend_sink_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1583 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1585 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1586 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1588 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1590 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SINK
, &tag
);
1591 pa_tagstruct_putu32(t
, idx
);
1592 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1593 pa_tagstruct_put_boolean(t
, suspend
);
1594 pa_pstream_send_tagstruct(c
->pstream
, t
);
1595 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
);
1600 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
) {
1606 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1608 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1609 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1610 PA_CHECK_VALIDITY_RETURN_NULL(c
, !source_name
|| *source_name
, PA_ERR_INVALID
);
1612 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1614 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1615 pa_tagstruct_putu32(t
, PA_INVALID_INDEX
);
1616 pa_tagstruct_puts(t
, source_name
);
1617 pa_tagstruct_put_boolean(t
, suspend
);
1618 pa_pstream_send_tagstruct(c
->pstream
, t
);
1619 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
);
1624 pa_operation
* pa_context_suspend_source_by_index(pa_context
*c
, uint32_t idx
, int suspend
, pa_context_success_cb_t cb
, void* userdata
) {
1630 pa_assert(PA_REFCNT_VALUE(c
) >= 1);
1632 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->state
== PA_CONTEXT_READY
, PA_ERR_BADSTATE
);
1633 PA_CHECK_VALIDITY_RETURN_NULL(c
, c
->version
>= 11, PA_ERR_NOTSUPPORTED
);
1635 o
= pa_operation_new(c
, NULL
, (pa_operation_cb_t
) cb
, userdata
);
1637 t
= pa_tagstruct_command(c
, PA_COMMAND_SUSPEND_SOURCE
, &tag
);
1638 pa_tagstruct_putu32(t
, idx
);
1639 pa_tagstruct_puts(t
, idx
== PA_INVALID_INDEX
? "" : NULL
);
1640 pa_tagstruct_put_boolean(t
, suspend
);
1641 pa_pstream_send_tagstruct(c
->pstream
, t
);
1642 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
);