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, see <http://www.gnu.org/licenses/>.
28 #include <pulse/format.h>
29 #include <pulse/utf8.h>
30 #include <pulse/xmalloc.h>
31 #include <pulse/timeval.h>
32 #include <pulse/util.h>
33 #include <pulse/rtclock.h>
34 #include <pulse/internal.h>
36 #include <pulsecore/core-util.h>
37 #include <pulsecore/source-output.h>
38 #include <pulsecore/namereg.h>
39 #include <pulsecore/core-subscribe.h>
40 #include <pulsecore/log.h>
41 #include <pulsecore/mix.h>
42 #include <pulsecore/flist.h>
46 #define ABSOLUTE_MIN_LATENCY (500)
47 #define ABSOLUTE_MAX_LATENCY (10*PA_USEC_PER_SEC)
48 #define DEFAULT_FIXED_LATENCY (250*PA_USEC_PER_MSEC)
50 PA_DEFINE_PUBLIC_CLASS(pa_source, pa_msgobject);
52 struct pa_source_volume_change {
56 PA_LLIST_FIELDS(pa_source_volume_change);
59 struct set_state_data {
60 pa_source_state_t state;
61 pa_suspend_cause_t suspend_cause;
64 static void source_free(pa_object *o);
66 static void pa_source_volume_change_push(pa_source *s);
67 static void pa_source_volume_change_flush(pa_source *s);
69 pa_source_new_data* pa_source_new_data_init(pa_source_new_data *data) {
73 data->proplist = pa_proplist_new();
74 data->ports = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_device_port_unref);
79 void pa_source_new_data_set_name(pa_source_new_data *data, const char *name) {
83 data->name = pa_xstrdup(name);
86 void pa_source_new_data_set_sample_spec(pa_source_new_data *data, const pa_sample_spec *spec) {
89 if ((data->sample_spec_is_set = !!spec))
90 data->sample_spec = *spec;
93 void pa_source_new_data_set_channel_map(pa_source_new_data *data, const pa_channel_map *map) {
96 if ((data->channel_map_is_set = !!map))
97 data->channel_map = *map;
100 void pa_source_new_data_set_alternate_sample_rate(pa_source_new_data *data, const uint32_t alternate_sample_rate) {
103 data->alternate_sample_rate_is_set = true;
104 data->alternate_sample_rate = alternate_sample_rate;
107 void pa_source_new_data_set_volume(pa_source_new_data *data, const pa_cvolume *volume) {
110 if ((data->volume_is_set = !!volume))
111 data->volume = *volume;
114 void pa_source_new_data_set_muted(pa_source_new_data *data, bool mute) {
117 data->muted_is_set = true;
121 void pa_source_new_data_set_port(pa_source_new_data *data, const char *port) {
124 pa_xfree(data->active_port);
125 data->active_port = pa_xstrdup(port);
128 void pa_source_new_data_done(pa_source_new_data *data) {
131 pa_proplist_free(data->proplist);
134 pa_hashmap_free(data->ports);
136 pa_xfree(data->name);
137 pa_xfree(data->active_port);
140 /* Called from main context */
141 static void reset_callbacks(pa_source *s) {
144 s->set_state_in_main_thread = NULL;
145 s->set_state_in_io_thread = NULL;
146 s->get_volume = NULL;
147 s->set_volume = NULL;
148 s->write_volume = NULL;
151 s->update_requested_latency = NULL;
153 s->get_formats = NULL;
154 s->reconfigure = NULL;
157 /* Called from main context */
158 pa_source* pa_source_new(
160 pa_source_new_data *data,
161 pa_source_flags_t flags) {
165 char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
170 pa_assert(data->name);
171 pa_assert_ctl_context();
173 s = pa_msgobject_new(pa_source);
175 if (!(name = pa_namereg_register(core, data->name, PA_NAMEREG_SOURCE, s, data->namereg_fail))) {
176 pa_log_debug("Failed to register name %s.", data->name);
181 pa_source_new_data_set_name(data, name);
183 if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_NEW], data) < 0) {
185 pa_namereg_unregister(core, name);
189 /* FIXME, need to free s here on failure */
191 pa_return_null_if_fail(!data->driver || pa_utf8_valid(data->driver));
192 pa_return_null_if_fail(data->name && pa_utf8_valid(data->name) && data->name[0]);
194 pa_return_null_if_fail(data->sample_spec_is_set && pa_sample_spec_valid(&data->sample_spec));
196 if (!data->channel_map_is_set)
197 pa_return_null_if_fail(pa_channel_map_init_auto(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT));
199 pa_return_null_if_fail(pa_channel_map_valid(&data->channel_map));
200 pa_return_null_if_fail(data->channel_map.channels == data->sample_spec.channels);
202 /* FIXME: There should probably be a general function for checking whether
203 * the source volume is allowed to be set, like there is for source outputs. */
204 pa_assert(!data->volume_is_set || !(flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
206 if (!data->volume_is_set) {
207 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
208 data->save_volume = false;
211 pa_return_null_if_fail(pa_cvolume_valid(&data->volume));
212 pa_return_null_if_fail(pa_cvolume_compatible(&data->volume, &data->sample_spec));
214 if (!data->muted_is_set)
218 pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->card->proplist);
220 pa_device_init_description(data->proplist, data->card);
221 pa_device_init_icon(data->proplist, false);
222 pa_device_init_intended_roles(data->proplist);
224 if (!data->active_port) {
225 pa_device_port *p = pa_device_port_find_best(data->ports);
227 pa_source_new_data_set_port(data, p->name);
230 if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_FIXATE], data) < 0) {
232 pa_namereg_unregister(core, name);
236 s->parent.parent.free = source_free;
237 s->parent.process_msg = pa_source_process_msg;
240 s->state = PA_SOURCE_INIT;
243 s->suspend_cause = data->suspend_cause;
244 s->name = pa_xstrdup(name);
245 s->proplist = pa_proplist_copy(data->proplist);
246 s->driver = pa_xstrdup(pa_path_get_filename(data->driver));
247 s->module = data->module;
248 s->card = data->card;
250 s->priority = pa_device_init_priority(s->proplist);
252 s->sample_spec = data->sample_spec;
253 s->channel_map = data->channel_map;
254 s->default_sample_rate = s->sample_spec.rate;
256 if (data->alternate_sample_rate_is_set)
257 s->alternate_sample_rate = data->alternate_sample_rate;
259 s->alternate_sample_rate = s->core->alternate_sample_rate;
261 s->avoid_resampling = data->avoid_resampling;
263 s->outputs = pa_idxset_new(NULL, NULL);
265 s->monitor_of = NULL;
266 s->output_from_master = NULL;
268 s->reference_volume = s->real_volume = data->volume;
269 pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
270 s->base_volume = PA_VOLUME_NORM;
271 s->n_volume_steps = PA_VOLUME_NORM+1;
272 s->muted = data->muted;
273 s->refresh_volume = s->refresh_muted = false;
280 /* As a minor optimization we just steal the list instead of
282 s->ports = data->ports;
285 s->active_port = NULL;
286 s->save_port = false;
288 if (data->active_port)
289 if ((s->active_port = pa_hashmap_get(s->ports, data->active_port)))
290 s->save_port = data->save_port;
292 /* Hopefully the active port has already been assigned in the previous call
293 to pa_device_port_find_best, but better safe than sorry */
295 s->active_port = pa_device_port_find_best(s->ports);
298 s->port_latency_offset = s->active_port->latency_offset;
300 s->port_latency_offset = 0;
302 s->save_volume = data->save_volume;
303 s->save_muted = data->save_muted;
305 pa_silence_memchunk_get(
306 &core->silence_cache,
312 s->thread_info.rtpoll = NULL;
313 s->thread_info.outputs = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL,
314 (pa_free_cb_t) pa_source_output_unref);
315 s->thread_info.soft_volume = s->soft_volume;
316 s->thread_info.soft_muted = s->muted;
317 s->thread_info.state = s->state;
318 s->thread_info.max_rewind = 0;
319 s->thread_info.requested_latency_valid = false;
320 s->thread_info.requested_latency = 0;
321 s->thread_info.min_latency = ABSOLUTE_MIN_LATENCY;
322 s->thread_info.max_latency = ABSOLUTE_MAX_LATENCY;
323 s->thread_info.fixed_latency = flags & PA_SOURCE_DYNAMIC_LATENCY ? 0 : DEFAULT_FIXED_LATENCY;
325 PA_LLIST_HEAD_INIT(pa_source_volume_change, s->thread_info.volume_changes);
326 s->thread_info.volume_changes_tail = NULL;
327 pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
328 s->thread_info.volume_change_safety_margin = core->deferred_volume_safety_margin_usec;
329 s->thread_info.volume_change_extra_delay = core->deferred_volume_extra_delay_usec;
330 s->thread_info.port_latency_offset = s->port_latency_offset;
332 /* FIXME: This should probably be moved to pa_source_put() */
333 pa_assert_se(pa_idxset_put(core->sources, s, &s->index) >= 0);
336 pa_assert_se(pa_idxset_put(s->card->sources, s, NULL) >= 0);
338 pt = pa_proplist_to_string_sep(s->proplist, "\n ");
339 pa_log_info("Created source %u \"%s\" with sample spec %s and channel map %s\n %s",
342 pa_sample_spec_snprint(st, sizeof(st), &s->sample_spec),
343 pa_channel_map_snprint(cm, sizeof(cm), &s->channel_map),
350 /* Called from main context */
351 static int source_set_state(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
354 bool suspend_cause_changed;
357 pa_source_state_t old_state;
358 pa_suspend_cause_t old_suspend_cause;
361 pa_assert_ctl_context();
363 state_changed = state != s->state;
364 suspend_cause_changed = suspend_cause != s->suspend_cause;
366 if (!state_changed && !suspend_cause_changed)
369 suspending = PA_SOURCE_IS_OPENED(s->state) && state == PA_SOURCE_SUSPENDED;
370 resuming = s->state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(state);
372 /* If we are resuming, suspend_cause must be 0. */
373 pa_assert(!resuming || !suspend_cause);
375 /* Here's something to think about: what to do with the suspend cause if
376 * resuming the source fails? The old suspend cause will be incorrect, so we
377 * can't use that. On the other hand, if we set no suspend cause (as is the
378 * case currently), then it looks strange to have a source suspended without
379 * any cause. It might be a good idea to add a new "resume failed" suspend
380 * cause, or it might just add unnecessary complexity, given that the
381 * current approach of not setting any suspend cause works well enough. */
383 if (s->set_state_in_main_thread) {
384 if ((ret = s->set_state_in_main_thread(s, state, suspend_cause)) < 0) {
385 /* set_state_in_main_thread() is allowed to fail only when resuming. */
388 /* If resuming fails, we set the state to SUSPENDED and
389 * suspend_cause to 0. */
390 state = PA_SOURCE_SUSPENDED;
392 state_changed = false;
393 suspend_cause_changed = suspend_cause != s->suspend_cause;
396 /* We know the state isn't changing. If the suspend cause isn't
397 * changing either, then there's nothing more to do. */
398 if (!suspend_cause_changed)
404 struct set_state_data data = { .state = state, .suspend_cause = suspend_cause };
406 if ((ret = pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_STATE, &data, 0, NULL)) < 0) {
407 /* SET_STATE is allowed to fail only when resuming. */
410 if (s->set_state_in_main_thread)
411 s->set_state_in_main_thread(s, PA_SOURCE_SUSPENDED, 0);
413 /* If resuming fails, we set the state to SUSPENDED and
414 * suspend_cause to 0. */
415 state = PA_SOURCE_SUSPENDED;
417 state_changed = false;
418 suspend_cause_changed = suspend_cause != s->suspend_cause;
421 /* We know the state isn't changing. If the suspend cause isn't
422 * changing either, then there's nothing more to do. */
423 if (!suspend_cause_changed)
428 old_suspend_cause = s->suspend_cause;
429 if (suspend_cause_changed) {
430 char old_cause_buf[PA_SUSPEND_CAUSE_TO_STRING_BUF_SIZE];
431 char new_cause_buf[PA_SUSPEND_CAUSE_TO_STRING_BUF_SIZE];
433 pa_log_debug("%s: suspend_cause: %s -> %s", s->name, pa_suspend_cause_to_string(s->suspend_cause, old_cause_buf),
434 pa_suspend_cause_to_string(suspend_cause, new_cause_buf));
435 s->suspend_cause = suspend_cause;
438 old_state = s->state;
440 pa_log_debug("%s: state: %s -> %s", s->name, pa_source_state_to_string(s->state), pa_source_state_to_string(state));
443 /* If we enter UNLINKED state, then we don't send change notifications.
444 * pa_source_unlink() will send unlink notifications instead. */
445 if (state != PA_SOURCE_UNLINKED) {
446 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], s);
447 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
451 if (suspending || resuming || suspend_cause_changed) {
455 /* We're suspending or resuming, tell everyone about it */
457 PA_IDXSET_FOREACH(o, s->outputs, idx)
458 if (s->state == PA_SOURCE_SUSPENDED &&
459 (o->flags & PA_SOURCE_OUTPUT_KILL_ON_SUSPEND))
460 pa_source_output_kill(o);
462 o->suspend(o, old_state, old_suspend_cause);
468 void pa_source_set_get_volume_callback(pa_source *s, pa_source_cb_t cb) {
474 void pa_source_set_set_volume_callback(pa_source *s, pa_source_cb_t cb) {
475 pa_source_flags_t flags;
478 pa_assert(!s->write_volume || cb);
482 /* Save the current flags so we can tell if they've changed */
486 /* The source implementor is responsible for setting decibel volume support */
487 s->flags |= PA_SOURCE_HW_VOLUME_CTRL;
489 s->flags &= ~PA_SOURCE_HW_VOLUME_CTRL;
490 /* See note below in pa_source_put() about volume sharing and decibel volumes */
491 pa_source_enable_decibel_volume(s, !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
494 /* If the flags have changed after init, let any clients know via a change event */
495 if (s->state != PA_SOURCE_INIT && flags != s->flags)
496 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
499 void pa_source_set_write_volume_callback(pa_source *s, pa_source_cb_t cb) {
500 pa_source_flags_t flags;
503 pa_assert(!cb || s->set_volume);
505 s->write_volume = cb;
507 /* Save the current flags so we can tell if they've changed */
511 s->flags |= PA_SOURCE_DEFERRED_VOLUME;
513 s->flags &= ~PA_SOURCE_DEFERRED_VOLUME;
515 /* If the flags have changed after init, let any clients know via a change event */
516 if (s->state != PA_SOURCE_INIT && flags != s->flags)
517 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
520 void pa_source_set_get_mute_callback(pa_source *s, pa_source_get_mute_cb_t cb) {
526 void pa_source_set_set_mute_callback(pa_source *s, pa_source_cb_t cb) {
527 pa_source_flags_t flags;
533 /* Save the current flags so we can tell if they've changed */
537 s->flags |= PA_SOURCE_HW_MUTE_CTRL;
539 s->flags &= ~PA_SOURCE_HW_MUTE_CTRL;
541 /* If the flags have changed after init, let any clients know via a change event */
542 if (s->state != PA_SOURCE_INIT && flags != s->flags)
543 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
546 static void enable_flat_volume(pa_source *s, bool enable) {
547 pa_source_flags_t flags;
551 /* Always follow the overall user preference here */
552 enable = enable && s->core->flat_volumes;
554 /* Save the current flags so we can tell if they've changed */
558 s->flags |= PA_SOURCE_FLAT_VOLUME;
560 s->flags &= ~PA_SOURCE_FLAT_VOLUME;
562 /* If the flags have changed after init, let any clients know via a change event */
563 if (s->state != PA_SOURCE_INIT && flags != s->flags)
564 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
567 void pa_source_enable_decibel_volume(pa_source *s, bool enable) {
568 pa_source_flags_t flags;
572 /* Save the current flags so we can tell if they've changed */
576 s->flags |= PA_SOURCE_DECIBEL_VOLUME;
577 enable_flat_volume(s, true);
579 s->flags &= ~PA_SOURCE_DECIBEL_VOLUME;
580 enable_flat_volume(s, false);
583 /* If the flags have changed after init, let any clients know via a change event */
584 if (s->state != PA_SOURCE_INIT && flags != s->flags)
585 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
588 /* Called from main context */
589 void pa_source_put(pa_source *s) {
590 pa_source_assert_ref(s);
591 pa_assert_ctl_context();
593 pa_assert(s->state == PA_SOURCE_INIT);
594 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) || pa_source_is_filter(s));
596 /* The following fields must be initialized properly when calling _put() */
597 pa_assert(s->asyncmsgq);
598 pa_assert(s->thread_info.min_latency <= s->thread_info.max_latency);
600 /* Generally, flags should be initialized via pa_source_new(). As a
601 * special exception we allow some volume related flags to be set
602 * between _new() and _put() by the callback setter functions above.
604 * Thus we implement a couple safeguards here which ensure the above
605 * setters were used (or at least the implementor made manual changes
606 * in a compatible way).
608 * Note: All of these flags set here can change over the life time
610 pa_assert(!(s->flags & PA_SOURCE_HW_VOLUME_CTRL) || s->set_volume);
611 pa_assert(!(s->flags & PA_SOURCE_DEFERRED_VOLUME) || s->write_volume);
612 pa_assert(!(s->flags & PA_SOURCE_HW_MUTE_CTRL) || s->set_mute);
614 /* XXX: Currently decibel volume is disabled for all sources that use volume
615 * sharing. When the master source supports decibel volume, it would be good
616 * to have the flag also in the filter source, but currently we don't do that
617 * so that the flags of the filter source never change when it's moved from
618 * a master source to another. One solution for this problem would be to
619 * remove user-visible volume altogether from filter sources when volume
620 * sharing is used, but the current approach was easier to implement... */
621 /* We always support decibel volumes in software, otherwise we leave it to
622 * the source implementor to set this flag as needed.
624 * Note: This flag can also change over the life time of the source. */
625 if (!(s->flags & PA_SOURCE_HW_VOLUME_CTRL) && !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
626 pa_source_enable_decibel_volume(s, true);
627 s->soft_volume = s->reference_volume;
630 /* If the source implementor support DB volumes by itself, we should always
631 * try and enable flat volumes too */
632 if ((s->flags & PA_SOURCE_DECIBEL_VOLUME))
633 enable_flat_volume(s, true);
635 if (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) {
636 pa_source *root_source = pa_source_get_master(s);
638 pa_assert(PA_LIKELY(root_source));
640 s->reference_volume = root_source->reference_volume;
641 pa_cvolume_remap(&s->reference_volume, &root_source->channel_map, &s->channel_map);
643 s->real_volume = root_source->real_volume;
644 pa_cvolume_remap(&s->real_volume, &root_source->channel_map, &s->channel_map);
646 /* We assume that if the sink implementor changed the default
647 * volume he did so in real_volume, because that is the usual
648 * place where he is supposed to place his changes. */
649 s->reference_volume = s->real_volume;
651 s->thread_info.soft_volume = s->soft_volume;
652 s->thread_info.soft_muted = s->muted;
653 pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
655 pa_assert((s->flags & PA_SOURCE_HW_VOLUME_CTRL)
656 || (s->base_volume == PA_VOLUME_NORM
657 && ((s->flags & PA_SOURCE_DECIBEL_VOLUME || (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)))));
658 pa_assert(!(s->flags & PA_SOURCE_DECIBEL_VOLUME) || s->n_volume_steps == PA_VOLUME_NORM+1);
659 pa_assert(!(s->flags & PA_SOURCE_DYNAMIC_LATENCY) == !(s->thread_info.fixed_latency == 0));
661 if (s->suspend_cause)
662 pa_assert_se(source_set_state(s, PA_SOURCE_SUSPENDED, s->suspend_cause) == 0);
664 pa_assert_se(source_set_state(s, PA_SOURCE_IDLE, 0) == 0);
666 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_NEW, s->index);
667 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PUT], s);
669 /* This function must be called after the PA_CORE_HOOK_SOURCE_PUT hook,
670 * because module-switch-on-connect needs to know the old default source */
671 pa_core_update_default_source(s->core);
674 /* Called from main context */
675 void pa_source_unlink(pa_source *s) {
677 pa_source_output *o, PA_UNUSED *j = NULL;
679 pa_source_assert_ref(s);
680 pa_assert_ctl_context();
682 /* See pa_sink_unlink() for a couple of comments how this function
685 if (s->unlink_requested)
688 s->unlink_requested = true;
690 linked = PA_SOURCE_IS_LINKED(s->state);
693 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], s);
695 if (s->state != PA_SOURCE_UNLINKED)
696 pa_namereg_unregister(s->core, s->name);
697 pa_idxset_remove_by_data(s->core->sources, s, NULL);
699 pa_core_update_default_source(s->core);
702 pa_idxset_remove_by_data(s->card->sources, s, NULL);
704 while ((o = pa_idxset_first(s->outputs, NULL))) {
706 pa_source_output_kill(o);
711 source_set_state(s, PA_SOURCE_UNLINKED, 0);
713 s->state = PA_SOURCE_UNLINKED;
718 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_REMOVE, s->index);
719 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK_POST], s);
723 /* Called from main context */
724 static void source_free(pa_object *o) {
725 pa_source *s = PA_SOURCE(o);
728 pa_assert_ctl_context();
729 pa_assert(pa_source_refcnt(s) == 0);
730 pa_assert(!PA_SOURCE_IS_LINKED(s->state));
732 pa_log_info("Freeing source %u \"%s\"", s->index, s->name);
734 pa_source_volume_change_flush(s);
736 pa_idxset_free(s->outputs, NULL);
737 pa_hashmap_free(s->thread_info.outputs);
739 if (s->silence.memblock)
740 pa_memblock_unref(s->silence.memblock);
746 pa_proplist_free(s->proplist);
749 pa_hashmap_free(s->ports);
754 /* Called from main context, and not while the IO thread is active, please */
755 void pa_source_set_asyncmsgq(pa_source *s, pa_asyncmsgq *q) {
756 pa_source_assert_ref(s);
757 pa_assert_ctl_context();
762 /* Called from main context, and not while the IO thread is active, please */
763 void pa_source_update_flags(pa_source *s, pa_source_flags_t mask, pa_source_flags_t value) {
764 pa_source_flags_t old_flags;
765 pa_source_output *output;
768 pa_source_assert_ref(s);
769 pa_assert_ctl_context();
771 /* For now, allow only a minimal set of flags to be changed. */
772 pa_assert((mask & ~(PA_SOURCE_DYNAMIC_LATENCY|PA_SOURCE_LATENCY)) == 0);
774 old_flags = s->flags;
775 s->flags = (s->flags & ~mask) | (value & mask);
777 if (s->flags == old_flags)
780 if ((s->flags & PA_SOURCE_LATENCY) != (old_flags & PA_SOURCE_LATENCY))
781 pa_log_debug("Source %s: LATENCY flag %s.", s->name, (s->flags & PA_SOURCE_LATENCY) ? "enabled" : "disabled");
783 if ((s->flags & PA_SOURCE_DYNAMIC_LATENCY) != (old_flags & PA_SOURCE_DYNAMIC_LATENCY))
784 pa_log_debug("Source %s: DYNAMIC_LATENCY flag %s.",
785 s->name, (s->flags & PA_SOURCE_DYNAMIC_LATENCY) ? "enabled" : "disabled");
787 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
788 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_FLAGS_CHANGED], s);
790 PA_IDXSET_FOREACH(output, s->outputs, idx) {
791 if (output->destination_source)
792 pa_source_update_flags(output->destination_source, mask, value);
796 /* Called from IO context, or before _put() from main context */
797 void pa_source_set_rtpoll(pa_source *s, pa_rtpoll *p) {
798 pa_source_assert_ref(s);
799 pa_source_assert_io_context(s);
801 s->thread_info.rtpoll = p;
804 /* Called from main context */
805 int pa_source_update_status(pa_source*s) {
806 pa_source_assert_ref(s);
807 pa_assert_ctl_context();
808 pa_assert(PA_SOURCE_IS_LINKED(s->state));
810 if (s->state == PA_SOURCE_SUSPENDED)
813 return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE, 0);
816 /* Called from main context */
817 int pa_source_suspend(pa_source *s, bool suspend, pa_suspend_cause_t cause) {
818 pa_suspend_cause_t merged_cause;
820 pa_source_assert_ref(s);
821 pa_assert_ctl_context();
822 pa_assert(PA_SOURCE_IS_LINKED(s->state));
823 pa_assert(cause != 0);
825 if (s->monitor_of && cause != PA_SUSPEND_PASSTHROUGH)
826 return -PA_ERR_NOTSUPPORTED;
829 merged_cause = s->suspend_cause | cause;
831 merged_cause = s->suspend_cause & ~cause;
834 return source_set_state(s, PA_SOURCE_SUSPENDED, merged_cause);
836 return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE, 0);
839 /* Called from main context */
840 int pa_source_sync_suspend(pa_source *s) {
841 pa_sink_state_t state;
842 pa_suspend_cause_t suspend_cause;
844 pa_source_assert_ref(s);
845 pa_assert_ctl_context();
846 pa_assert(PA_SOURCE_IS_LINKED(s->state));
847 pa_assert(s->monitor_of);
849 state = s->monitor_of->state;
850 suspend_cause = s->monitor_of->suspend_cause;
852 /* The monitor source usually has the same state and suspend cause as the
853 * sink, the only exception is when the monitor source is suspended due to
854 * the sink being in the passthrough mode. If the monitor currently has the
855 * PASSTHROUGH suspend cause, then we have to keep the monitor suspended
856 * even if the sink is running. */
857 if (s->suspend_cause & PA_SUSPEND_PASSTHROUGH)
858 suspend_cause |= PA_SUSPEND_PASSTHROUGH;
860 if (state == PA_SINK_SUSPENDED || suspend_cause)
861 return source_set_state(s, PA_SOURCE_SUSPENDED, suspend_cause);
863 pa_assert(PA_SINK_IS_OPENED(state));
865 return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE, 0);
868 /* Called from main context */
869 pa_queue *pa_source_move_all_start(pa_source *s, pa_queue *q) {
870 pa_source_output *o, *n;
873 pa_source_assert_ref(s);
874 pa_assert_ctl_context();
875 pa_assert(PA_SOURCE_IS_LINKED(s->state));
880 for (o = PA_SOURCE_OUTPUT(pa_idxset_first(s->outputs, &idx)); o; o = n) {
881 n = PA_SOURCE_OUTPUT(pa_idxset_next(s->outputs, &idx));
883 pa_source_output_ref(o);
885 if (pa_source_output_start_move(o) >= 0)
888 pa_source_output_unref(o);
894 /* Called from main context */
895 void pa_source_move_all_finish(pa_source *s, pa_queue *q, bool save) {
898 pa_source_assert_ref(s);
899 pa_assert_ctl_context();
900 pa_assert(PA_SOURCE_IS_LINKED(s->state));
903 while ((o = PA_SOURCE_OUTPUT(pa_queue_pop(q)))) {
904 if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) {
905 if (pa_source_output_finish_move(o, s, save) < 0)
906 pa_source_output_fail_move(o);
909 pa_source_output_unref(o);
912 pa_queue_free(q, NULL);
915 /* Called from main context */
916 void pa_source_move_all_fail(pa_queue *q) {
919 pa_assert_ctl_context();
922 while ((o = PA_SOURCE_OUTPUT(pa_queue_pop(q)))) {
923 pa_source_output_fail_move(o);
924 pa_source_output_unref(o);
927 pa_queue_free(q, NULL);
930 /* Called from IO thread context */
931 void pa_source_process_rewind(pa_source *s, size_t nbytes) {
935 pa_source_assert_ref(s);
936 pa_source_assert_io_context(s);
937 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
942 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
945 pa_log_debug("Processing rewind...");
947 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
948 pa_source_output_assert_ref(o);
949 pa_source_output_process_rewind(o, nbytes);
953 /* Called from IO thread context */
954 void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
958 pa_source_assert_ref(s);
959 pa_source_assert_io_context(s);
960 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
963 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
966 if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&s->thread_info.soft_volume)) {
967 pa_memchunk vchunk = *chunk;
969 pa_memblock_ref(vchunk.memblock);
970 pa_memchunk_make_writable(&vchunk, 0);
972 if (s->thread_info.soft_muted || pa_cvolume_is_muted(&s->thread_info.soft_volume))
973 pa_silence_memchunk(&vchunk, &s->sample_spec);
975 pa_volume_memchunk(&vchunk, &s->sample_spec, &s->thread_info.soft_volume);
977 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL))) {
978 pa_source_output_assert_ref(o);
980 if (!o->thread_info.direct_on_input)
981 pa_source_output_push(o, &vchunk);
984 pa_memblock_unref(vchunk.memblock);
987 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL))) {
988 pa_source_output_assert_ref(o);
990 if (!o->thread_info.direct_on_input)
991 pa_source_output_push(o, chunk);
996 /* Called from IO thread context */
997 void pa_source_post_direct(pa_source*s, pa_source_output *o, const pa_memchunk *chunk) {
998 pa_source_assert_ref(s);
999 pa_source_assert_io_context(s);
1000 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
1001 pa_source_output_assert_ref(o);
1002 pa_assert(o->thread_info.direct_on_input);
1005 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
1008 if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&s->thread_info.soft_volume)) {
1009 pa_memchunk vchunk = *chunk;
1011 pa_memblock_ref(vchunk.memblock);
1012 pa_memchunk_make_writable(&vchunk, 0);
1014 if (s->thread_info.soft_muted || pa_cvolume_is_muted(&s->thread_info.soft_volume))
1015 pa_silence_memchunk(&vchunk, &s->sample_spec);
1017 pa_volume_memchunk(&vchunk, &s->sample_spec, &s->thread_info.soft_volume);
1019 pa_source_output_push(o, &vchunk);
1021 pa_memblock_unref(vchunk.memblock);
1023 pa_source_output_push(o, chunk);
1026 /* Called from main thread */
1027 void pa_source_reconfigure(pa_source *s, pa_sample_spec *spec, bool passthrough) {
1029 pa_source_output *o;
1030 pa_sample_spec desired_spec;
1031 uint32_t default_rate = s->default_sample_rate;
1032 uint32_t alternate_rate = s->alternate_sample_rate;
1033 bool default_rate_is_usable = false;
1034 bool alternate_rate_is_usable = false;
1035 bool avoid_resampling = s->avoid_resampling;
1037 if (pa_sample_spec_equal(spec, &s->sample_spec))
1040 if (!s->reconfigure && !s->monitor_of)
1043 if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough && !avoid_resampling)) {
1044 pa_log_debug("Default and alternate sample rates are the same, so there is no point in switching.");
1048 if (PA_SOURCE_IS_RUNNING(s->state)) {
1049 pa_log_info("Cannot update sample spec, SOURCE_IS_RUNNING, will keep using %s and %u Hz",
1050 pa_sample_format_to_string(s->sample_spec.format), s->sample_spec.rate);
1054 if (s->monitor_of) {
1055 if (PA_SINK_IS_RUNNING(s->monitor_of->state)) {
1056 pa_log_info("Cannot update sample spec, this is a monitor source and the sink is running.");
1061 if (PA_UNLIKELY(!pa_sample_spec_valid(spec)))
1064 desired_spec = s->sample_spec;
1067 /* We have to try to use the source output format and rate */
1068 desired_spec.format = spec->format;
1069 desired_spec.rate = spec->rate;
1071 } else if (avoid_resampling) {
1072 /* We just try to set the source output's sample rate if it's not too low */
1073 if (spec->rate >= default_rate || spec->rate >= alternate_rate)
1074 desired_spec.rate = spec->rate;
1075 desired_spec.format = spec->format;
1077 } else if (default_rate == spec->rate || alternate_rate == spec->rate) {
1078 /* We can directly try to use this rate */
1079 desired_spec.rate = spec->rate;
1083 if (desired_spec.rate != spec->rate) {
1084 /* See if we can pick a rate that results in less resampling effort */
1085 if (default_rate % 11025 == 0 && spec->rate % 11025 == 0)
1086 default_rate_is_usable = true;
1087 if (default_rate % 4000 == 0 && spec->rate % 4000 == 0)
1088 default_rate_is_usable = true;
1089 if (alternate_rate % 11025 == 0 && spec->rate % 11025 == 0)
1090 alternate_rate_is_usable = true;
1091 if (alternate_rate % 4000 == 0 && spec->rate % 4000 == 0)
1092 alternate_rate_is_usable = true;
1094 if (alternate_rate_is_usable && !default_rate_is_usable)
1095 desired_spec.rate = alternate_rate;
1097 desired_spec.rate = default_rate;
1100 if (pa_sample_spec_equal(&desired_spec, &s->sample_spec) && passthrough == pa_source_is_passthrough(s))
1103 if (!passthrough && pa_source_used_by(s) > 0)
1106 pa_log_debug("Suspending source %s due to changing format, desired format = %s rate = %u",
1107 s->name, pa_sample_format_to_string(desired_spec.format), desired_spec.rate);
1108 pa_source_suspend(s, true, PA_SUSPEND_INTERNAL);
1111 s->reconfigure(s, &desired_spec, passthrough);
1113 /* This is a monitor source. */
1115 /* XXX: This code is written with non-passthrough streams in mind. I
1116 * have no idea whether the behaviour with passthrough streams is
1119 s->sample_spec = desired_spec;
1120 pa_sink_reconfigure(s->monitor_of, &desired_spec, false);
1121 s->sample_spec = s->monitor_of->sample_spec;
1126 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1127 if (o->state == PA_SOURCE_OUTPUT_CORKED)
1128 pa_source_output_update_resampler(o);
1131 pa_log_info("Reconfigured successfully");
1134 pa_source_suspend(s, false, PA_SUSPEND_INTERNAL);
1137 /* Called from main thread */
1138 pa_usec_t pa_source_get_latency(pa_source *s) {
1141 pa_source_assert_ref(s);
1142 pa_assert_ctl_context();
1143 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1145 if (s->state == PA_SOURCE_SUSPENDED)
1148 if (!(s->flags & PA_SOURCE_LATENCY))
1151 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL) == 0);
1153 /* The return value is unsigned, so check that the offset can be added to usec without
1155 if (-s->port_latency_offset <= usec)
1156 usec += s->port_latency_offset;
1160 return (pa_usec_t)usec;
1163 /* Called from IO thread */
1164 int64_t pa_source_get_latency_within_thread(pa_source *s, bool allow_negative) {
1168 pa_source_assert_ref(s);
1169 pa_source_assert_io_context(s);
1170 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
1172 /* The returned value is supposed to be in the time domain of the sound card! */
1174 if (s->thread_info.state == PA_SOURCE_SUSPENDED)
1177 if (!(s->flags & PA_SOURCE_LATENCY))
1180 o = PA_MSGOBJECT(s);
1182 /* FIXME: We probably should make this a proper vtable callback instead of going through process_msg() */
1184 o->process_msg(o, PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL);
1186 /* If allow_negative is false, the call should only return positive values, */
1187 usec += s->thread_info.port_latency_offset;
1188 if (!allow_negative && usec < 0)
1194 /* Called from the main thread (and also from the IO thread while the main
1195 * thread is waiting).
1197 * When a source uses volume sharing, it never has the PA_SOURCE_FLAT_VOLUME flag
1198 * set. Instead, flat volume mode is detected by checking whether the root source
1199 * has the flag set. */
1200 bool pa_source_flat_volume_enabled(pa_source *s) {
1201 pa_source_assert_ref(s);
1203 s = pa_source_get_master(s);
1206 return (s->flags & PA_SOURCE_FLAT_VOLUME);
1211 /* Called from the main thread (and also from the IO thread while the main
1212 * thread is waiting). */
1213 pa_source *pa_source_get_master(pa_source *s) {
1214 pa_source_assert_ref(s);
1216 while (s && (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1217 if (PA_UNLIKELY(!s->output_from_master))
1220 s = s->output_from_master->source;
1226 /* Called from main context */
1227 bool pa_source_is_filter(pa_source *s) {
1228 pa_source_assert_ref(s);
1230 return (s->output_from_master != NULL);
1233 /* Called from main context */
1234 bool pa_source_is_passthrough(pa_source *s) {
1236 pa_source_assert_ref(s);
1238 /* NB Currently only monitor sources support passthrough mode */
1239 return (s->monitor_of && pa_sink_is_passthrough(s->monitor_of));
1242 /* Called from main context */
1243 void pa_source_enter_passthrough(pa_source *s) {
1246 /* set the volume to NORM */
1247 s->saved_volume = *pa_source_get_volume(s, true);
1248 s->saved_save_volume = s->save_volume;
1250 pa_cvolume_set(&volume, s->sample_spec.channels, PA_MIN(s->base_volume, PA_VOLUME_NORM));
1251 pa_source_set_volume(s, &volume, true, false);
1254 /* Called from main context */
1255 void pa_source_leave_passthrough(pa_source *s) {
1256 /* Restore source volume to what it was before we entered passthrough mode */
1257 pa_source_set_volume(s, &s->saved_volume, true, s->saved_save_volume);
1259 pa_cvolume_init(&s->saved_volume);
1260 s->saved_save_volume = false;
1263 /* Called from main context. */
1264 static void compute_reference_ratio(pa_source_output *o) {
1266 pa_cvolume remapped;
1270 pa_assert(pa_source_flat_volume_enabled(o->source));
1273 * Calculates the reference ratio from the source's reference
1274 * volume. This basically calculates:
1276 * o->reference_ratio = o->volume / o->source->reference_volume
1279 remapped = o->source->reference_volume;
1280 pa_cvolume_remap(&remapped, &o->source->channel_map, &o->channel_map);
1282 ratio = o->reference_ratio;
1284 for (c = 0; c < o->sample_spec.channels; c++) {
1286 /* We don't update when the source volume is 0 anyway */
1287 if (remapped.values[c] <= PA_VOLUME_MUTED)
1290 /* Don't update the reference ratio unless necessary */
1291 if (pa_sw_volume_multiply(
1293 remapped.values[c]) == o->volume.values[c])
1296 ratio.values[c] = pa_sw_volume_divide(
1297 o->volume.values[c],
1298 remapped.values[c]);
1301 pa_source_output_set_reference_ratio(o, &ratio);
1304 /* Called from main context. Only called for the root source in volume sharing
1305 * cases, except for internal recursive calls. */
1306 static void compute_reference_ratios(pa_source *s) {
1308 pa_source_output *o;
1310 pa_source_assert_ref(s);
1311 pa_assert_ctl_context();
1312 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1313 pa_assert(pa_source_flat_volume_enabled(s));
1315 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1316 compute_reference_ratio(o);
1318 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)
1319 && PA_SOURCE_IS_LINKED(o->destination_source->state))
1320 compute_reference_ratios(o->destination_source);
1324 /* Called from main context. Only called for the root source in volume sharing
1325 * cases, except for internal recursive calls. */
1326 static void compute_real_ratios(pa_source *s) {
1327 pa_source_output *o;
1330 pa_source_assert_ref(s);
1331 pa_assert_ctl_context();
1332 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1333 pa_assert(pa_source_flat_volume_enabled(s));
1335 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1337 pa_cvolume remapped;
1339 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1340 /* The origin source uses volume sharing, so this input's real ratio
1341 * is handled as a special case - the real ratio must be 0 dB, and
1342 * as a result i->soft_volume must equal i->volume_factor. */
1343 pa_cvolume_reset(&o->real_ratio, o->real_ratio.channels);
1344 o->soft_volume = o->volume_factor;
1346 if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1347 compute_real_ratios(o->destination_source);
1353 * This basically calculates:
1355 * i->real_ratio := i->volume / s->real_volume
1356 * i->soft_volume := i->real_ratio * i->volume_factor
1359 remapped = s->real_volume;
1360 pa_cvolume_remap(&remapped, &s->channel_map, &o->channel_map);
1362 o->real_ratio.channels = o->sample_spec.channels;
1363 o->soft_volume.channels = o->sample_spec.channels;
1365 for (c = 0; c < o->sample_spec.channels; c++) {
1367 if (remapped.values[c] <= PA_VOLUME_MUTED) {
1368 /* We leave o->real_ratio untouched */
1369 o->soft_volume.values[c] = PA_VOLUME_MUTED;
1373 /* Don't lose accuracy unless necessary */
1374 if (pa_sw_volume_multiply(
1375 o->real_ratio.values[c],
1376 remapped.values[c]) != o->volume.values[c])
1378 o->real_ratio.values[c] = pa_sw_volume_divide(
1379 o->volume.values[c],
1380 remapped.values[c]);
1382 o->soft_volume.values[c] = pa_sw_volume_multiply(
1383 o->real_ratio.values[c],
1384 o->volume_factor.values[c]);
1387 /* We don't copy the soft_volume to the thread_info data
1388 * here. That must be done by the caller */
1392 static pa_cvolume *cvolume_remap_minimal_impact(
1394 const pa_cvolume *template,
1395 const pa_channel_map *from,
1396 const pa_channel_map *to) {
1401 pa_assert(template);
1404 pa_assert(pa_cvolume_compatible_with_channel_map(v, from));
1405 pa_assert(pa_cvolume_compatible_with_channel_map(template, to));
1407 /* Much like pa_cvolume_remap(), but tries to minimize impact when
1408 * mapping from source output to source volumes:
1410 * If template is a possible remapping from v it is used instead
1411 * of remapping anew.
1413 * If the channel maps don't match we set an all-channel volume on
1414 * the source to ensure that changing a volume on one stream has no
1415 * effect that cannot be compensated for in another stream that
1416 * does not have the same channel map as the source. */
1418 if (pa_channel_map_equal(from, to))
1422 if (pa_cvolume_equal(pa_cvolume_remap(&t, to, from), v)) {
1427 pa_cvolume_set(v, to->channels, pa_cvolume_max(v));
1431 /* Called from main thread. Only called for the root source in volume sharing
1432 * cases, except for internal recursive calls. */
1433 static void get_maximum_output_volume(pa_source *s, pa_cvolume *max_volume, const pa_channel_map *channel_map) {
1434 pa_source_output *o;
1437 pa_source_assert_ref(s);
1438 pa_assert(max_volume);
1439 pa_assert(channel_map);
1440 pa_assert(pa_source_flat_volume_enabled(s));
1442 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1443 pa_cvolume remapped;
1445 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1446 if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1447 get_maximum_output_volume(o->destination_source, max_volume, channel_map);
1449 /* Ignore this output. The origin source uses volume sharing, so this
1450 * output's volume will be set to be equal to the root source's real
1451 * volume. Obviously this output's current volume must not then
1452 * affect what the root source's real volume will be. */
1456 remapped = o->volume;
1457 cvolume_remap_minimal_impact(&remapped, max_volume, &o->channel_map, channel_map);
1458 pa_cvolume_merge(max_volume, max_volume, &remapped);
1462 /* Called from main thread. Only called for the root source in volume sharing
1463 * cases, except for internal recursive calls. */
1464 static bool has_outputs(pa_source *s) {
1465 pa_source_output *o;
1468 pa_source_assert_ref(s);
1470 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1471 if (!o->destination_source || !(o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) || has_outputs(o->destination_source))
1478 /* Called from main thread. Only called for the root source in volume sharing
1479 * cases, except for internal recursive calls. */
1480 static void update_real_volume(pa_source *s, const pa_cvolume *new_volume, pa_channel_map *channel_map) {
1481 pa_source_output *o;
1484 pa_source_assert_ref(s);
1485 pa_assert(new_volume);
1486 pa_assert(channel_map);
1488 s->real_volume = *new_volume;
1489 pa_cvolume_remap(&s->real_volume, channel_map, &s->channel_map);
1491 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1492 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1493 if (pa_source_flat_volume_enabled(s)) {
1494 pa_cvolume new_output_volume;
1496 /* Follow the root source's real volume. */
1497 new_output_volume = *new_volume;
1498 pa_cvolume_remap(&new_output_volume, channel_map, &o->channel_map);
1499 pa_source_output_set_volume_direct(o, &new_output_volume);
1500 compute_reference_ratio(o);
1503 if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1504 update_real_volume(o->destination_source, new_volume, channel_map);
1509 /* Called from main thread. Only called for the root source in shared volume
1511 static void compute_real_volume(pa_source *s) {
1512 pa_source_assert_ref(s);
1513 pa_assert_ctl_context();
1514 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1515 pa_assert(pa_source_flat_volume_enabled(s));
1516 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1518 /* This determines the maximum volume of all streams and sets
1519 * s->real_volume accordingly. */
1521 if (!has_outputs(s)) {
1522 /* In the special case that we have no source outputs we leave the
1523 * volume unmodified. */
1524 update_real_volume(s, &s->reference_volume, &s->channel_map);
1528 pa_cvolume_mute(&s->real_volume, s->channel_map.channels);
1530 /* First let's determine the new maximum volume of all outputs
1531 * connected to this source */
1532 get_maximum_output_volume(s, &s->real_volume, &s->channel_map);
1533 update_real_volume(s, &s->real_volume, &s->channel_map);
1535 /* Then, let's update the real ratios/soft volumes of all outputs
1536 * connected to this source */
1537 compute_real_ratios(s);
1540 /* Called from main thread. Only called for the root source in shared volume
1541 * cases, except for internal recursive calls. */
1542 static void propagate_reference_volume(pa_source *s) {
1543 pa_source_output *o;
1546 pa_source_assert_ref(s);
1547 pa_assert_ctl_context();
1548 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1549 pa_assert(pa_source_flat_volume_enabled(s));
1551 /* This is called whenever the source volume changes that is not
1552 * caused by a source output volume change. We need to fix up the
1553 * source output volumes accordingly */
1555 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1556 pa_cvolume new_volume;
1558 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1559 if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1560 propagate_reference_volume(o->destination_source);
1562 /* Since the origin source uses volume sharing, this output's volume
1563 * needs to be updated to match the root source's real volume, but
1564 * that will be done later in update_real_volume(). */
1568 /* This basically calculates:
1570 * o->volume := o->reference_volume * o->reference_ratio */
1572 new_volume = s->reference_volume;
1573 pa_cvolume_remap(&new_volume, &s->channel_map, &o->channel_map);
1574 pa_sw_cvolume_multiply(&new_volume, &new_volume, &o->reference_ratio);
1575 pa_source_output_set_volume_direct(o, &new_volume);
1579 /* Called from main thread. Only called for the root source in volume sharing
1580 * cases, except for internal recursive calls. The return value indicates
1581 * whether any reference volume actually changed. */
1582 static bool update_reference_volume(pa_source *s, const pa_cvolume *v, const pa_channel_map *channel_map, bool save) {
1584 bool reference_volume_changed;
1585 pa_source_output *o;
1588 pa_source_assert_ref(s);
1589 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1591 pa_assert(channel_map);
1592 pa_assert(pa_cvolume_valid(v));
1595 pa_cvolume_remap(&volume, channel_map, &s->channel_map);
1597 reference_volume_changed = !pa_cvolume_equal(&volume, &s->reference_volume);
1598 pa_source_set_reference_volume_direct(s, &volume);
1600 s->save_volume = (!reference_volume_changed && s->save_volume) || save;
1602 if (!reference_volume_changed && !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1603 /* If the root source's volume doesn't change, then there can't be any
1604 * changes in the other source in the source tree either.
1606 * It's probably theoretically possible that even if the root source's
1607 * volume changes slightly, some filter source doesn't change its volume
1608 * due to rounding errors. If that happens, we still want to propagate
1609 * the changed root source volume to the sources connected to the
1610 * intermediate source that didn't change its volume. This theoretical
1611 * possibility is the reason why we have that !(s->flags &
1612 * PA_SOURCE_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
1613 * notice even if we returned here false always if
1614 * reference_volume_changed is false. */
1617 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1618 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)
1619 && PA_SOURCE_IS_LINKED(o->destination_source->state))
1620 update_reference_volume(o->destination_source, v, channel_map, false);
1626 /* Called from main thread */
1627 void pa_source_set_volume(
1629 const pa_cvolume *volume,
1633 pa_cvolume new_reference_volume, root_real_volume;
1634 pa_source *root_source;
1636 pa_source_assert_ref(s);
1637 pa_assert_ctl_context();
1638 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1639 pa_assert(!volume || pa_cvolume_valid(volume));
1640 pa_assert(volume || pa_source_flat_volume_enabled(s));
1641 pa_assert(!volume || volume->channels == 1 || pa_cvolume_compatible(volume, &s->sample_spec));
1643 /* make sure we don't change the volume in PASSTHROUGH mode ...
1644 * ... *except* if we're being invoked to reset the volume to ensure 0 dB gain */
1645 if (pa_source_is_passthrough(s) && (!volume || !pa_cvolume_is_norm(volume))) {
1646 pa_log_warn("Cannot change volume, source is monitor of a PASSTHROUGH sink");
1650 /* In case of volume sharing, the volume is set for the root source first,
1651 * from which it's then propagated to the sharing sources. */
1652 root_source = pa_source_get_master(s);
1654 if (PA_UNLIKELY(!root_source))
1657 /* As a special exception we accept mono volumes on all sources --
1658 * even on those with more complex channel maps */
1661 if (pa_cvolume_compatible(volume, &s->sample_spec))
1662 new_reference_volume = *volume;
1664 new_reference_volume = s->reference_volume;
1665 pa_cvolume_scale(&new_reference_volume, pa_cvolume_max(volume));
1668 pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
1670 if (update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save)) {
1671 if (pa_source_flat_volume_enabled(root_source)) {
1672 /* OK, propagate this volume change back to the outputs */
1673 propagate_reference_volume(root_source);
1675 /* And now recalculate the real volume */
1676 compute_real_volume(root_source);
1678 update_real_volume(root_source, &root_source->reference_volume, &root_source->channel_map);
1682 /* If volume is NULL we synchronize the source's real and
1683 * reference volumes with the stream volumes. */
1685 pa_assert(pa_source_flat_volume_enabled(root_source));
1687 /* Ok, let's determine the new real volume */
1688 compute_real_volume(root_source);
1690 /* To propagate the reference volume from the filter to the root source,
1691 * we first take the real volume from the root source and remap it to
1692 * match the filter. Then, we merge in the reference volume from the
1693 * filter on top of this, and remap it back to the root source channel
1695 root_real_volume = root_source->real_volume;
1696 /* First we remap root's real volume to filter channel count and map if needed */
1697 if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
1698 pa_cvolume_remap(&root_real_volume, &root_source->channel_map, &s->channel_map);
1699 /* Then let's 'push' the reference volume if necessary */
1700 pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_real_volume);
1701 /* If the source and its root don't have the same number of channels, we need to remap back */
1702 if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
1703 pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
1705 update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save);
1707 /* Now that the reference volume is updated, we can update the streams'
1708 * reference ratios. */
1709 compute_reference_ratios(root_source);
1712 if (root_source->set_volume) {
1713 /* If we have a function set_volume(), then we do not apply a
1714 * soft volume by default. However, set_volume() is free to
1715 * apply one to root_source->soft_volume */
1717 pa_cvolume_reset(&root_source->soft_volume, root_source->sample_spec.channels);
1718 if (!(root_source->flags & PA_SOURCE_DEFERRED_VOLUME))
1719 root_source->set_volume(root_source);
1722 /* If we have no function set_volume(), then the soft volume
1723 * becomes the real volume */
1724 root_source->soft_volume = root_source->real_volume;
1726 /* This tells the source that soft volume and/or real volume changed */
1728 pa_assert_se(pa_asyncmsgq_send(root_source->asyncmsgq, PA_MSGOBJECT(root_source), PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL) == 0);
1731 /* Called from the io thread if sync volume is used, otherwise from the main thread.
1732 * Only to be called by source implementor */
1733 void pa_source_set_soft_volume(pa_source *s, const pa_cvolume *volume) {
1735 pa_source_assert_ref(s);
1736 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1738 if (s->flags & PA_SOURCE_DEFERRED_VOLUME)
1739 pa_source_assert_io_context(s);
1741 pa_assert_ctl_context();
1744 pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
1746 s->soft_volume = *volume;
1748 if (PA_SOURCE_IS_LINKED(s->state) && !(s->flags & PA_SOURCE_DEFERRED_VOLUME))
1749 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_VOLUME, NULL, 0, NULL) == 0);
1751 s->thread_info.soft_volume = s->soft_volume;
1754 /* Called from the main thread. Only called for the root source in volume sharing
1755 * cases, except for internal recursive calls. */
1756 static void propagate_real_volume(pa_source *s, const pa_cvolume *old_real_volume) {
1757 pa_source_output *o;
1760 pa_source_assert_ref(s);
1761 pa_assert(old_real_volume);
1762 pa_assert_ctl_context();
1763 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1765 /* This is called when the hardware's real volume changes due to
1766 * some external event. We copy the real volume into our
1767 * reference volume and then rebuild the stream volumes based on
1768 * i->real_ratio which should stay fixed. */
1770 if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1771 if (pa_cvolume_equal(old_real_volume, &s->real_volume))
1774 /* 1. Make the real volume the reference volume */
1775 update_reference_volume(s, &s->real_volume, &s->channel_map, true);
1778 if (pa_source_flat_volume_enabled(s)) {
1779 PA_IDXSET_FOREACH(o, s->outputs, idx) {
1780 pa_cvolume new_volume;
1782 /* 2. Since the source's reference and real volumes are equal
1783 * now our ratios should be too. */
1784 pa_source_output_set_reference_ratio(o, &o->real_ratio);
1786 /* 3. Recalculate the new stream reference volume based on the
1787 * reference ratio and the sink's reference volume.
1789 * This basically calculates:
1791 * o->volume = s->reference_volume * o->reference_ratio
1793 * This is identical to propagate_reference_volume() */
1794 new_volume = s->reference_volume;
1795 pa_cvolume_remap(&new_volume, &s->channel_map, &o->channel_map);
1796 pa_sw_cvolume_multiply(&new_volume, &new_volume, &o->reference_ratio);
1797 pa_source_output_set_volume_direct(o, &new_volume);
1799 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)
1800 && PA_SOURCE_IS_LINKED(o->destination_source->state))
1801 propagate_real_volume(o->destination_source, old_real_volume);
1805 /* Something got changed in the hardware. It probably makes sense
1806 * to save changed hw settings given that hw volume changes not
1807 * triggered by PA are almost certainly done by the user. */
1808 if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1809 s->save_volume = true;
1812 /* Called from io thread */
1813 void pa_source_update_volume_and_mute(pa_source *s) {
1815 pa_source_assert_io_context(s);
1817 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_UPDATE_VOLUME_AND_MUTE, NULL, 0, NULL, NULL);
1820 /* Called from main thread */
1821 const pa_cvolume *pa_source_get_volume(pa_source *s, bool force_refresh) {
1822 pa_source_assert_ref(s);
1823 pa_assert_ctl_context();
1824 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1826 if (s->refresh_volume || force_refresh) {
1827 struct pa_cvolume old_real_volume;
1829 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1831 old_real_volume = s->real_volume;
1833 if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_volume)
1836 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_VOLUME, NULL, 0, NULL) == 0);
1838 update_real_volume(s, &s->real_volume, &s->channel_map);
1839 propagate_real_volume(s, &old_real_volume);
1842 return &s->reference_volume;
1845 /* Called from main thread. In volume sharing cases, only the root source may
1847 void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_real_volume) {
1848 pa_cvolume old_real_volume;
1850 pa_source_assert_ref(s);
1851 pa_assert_ctl_context();
1852 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1853 pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1855 /* The source implementor may call this if the volume changed to make sure everyone is notified */
1857 old_real_volume = s->real_volume;
1858 update_real_volume(s, new_real_volume, &s->channel_map);
1859 propagate_real_volume(s, &old_real_volume);
1862 /* Called from main thread */
1863 void pa_source_set_mute(pa_source *s, bool mute, bool save) {
1866 pa_source_assert_ref(s);
1867 pa_assert_ctl_context();
1869 old_muted = s->muted;
1871 if (mute == old_muted) {
1872 s->save_muted |= save;
1877 s->save_muted = save;
1879 if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->set_mute) {
1880 s->set_mute_in_progress = true;
1882 s->set_mute_in_progress = false;
1885 if (!PA_SOURCE_IS_LINKED(s->state))
1888 pa_log_debug("The mute of source %s changed from %s to %s.", s->name, pa_yes_no(old_muted), pa_yes_no(mute));
1889 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MUTE, NULL, 0, NULL) == 0);
1890 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1891 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_MUTE_CHANGED], s);
1894 /* Called from main thread */
1895 bool pa_source_get_mute(pa_source *s, bool force_refresh) {
1897 pa_source_assert_ref(s);
1898 pa_assert_ctl_context();
1899 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1901 if ((s->refresh_muted || force_refresh) && s->get_mute) {
1904 if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
1905 if (pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MUTE, &mute, 0, NULL) >= 0)
1906 pa_source_mute_changed(s, mute);
1908 if (s->get_mute(s, &mute) >= 0)
1909 pa_source_mute_changed(s, mute);
1916 /* Called from main thread */
1917 void pa_source_mute_changed(pa_source *s, bool new_muted) {
1918 pa_source_assert_ref(s);
1919 pa_assert_ctl_context();
1920 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1922 if (s->set_mute_in_progress)
1925 /* pa_source_set_mute() does this same check, so this may appear redundant,
1926 * but we must have this here also, because the save parameter of
1927 * pa_source_set_mute() would otherwise have unintended side effects
1928 * (saving the mute state when it shouldn't be saved). */
1929 if (new_muted == s->muted)
1932 pa_source_set_mute(s, new_muted, true);
1935 /* Called from main thread */
1936 bool pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist *p) {
1937 pa_source_assert_ref(s);
1938 pa_assert_ctl_context();
1941 pa_proplist_update(s->proplist, mode, p);
1943 if (PA_SOURCE_IS_LINKED(s->state)) {
1944 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], s);
1945 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1951 /* Called from main thread */
1952 /* FIXME -- this should be dropped and be merged into pa_source_update_proplist() */
1953 void pa_source_set_description(pa_source *s, const char *description) {
1955 pa_source_assert_ref(s);
1956 pa_assert_ctl_context();
1958 if (!description && !pa_proplist_contains(s->proplist, PA_PROP_DEVICE_DESCRIPTION))
1961 old = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
1963 if (old && description && pa_streq(old, description))
1967 pa_proplist_sets(s->proplist, PA_PROP_DEVICE_DESCRIPTION, description);
1969 pa_proplist_unset(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
1971 if (PA_SOURCE_IS_LINKED(s->state)) {
1972 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1973 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], s);
1977 /* Called from main thread */
1978 unsigned pa_source_linked_by(pa_source *s) {
1979 pa_source_assert_ref(s);
1980 pa_assert_ctl_context();
1981 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1983 return pa_idxset_size(s->outputs);
1986 /* Called from main thread */
1987 unsigned pa_source_used_by(pa_source *s) {
1990 pa_source_assert_ref(s);
1991 pa_assert_ctl_context();
1992 pa_assert(PA_SOURCE_IS_LINKED(s->state));
1994 ret = pa_idxset_size(s->outputs);
1995 pa_assert(ret >= s->n_corked);
1997 return ret - s->n_corked;
2000 /* Called from main thread */
2001 unsigned pa_source_check_suspend(pa_source *s, pa_source_output *ignore) {
2003 pa_source_output *o;
2006 pa_source_assert_ref(s);
2007 pa_assert_ctl_context();
2009 if (!PA_SOURCE_IS_LINKED(s->state))
2014 PA_IDXSET_FOREACH(o, s->outputs, idx) {
2018 /* We do not assert here. It is perfectly valid for a source output to
2019 * be in the INIT state (i.e. created, marked done but not yet put)
2020 * and we should not care if it's unlinked as it won't contribute
2021 * towards our busy status.
2023 if (!PA_SOURCE_OUTPUT_IS_LINKED(o->state))
2026 if (o->state == PA_SOURCE_OUTPUT_CORKED)
2029 if (o->flags & PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND)
2038 const char *pa_source_state_to_string(pa_source_state_t state) {
2040 case PA_SOURCE_INIT: return "INIT";
2041 case PA_SOURCE_IDLE: return "IDLE";
2042 case PA_SOURCE_RUNNING: return "RUNNING";
2043 case PA_SOURCE_SUSPENDED: return "SUSPENDED";
2044 case PA_SOURCE_UNLINKED: return "UNLINKED";
2045 case PA_SOURCE_INVALID_STATE: return "INVALID_STATE";
2048 pa_assert_not_reached();
2051 /* Called from the IO thread */
2052 static void sync_output_volumes_within_thread(pa_source *s) {
2053 pa_source_output *o;
2056 pa_source_assert_ref(s);
2057 pa_source_assert_io_context(s);
2059 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
2060 if (pa_cvolume_equal(&o->thread_info.soft_volume, &o->soft_volume))
2063 o->thread_info.soft_volume = o->soft_volume;
2064 //pa_source_output_request_rewind(o, 0, true, false, false);
2068 /* Called from the IO thread. Only called for the root source in volume sharing
2069 * cases, except for internal recursive calls. */
2070 static void set_shared_volume_within_thread(pa_source *s) {
2071 pa_source_output *o;
2074 pa_source_assert_ref(s);
2076 PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED, NULL, 0, NULL);
2078 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
2079 if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
2080 set_shared_volume_within_thread(o->destination_source);
2084 /* Called from IO thread, except when it is not */
2085 int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
2086 pa_source *s = PA_SOURCE(object);
2087 pa_source_assert_ref(s);
2089 switch ((pa_source_message_t) code) {
2091 case PA_SOURCE_MESSAGE_ADD_OUTPUT: {
2092 pa_source_output *o = PA_SOURCE_OUTPUT(userdata);
2094 pa_hashmap_put(s->thread_info.outputs, PA_UINT32_TO_PTR(o->index), pa_source_output_ref(o));
2096 if (o->direct_on_input) {
2097 o->thread_info.direct_on_input = o->direct_on_input;
2098 pa_hashmap_put(o->thread_info.direct_on_input->thread_info.direct_outputs, PA_UINT32_TO_PTR(o->index), o);
2101 pa_source_output_attach(o);
2103 pa_source_output_set_state_within_thread(o, o->state);
2105 if (o->thread_info.requested_source_latency != (pa_usec_t) -1)
2106 pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
2108 pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
2110 /* We don't just invalidate the requested latency here,
2111 * because if we are in a move we might need to fix up the
2112 * requested latency. */
2113 pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
2115 /* In flat volume mode we need to update the volume as
2117 return object->process_msg(object, PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2120 case PA_SOURCE_MESSAGE_REMOVE_OUTPUT: {
2121 pa_source_output *o = PA_SOURCE_OUTPUT(userdata);
2123 pa_source_output_set_state_within_thread(o, o->state);
2125 pa_source_output_detach(o);
2127 if (o->thread_info.direct_on_input) {
2128 pa_hashmap_remove(o->thread_info.direct_on_input->thread_info.direct_outputs, PA_UINT32_TO_PTR(o->index));
2129 o->thread_info.direct_on_input = NULL;
2132 pa_hashmap_remove_and_free(s->thread_info.outputs, PA_UINT32_TO_PTR(o->index));
2133 pa_source_invalidate_requested_latency(s, true);
2135 /* In flat volume mode we need to update the volume as
2137 return object->process_msg(object, PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2140 case PA_SOURCE_MESSAGE_SET_SHARED_VOLUME: {
2141 pa_source *root_source = pa_source_get_master(s);
2143 if (PA_LIKELY(root_source))
2144 set_shared_volume_within_thread(root_source);
2149 case PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED:
2151 if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
2153 pa_source_volume_change_push(s);
2155 /* Fall through ... */
2157 case PA_SOURCE_MESSAGE_SET_VOLUME:
2159 if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2160 s->thread_info.soft_volume = s->soft_volume;
2163 /* Fall through ... */
2165 case PA_SOURCE_MESSAGE_SYNC_VOLUMES:
2166 sync_output_volumes_within_thread(s);
2169 case PA_SOURCE_MESSAGE_GET_VOLUME:
2171 if ((s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_volume) {
2173 pa_source_volume_change_flush(s);
2174 pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
2177 /* In case source implementor reset SW volume. */
2178 if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2179 s->thread_info.soft_volume = s->soft_volume;
2184 case PA_SOURCE_MESSAGE_SET_MUTE:
2186 if (s->thread_info.soft_muted != s->muted) {
2187 s->thread_info.soft_muted = s->muted;
2190 if (s->flags & PA_SOURCE_DEFERRED_VOLUME && s->set_mute)
2195 case PA_SOURCE_MESSAGE_GET_MUTE:
2197 if (s->flags & PA_SOURCE_DEFERRED_VOLUME && s->get_mute)
2198 return s->get_mute(s, userdata);
2202 case PA_SOURCE_MESSAGE_SET_STATE: {
2203 struct set_state_data *data = userdata;
2204 bool suspend_change =
2205 (s->thread_info.state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(data->state)) ||
2206 (PA_SOURCE_IS_OPENED(s->thread_info.state) && data->state == PA_SOURCE_SUSPENDED);
2208 if (s->set_state_in_io_thread) {
2211 if ((r = s->set_state_in_io_thread(s, data->state, data->suspend_cause)) < 0)
2215 s->thread_info.state = data->state;
2217 if (suspend_change) {
2218 pa_source_output *o;
2221 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
2222 if (o->suspend_within_thread)
2223 o->suspend_within_thread(o, s->thread_info.state == PA_SOURCE_SUSPENDED);
2229 case PA_SOURCE_MESSAGE_GET_REQUESTED_LATENCY: {
2231 pa_usec_t *usec = userdata;
2232 *usec = pa_source_get_requested_latency_within_thread(s);
2234 /* Yes, that's right, the IO thread will see -1 when no
2235 * explicit requested latency is configured, the main
2236 * thread will see max_latency */
2237 if (*usec == (pa_usec_t) -1)
2238 *usec = s->thread_info.max_latency;
2243 case PA_SOURCE_MESSAGE_SET_LATENCY_RANGE: {
2244 pa_usec_t *r = userdata;
2246 pa_source_set_latency_range_within_thread(s, r[0], r[1]);
2251 case PA_SOURCE_MESSAGE_GET_LATENCY_RANGE: {
2252 pa_usec_t *r = userdata;
2254 r[0] = s->thread_info.min_latency;
2255 r[1] = s->thread_info.max_latency;
2260 case PA_SOURCE_MESSAGE_GET_FIXED_LATENCY:
2262 *((pa_usec_t*) userdata) = s->thread_info.fixed_latency;
2265 case PA_SOURCE_MESSAGE_SET_FIXED_LATENCY:
2267 pa_source_set_fixed_latency_within_thread(s, (pa_usec_t) offset);
2270 case PA_SOURCE_MESSAGE_GET_MAX_REWIND:
2272 *((size_t*) userdata) = s->thread_info.max_rewind;
2275 case PA_SOURCE_MESSAGE_SET_MAX_REWIND:
2277 pa_source_set_max_rewind_within_thread(s, (size_t) offset);
2280 case PA_SOURCE_MESSAGE_GET_LATENCY:
2282 if (s->monitor_of) {
2283 *((int64_t*) userdata) = -pa_sink_get_latency_within_thread(s->monitor_of, true);
2287 /* Implementors need to overwrite this implementation! */
2290 case PA_SOURCE_MESSAGE_UPDATE_VOLUME_AND_MUTE:
2291 /* This message is sent from IO-thread and handled in main thread. */
2292 pa_assert_ctl_context();
2294 /* Make sure we're not messing with main thread when no longer linked */
2295 if (!PA_SOURCE_IS_LINKED(s->state))
2298 pa_source_get_volume(s, true);
2299 pa_source_get_mute(s, true);
2302 case PA_SOURCE_MESSAGE_SET_PORT_LATENCY_OFFSET:
2303 s->thread_info.port_latency_offset = offset;
2306 case PA_SOURCE_MESSAGE_MAX:
2313 /* Called from main thread */
2314 int pa_source_suspend_all(pa_core *c, bool suspend, pa_suspend_cause_t cause) {
2319 pa_core_assert_ref(c);
2320 pa_assert_ctl_context();
2321 pa_assert(cause != 0);
2323 for (source = PA_SOURCE(pa_idxset_first(c->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(c->sources, &idx))) {
2326 if (source->monitor_of)
2329 if ((r = pa_source_suspend(source, suspend, cause)) < 0)
2336 /* Called from IO thread */
2337 void pa_source_detach_within_thread(pa_source *s) {
2338 pa_source_output *o;
2341 pa_source_assert_ref(s);
2342 pa_source_assert_io_context(s);
2343 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
2345 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2346 pa_source_output_detach(o);
2349 /* Called from IO thread */
2350 void pa_source_attach_within_thread(pa_source *s) {
2351 pa_source_output *o;
2354 pa_source_assert_ref(s);
2355 pa_source_assert_io_context(s);
2356 pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
2358 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2359 pa_source_output_attach(o);
2362 /* Called from IO thread */
2363 pa_usec_t pa_source_get_requested_latency_within_thread(pa_source *s) {
2364 pa_usec_t result = (pa_usec_t) -1;
2365 pa_source_output *o;
2368 pa_source_assert_ref(s);
2369 pa_source_assert_io_context(s);
2371 if (!(s->flags & PA_SOURCE_DYNAMIC_LATENCY))
2372 return PA_CLAMP(s->thread_info.fixed_latency, s->thread_info.min_latency, s->thread_info.max_latency);
2374 if (s->thread_info.requested_latency_valid)
2375 return s->thread_info.requested_latency;
2377 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2378 if (o->thread_info.requested_source_latency != (pa_usec_t) -1 &&
2379 (result == (pa_usec_t) -1 || result > o->thread_info.requested_source_latency))
2380 result = o->thread_info.requested_source_latency;
2382 if (result != (pa_usec_t) -1)
2383 result = PA_CLAMP(result, s->thread_info.min_latency, s->thread_info.max_latency);
2385 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2386 /* Only cache this if we are fully set up */
2387 s->thread_info.requested_latency = result;
2388 s->thread_info.requested_latency_valid = true;
2394 /* Called from main thread */
2395 pa_usec_t pa_source_get_requested_latency(pa_source *s) {
2398 pa_source_assert_ref(s);
2399 pa_assert_ctl_context();
2400 pa_assert(PA_SOURCE_IS_LINKED(s->state));
2402 if (s->state == PA_SOURCE_SUSPENDED)
2405 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
2410 /* Called from IO thread */
2411 void pa_source_set_max_rewind_within_thread(pa_source *s, size_t max_rewind) {
2412 pa_source_output *o;
2415 pa_source_assert_ref(s);
2416 pa_source_assert_io_context(s);
2418 if (max_rewind == s->thread_info.max_rewind)
2421 s->thread_info.max_rewind = max_rewind;
2423 if (PA_SOURCE_IS_LINKED(s->thread_info.state))
2424 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2425 pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
2428 /* Called from main thread */
2429 void pa_source_set_max_rewind(pa_source *s, size_t max_rewind) {
2430 pa_source_assert_ref(s);
2431 pa_assert_ctl_context();
2433 if (PA_SOURCE_IS_LINKED(s->state))
2434 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MAX_REWIND, NULL, max_rewind, NULL) == 0);
2436 pa_source_set_max_rewind_within_thread(s, max_rewind);
2439 /* Called from IO thread */
2440 void pa_source_invalidate_requested_latency(pa_source *s, bool dynamic) {
2441 pa_source_output *o;
2444 pa_source_assert_ref(s);
2445 pa_source_assert_io_context(s);
2447 if ((s->flags & PA_SOURCE_DYNAMIC_LATENCY))
2448 s->thread_info.requested_latency_valid = false;
2452 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2454 if (s->update_requested_latency)
2455 s->update_requested_latency(s);
2457 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
2458 if (o->update_source_requested_latency)
2459 o->update_source_requested_latency(o);
2463 pa_sink_invalidate_requested_latency(s->monitor_of, dynamic);
2466 /* Called from main thread */
2467 void pa_source_set_latency_range(pa_source *s, pa_usec_t min_latency, pa_usec_t max_latency) {
2468 pa_source_assert_ref(s);
2469 pa_assert_ctl_context();
2471 /* min_latency == 0: no limit
2472 * min_latency anything else: specified limit
2474 * Similar for max_latency */
2476 if (min_latency < ABSOLUTE_MIN_LATENCY)
2477 min_latency = ABSOLUTE_MIN_LATENCY;
2479 if (max_latency <= 0 ||
2480 max_latency > ABSOLUTE_MAX_LATENCY)
2481 max_latency = ABSOLUTE_MAX_LATENCY;
2483 pa_assert(min_latency <= max_latency);
2485 /* Hmm, let's see if someone forgot to set PA_SOURCE_DYNAMIC_LATENCY here... */
2486 pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
2487 max_latency == ABSOLUTE_MAX_LATENCY) ||
2488 (s->flags & PA_SOURCE_DYNAMIC_LATENCY));
2490 if (PA_SOURCE_IS_LINKED(s->state)) {
2496 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_LATENCY_RANGE, r, 0, NULL) == 0);
2498 pa_source_set_latency_range_within_thread(s, min_latency, max_latency);
2501 /* Called from main thread */
2502 void pa_source_get_latency_range(pa_source *s, pa_usec_t *min_latency, pa_usec_t *max_latency) {
2503 pa_source_assert_ref(s);
2504 pa_assert_ctl_context();
2505 pa_assert(min_latency);
2506 pa_assert(max_latency);
2508 if (PA_SOURCE_IS_LINKED(s->state)) {
2509 pa_usec_t r[2] = { 0, 0 };
2511 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY_RANGE, r, 0, NULL) == 0);
2513 *min_latency = r[0];
2514 *max_latency = r[1];
2516 *min_latency = s->thread_info.min_latency;
2517 *max_latency = s->thread_info.max_latency;
2521 /* Called from IO thread, and from main thread before pa_source_put() is called */
2522 void pa_source_set_latency_range_within_thread(pa_source *s, pa_usec_t min_latency, pa_usec_t max_latency) {
2523 pa_source_assert_ref(s);
2524 pa_source_assert_io_context(s);
2526 pa_assert(min_latency >= ABSOLUTE_MIN_LATENCY);
2527 pa_assert(max_latency <= ABSOLUTE_MAX_LATENCY);
2528 pa_assert(min_latency <= max_latency);
2530 /* Hmm, let's see if someone forgot to set PA_SOURCE_DYNAMIC_LATENCY here... */
2531 pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
2532 max_latency == ABSOLUTE_MAX_LATENCY) ||
2533 (s->flags & PA_SOURCE_DYNAMIC_LATENCY) ||
2536 if (s->thread_info.min_latency == min_latency &&
2537 s->thread_info.max_latency == max_latency)
2540 s->thread_info.min_latency = min_latency;
2541 s->thread_info.max_latency = max_latency;
2543 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2544 pa_source_output *o;
2547 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2548 if (o->update_source_latency_range)
2549 o->update_source_latency_range(o);
2552 pa_source_invalidate_requested_latency(s, false);
2555 /* Called from main thread, before the source is put */
2556 void pa_source_set_fixed_latency(pa_source *s, pa_usec_t latency) {
2557 pa_source_assert_ref(s);
2558 pa_assert_ctl_context();
2560 if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
2561 pa_assert(latency == 0);
2565 if (latency < ABSOLUTE_MIN_LATENCY)
2566 latency = ABSOLUTE_MIN_LATENCY;
2568 if (latency > ABSOLUTE_MAX_LATENCY)
2569 latency = ABSOLUTE_MAX_LATENCY;
2571 if (PA_SOURCE_IS_LINKED(s->state))
2572 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_FIXED_LATENCY, NULL, (int64_t) latency, NULL) == 0);
2574 s->thread_info.fixed_latency = latency;
2577 /* Called from main thread */
2578 pa_usec_t pa_source_get_fixed_latency(pa_source *s) {
2581 pa_source_assert_ref(s);
2582 pa_assert_ctl_context();
2584 if (s->flags & PA_SOURCE_DYNAMIC_LATENCY)
2587 if (PA_SOURCE_IS_LINKED(s->state))
2588 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_FIXED_LATENCY, &latency, 0, NULL) == 0);
2590 latency = s->thread_info.fixed_latency;
2595 /* Called from IO thread */
2596 void pa_source_set_fixed_latency_within_thread(pa_source *s, pa_usec_t latency) {
2597 pa_source_assert_ref(s);
2598 pa_source_assert_io_context(s);
2600 if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
2601 pa_assert(latency == 0);
2602 s->thread_info.fixed_latency = 0;
2607 pa_assert(latency >= ABSOLUTE_MIN_LATENCY);
2608 pa_assert(latency <= ABSOLUTE_MAX_LATENCY);
2610 if (s->thread_info.fixed_latency == latency)
2613 s->thread_info.fixed_latency = latency;
2615 if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2616 pa_source_output *o;
2619 PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2620 if (o->update_source_fixed_latency)
2621 o->update_source_fixed_latency(o);
2624 pa_source_invalidate_requested_latency(s, false);
2627 /* Called from main thread */
2628 void pa_source_set_port_latency_offset(pa_source *s, int64_t offset) {
2629 pa_source_assert_ref(s);
2631 s->port_latency_offset = offset;
2633 if (PA_SOURCE_IS_LINKED(s->state))
2634 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_PORT_LATENCY_OFFSET, NULL, offset, NULL) == 0);
2636 s->thread_info.port_latency_offset = offset;
2638 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_LATENCY_OFFSET_CHANGED], s);
2641 /* Called from main thread */
2642 size_t pa_source_get_max_rewind(pa_source *s) {
2644 pa_assert_ctl_context();
2645 pa_source_assert_ref(s);
2647 if (!PA_SOURCE_IS_LINKED(s->state))
2648 return s->thread_info.max_rewind;
2650 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MAX_REWIND, &r, 0, NULL) == 0);
2655 /* Called from main context */
2656 int pa_source_set_port(pa_source *s, const char *name, bool save) {
2657 pa_device_port *port;
2659 pa_source_assert_ref(s);
2660 pa_assert_ctl_context();
2663 pa_log_debug("set_port() operation not implemented for source %u \"%s\"", s->index, s->name);
2664 return -PA_ERR_NOTIMPLEMENTED;
2668 return -PA_ERR_NOENTITY;
2670 if (!(port = pa_hashmap_get(s->ports, name)))
2671 return -PA_ERR_NOENTITY;
2673 if (s->active_port == port) {
2674 s->save_port = s->save_port || save;
2678 if (s->set_port(s, port) < 0)
2679 return -PA_ERR_NOENTITY;
2681 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2683 pa_log_info("Changed port of source %u \"%s\" to %s", s->index, s->name, port->name);
2685 s->active_port = port;
2686 s->save_port = save;
2688 /* The active port affects the default source selection. */
2689 pa_core_update_default_source(s->core);
2691 pa_source_set_port_latency_offset(s, s->active_port->latency_offset);
2693 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], s);
2698 PA_STATIC_FLIST_DECLARE(pa_source_volume_change, 0, pa_xfree);
2700 /* Called from the IO thread. */
2701 static pa_source_volume_change *pa_source_volume_change_new(pa_source *s) {
2702 pa_source_volume_change *c;
2703 if (!(c = pa_flist_pop(PA_STATIC_FLIST_GET(pa_source_volume_change))))
2704 c = pa_xnew(pa_source_volume_change, 1);
2706 PA_LLIST_INIT(pa_source_volume_change, c);
2708 pa_cvolume_reset(&c->hw_volume, s->sample_spec.channels);
2712 /* Called from the IO thread. */
2713 static void pa_source_volume_change_free(pa_source_volume_change *c) {
2715 if (pa_flist_push(PA_STATIC_FLIST_GET(pa_source_volume_change), c) < 0)
2719 /* Called from the IO thread. */
2720 void pa_source_volume_change_push(pa_source *s) {
2721 pa_source_volume_change *c = NULL;
2722 pa_source_volume_change *nc = NULL;
2723 pa_source_volume_change *pc = NULL;
2724 uint32_t safety_margin = s->thread_info.volume_change_safety_margin;
2726 const char *direction = NULL;
2729 nc = pa_source_volume_change_new(s);
2731 /* NOTE: There is already more different volumes in pa_source that I can remember.
2732 * Adding one more volume for HW would get us rid of this, but I am trying
2733 * to survive with the ones we already have. */
2734 pa_sw_cvolume_divide(&nc->hw_volume, &s->real_volume, &s->soft_volume);
2736 if (!s->thread_info.volume_changes && pa_cvolume_equal(&nc->hw_volume, &s->thread_info.current_hw_volume)) {
2737 pa_log_debug("Volume not changing");
2738 pa_source_volume_change_free(nc);
2742 nc->at = pa_source_get_latency_within_thread(s, false);
2743 nc->at += pa_rtclock_now() + s->thread_info.volume_change_extra_delay;
2745 if (s->thread_info.volume_changes_tail) {
2746 for (c = s->thread_info.volume_changes_tail; c; c = c->prev) {
2747 /* If volume is going up let's do it a bit late. If it is going
2748 * down let's do it a bit early. */
2749 if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&c->hw_volume)) {
2750 if (nc->at + safety_margin > c->at) {
2751 nc->at += safety_margin;
2756 else if (nc->at - safety_margin > c->at) {
2757 nc->at -= safety_margin;
2765 if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&s->thread_info.current_hw_volume)) {
2766 nc->at += safety_margin;
2769 nc->at -= safety_margin;
2772 PA_LLIST_PREPEND(pa_source_volume_change, s->thread_info.volume_changes, nc);
2775 PA_LLIST_INSERT_AFTER(pa_source_volume_change, s->thread_info.volume_changes, c, nc);
2778 pa_log_debug("Volume going %s to %d at %llu", direction, pa_cvolume_avg(&nc->hw_volume), (long long unsigned) nc->at);
2780 /* We can ignore volume events that came earlier but should happen later than this. */
2781 PA_LLIST_FOREACH_SAFE(c, pc, nc->next) {
2782 pa_log_debug("Volume change to %d at %llu was dropped", pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at);
2783 pa_source_volume_change_free(c);
2786 s->thread_info.volume_changes_tail = nc;
2789 /* Called from the IO thread. */
2790 static void pa_source_volume_change_flush(pa_source *s) {
2791 pa_source_volume_change *c = s->thread_info.volume_changes;
2793 s->thread_info.volume_changes = NULL;
2794 s->thread_info.volume_changes_tail = NULL;
2796 pa_source_volume_change *next = c->next;
2797 pa_source_volume_change_free(c);
2802 /* Called from the IO thread. */
2803 bool pa_source_volume_change_apply(pa_source *s, pa_usec_t *usec_to_next) {
2809 if (!s->thread_info.volume_changes || !PA_SOURCE_IS_LINKED(s->state)) {
2815 pa_assert(s->write_volume);
2817 now = pa_rtclock_now();
2819 while (s->thread_info.volume_changes && now >= s->thread_info.volume_changes->at) {
2820 pa_source_volume_change *c = s->thread_info.volume_changes;
2821 PA_LLIST_REMOVE(pa_source_volume_change, s->thread_info.volume_changes, c);
2822 pa_log_debug("Volume change to %d at %llu was written %llu usec late",
2823 pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at, (long long unsigned) (now - c->at));
2825 s->thread_info.current_hw_volume = c->hw_volume;
2826 pa_source_volume_change_free(c);
2832 if (s->thread_info.volume_changes) {
2834 *usec_to_next = s->thread_info.volume_changes->at - now;
2835 if (pa_log_ratelimit(PA_LOG_DEBUG))
2836 pa_log_debug("Next volume change in %lld usec", (long long) (s->thread_info.volume_changes->at - now));
2841 s->thread_info.volume_changes_tail = NULL;
2846 /* Called from the main thread */
2847 /* Gets the list of formats supported by the source. The members and idxset must
2848 * be freed by the caller. */
2849 pa_idxset* pa_source_get_formats(pa_source *s) {
2854 if (s->get_formats) {
2855 /* Source supports format query, all is good */
2856 ret = s->get_formats(s);
2858 /* Source doesn't support format query, so assume it does PCM */
2859 pa_format_info *f = pa_format_info_new();
2860 f->encoding = PA_ENCODING_PCM;
2862 ret = pa_idxset_new(NULL, NULL);
2863 pa_idxset_put(ret, f, NULL);
2869 /* Called from the main thread */
2870 /* Checks if the source can accept this format */
2871 bool pa_source_check_format(pa_source *s, pa_format_info *f) {
2872 pa_idxset *formats = NULL;
2878 formats = pa_source_get_formats(s);
2881 pa_format_info *finfo_device;
2884 PA_IDXSET_FOREACH(finfo_device, formats, i) {
2885 if (pa_format_info_is_compatible(finfo_device, f)) {
2891 pa_idxset_free(formats, (pa_free_cb_t) pa_format_info_free);
2897 /* Called from the main thread */
2898 /* Calculates the intersection between formats supported by the source and
2899 * in_formats, and returns these, in the order of the source's formats. */
2900 pa_idxset* pa_source_check_formats(pa_source *s, pa_idxset *in_formats) {
2901 pa_idxset *out_formats = pa_idxset_new(NULL, NULL), *source_formats = NULL;
2902 pa_format_info *f_source, *f_in;
2907 if (!in_formats || pa_idxset_isempty(in_formats))
2910 source_formats = pa_source_get_formats(s);
2912 PA_IDXSET_FOREACH(f_source, source_formats, i) {
2913 PA_IDXSET_FOREACH(f_in, in_formats, j) {
2914 if (pa_format_info_is_compatible(f_source, f_in))
2915 pa_idxset_put(out_formats, pa_format_info_copy(f_in), NULL);
2921 pa_idxset_free(source_formats, (pa_free_cb_t) pa_format_info_free);
2926 /* Called from the main thread */
2927 void pa_source_set_sample_format(pa_source *s, pa_sample_format_t format) {
2928 pa_sample_format_t old_format;
2931 pa_assert(pa_sample_format_valid(format));
2933 old_format = s->sample_spec.format;
2934 if (old_format == format)
2937 pa_log_info("%s: format: %s -> %s",
2938 s->name, pa_sample_format_to_string(old_format), pa_sample_format_to_string(format));
2940 s->sample_spec.format = format;
2942 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2945 /* Called from the main thread */
2946 void pa_source_set_sample_rate(pa_source *s, uint32_t rate) {
2950 pa_assert(pa_sample_rate_valid(rate));
2952 old_rate = s->sample_spec.rate;
2953 if (old_rate == rate)
2956 pa_log_info("%s: rate: %u -> %u", s->name, old_rate, rate);
2958 s->sample_spec.rate = rate;
2960 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2963 /* Called from the main thread. */
2964 void pa_source_set_reference_volume_direct(pa_source *s, const pa_cvolume *volume) {
2965 pa_cvolume old_volume;
2966 char old_volume_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
2967 char new_volume_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
2972 old_volume = s->reference_volume;
2974 if (pa_cvolume_equal(volume, &old_volume))
2977 s->reference_volume = *volume;
2978 pa_log_debug("The reference volume of source %s changed from %s to %s.", s->name,
2979 pa_cvolume_snprint_verbose(old_volume_str, sizeof(old_volume_str), &old_volume, &s->channel_map,
2980 s->flags & PA_SOURCE_DECIBEL_VOLUME),
2981 pa_cvolume_snprint_verbose(new_volume_str, sizeof(new_volume_str), volume, &s->channel_map,
2982 s->flags & PA_SOURCE_DECIBEL_VOLUME));
2984 pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2985 pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_VOLUME_CHANGED], s);