2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of the License,
9 or (at your option) any later version.
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
39 #include <pulse/i18n.h>
40 #include <pulse/pulseaudio.h>
42 #include <pulsecore/macro.h>
43 #include <pulsecore/core-util.h>
44 #include <pulsecore/log.h>
45 #include <pulsecore/sndfile-util.h>
47 static pa_context
*context
= NULL
;
48 static pa_mainloop_api
*mainloop_api
= NULL
;
62 sink_input_idx
= PA_INVALID_INDEX
,
63 source_output_idx
= PA_INVALID_INDEX
;
65 static uint32_t module_index
;
66 static pa_bool_t suspend
;
67 static pa_bool_t mute
;
68 static pa_volume_t volume
;
69 static enum volume_flags
{
74 VOL_ABSOLUTE
= 0 << 4,
75 VOL_RELATIVE
= 1 << 4,
78 static pa_proplist
*proplist
= NULL
;
80 static SNDFILE
*sndfile
= NULL
;
81 static pa_stream
*sample_stream
= NULL
;
82 static pa_sample_spec sample_spec
;
83 static pa_channel_map channel_map
;
84 static size_t sample_length
= 0;
85 static int actions
= 1;
87 static pa_bool_t nl
= FALSE
;
108 SET_SINK_INPUT_VOLUME
,
115 static void quit(int ret
) {
116 pa_assert(mainloop_api
);
117 mainloop_api
->quit(mainloop_api
, ret
);
120 static void context_drain_complete(pa_context
*c
, void *userdata
) {
121 pa_context_disconnect(c
);
124 static void drain(void) {
127 if (!(o
= pa_context_drain(context
, context_drain_complete
, NULL
)))
128 pa_context_disconnect(context
);
130 pa_operation_unref(o
);
133 static void complete_action(void) {
134 pa_assert(actions
> 0);
140 static void stat_callback(pa_context
*c
, const pa_stat_info
*i
, void *userdata
) {
141 char s
[PA_BYTES_SNPRINT_MAX
];
143 pa_log(_("Failed to get statistics: %s"), pa_strerror(pa_context_errno(c
)));
148 pa_bytes_snprint(s
, sizeof(s
), i
->memblock_total_size
);
149 printf(_("Currently in use: %u blocks containing %s bytes total.\n"), i
->memblock_total
, s
);
151 pa_bytes_snprint(s
, sizeof(s
), i
->memblock_allocated_size
);
152 printf(_("Allocated during whole lifetime: %u blocks containing %s bytes total.\n"), i
->memblock_allocated
, s
);
154 pa_bytes_snprint(s
, sizeof(s
), i
->scache_size
);
155 printf(_("Sample cache size: %s\n"), s
);
160 static void get_server_info_callback(pa_context
*c
, const pa_server_info
*i
, void *useerdata
) {
161 char ss
[PA_SAMPLE_SPEC_SNPRINT_MAX
], cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
164 pa_log(_("Failed to get server information: %s"), pa_strerror(pa_context_errno(c
)));
169 printf(_("Server String: %s\n"
170 "Library Protocol Version: %u\n"
171 "Server Protocol Version: %u\n"
175 pa_context_get_server(c
),
176 pa_context_get_protocol_version(c
),
177 pa_context_get_server_protocol_version(c
),
178 pa_yes_no(pa_context_is_local(c
)),
179 pa_context_get_index(c
),
180 pa_context_get_tile_size(c
, NULL
));
182 pa_sample_spec_snprint(ss
, sizeof(ss
), &i
->sample_spec
);
183 pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
);
185 printf(_("User Name: %s\n"
188 "Server Version: %s\n"
189 "Default Sample Specification: %s\n"
190 "Default Channel Map: %s\n"
192 "Default Source: %s\n"
193 "Cookie: %04x:%04x\n"),
200 i
->default_sink_name
,
201 i
->default_source_name
,
203 i
->cookie
& 0xFFFFU
);
208 static void get_sink_info_callback(pa_context
*c
, const pa_sink_info
*i
, int is_last
, void *userdata
) {
210 static const char *state_table
[] = {
211 [1+PA_SINK_INVALID_STATE
] = "n/a",
212 [1+PA_SINK_RUNNING
] = "RUNNING",
213 [1+PA_SINK_IDLE
] = "IDLE",
214 [1+PA_SINK_SUSPENDED
] = "SUSPENDED"
218 s
[PA_SAMPLE_SPEC_SNPRINT_MAX
],
219 cv
[PA_CVOLUME_SNPRINT_MAX
],
220 cvdb
[PA_SW_CVOLUME_SNPRINT_DB_MAX
],
221 v
[PA_VOLUME_SNPRINT_MAX
],
222 vdb
[PA_SW_VOLUME_SNPRINT_DB_MAX
],
223 cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
227 pa_log(_("Failed to get sink information: %s"), pa_strerror(pa_context_errno(c
)));
243 printf(_("Sink #%u\n"
246 "\tDescription: %s\n"
248 "\tSample Specification: %s\n"
249 "\tChannel Map: %s\n"
250 "\tOwner Module: %u\n"
254 "\tBase Volume: %s%s%s\n"
255 "\tMonitor Source: %s\n"
256 "\tLatency: %0.0f usec, configured %0.0f usec\n"
257 "\tFlags: %s%s%s%s%s%s\n"
258 "\tProperties:\n\t\t%s\n"),
260 state_table
[1+i
->state
],
262 pa_strnull(i
->description
),
263 pa_strnull(i
->driver
),
264 pa_sample_spec_snprint(s
, sizeof(s
), &i
->sample_spec
),
265 pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
),
268 pa_cvolume_snprint(cv
, sizeof(cv
), &i
->volume
),
269 i
->flags
& PA_SINK_DECIBEL_VOLUME
? "\n\t " : "",
270 i
->flags
& PA_SINK_DECIBEL_VOLUME
? pa_sw_cvolume_snprint_dB(cvdb
, sizeof(cvdb
), &i
->volume
) : "",
271 pa_cvolume_get_balance(&i
->volume
, &i
->channel_map
),
272 pa_volume_snprint(v
, sizeof(v
), i
->base_volume
),
273 i
->flags
& PA_SINK_DECIBEL_VOLUME
? "\n\t " : "",
274 i
->flags
& PA_SINK_DECIBEL_VOLUME
? pa_sw_volume_snprint_dB(vdb
, sizeof(vdb
), i
->base_volume
) : "",
275 pa_strnull(i
->monitor_source_name
),
276 (double) i
->latency
, (double) i
->configured_latency
,
277 i
->flags
& PA_SINK_HARDWARE
? "HARDWARE " : "",
278 i
->flags
& PA_SINK_NETWORK
? "NETWORK " : "",
279 i
->flags
& PA_SINK_HW_MUTE_CTRL
? "HW_MUTE_CTRL " : "",
280 i
->flags
& PA_SINK_HW_VOLUME_CTRL
? "HW_VOLUME_CTRL " : "",
281 i
->flags
& PA_SINK_DECIBEL_VOLUME
? "DECIBEL_VOLUME " : "",
282 i
->flags
& PA_SINK_LATENCY
? "LATENCY " : "",
283 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
288 pa_sink_port_info
**p
;
290 printf(_("\tPorts:\n"));
291 for (p
= i
->ports
; *p
; p
++)
292 printf("\t\t%s: %s (priority. %u)\n", (*p
)->name
, (*p
)->description
, (*p
)->priority
);
296 printf(_("\tActive Port: %s\n"),
297 i
->active_port
->name
);
300 static void get_source_info_callback(pa_context
*c
, const pa_source_info
*i
, int is_last
, void *userdata
) {
302 static const char *state_table
[] = {
303 [1+PA_SOURCE_INVALID_STATE
] = "n/a",
304 [1+PA_SOURCE_RUNNING
] = "RUNNING",
305 [1+PA_SOURCE_IDLE
] = "IDLE",
306 [1+PA_SOURCE_SUSPENDED
] = "SUSPENDED"
310 s
[PA_SAMPLE_SPEC_SNPRINT_MAX
],
311 cv
[PA_CVOLUME_SNPRINT_MAX
],
312 cvdb
[PA_SW_CVOLUME_SNPRINT_DB_MAX
],
313 v
[PA_VOLUME_SNPRINT_MAX
],
314 vdb
[PA_SW_VOLUME_SNPRINT_DB_MAX
],
315 cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
319 pa_log(_("Failed to get source information: %s"), pa_strerror(pa_context_errno(c
)));
335 printf(_("Source #%u\n"
338 "\tDescription: %s\n"
340 "\tSample Specification: %s\n"
341 "\tChannel Map: %s\n"
342 "\tOwner Module: %u\n"
346 "\tBase Volume: %s%s%s\n"
347 "\tMonitor of Sink: %s\n"
348 "\tLatency: %0.0f usec, configured %0.0f usec\n"
349 "\tFlags: %s%s%s%s%s%s\n"
350 "\tProperties:\n\t\t%s\n"),
352 state_table
[1+i
->state
],
354 pa_strnull(i
->description
),
355 pa_strnull(i
->driver
),
356 pa_sample_spec_snprint(s
, sizeof(s
), &i
->sample_spec
),
357 pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
),
360 pa_cvolume_snprint(cv
, sizeof(cv
), &i
->volume
),
361 i
->flags
& PA_SOURCE_DECIBEL_VOLUME
? "\n\t " : "",
362 i
->flags
& PA_SOURCE_DECIBEL_VOLUME
? pa_sw_cvolume_snprint_dB(cvdb
, sizeof(cvdb
), &i
->volume
) : "",
363 pa_cvolume_get_balance(&i
->volume
, &i
->channel_map
),
364 pa_volume_snprint(v
, sizeof(v
), i
->base_volume
),
365 i
->flags
& PA_SOURCE_DECIBEL_VOLUME
? "\n\t " : "",
366 i
->flags
& PA_SOURCE_DECIBEL_VOLUME
? pa_sw_volume_snprint_dB(vdb
, sizeof(vdb
), i
->base_volume
) : "",
367 i
->monitor_of_sink_name
? i
->monitor_of_sink_name
: _("n/a"),
368 (double) i
->latency
, (double) i
->configured_latency
,
369 i
->flags
& PA_SOURCE_HARDWARE
? "HARDWARE " : "",
370 i
->flags
& PA_SOURCE_NETWORK
? "NETWORK " : "",
371 i
->flags
& PA_SOURCE_HW_MUTE_CTRL
? "HW_MUTE_CTRL " : "",
372 i
->flags
& PA_SOURCE_HW_VOLUME_CTRL
? "HW_VOLUME_CTRL " : "",
373 i
->flags
& PA_SOURCE_DECIBEL_VOLUME
? "DECIBEL_VOLUME " : "",
374 i
->flags
& PA_SOURCE_LATENCY
? "LATENCY " : "",
375 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
380 pa_source_port_info
**p
;
382 printf(_("\tPorts:\n"));
383 for (p
= i
->ports
; *p
; p
++)
384 printf("\t\t%s: %s (priority. %u)\n", (*p
)->name
, (*p
)->description
, (*p
)->priority
);
388 printf(_("\tActive Port: %s\n"),
389 i
->active_port
->name
);
392 static void get_module_info_callback(pa_context
*c
, const pa_module_info
*i
, int is_last
, void *userdata
) {
397 pa_log(_("Failed to get module information: %s"), pa_strerror(pa_context_errno(c
)));
413 pa_snprintf(t
, sizeof(t
), "%u", i
->n_used
);
415 printf(_("Module #%u\n"
418 "\tUsage counter: %s\n"
419 "\tProperties:\n\t\t%s\n"),
422 i
->argument
? i
->argument
: "",
423 i
->n_used
!= PA_INVALID_INDEX
? t
: _("n/a"),
424 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
429 static void get_client_info_callback(pa_context
*c
, const pa_client_info
*i
, int is_last
, void *userdata
) {
434 pa_log(_("Failed to get client information: %s"), pa_strerror(pa_context_errno(c
)));
450 pa_snprintf(t
, sizeof(t
), "%u", i
->owner_module
);
452 printf(_("Client #%u\n"
454 "\tOwner Module: %s\n"
455 "\tProperties:\n\t\t%s\n"),
457 pa_strnull(i
->driver
),
458 i
->owner_module
!= PA_INVALID_INDEX
? t
: _("n/a"),
459 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
464 static void get_card_info_callback(pa_context
*c
, const pa_card_info
*i
, int is_last
, void *userdata
) {
469 pa_log(_("Failed to get card information: %s"), pa_strerror(pa_context_errno(c
)));
485 pa_snprintf(t
, sizeof(t
), "%u", i
->owner_module
);
487 printf(_("Card #%u\n"
490 "\tOwner Module: %s\n"
491 "\tProperties:\n\t\t%s\n"),
494 pa_strnull(i
->driver
),
495 i
->owner_module
!= PA_INVALID_INDEX
? t
: _("n/a"),
496 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
499 pa_card_profile_info
*p
;
501 printf(_("\tProfiles:\n"));
502 for (p
= i
->profiles
; p
->name
; p
++)
503 printf("\t\t%s: %s (sinks: %u, sources: %u, priority. %u)\n", p
->name
, p
->description
, p
->n_sinks
, p
->n_sources
, p
->priority
);
506 if (i
->active_profile
)
507 printf(_("\tActive Profile: %s\n"),
508 i
->active_profile
->name
);
513 static void get_sink_input_info_callback(pa_context
*c
, const pa_sink_input_info
*i
, int is_last
, void *userdata
) {
514 char t
[32], k
[32], s
[PA_SAMPLE_SPEC_SNPRINT_MAX
], cv
[PA_CVOLUME_SNPRINT_MAX
], cvdb
[PA_SW_CVOLUME_SNPRINT_DB_MAX
], cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
518 pa_log(_("Failed to get sink input information: %s"), pa_strerror(pa_context_errno(c
)));
534 pa_snprintf(t
, sizeof(t
), "%u", i
->owner_module
);
535 pa_snprintf(k
, sizeof(k
), "%u", i
->client
);
537 printf(_("Sink Input #%u\n"
539 "\tOwner Module: %s\n"
542 "\tSample Specification: %s\n"
543 "\tChannel Map: %s\n"
548 "\tBuffer Latency: %0.0f usec\n"
549 "\tSink Latency: %0.0f usec\n"
550 "\tResample method: %s\n"
551 "\tProperties:\n\t\t%s\n"),
553 pa_strnull(i
->driver
),
554 i
->owner_module
!= PA_INVALID_INDEX
? t
: _("n/a"),
555 i
->client
!= PA_INVALID_INDEX
? k
: _("n/a"),
557 pa_sample_spec_snprint(s
, sizeof(s
), &i
->sample_spec
),
558 pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
),
560 pa_cvolume_snprint(cv
, sizeof(cv
), &i
->volume
),
561 pa_sw_cvolume_snprint_dB(cvdb
, sizeof(cvdb
), &i
->volume
),
562 pa_cvolume_get_balance(&i
->volume
, &i
->channel_map
),
563 (double) i
->buffer_usec
,
564 (double) i
->sink_usec
,
565 i
->resample_method
? i
->resample_method
: _("n/a"),
566 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
571 static void get_source_output_info_callback(pa_context
*c
, const pa_source_output_info
*i
, int is_last
, void *userdata
) {
572 char t
[32], k
[32], s
[PA_SAMPLE_SPEC_SNPRINT_MAX
], cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
576 pa_log(_("Failed to get source output information: %s"), pa_strerror(pa_context_errno(c
)));
593 pa_snprintf(t
, sizeof(t
), "%u", i
->owner_module
);
594 pa_snprintf(k
, sizeof(k
), "%u", i
->client
);
596 printf(_("Source Output #%u\n"
598 "\tOwner Module: %s\n"
601 "\tSample Specification: %s\n"
602 "\tChannel Map: %s\n"
603 "\tBuffer Latency: %0.0f usec\n"
604 "\tSource Latency: %0.0f usec\n"
605 "\tResample method: %s\n"
606 "\tProperties:\n\t\t%s\n"),
608 pa_strnull(i
->driver
),
609 i
->owner_module
!= PA_INVALID_INDEX
? t
: _("n/a"),
610 i
->client
!= PA_INVALID_INDEX
? k
: _("n/a"),
612 pa_sample_spec_snprint(s
, sizeof(s
), &i
->sample_spec
),
613 pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
),
614 (double) i
->buffer_usec
,
615 (double) i
->source_usec
,
616 i
->resample_method
? i
->resample_method
: _("n/a"),
617 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
622 static void get_sample_info_callback(pa_context
*c
, const pa_sample_info
*i
, int is_last
, void *userdata
) {
623 char t
[PA_BYTES_SNPRINT_MAX
], s
[PA_SAMPLE_SPEC_SNPRINT_MAX
], cv
[PA_CVOLUME_SNPRINT_MAX
], cvdb
[PA_SW_CVOLUME_SNPRINT_DB_MAX
], cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
627 pa_log(_("Failed to get sample information: %s"), pa_strerror(pa_context_errno(c
)));
643 pa_bytes_snprint(t
, sizeof(t
), i
->bytes
);
645 printf(_("Sample #%u\n"
647 "\tSample Specification: %s\n"
648 "\tChannel Map: %s\n"
652 "\tDuration: %0.1fs\n"
656 "\tProperties:\n\t\t%s\n"),
659 pa_sample_spec_valid(&i
->sample_spec
) ? pa_sample_spec_snprint(s
, sizeof(s
), &i
->sample_spec
) : _("n/a"),
660 pa_sample_spec_valid(&i
->sample_spec
) ? pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
) : _("n/a"),
661 pa_cvolume_snprint(cv
, sizeof(cv
), &i
->volume
),
662 pa_sw_cvolume_snprint_dB(cvdb
, sizeof(cvdb
), &i
->volume
),
663 pa_cvolume_get_balance(&i
->volume
, &i
->channel_map
),
664 (double) i
->duration
/1000000.0,
667 i
->filename
? i
->filename
: _("n/a"),
668 pl
= pa_proplist_to_string_sep(i
->proplist
, "\n\t\t"));
673 static void simple_callback(pa_context
*c
, int success
, void *userdata
) {
675 pa_log(_("Failure: %s"), pa_strerror(pa_context_errno(c
)));
683 static void index_callback(pa_context
*c
, uint32_t idx
, void *userdata
) {
684 if (idx
== PA_INVALID_INDEX
) {
685 pa_log(_("Failure: %s"), pa_strerror(pa_context_errno(c
)));
695 static void volume_relative_adjust(pa_cvolume
*cv
) {
696 pa_assert((volume_flags
& VOL_RELATIVE
) == VOL_RELATIVE
);
698 /* Relative volume change is additive in case of UINT or PERCENT
699 * and multiplicative for LINEAR or DECIBEL */
700 if ((volume_flags
& 0x0F) == VOL_UINT
|| (volume_flags
& 0x0F) == VOL_PERCENT
) {
701 pa_volume_t v
= pa_cvolume_avg(cv
);
702 v
= v
+ volume
< PA_VOLUME_NORM
? PA_VOLUME_MUTED
: v
+ volume
- PA_VOLUME_NORM
;
703 pa_cvolume_set(cv
, 1, v
);
705 if ((volume_flags
& 0x0F) == VOL_LINEAR
|| (volume_flags
& 0x0F) == VOL_DECIBEL
) {
706 pa_sw_cvolume_multiply_scalar(cv
, cv
, volume
);
710 static void get_sink_volume_callback(pa_context
*c
, const pa_sink_info
*i
, int is_last
, void *userdata
) {
714 pa_log(_("Failed to get sink information: %s"), pa_strerror(pa_context_errno(c
)));
725 volume_relative_adjust(&cv
);
726 pa_operation_unref(pa_context_set_sink_volume_by_name(c
, sink_name
, &cv
, simple_callback
, NULL
));
729 static void get_source_volume_callback(pa_context
*c
, const pa_source_info
*i
, int is_last
, void *userdata
) {
733 pa_log(_("Failed to get source information: %s"), pa_strerror(pa_context_errno(c
)));
744 volume_relative_adjust(&cv
);
745 pa_operation_unref(pa_context_set_source_volume_by_name(c
, source_name
, &cv
, simple_callback
, NULL
));
748 static void get_sink_input_volume_callback(pa_context
*c
, const pa_sink_input_info
*i
, int is_last
, void *userdata
) {
752 pa_log(_("Failed to get sink input information: %s"), pa_strerror(pa_context_errno(c
)));
763 volume_relative_adjust(&cv
);
764 pa_operation_unref(pa_context_set_sink_input_volume(c
, sink_input_idx
, &cv
, simple_callback
, NULL
));
767 static void stream_state_callback(pa_stream
*s
, void *userdata
) {
770 switch (pa_stream_get_state(s
)) {
771 case PA_STREAM_CREATING
:
772 case PA_STREAM_READY
:
775 case PA_STREAM_TERMINATED
:
779 case PA_STREAM_FAILED
:
781 pa_log(_("Failed to upload sample: %s"), pa_strerror(pa_context_errno(pa_stream_get_context(s
))));
786 static void stream_write_callback(pa_stream
*s
, size_t length
, void *userdata
) {
789 pa_assert(s
&& length
&& sndfile
);
791 d
= pa_xmalloc(length
);
793 pa_assert(sample_length
>= length
);
794 l
= (sf_count_t
) (length
/pa_frame_size(&sample_spec
));
796 if ((sf_readf_float(sndfile
, d
, l
)) != l
) {
798 pa_log(_("Premature end of file"));
803 pa_stream_write(s
, d
, length
, pa_xfree
, 0, PA_SEEK_RELATIVE
);
805 sample_length
-= length
;
807 if (sample_length
<= 0) {
808 pa_stream_set_write_callback(sample_stream
, NULL
, NULL
);
809 pa_stream_finish_upload(sample_stream
);
813 static const char *subscription_event_type_to_string(pa_subscription_event_type_t t
) {
815 switch (t
& PA_SUBSCRIPTION_EVENT_TYPE_MASK
) {
817 case PA_SUBSCRIPTION_EVENT_NEW
:
820 case PA_SUBSCRIPTION_EVENT_CHANGE
:
823 case PA_SUBSCRIPTION_EVENT_REMOVE
:
830 static const char *subscription_event_facility_to_string(pa_subscription_event_type_t t
) {
832 switch (t
& PA_SUBSCRIPTION_EVENT_FACILITY_MASK
) {
834 case PA_SUBSCRIPTION_EVENT_SINK
:
837 case PA_SUBSCRIPTION_EVENT_SOURCE
:
840 case PA_SUBSCRIPTION_EVENT_SINK_INPUT
:
841 return _("sink-input");
843 case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT
:
844 return _("source-output");
846 case PA_SUBSCRIPTION_EVENT_MODULE
:
849 case PA_SUBSCRIPTION_EVENT_CLIENT
:
852 case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE
:
853 return _("sample-cache");
855 case PA_SUBSCRIPTION_EVENT_SERVER
:
858 case PA_SUBSCRIPTION_EVENT_CARD
:
865 static void context_subscribe_callback(pa_context
*c
, pa_subscription_event_type_t t
, uint32_t idx
, void *userdata
) {
868 printf(_("Event '%s' on %s #%u\n"),
869 subscription_event_type_to_string(t
),
870 subscription_event_facility_to_string(t
),
874 static void context_state_callback(pa_context
*c
, void *userdata
) {
876 switch (pa_context_get_state(c
)) {
877 case PA_CONTEXT_CONNECTING
:
878 case PA_CONTEXT_AUTHORIZING
:
879 case PA_CONTEXT_SETTING_NAME
:
882 case PA_CONTEXT_READY
:
886 pa_operation_unref(pa_context_stat(c
, stat_callback
, NULL
));
887 pa_operation_unref(pa_context_get_server_info(c
, get_server_info_callback
, NULL
));
891 pa_operation_unref(pa_context_play_sample(c
, sample_name
, sink_name
, PA_VOLUME_NORM
, simple_callback
, NULL
));
895 pa_operation_unref(pa_context_remove_sample(c
, sample_name
, simple_callback
, NULL
));
899 sample_stream
= pa_stream_new(c
, sample_name
, &sample_spec
, NULL
);
900 pa_assert(sample_stream
);
902 pa_stream_set_state_callback(sample_stream
, stream_state_callback
, NULL
);
903 pa_stream_set_write_callback(sample_stream
, stream_write_callback
, NULL
);
904 pa_stream_connect_upload(sample_stream
, sample_length
);
908 pa_operation_unref(pa_context_exit_daemon(c
, simple_callback
, NULL
));
913 if (pa_streq(list_type
, "modules"))
914 pa_operation_unref(pa_context_get_module_info_list(c
, get_module_info_callback
, NULL
));
915 else if (pa_streq(list_type
, "sinks"))
916 pa_operation_unref(pa_context_get_sink_info_list(c
, get_sink_info_callback
, NULL
));
917 else if (pa_streq(list_type
, "sources"))
918 pa_operation_unref(pa_context_get_source_info_list(c
, get_source_info_callback
, NULL
));
919 else if (pa_streq(list_type
, "sink-inputs"))
920 pa_operation_unref(pa_context_get_sink_input_info_list(c
, get_sink_input_info_callback
, NULL
));
921 else if (pa_streq(list_type
, "source-outputs"))
922 pa_operation_unref(pa_context_get_source_output_info_list(c
, get_source_output_info_callback
, NULL
));
923 else if (pa_streq(list_type
, "clients"))
924 pa_operation_unref(pa_context_get_client_info_list(c
, get_client_info_callback
, NULL
));
925 else if (pa_streq(list_type
, "samples"))
926 pa_operation_unref(pa_context_get_sample_info_list(c
, get_sample_info_callback
, NULL
));
927 else if (pa_streq(list_type
, "cards"))
928 pa_operation_unref(pa_context_get_card_info_list(c
, get_card_info_callback
, NULL
));
930 pa_assert_not_reached();
933 pa_operation_unref(pa_context_get_module_info_list(c
, get_module_info_callback
, NULL
));
934 pa_operation_unref(pa_context_get_sink_info_list(c
, get_sink_info_callback
, NULL
));
935 pa_operation_unref(pa_context_get_source_info_list(c
, get_source_info_callback
, NULL
));
936 pa_operation_unref(pa_context_get_sink_input_info_list(c
, get_sink_input_info_callback
, NULL
));
937 pa_operation_unref(pa_context_get_source_output_info_list(c
, get_source_output_info_callback
, NULL
));
938 pa_operation_unref(pa_context_get_client_info_list(c
, get_client_info_callback
, NULL
));
939 pa_operation_unref(pa_context_get_sample_info_list(c
, get_sample_info_callback
, NULL
));
940 pa_operation_unref(pa_context_get_card_info_list(c
, get_card_info_callback
, NULL
));
944 case MOVE_SINK_INPUT
:
945 pa_operation_unref(pa_context_move_sink_input_by_name(c
, sink_input_idx
, sink_name
, simple_callback
, NULL
));
948 case MOVE_SOURCE_OUTPUT
:
949 pa_operation_unref(pa_context_move_source_output_by_name(c
, source_output_idx
, source_name
, simple_callback
, NULL
));
953 pa_operation_unref(pa_context_load_module(c
, module_name
, module_args
, index_callback
, NULL
));
957 pa_operation_unref(pa_context_unload_module(c
, module_index
, simple_callback
, NULL
));
962 pa_operation_unref(pa_context_suspend_sink_by_name(c
, sink_name
, suspend
, simple_callback
, NULL
));
964 pa_operation_unref(pa_context_suspend_sink_by_index(c
, PA_INVALID_INDEX
, suspend
, simple_callback
, NULL
));
969 pa_operation_unref(pa_context_suspend_source_by_name(c
, source_name
, suspend
, simple_callback
, NULL
));
971 pa_operation_unref(pa_context_suspend_source_by_index(c
, PA_INVALID_INDEX
, suspend
, simple_callback
, NULL
));
974 case SET_CARD_PROFILE
:
975 pa_operation_unref(pa_context_set_card_profile_by_name(c
, card_name
, profile_name
, simple_callback
, NULL
));
979 pa_operation_unref(pa_context_set_sink_port_by_name(c
, sink_name
, port_name
, simple_callback
, NULL
));
982 case SET_SOURCE_PORT
:
983 pa_operation_unref(pa_context_set_source_port_by_name(c
, source_name
, port_name
, simple_callback
, NULL
));
987 pa_operation_unref(pa_context_set_sink_mute_by_name(c
, sink_name
, mute
, simple_callback
, NULL
));
990 case SET_SOURCE_MUTE
:
991 pa_operation_unref(pa_context_set_source_mute_by_name(c
, source_name
, mute
, simple_callback
, NULL
));
994 case SET_SINK_INPUT_MUTE
:
995 pa_operation_unref(pa_context_set_sink_input_mute(c
, sink_input_idx
, mute
, simple_callback
, NULL
));
998 case SET_SINK_VOLUME
:
999 if ((volume_flags
& VOL_RELATIVE
) == VOL_RELATIVE
) {
1000 pa_operation_unref(pa_context_get_sink_info_by_name(c
, sink_name
, get_sink_volume_callback
, NULL
));
1003 pa_cvolume_set(&v
, 1, volume
);
1004 pa_operation_unref(pa_context_set_sink_volume_by_name(c
, sink_name
, &v
, simple_callback
, NULL
));
1008 case SET_SOURCE_VOLUME
:
1009 if ((volume_flags
& VOL_RELATIVE
) == VOL_RELATIVE
) {
1010 pa_operation_unref(pa_context_get_source_info_by_name(c
, source_name
, get_source_volume_callback
, NULL
));
1013 pa_cvolume_set(&v
, 1, volume
);
1014 pa_operation_unref(pa_context_set_source_volume_by_name(c
, source_name
, &v
, simple_callback
, NULL
));
1018 case SET_SINK_INPUT_VOLUME
:
1019 if ((volume_flags
& VOL_RELATIVE
) == VOL_RELATIVE
) {
1020 pa_operation_unref(pa_context_get_sink_input_info(c
, sink_input_idx
, get_sink_input_volume_callback
, NULL
));
1023 pa_cvolume_set(&v
, 1, volume
);
1024 pa_operation_unref(pa_context_set_sink_input_volume(c
, sink_input_idx
, &v
, simple_callback
, NULL
));
1029 pa_context_set_subscribe_callback(c
, context_subscribe_callback
, NULL
);
1031 pa_operation_unref(pa_context_subscribe(
1033 PA_SUBSCRIPTION_MASK_SINK
|
1034 PA_SUBSCRIPTION_MASK_SOURCE
|
1035 PA_SUBSCRIPTION_MASK_SINK_INPUT
|
1036 PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT
|
1037 PA_SUBSCRIPTION_MASK_MODULE
|
1038 PA_SUBSCRIPTION_MASK_CLIENT
|
1039 PA_SUBSCRIPTION_MASK_SAMPLE_CACHE
|
1040 PA_SUBSCRIPTION_MASK_SERVER
|
1041 PA_SUBSCRIPTION_MASK_CARD
,
1047 pa_assert_not_reached();
1051 case PA_CONTEXT_TERMINATED
:
1055 case PA_CONTEXT_FAILED
:
1057 pa_log(_("Connection failure: %s"), pa_strerror(pa_context_errno(c
)));
1062 static void exit_signal_callback(pa_mainloop_api
*m
, pa_signal_event
*e
, int sig
, void *userdata
) {
1063 pa_log(_("Got SIGINT, exiting."));
1067 static int parse_volume(const char *vol_spec
, pa_volume_t
*vol
, enum volume_flags
*vol_flags
) {
1071 pa_assert(vol_spec
);
1073 pa_assert(vol_flags
);
1075 vs
= pa_xstrdup(vol_spec
);
1077 *vol_flags
= (pa_startswith(vs
, "+") || pa_startswith(vs
, "-")) ? VOL_RELATIVE
: VOL_ABSOLUTE
;
1078 if (strchr(vs
, '.'))
1079 *vol_flags
|= VOL_LINEAR
;
1080 if (pa_endswith(vs
, "%")) {
1081 *vol_flags
|= VOL_PERCENT
;
1082 vs
[strlen(vs
)-1] = 0;
1084 if (pa_endswith(vs
, "db") || pa_endswith(vs
, "dB")) {
1085 *vol_flags
|= VOL_DECIBEL
;
1086 vs
[strlen(vs
)-2] = 0;
1089 if (pa_atod(vs
, &v
) < 0) {
1090 pa_log(_("Invalid volume specification"));
1097 if ((*vol_flags
& VOL_RELATIVE
) == VOL_RELATIVE
) {
1098 if ((*vol_flags
& 0x0F) == VOL_UINT
)
1099 v
+= (double) PA_VOLUME_NORM
;
1100 if ((*vol_flags
& 0x0F) == VOL_PERCENT
)
1102 if ((*vol_flags
& 0x0F) == VOL_LINEAR
)
1105 if ((*vol_flags
& 0x0F) == VOL_PERCENT
)
1106 v
= v
* (double) PA_VOLUME_NORM
/ 100;
1107 if ((*vol_flags
& 0x0F) == VOL_LINEAR
)
1108 v
= pa_sw_volume_from_linear(v
);
1109 if ((*vol_flags
& 0x0F) == VOL_DECIBEL
)
1110 v
= pa_sw_volume_from_dB(v
);
1112 if (!PA_VOLUME_IS_VALID((pa_volume_t
) v
)) {
1113 pa_log(_("Volume outside permissible range.\n"));
1117 *vol
= (pa_volume_t
) v
;
1122 static void help(const char *argv0
) {
1124 printf(_("%s [options] stat\n"
1125 "%s [options] list [TYPE]\n"
1126 "%s [options] exit\n"
1127 "%s [options] upload-sample FILENAME [NAME]\n"
1128 "%s [options] play-sample NAME [SINK]\n"
1129 "%s [options] remove-sample NAME\n"
1130 "%s [options] move-sink-input SINKINPUT SINK\n"
1131 "%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
1132 "%s [options] load-module NAME [ARGS ...]\n"
1133 "%s [options] unload-module MODULE\n"
1134 "%s [options] suspend-sink SINK 1|0\n"
1135 "%s [options] suspend-source SOURCE 1|0\n"
1136 "%s [options] set-card-profile CARD PROFILE\n"
1137 "%s [options] set-sink-port SINK PORT\n"
1138 "%s [options] set-source-port SOURCE PORT\n"
1139 "%s [options] set-sink-volume SINK VOLUME\n"
1140 "%s [options] set-source-volume SOURCE VOLUME\n"
1141 "%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
1142 "%s [options] set-sink-mute SINK 1|0\n"
1143 "%s [options] set-source-mute SOURCE 1|0\n"
1144 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
1145 "%s [options] subscribe\n\n"
1146 " -h, --help Show this help\n"
1147 " --version Show version\n\n"
1148 " -s, --server=SERVER The name of the server to connect to\n"
1149 " -n, --client-name=NAME How to call this client on the server\n"),
1150 argv0
, argv0
, argv0
, argv0
, argv0
,
1151 argv0
, argv0
, argv0
, argv0
, argv0
,
1152 argv0
, argv0
, argv0
, argv0
, argv0
,
1153 argv0
, argv0
, argv0
, argv0
, argv0
,
1161 int main(int argc
, char *argv
[]) {
1162 pa_mainloop
*m
= NULL
;
1164 char *server
= NULL
, *bn
;
1166 static const struct option long_options
[] = {
1167 {"server", 1, NULL
, 's'},
1168 {"client-name", 1, NULL
, 'n'},
1169 {"version", 0, NULL
, ARG_VERSION
},
1170 {"help", 0, NULL
, 'h'},
1174 setlocale(LC_ALL
, "");
1175 bindtextdomain(GETTEXT_PACKAGE
, PULSE_LOCALEDIR
);
1177 bn
= pa_path_get_filename(argv
[0]);
1179 proplist
= pa_proplist_new();
1181 while ((c
= getopt_long(argc
, argv
, "s:n:h", long_options
, NULL
)) != -1) {
1189 printf(_("pactl %s\n"
1190 "Compiled with libpulse %s\n"
1191 "Linked with libpulse %s\n"),
1193 pa_get_headers_version(),
1194 pa_get_library_version());
1200 server
= pa_xstrdup(optarg
);
1206 if (!(t
= pa_locale_to_utf8(optarg
)) ||
1207 pa_proplist_sets(proplist
, PA_PROP_APPLICATION_NAME
, t
) < 0) {
1209 pa_log(_("Invalid client name '%s'"), t
? t
: optarg
);
1223 if (optind
< argc
) {
1224 if (pa_streq(argv
[optind
], "stat"))
1227 else if (pa_streq(argv
[optind
], "exit"))
1230 else if (pa_streq(argv
[optind
], "list")) {
1233 for (int i
= optind
+1; i
< argc
; i
++){
1234 if (pa_streq(argv
[i
], "modules") || pa_streq(argv
[i
], "clients") ||
1235 pa_streq(argv
[i
], "sinks") || pa_streq(argv
[i
], "sink-inputs") ||
1236 pa_streq(argv
[i
], "sources") || pa_streq(argv
[i
], "source-outputs") ||
1237 pa_streq(argv
[i
], "samples") || pa_streq(argv
[i
], "cards")) {
1238 list_type
= pa_xstrdup(argv
[i
]);
1240 pa_log(_("Specify nothing, or one of: %s"), "modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards");
1245 } else if (pa_streq(argv
[optind
], "upload-sample")) {
1247 action
= UPLOAD_SAMPLE
;
1249 if (optind
+1 >= argc
) {
1250 pa_log(_("Please specify a sample file to load"));
1254 if (optind
+2 < argc
)
1255 sample_name
= pa_xstrdup(argv
[optind
+2]);
1257 char *f
= pa_path_get_filename(argv
[optind
+1]);
1258 sample_name
= pa_xstrndup(f
, strcspn(f
, "."));
1262 if (!(sndfile
= sf_open(argv
[optind
+1], SFM_READ
, &sfi
))) {
1263 pa_log(_("Failed to open sound file."));
1267 if (pa_sndfile_read_sample_spec(sndfile
, &sample_spec
) < 0) {
1268 pa_log(_("Failed to determine sample specification from file."));
1271 sample_spec
.format
= PA_SAMPLE_FLOAT32
;
1273 if (pa_sndfile_read_channel_map(sndfile
, &channel_map
) < 0) {
1274 if (sample_spec
.channels
> 2)
1275 pa_log(_("Warning: Failed to determine sample specification from file."));
1276 pa_channel_map_init_extend(&channel_map
, sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
1279 pa_assert(pa_channel_map_compatible(&channel_map
, &sample_spec
));
1280 sample_length
= (size_t) sfi
.frames
*pa_frame_size(&sample_spec
);
1282 } else if (pa_streq(argv
[optind
], "play-sample")) {
1283 action
= PLAY_SAMPLE
;
1284 if (argc
!= optind
+2 && argc
!= optind
+3) {
1285 pa_log(_("You have to specify a sample name to play"));
1289 sample_name
= pa_xstrdup(argv
[optind
+1]);
1291 if (optind
+2 < argc
)
1292 sink_name
= pa_xstrdup(argv
[optind
+2]);
1294 } else if (pa_streq(argv
[optind
], "remove-sample")) {
1295 action
= REMOVE_SAMPLE
;
1296 if (argc
!= optind
+2) {
1297 pa_log(_("You have to specify a sample name to remove"));
1301 sample_name
= pa_xstrdup(argv
[optind
+1]);
1303 } else if (pa_streq(argv
[optind
], "move-sink-input")) {
1304 action
= MOVE_SINK_INPUT
;
1305 if (argc
!= optind
+3) {
1306 pa_log(_("You have to specify a sink input index and a sink"));
1310 sink_input_idx
= (uint32_t) atoi(argv
[optind
+1]);
1311 sink_name
= pa_xstrdup(argv
[optind
+2]);
1313 } else if (pa_streq(argv
[optind
], "move-source-output")) {
1314 action
= MOVE_SOURCE_OUTPUT
;
1315 if (argc
!= optind
+3) {
1316 pa_log(_("You have to specify a source output index and a source"));
1320 source_output_idx
= (uint32_t) atoi(argv
[optind
+1]);
1321 source_name
= pa_xstrdup(argv
[optind
+2]);
1323 } else if (pa_streq(argv
[optind
], "load-module")) {
1328 action
= LOAD_MODULE
;
1330 if (argc
<= optind
+1) {
1331 pa_log(_("You have to specify a module name and arguments."));
1335 module_name
= argv
[optind
+1];
1337 for (i
= optind
+2; i
< argc
; i
++)
1338 n
+= strlen(argv
[i
])+1;
1341 p
= module_args
= pa_xmalloc(n
);
1343 for (i
= optind
+2; i
< argc
; i
++)
1344 p
+= sprintf(p
, "%s%s", p
== module_args
? "" : " ", argv
[i
]);
1347 } else if (pa_streq(argv
[optind
], "unload-module")) {
1348 action
= UNLOAD_MODULE
;
1350 if (argc
!= optind
+2) {
1351 pa_log(_("You have to specify a module index"));
1355 module_index
= (uint32_t) atoi(argv
[optind
+1]);
1357 } else if (pa_streq(argv
[optind
], "suspend-sink")) {
1358 action
= SUSPEND_SINK
;
1360 if (argc
> optind
+3 || optind
+1 >= argc
) {
1361 pa_log(_("You may not specify more than one sink. You have to specify a boolean value."));
1365 suspend
= pa_parse_boolean(argv
[argc
-1]);
1367 if (argc
> optind
+2)
1368 sink_name
= pa_xstrdup(argv
[optind
+1]);
1370 } else if (pa_streq(argv
[optind
], "suspend-source")) {
1371 action
= SUSPEND_SOURCE
;
1373 if (argc
> optind
+3 || optind
+1 >= argc
) {
1374 pa_log(_("You may not specify more than one source. You have to specify a boolean value."));
1378 suspend
= pa_parse_boolean(argv
[argc
-1]);
1380 if (argc
> optind
+2)
1381 source_name
= pa_xstrdup(argv
[optind
+1]);
1382 } else if (pa_streq(argv
[optind
], "set-card-profile")) {
1383 action
= SET_CARD_PROFILE
;
1385 if (argc
!= optind
+3) {
1386 pa_log(_("You have to specify a card name/index and a profile name"));
1390 card_name
= pa_xstrdup(argv
[optind
+1]);
1391 profile_name
= pa_xstrdup(argv
[optind
+2]);
1393 } else if (pa_streq(argv
[optind
], "set-sink-port")) {
1394 action
= SET_SINK_PORT
;
1396 if (argc
!= optind
+3) {
1397 pa_log(_("You have to specify a sink name/index and a port name"));
1401 sink_name
= pa_xstrdup(argv
[optind
+1]);
1402 port_name
= pa_xstrdup(argv
[optind
+2]);
1404 } else if (pa_streq(argv
[optind
], "set-source-port")) {
1405 action
= SET_SOURCE_PORT
;
1407 if (argc
!= optind
+3) {
1408 pa_log(_("You have to specify a source name/index and a port name"));
1412 source_name
= pa_xstrdup(argv
[optind
+1]);
1413 port_name
= pa_xstrdup(argv
[optind
+2]);
1415 } else if (pa_streq(argv
[optind
], "set-sink-volume")) {
1416 action
= SET_SINK_VOLUME
;
1418 if (argc
!= optind
+3) {
1419 pa_log(_("You have to specify a sink name/index and a volume"));
1423 sink_name
= pa_xstrdup(argv
[optind
+1]);
1425 if (parse_volume(argv
[optind
+2], &volume
, &volume_flags
) < 0)
1428 } else if (pa_streq(argv
[optind
], "set-source-volume")) {
1429 action
= SET_SOURCE_VOLUME
;
1431 if (argc
!= optind
+3) {
1432 pa_log(_("You have to specify a source name/index and a volume"));
1436 source_name
= pa_xstrdup(argv
[optind
+1]);
1438 if (parse_volume(argv
[optind
+2], &volume
, &volume_flags
) < 0)
1441 } else if (pa_streq(argv
[optind
], "set-sink-input-volume")) {
1442 action
= SET_SINK_INPUT_VOLUME
;
1444 if (argc
!= optind
+3) {
1445 pa_log(_("You have to specify a sink input index and a volume"));
1449 if (pa_atou(argv
[optind
+1], &sink_input_idx
) < 0) {
1450 pa_log(_("Invalid sink input index"));
1454 if (parse_volume(argv
[optind
+2], &volume
, &volume_flags
) < 0)
1457 } else if (pa_streq(argv
[optind
], "set-sink-mute")) {
1459 action
= SET_SINK_MUTE
;
1461 if (argc
!= optind
+3) {
1462 pa_log(_("You have to specify a sink name/index and a mute boolean"));
1466 if ((b
= pa_parse_boolean(argv
[optind
+2])) < 0) {
1467 pa_log(_("Invalid mute specification"));
1471 sink_name
= pa_xstrdup(argv
[optind
+1]);
1474 } else if (pa_streq(argv
[optind
], "set-source-mute")) {
1476 action
= SET_SOURCE_MUTE
;
1478 if (argc
!= optind
+3) {
1479 pa_log(_("You have to specify a source name/index and a mute boolean"));
1483 if ((b
= pa_parse_boolean(argv
[optind
+2])) < 0) {
1484 pa_log(_("Invalid mute specification"));
1488 source_name
= pa_xstrdup(argv
[optind
+1]);
1491 } else if (pa_streq(argv
[optind
], "set-sink-input-mute")) {
1493 action
= SET_SINK_INPUT_MUTE
;
1495 if (argc
!= optind
+3) {
1496 pa_log(_("You have to specify a sink input index and a mute boolean"));
1500 if (pa_atou(argv
[optind
+1], &sink_input_idx
) < 0) {
1501 pa_log(_("Invalid sink input index specification"));
1505 if ((b
= pa_parse_boolean(argv
[optind
+2])) < 0) {
1506 pa_log(_("Invalid mute specification"));
1512 } else if (pa_streq(argv
[optind
], "subscribe"))
1516 else if (pa_streq(argv
[optind
], "help")) {
1523 if (action
== NONE
) {
1524 pa_log(_("No valid command specified."));
1528 if (!(m
= pa_mainloop_new())) {
1529 pa_log(_("pa_mainloop_new() failed."));
1533 mainloop_api
= pa_mainloop_get_api(m
);
1535 pa_assert_se(pa_signal_init(mainloop_api
) == 0);
1536 pa_signal_new(SIGINT
, exit_signal_callback
, NULL
);
1537 pa_signal_new(SIGTERM
, exit_signal_callback
, NULL
);
1538 pa_disable_sigpipe();
1540 if (!(context
= pa_context_new_with_proplist(mainloop_api
, NULL
, proplist
))) {
1541 pa_log(_("pa_context_new() failed."));
1545 pa_context_set_state_callback(context
, context_state_callback
, NULL
);
1546 if (pa_context_connect(context
, server
, 0, NULL
) < 0) {
1547 pa_log(_("pa_context_connect() failed: %s"), pa_strerror(pa_context_errno(context
)));
1551 if (pa_mainloop_run(m
, &ret
) < 0) {
1552 pa_log(_("pa_mainloop_run() failed."));
1558 pa_stream_unref(sample_stream
);
1561 pa_context_unref(context
);
1565 pa_mainloop_free(m
);
1569 pa_xfree(list_type
);
1570 pa_xfree(sample_name
);
1571 pa_xfree(sink_name
);
1572 pa_xfree(source_name
);
1573 pa_xfree(module_args
);
1574 pa_xfree(card_name
);
1575 pa_xfree(profile_name
);
1576 pa_xfree(port_name
);
1582 pa_proplist_free(proplist
);