replace sink/source SET_STATE handlers with callbacks
[platform/upstream/pulseaudio.git] / src / pulsecore / source.c
1 /***
2   This file is part of PulseAudio.
3
4   Copyright 2004-2006 Lennart Poettering
5   Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6
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.
11
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.
16
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/>.
19 ***/
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27
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>
35
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>
43
44 #include "source.h"
45
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)
49
50 PA_DEFINE_PUBLIC_CLASS(pa_source, pa_msgobject);
51
52 struct pa_source_volume_change {
53     pa_usec_t at;
54     pa_cvolume hw_volume;
55
56     PA_LLIST_FIELDS(pa_source_volume_change);
57 };
58
59 struct source_message_set_port {
60     pa_device_port *port;
61     int ret;
62 };
63
64 static void source_free(pa_object *o);
65
66 static void pa_source_volume_change_push(pa_source *s);
67 static void pa_source_volume_change_flush(pa_source *s);
68
69 pa_source_new_data* pa_source_new_data_init(pa_source_new_data *data) {
70     pa_assert(data);
71
72     pa_zero(*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);
75
76     return data;
77 }
78
79 void pa_source_new_data_set_name(pa_source_new_data *data, const char *name) {
80     pa_assert(data);
81
82     pa_xfree(data->name);
83     data->name = pa_xstrdup(name);
84 }
85
86 void pa_source_new_data_set_sample_spec(pa_source_new_data *data, const pa_sample_spec *spec) {
87     pa_assert(data);
88
89     if ((data->sample_spec_is_set = !!spec))
90         data->sample_spec = *spec;
91 }
92
93 void pa_source_new_data_set_channel_map(pa_source_new_data *data, const pa_channel_map *map) {
94     pa_assert(data);
95
96     if ((data->channel_map_is_set = !!map))
97         data->channel_map = *map;
98 }
99
100 void pa_source_new_data_set_alternate_sample_rate(pa_source_new_data *data, const uint32_t alternate_sample_rate) {
101     pa_assert(data);
102
103     data->alternate_sample_rate_is_set = true;
104     data->alternate_sample_rate = alternate_sample_rate;
105 }
106
107 void pa_source_new_data_set_volume(pa_source_new_data *data, const pa_cvolume *volume) {
108     pa_assert(data);
109
110     if ((data->volume_is_set = !!volume))
111         data->volume = *volume;
112 }
113
114 void pa_source_new_data_set_muted(pa_source_new_data *data, bool mute) {
115     pa_assert(data);
116
117     data->muted_is_set = true;
118     data->muted = mute;
119 }
120
121 void pa_source_new_data_set_port(pa_source_new_data *data, const char *port) {
122     pa_assert(data);
123
124     pa_xfree(data->active_port);
125     data->active_port = pa_xstrdup(port);
126 }
127
128 void pa_source_new_data_done(pa_source_new_data *data) {
129     pa_assert(data);
130
131     pa_proplist_free(data->proplist);
132
133     if (data->ports)
134         pa_hashmap_free(data->ports);
135
136     pa_xfree(data->name);
137     pa_xfree(data->active_port);
138 }
139
140 /* Called from main context */
141 static void reset_callbacks(pa_source *s) {
142     pa_assert(s);
143
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;
149     s->get_mute = NULL;
150     s->set_mute = NULL;
151     s->update_requested_latency = NULL;
152     s->set_port = NULL;
153     s->get_formats = NULL;
154     s->reconfigure = NULL;
155 }
156
157 /* Called from main context */
158 pa_source* pa_source_new(
159         pa_core *core,
160         pa_source_new_data *data,
161         pa_source_flags_t flags) {
162
163     pa_source *s;
164     const char *name;
165     char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
166     char *pt;
167
168     pa_assert(core);
169     pa_assert(data);
170     pa_assert(data->name);
171     pa_assert_ctl_context();
172
173     s = pa_msgobject_new(pa_source);
174
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);
177         pa_xfree(s);
178         return NULL;
179     }
180
181     pa_source_new_data_set_name(data, name);
182
183     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_NEW], data) < 0) {
184         pa_xfree(s);
185         pa_namereg_unregister(core, name);
186         return NULL;
187     }
188
189     /* FIXME, need to free s here on failure */
190
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]);
193
194     pa_return_null_if_fail(data->sample_spec_is_set && pa_sample_spec_valid(&data->sample_spec));
195
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));
198
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);
201
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));
205
206     if (!data->volume_is_set) {
207         pa_cvolume_reset(&data->volume, data->sample_spec.channels);
208         data->save_volume = false;
209     }
210
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));
213
214     if (!data->muted_is_set)
215         data->muted = false;
216
217     if (data->card)
218         pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->card->proplist);
219
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);
223
224     if (!data->active_port) {
225         pa_device_port *p = pa_device_port_find_best(data->ports);
226         if (p)
227             pa_source_new_data_set_port(data, p->name);
228     }
229
230     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_FIXATE], data) < 0) {
231         pa_xfree(s);
232         pa_namereg_unregister(core, name);
233         return NULL;
234     }
235
236     s->parent.parent.free = source_free;
237     s->parent.process_msg = pa_source_process_msg;
238
239     s->core = core;
240     s->state = PA_SOURCE_INIT;
241     s->flags = flags;
242     s->priority = 0;
243     s->suspend_cause = data->suspend_cause;
244     pa_source_set_mixer_dirty(s, false);
245     s->name = pa_xstrdup(name);
246     s->proplist = pa_proplist_copy(data->proplist);
247     s->driver = pa_xstrdup(pa_path_get_filename(data->driver));
248     s->module = data->module;
249     s->card = data->card;
250
251     s->priority = pa_device_init_priority(s->proplist);
252
253     s->sample_spec = data->sample_spec;
254     s->channel_map = data->channel_map;
255     s->default_sample_rate = s->sample_spec.rate;
256
257     if (data->alternate_sample_rate_is_set)
258         s->alternate_sample_rate = data->alternate_sample_rate;
259     else
260         s->alternate_sample_rate = s->core->alternate_sample_rate;
261
262     if (s->sample_spec.rate == s->alternate_sample_rate) {
263         pa_log_warn("Default and alternate sample rates are the same.");
264         s->alternate_sample_rate = 0;
265     }
266
267     s->outputs = pa_idxset_new(NULL, NULL);
268     s->n_corked = 0;
269     s->monitor_of = NULL;
270     s->output_from_master = NULL;
271
272     s->reference_volume = s->real_volume = data->volume;
273     pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
274     s->base_volume = PA_VOLUME_NORM;
275     s->n_volume_steps = PA_VOLUME_NORM+1;
276     s->muted = data->muted;
277     s->refresh_volume = s->refresh_muted = false;
278
279     reset_callbacks(s);
280     s->userdata = NULL;
281
282     s->asyncmsgq = NULL;
283
284     /* As a minor optimization we just steal the list instead of
285      * copying it here */
286     s->ports = data->ports;
287     data->ports = NULL;
288
289     s->active_port = NULL;
290     s->save_port = false;
291
292     if (data->active_port)
293         if ((s->active_port = pa_hashmap_get(s->ports, data->active_port)))
294             s->save_port = data->save_port;
295
296     /* Hopefully the active port has already been assigned in the previous call
297        to pa_device_port_find_best, but better safe than sorry */
298     if (!s->active_port)
299         s->active_port = pa_device_port_find_best(s->ports);
300
301     if (s->active_port)
302         s->port_latency_offset = s->active_port->latency_offset;
303     else
304         s->port_latency_offset = 0;
305
306     s->save_volume = data->save_volume;
307     s->save_muted = data->save_muted;
308
309     pa_silence_memchunk_get(
310             &core->silence_cache,
311             core->mempool,
312             &s->silence,
313             &s->sample_spec,
314             0);
315
316     s->thread_info.rtpoll = NULL;
317     s->thread_info.outputs = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL,
318                                                  (pa_free_cb_t) pa_source_output_unref);
319     s->thread_info.soft_volume = s->soft_volume;
320     s->thread_info.soft_muted = s->muted;
321     s->thread_info.state = s->state;
322     s->thread_info.max_rewind = 0;
323     s->thread_info.requested_latency_valid = false;
324     s->thread_info.requested_latency = 0;
325     s->thread_info.min_latency = ABSOLUTE_MIN_LATENCY;
326     s->thread_info.max_latency = ABSOLUTE_MAX_LATENCY;
327     s->thread_info.fixed_latency = flags & PA_SOURCE_DYNAMIC_LATENCY ? 0 : DEFAULT_FIXED_LATENCY;
328
329     PA_LLIST_HEAD_INIT(pa_source_volume_change, s->thread_info.volume_changes);
330     s->thread_info.volume_changes_tail = NULL;
331     pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
332     s->thread_info.volume_change_safety_margin = core->deferred_volume_safety_margin_usec;
333     s->thread_info.volume_change_extra_delay = core->deferred_volume_extra_delay_usec;
334     s->thread_info.port_latency_offset = s->port_latency_offset;
335
336     /* FIXME: This should probably be moved to pa_source_put() */
337     pa_assert_se(pa_idxset_put(core->sources, s, &s->index) >= 0);
338
339     if (s->card)
340         pa_assert_se(pa_idxset_put(s->card->sources, s, NULL) >= 0);
341
342     pt = pa_proplist_to_string_sep(s->proplist, "\n    ");
343     pa_log_info("Created source %u \"%s\" with sample spec %s and channel map %s\n    %s",
344                 s->index,
345                 s->name,
346                 pa_sample_spec_snprint(st, sizeof(st), &s->sample_spec),
347                 pa_channel_map_snprint(cm, sizeof(cm), &s->channel_map),
348                 pt);
349     pa_xfree(pt);
350
351     return s;
352 }
353
354 /* Called from main context */
355 static int source_set_state(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
356     int ret = 0;
357     bool state_changed;
358     bool suspend_cause_changed;
359     bool suspending;
360     bool resuming;
361
362     pa_assert(s);
363     pa_assert_ctl_context();
364
365     state_changed = state != s->state;
366     suspend_cause_changed = suspend_cause != s->suspend_cause;
367
368     if (!state_changed && !suspend_cause_changed)
369         return 0;
370
371     suspending = PA_SOURCE_IS_OPENED(s->state) && state == PA_SOURCE_SUSPENDED;
372     resuming = s->state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(state);
373
374     /* If we are resuming, suspend_cause must be 0. */
375     pa_assert(!resuming || !suspend_cause);
376
377     /* Here's something to think about: what to do with the suspend cause if
378      * resuming the source fails? The old suspend cause will be incorrect, so we
379      * can't use that. On the other hand, if we set no suspend cause (as is the
380      * case currently), then it looks strange to have a source suspended without
381      * any cause. It might be a good idea to add a new "resume failed" suspend
382      * cause, or it might just add unnecessary complexity, given that the
383      * current approach of not setting any suspend cause works well enough. */
384
385     if (s->set_state_in_main_thread) {
386         ret = s->set_state_in_main_thread(s, state, suspend_cause);
387         /* set_state_in_main_thread() is allowed to fail only when resuming. */
388         pa_assert(ret >= 0 || resuming);
389     }
390
391     if (ret >= 0 && s->asyncmsgq && state_changed)
392         if ((ret = pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_STATE, PA_UINT_TO_PTR(state), 0, NULL)) < 0) {
393             /* SET_STATE is allowed to fail only when resuming. */
394             pa_assert(resuming);
395
396             if (s->set_state_in_main_thread)
397                 s->set_state_in_main_thread(s, PA_SOURCE_SUSPENDED, 0);
398         }
399
400     if (suspend_cause_changed) {
401         char old_cause_buf[PA_SUSPEND_CAUSE_TO_STRING_BUF_SIZE];
402         char new_cause_buf[PA_SUSPEND_CAUSE_TO_STRING_BUF_SIZE];
403
404         pa_log_debug("%s: suspend_cause: %s -> %s", s->name, pa_suspend_cause_to_string(s->suspend_cause, old_cause_buf),
405                      pa_suspend_cause_to_string(suspend_cause, new_cause_buf));
406         s->suspend_cause = suspend_cause;
407     }
408
409     if (ret < 0)
410         goto finish;
411
412     if (state_changed) {
413         pa_log_debug("%s: state: %s -> %s", s->name, pa_source_state_to_string(s->state), pa_source_state_to_string(state));
414         s->state = state;
415
416         /* If we enter UNLINKED state, then we don't send change notifications.
417          * pa_source_unlink() will send unlink notifications instead. */
418         if (state == PA_SOURCE_UNLINKED) {
419             pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], s);
420             pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
421         }
422     }
423
424     if (suspending || resuming) {
425         pa_source_output *o;
426         uint32_t idx;
427
428         /* We're suspending or resuming, tell everyone about it */
429
430         PA_IDXSET_FOREACH(o, s->outputs, idx)
431             if (s->state == PA_SOURCE_SUSPENDED &&
432                 (o->flags & PA_SOURCE_OUTPUT_KILL_ON_SUSPEND))
433                 pa_source_output_kill(o);
434             else if (o->suspend)
435                 o->suspend(o, state == PA_SOURCE_SUSPENDED);
436     }
437
438 finish:
439     return ret;
440 }
441
442 void pa_source_set_get_volume_callback(pa_source *s, pa_source_cb_t cb) {
443     pa_assert(s);
444
445     s->get_volume = cb;
446 }
447
448 void pa_source_set_set_volume_callback(pa_source *s, pa_source_cb_t cb) {
449     pa_source_flags_t flags;
450
451     pa_assert(s);
452     pa_assert(!s->write_volume || cb);
453
454     s->set_volume = cb;
455
456     /* Save the current flags so we can tell if they've changed */
457     flags = s->flags;
458
459     if (cb) {
460         /* The source implementor is responsible for setting decibel volume support */
461         s->flags |= PA_SOURCE_HW_VOLUME_CTRL;
462     } else {
463         s->flags &= ~PA_SOURCE_HW_VOLUME_CTRL;
464         /* See note below in pa_source_put() about volume sharing and decibel volumes */
465         pa_source_enable_decibel_volume(s, !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
466     }
467
468     /* If the flags have changed after init, let any clients know via a change event */
469     if (s->state != PA_SOURCE_INIT && flags != s->flags)
470         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
471 }
472
473 void pa_source_set_write_volume_callback(pa_source *s, pa_source_cb_t cb) {
474     pa_source_flags_t flags;
475
476     pa_assert(s);
477     pa_assert(!cb || s->set_volume);
478
479     s->write_volume = cb;
480
481     /* Save the current flags so we can tell if they've changed */
482     flags = s->flags;
483
484     if (cb)
485         s->flags |= PA_SOURCE_DEFERRED_VOLUME;
486     else
487         s->flags &= ~PA_SOURCE_DEFERRED_VOLUME;
488
489     /* If the flags have changed after init, let any clients know via a change event */
490     if (s->state != PA_SOURCE_INIT && flags != s->flags)
491         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
492 }
493
494 void pa_source_set_get_mute_callback(pa_source *s, pa_source_get_mute_cb_t cb) {
495     pa_assert(s);
496
497     s->get_mute = cb;
498 }
499
500 void pa_source_set_set_mute_callback(pa_source *s, pa_source_cb_t cb) {
501     pa_source_flags_t flags;
502
503     pa_assert(s);
504
505     s->set_mute = cb;
506
507     /* Save the current flags so we can tell if they've changed */
508     flags = s->flags;
509
510     if (cb)
511         s->flags |= PA_SOURCE_HW_MUTE_CTRL;
512     else
513         s->flags &= ~PA_SOURCE_HW_MUTE_CTRL;
514
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);
518 }
519
520 static void enable_flat_volume(pa_source *s, bool enable) {
521     pa_source_flags_t flags;
522
523     pa_assert(s);
524
525     /* Always follow the overall user preference here */
526     enable = enable && s->core->flat_volumes;
527
528     /* Save the current flags so we can tell if they've changed */
529     flags = s->flags;
530
531     if (enable)
532         s->flags |= PA_SOURCE_FLAT_VOLUME;
533     else
534         s->flags &= ~PA_SOURCE_FLAT_VOLUME;
535
536     /* If the flags have changed after init, let any clients know via a change event */
537     if (s->state != PA_SOURCE_INIT && flags != s->flags)
538         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
539 }
540
541 void pa_source_enable_decibel_volume(pa_source *s, bool enable) {
542     pa_source_flags_t flags;
543
544     pa_assert(s);
545
546     /* Save the current flags so we can tell if they've changed */
547     flags = s->flags;
548
549     if (enable) {
550         s->flags |= PA_SOURCE_DECIBEL_VOLUME;
551         enable_flat_volume(s, true);
552     } else {
553         s->flags &= ~PA_SOURCE_DECIBEL_VOLUME;
554         enable_flat_volume(s, false);
555     }
556
557     /* If the flags have changed after init, let any clients know via a change event */
558     if (s->state != PA_SOURCE_INIT && flags != s->flags)
559         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
560 }
561
562 /* Called from main context */
563 void pa_source_put(pa_source *s) {
564     pa_source_assert_ref(s);
565     pa_assert_ctl_context();
566
567     pa_assert(s->state == PA_SOURCE_INIT);
568     pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) || pa_source_is_filter(s));
569
570     /* The following fields must be initialized properly when calling _put() */
571     pa_assert(s->asyncmsgq);
572     pa_assert(s->thread_info.min_latency <= s->thread_info.max_latency);
573
574     /* Generally, flags should be initialized via pa_source_new(). As a
575      * special exception we allow some volume related flags to be set
576      * between _new() and _put() by the callback setter functions above.
577      *
578      * Thus we implement a couple safeguards here which ensure the above
579      * setters were used (or at least the implementor made manual changes
580      * in a compatible way).
581      *
582      * Note: All of these flags set here can change over the life time
583      * of the source. */
584     pa_assert(!(s->flags & PA_SOURCE_HW_VOLUME_CTRL) || s->set_volume);
585     pa_assert(!(s->flags & PA_SOURCE_DEFERRED_VOLUME) || s->write_volume);
586     pa_assert(!(s->flags & PA_SOURCE_HW_MUTE_CTRL) || s->set_mute);
587
588     /* XXX: Currently decibel volume is disabled for all sources that use volume
589      * sharing. When the master source supports decibel volume, it would be good
590      * to have the flag also in the filter source, but currently we don't do that
591      * so that the flags of the filter source never change when it's moved from
592      * a master source to another. One solution for this problem would be to
593      * remove user-visible volume altogether from filter sources when volume
594      * sharing is used, but the current approach was easier to implement... */
595     /* We always support decibel volumes in software, otherwise we leave it to
596      * the source implementor to set this flag as needed.
597      *
598      * Note: This flag can also change over the life time of the source. */
599     if (!(s->flags & PA_SOURCE_HW_VOLUME_CTRL) && !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
600         pa_source_enable_decibel_volume(s, true);
601         s->soft_volume = s->reference_volume;
602     }
603
604     /* If the source implementor support DB volumes by itself, we should always
605      * try and enable flat volumes too */
606     if ((s->flags & PA_SOURCE_DECIBEL_VOLUME))
607         enable_flat_volume(s, true);
608
609     if (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) {
610         pa_source *root_source = pa_source_get_master(s);
611
612         pa_assert(PA_LIKELY(root_source));
613
614         s->reference_volume = root_source->reference_volume;
615         pa_cvolume_remap(&s->reference_volume, &root_source->channel_map, &s->channel_map);
616
617         s->real_volume = root_source->real_volume;
618         pa_cvolume_remap(&s->real_volume, &root_source->channel_map, &s->channel_map);
619     } else
620         /* We assume that if the sink implementor changed the default
621          * volume he did so in real_volume, because that is the usual
622          * place where he is supposed to place his changes.  */
623         s->reference_volume = s->real_volume;
624
625     s->thread_info.soft_volume = s->soft_volume;
626     s->thread_info.soft_muted = s->muted;
627     pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
628
629     pa_assert((s->flags & PA_SOURCE_HW_VOLUME_CTRL)
630               || (s->base_volume == PA_VOLUME_NORM
631                   && ((s->flags & PA_SOURCE_DECIBEL_VOLUME || (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)))));
632     pa_assert(!(s->flags & PA_SOURCE_DECIBEL_VOLUME) || s->n_volume_steps == PA_VOLUME_NORM+1);
633     pa_assert(!(s->flags & PA_SOURCE_DYNAMIC_LATENCY) == !(s->thread_info.fixed_latency == 0));
634
635     if (s->suspend_cause)
636         pa_assert_se(source_set_state(s, PA_SOURCE_SUSPENDED, s->suspend_cause) == 0);
637     else
638         pa_assert_se(source_set_state(s, PA_SOURCE_IDLE, 0) == 0);
639
640     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_NEW, s->index);
641     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PUT], s);
642
643     /* This function must be called after the PA_CORE_HOOK_SOURCE_PUT hook,
644      * because module-switch-on-connect needs to know the old default source */
645     pa_core_update_default_source(s->core);
646 }
647
648 /* Called from main context */
649 void pa_source_unlink(pa_source *s) {
650     bool linked;
651     pa_source_output *o, PA_UNUSED *j = NULL;
652
653     pa_source_assert_ref(s);
654     pa_assert_ctl_context();
655
656     /* See pa_sink_unlink() for a couple of comments how this function
657      * works. */
658
659     if (s->unlink_requested)
660         return;
661
662     s->unlink_requested = true;
663
664     linked = PA_SOURCE_IS_LINKED(s->state);
665
666     if (linked)
667         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], s);
668
669     if (s->state != PA_SOURCE_UNLINKED)
670         pa_namereg_unregister(s->core, s->name);
671     pa_idxset_remove_by_data(s->core->sources, s, NULL);
672
673     pa_core_update_default_source(s->core);
674
675     if (s->card)
676         pa_idxset_remove_by_data(s->card->sources, s, NULL);
677
678     while ((o = pa_idxset_first(s->outputs, NULL))) {
679         pa_assert(o != j);
680         pa_source_output_kill(o);
681         j = o;
682     }
683
684     if (linked)
685         source_set_state(s, PA_SOURCE_UNLINKED, 0);
686     else
687         s->state = PA_SOURCE_UNLINKED;
688
689     reset_callbacks(s);
690
691     if (linked) {
692         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_REMOVE, s->index);
693         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK_POST], s);
694     }
695 }
696
697 /* Called from main context */
698 static void source_free(pa_object *o) {
699     pa_source *s = PA_SOURCE(o);
700
701     pa_assert(s);
702     pa_assert_ctl_context();
703     pa_assert(pa_source_refcnt(s) == 0);
704     pa_assert(!PA_SOURCE_IS_LINKED(s->state));
705
706     pa_log_info("Freeing source %u \"%s\"", s->index, s->name);
707
708     pa_source_volume_change_flush(s);
709
710     pa_idxset_free(s->outputs, NULL);
711     pa_hashmap_free(s->thread_info.outputs);
712
713     if (s->silence.memblock)
714         pa_memblock_unref(s->silence.memblock);
715
716     pa_xfree(s->name);
717     pa_xfree(s->driver);
718
719     if (s->proplist)
720         pa_proplist_free(s->proplist);
721
722     if (s->ports)
723         pa_hashmap_free(s->ports);
724
725     pa_xfree(s);
726 }
727
728 /* Called from main context, and not while the IO thread is active, please */
729 void pa_source_set_asyncmsgq(pa_source *s, pa_asyncmsgq *q) {
730     pa_source_assert_ref(s);
731     pa_assert_ctl_context();
732
733     s->asyncmsgq = q;
734 }
735
736 /* Called from main context, and not while the IO thread is active, please */
737 void pa_source_update_flags(pa_source *s, pa_source_flags_t mask, pa_source_flags_t value) {
738     pa_source_flags_t old_flags;
739     pa_source_output *output;
740     uint32_t idx;
741
742     pa_source_assert_ref(s);
743     pa_assert_ctl_context();
744
745     /* For now, allow only a minimal set of flags to be changed. */
746     pa_assert((mask & ~(PA_SOURCE_DYNAMIC_LATENCY|PA_SOURCE_LATENCY)) == 0);
747
748     old_flags = s->flags;
749     s->flags = (s->flags & ~mask) | (value & mask);
750
751     if (s->flags == old_flags)
752         return;
753
754     if ((s->flags & PA_SOURCE_LATENCY) != (old_flags & PA_SOURCE_LATENCY))
755         pa_log_debug("Source %s: LATENCY flag %s.", s->name, (s->flags & PA_SOURCE_LATENCY) ? "enabled" : "disabled");
756
757     if ((s->flags & PA_SOURCE_DYNAMIC_LATENCY) != (old_flags & PA_SOURCE_DYNAMIC_LATENCY))
758         pa_log_debug("Source %s: DYNAMIC_LATENCY flag %s.",
759                      s->name, (s->flags & PA_SOURCE_DYNAMIC_LATENCY) ? "enabled" : "disabled");
760
761     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
762     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_FLAGS_CHANGED], s);
763
764     PA_IDXSET_FOREACH(output, s->outputs, idx) {
765         if (output->destination_source)
766             pa_source_update_flags(output->destination_source, mask, value);
767     }
768 }
769
770 /* Called from IO context, or before _put() from main context */
771 void pa_source_set_rtpoll(pa_source *s, pa_rtpoll *p) {
772     pa_source_assert_ref(s);
773     pa_source_assert_io_context(s);
774
775     s->thread_info.rtpoll = p;
776 }
777
778 /* Called from main context */
779 int pa_source_update_status(pa_source*s) {
780     pa_source_assert_ref(s);
781     pa_assert_ctl_context();
782     pa_assert(PA_SOURCE_IS_LINKED(s->state));
783
784     if (s->state == PA_SOURCE_SUSPENDED)
785         return 0;
786
787     return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE, 0);
788 }
789
790 /* Called from any context - must be threadsafe */
791 void pa_source_set_mixer_dirty(pa_source *s, bool is_dirty) {
792     pa_atomic_store(&s->mixer_dirty, is_dirty ? 1 : 0);
793 }
794
795 /* Called from main context */
796 int pa_source_suspend(pa_source *s, bool suspend, pa_suspend_cause_t cause) {
797     pa_suspend_cause_t merged_cause;
798
799     pa_source_assert_ref(s);
800     pa_assert_ctl_context();
801     pa_assert(PA_SOURCE_IS_LINKED(s->state));
802     pa_assert(cause != 0);
803
804     if (s->monitor_of && cause != PA_SUSPEND_PASSTHROUGH)
805         return -PA_ERR_NOTSUPPORTED;
806
807     if (suspend)
808         merged_cause = s->suspend_cause | cause;
809     else
810         merged_cause = s->suspend_cause & ~cause;
811
812     if (!(merged_cause & PA_SUSPEND_SESSION) && (pa_atomic_load(&s->mixer_dirty) != 0)) {
813         /* This might look racy but isn't: If somebody sets mixer_dirty exactly here,
814            it'll be handled just fine. */
815         pa_source_set_mixer_dirty(s, false);
816         pa_log_debug("Mixer is now accessible. Updating alsa mixer settings.");
817         if (s->active_port && s->set_port) {
818             if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
819                 struct source_message_set_port msg = { .port = s->active_port, .ret = 0 };
820                 pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_PORT, &msg, 0, NULL) == 0);
821             }
822             else
823                 s->set_port(s, s->active_port);
824         }
825         else {
826             if (s->set_mute)
827                 s->set_mute(s);
828             if (s->set_volume)
829                 s->set_volume(s);
830         }
831     }
832
833     if (merged_cause)
834         return source_set_state(s, PA_SOURCE_SUSPENDED, merged_cause);
835     else
836         return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE, 0);
837 }
838
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;
843
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);
848
849     state = pa_sink_get_state(s->monitor_of);
850     suspend_cause = s->monitor_of->suspend_cause;
851
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;
859
860     if (state == PA_SINK_SUSPENDED || suspend_cause)
861         return source_set_state(s, PA_SOURCE_SUSPENDED, suspend_cause);
862
863     pa_assert(PA_SINK_IS_OPENED(state));
864
865     return source_set_state(s, pa_source_used_by(s) ? PA_SOURCE_RUNNING : PA_SOURCE_IDLE, 0);
866 }
867
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;
871     uint32_t idx;
872
873     pa_source_assert_ref(s);
874     pa_assert_ctl_context();
875     pa_assert(PA_SOURCE_IS_LINKED(s->state));
876
877     if (!q)
878         q = pa_queue_new();
879
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));
882
883         pa_source_output_ref(o);
884
885         if (pa_source_output_start_move(o) >= 0)
886             pa_queue_push(q, o);
887         else
888             pa_source_output_unref(o);
889     }
890
891     return q;
892 }
893
894 /* Called from main context */
895 void pa_source_move_all_finish(pa_source *s, pa_queue *q, bool save) {
896     pa_source_output *o;
897
898     pa_source_assert_ref(s);
899     pa_assert_ctl_context();
900     pa_assert(PA_SOURCE_IS_LINKED(s->state));
901     pa_assert(q);
902
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);
907
908         }
909         pa_source_output_unref(o);
910     }
911
912     pa_queue_free(q, NULL);
913 }
914
915 /* Called from main context */
916 void pa_source_move_all_fail(pa_queue *q) {
917     pa_source_output *o;
918
919     pa_assert_ctl_context();
920     pa_assert(q);
921
922     while ((o = PA_SOURCE_OUTPUT(pa_queue_pop(q)))) {
923         pa_source_output_fail_move(o);
924         pa_source_output_unref(o);
925     }
926
927     pa_queue_free(q, NULL);
928 }
929
930 /* Called from IO thread context */
931 void pa_source_process_rewind(pa_source *s, size_t nbytes) {
932     pa_source_output *o;
933     void *state = NULL;
934
935     pa_source_assert_ref(s);
936     pa_source_assert_io_context(s);
937     pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
938
939     if (nbytes <= 0)
940         return;
941
942     if (s->thread_info.state == PA_SOURCE_SUSPENDED)
943         return;
944
945     pa_log_debug("Processing rewind...");
946
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);
950     }
951 }
952
953 /* Called from IO thread context */
954 void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
955     pa_source_output *o;
956     void *state = NULL;
957
958     pa_source_assert_ref(s);
959     pa_source_assert_io_context(s);
960     pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
961     pa_assert(chunk);
962
963     if (s->thread_info.state == PA_SOURCE_SUSPENDED)
964         return;
965
966     if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&s->thread_info.soft_volume)) {
967         pa_memchunk vchunk = *chunk;
968
969         pa_memblock_ref(vchunk.memblock);
970         pa_memchunk_make_writable(&vchunk, 0);
971
972         if (s->thread_info.soft_muted || pa_cvolume_is_muted(&s->thread_info.soft_volume))
973             pa_silence_memchunk(&vchunk, &s->sample_spec);
974         else
975             pa_volume_memchunk(&vchunk, &s->sample_spec, &s->thread_info.soft_volume);
976
977         while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL))) {
978             pa_source_output_assert_ref(o);
979
980             if (!o->thread_info.direct_on_input)
981                 pa_source_output_push(o, &vchunk);
982         }
983
984         pa_memblock_unref(vchunk.memblock);
985     } else {
986
987         while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL))) {
988             pa_source_output_assert_ref(o);
989
990             if (!o->thread_info.direct_on_input)
991                 pa_source_output_push(o, chunk);
992         }
993     }
994 }
995
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);
1003     pa_assert(chunk);
1004
1005     if (s->thread_info.state == PA_SOURCE_SUSPENDED)
1006         return;
1007
1008     if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&s->thread_info.soft_volume)) {
1009         pa_memchunk vchunk = *chunk;
1010
1011         pa_memblock_ref(vchunk.memblock);
1012         pa_memchunk_make_writable(&vchunk, 0);
1013
1014         if (s->thread_info.soft_muted || pa_cvolume_is_muted(&s->thread_info.soft_volume))
1015             pa_silence_memchunk(&vchunk, &s->sample_spec);
1016         else
1017             pa_volume_memchunk(&vchunk, &s->sample_spec, &s->thread_info.soft_volume);
1018
1019         pa_source_output_push(o, &vchunk);
1020
1021         pa_memblock_unref(vchunk.memblock);
1022     } else
1023         pa_source_output_push(o, chunk);
1024 }
1025
1026 /* Called from main thread */
1027 int pa_source_reconfigure(pa_source *s, pa_sample_spec *spec, bool passthrough) {
1028     int ret;
1029     pa_sample_spec desired_spec;
1030     uint32_t default_rate = s->default_sample_rate;
1031     uint32_t alternate_rate = s->alternate_sample_rate;
1032     bool default_rate_is_usable = false;
1033     bool alternate_rate_is_usable = false;
1034     bool avoid_resampling = s->core->avoid_resampling;
1035
1036     /* We currently only try to reconfigure the sample rate */
1037
1038     if (pa_sample_spec_equal(spec, &s->sample_spec))
1039         return 0;
1040
1041     if (!s->reconfigure && !s->monitor_of)
1042         return -1;
1043
1044     if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough && !avoid_resampling)) {
1045         pa_log_debug("Default and alternate sample rates are the same, so there is no point in switching.");
1046         return -1;
1047     }
1048
1049     if (PA_SOURCE_IS_RUNNING(s->state)) {
1050         pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u Hz",
1051                     s->sample_spec.rate);
1052         return -1;
1053     }
1054
1055     if (s->monitor_of) {
1056         if (PA_SINK_IS_RUNNING(s->monitor_of->state)) {
1057             pa_log_info("Cannot update rate, this is a monitor source and the sink is running.");
1058             return -1;
1059         }
1060     }
1061
1062     if (PA_UNLIKELY(!pa_sample_spec_valid(spec)))
1063         return -1;
1064
1065     desired_spec = s->sample_spec;
1066
1067     if (passthrough) {
1068         /* We have to try to use the source output rate */
1069         desired_spec.rate = spec->rate;
1070
1071     } else if (avoid_resampling && (spec->rate >= default_rate || spec->rate >= alternate_rate)) {
1072         /* We just try to set the source output's sample rate if it's not too low */
1073         desired_spec.rate = spec->rate;
1074
1075     } else if (default_rate == spec->rate || alternate_rate == spec->rate) {
1076         /* We can directly try to use this rate */
1077         desired_spec.rate = spec->rate;
1078
1079     } else {
1080         /* See if we can pick a rate that results in less resampling effort */
1081         if (default_rate % 11025 == 0 && spec->rate % 11025 == 0)
1082             default_rate_is_usable = true;
1083         if (default_rate % 4000 == 0 && spec->rate % 4000 == 0)
1084             default_rate_is_usable = true;
1085         if (alternate_rate && alternate_rate % 11025 == 0 && spec->rate % 11025 == 0)
1086             alternate_rate_is_usable = true;
1087         if (alternate_rate && alternate_rate % 4000 == 0 && spec->rate % 4000 == 0)
1088             alternate_rate_is_usable = true;
1089
1090         if (alternate_rate_is_usable && !default_rate_is_usable)
1091             desired_spec.rate = alternate_rate;
1092         else
1093             desired_spec.rate = default_rate;
1094     }
1095
1096     if (pa_sample_spec_equal(&desired_spec, &s->sample_spec) && passthrough == pa_source_is_passthrough(s))
1097         return -1;
1098
1099     if (!passthrough && pa_source_used_by(s) > 0)
1100         return -1;
1101
1102     pa_log_debug("Suspending source %s due to changing the sample rate.", s->name);
1103     pa_source_suspend(s, true, PA_SUSPEND_INTERNAL);
1104
1105     if (s->reconfigure)
1106         ret = s->reconfigure(s, &desired_spec, passthrough);
1107     else {
1108         /* This is a monitor source. */
1109
1110         /* XXX: This code is written with non-passthrough streams in mind. I
1111          * have no idea whether the behaviour with passthrough streams is
1112          * sensible. */
1113         if (!passthrough) {
1114             pa_sample_spec old_spec = s->sample_spec;
1115
1116             s->sample_spec = desired_spec;
1117             ret = pa_sink_reconfigure(s->monitor_of, &desired_spec, false);
1118
1119             if (ret < 0) {
1120                 /* Changing the sink rate failed, roll back the old rate for
1121                  * the monitor source. Why did we set the source rate before
1122                  * calling pa_sink_reconfigure(), you may ask. The reason is
1123                  * that pa_sink_reconfigure() tries to update the monitor
1124                  * source rate, but we are already in the process of updating
1125                  * the monitor source rate, so there's a risk of entering an
1126                  * infinite loop. Setting the source rate before calling
1127                  * pa_sink_reconfigure() makes the rate == s->sample_spec.rate
1128                  * check in the beginning of this function return early, so we
1129                  * avoid looping. */
1130                 s->sample_spec = old_spec;
1131             }
1132         } else
1133             ret = -1;
1134     }
1135
1136     if (ret >= 0) {
1137         uint32_t idx;
1138         pa_source_output *o;
1139
1140         PA_IDXSET_FOREACH(o, s->outputs, idx) {
1141             if (o->state == PA_SOURCE_OUTPUT_CORKED)
1142                 pa_source_output_update_rate(o);
1143         }
1144
1145         pa_log_info("Changed sampling rate successfully");
1146     }
1147
1148     pa_source_suspend(s, false, PA_SUSPEND_INTERNAL);
1149
1150     return ret;
1151 }
1152
1153 /* Called from main thread */
1154 pa_usec_t pa_source_get_latency(pa_source *s) {
1155     int64_t usec;
1156
1157     pa_source_assert_ref(s);
1158     pa_assert_ctl_context();
1159     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1160
1161     if (s->state == PA_SOURCE_SUSPENDED)
1162         return 0;
1163
1164     if (!(s->flags & PA_SOURCE_LATENCY))
1165         return 0;
1166
1167     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL) == 0);
1168
1169     /* The return value is unsigned, so check that the offset can be added to usec without
1170      * underflowing. */
1171     if (-s->port_latency_offset <= usec)
1172         usec += s->port_latency_offset;
1173     else
1174         usec = 0;
1175
1176     return (pa_usec_t)usec;
1177 }
1178
1179 /* Called from IO thread */
1180 int64_t pa_source_get_latency_within_thread(pa_source *s, bool allow_negative) {
1181     int64_t usec = 0;
1182     pa_msgobject *o;
1183
1184     pa_source_assert_ref(s);
1185     pa_source_assert_io_context(s);
1186     pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
1187
1188     /* The returned value is supposed to be in the time domain of the sound card! */
1189
1190     if (s->thread_info.state == PA_SOURCE_SUSPENDED)
1191         return 0;
1192
1193     if (!(s->flags & PA_SOURCE_LATENCY))
1194         return 0;
1195
1196     o = PA_MSGOBJECT(s);
1197
1198     /* FIXME: We probably should make this a proper vtable callback instead of going through process_msg() */
1199
1200     o->process_msg(o, PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL);
1201
1202     /* If allow_negative is false, the call should only return positive values, */
1203     usec += s->thread_info.port_latency_offset;
1204     if (!allow_negative && usec < 0)
1205         usec = 0;
1206
1207     return usec;
1208 }
1209
1210 /* Called from the main thread (and also from the IO thread while the main
1211  * thread is waiting).
1212  *
1213  * When a source uses volume sharing, it never has the PA_SOURCE_FLAT_VOLUME flag
1214  * set. Instead, flat volume mode is detected by checking whether the root source
1215  * has the flag set. */
1216 bool pa_source_flat_volume_enabled(pa_source *s) {
1217     pa_source_assert_ref(s);
1218
1219     s = pa_source_get_master(s);
1220
1221     if (PA_LIKELY(s))
1222         return (s->flags & PA_SOURCE_FLAT_VOLUME);
1223     else
1224         return false;
1225 }
1226
1227 /* Called from the main thread (and also from the IO thread while the main
1228  * thread is waiting). */
1229 pa_source *pa_source_get_master(pa_source *s) {
1230     pa_source_assert_ref(s);
1231
1232     while (s && (s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1233         if (PA_UNLIKELY(!s->output_from_master))
1234             return NULL;
1235
1236         s = s->output_from_master->source;
1237     }
1238
1239     return s;
1240 }
1241
1242 /* Called from main context */
1243 bool pa_source_is_filter(pa_source *s) {
1244     pa_source_assert_ref(s);
1245
1246     return (s->output_from_master != NULL);
1247 }
1248
1249 /* Called from main context */
1250 bool pa_source_is_passthrough(pa_source *s) {
1251
1252     pa_source_assert_ref(s);
1253
1254     /* NB Currently only monitor sources support passthrough mode */
1255     return (s->monitor_of && pa_sink_is_passthrough(s->monitor_of));
1256 }
1257
1258 /* Called from main context */
1259 void pa_source_enter_passthrough(pa_source *s) {
1260     pa_cvolume volume;
1261
1262     /* set the volume to NORM */
1263     s->saved_volume = *pa_source_get_volume(s, true);
1264     s->saved_save_volume = s->save_volume;
1265
1266     pa_cvolume_set(&volume, s->sample_spec.channels, PA_MIN(s->base_volume, PA_VOLUME_NORM));
1267     pa_source_set_volume(s, &volume, true, false);
1268 }
1269
1270 /* Called from main context */
1271 void pa_source_leave_passthrough(pa_source *s) {
1272     /* Restore source volume to what it was before we entered passthrough mode */
1273     pa_source_set_volume(s, &s->saved_volume, true, s->saved_save_volume);
1274
1275     pa_cvolume_init(&s->saved_volume);
1276     s->saved_save_volume = false;
1277 }
1278
1279 /* Called from main context. */
1280 static void compute_reference_ratio(pa_source_output *o) {
1281     unsigned c = 0;
1282     pa_cvolume remapped;
1283     pa_cvolume ratio;
1284
1285     pa_assert(o);
1286     pa_assert(pa_source_flat_volume_enabled(o->source));
1287
1288     /*
1289      * Calculates the reference ratio from the source's reference
1290      * volume. This basically calculates:
1291      *
1292      * o->reference_ratio = o->volume / o->source->reference_volume
1293      */
1294
1295     remapped = o->source->reference_volume;
1296     pa_cvolume_remap(&remapped, &o->source->channel_map, &o->channel_map);
1297
1298     ratio = o->reference_ratio;
1299
1300     for (c = 0; c < o->sample_spec.channels; c++) {
1301
1302         /* We don't update when the source volume is 0 anyway */
1303         if (remapped.values[c] <= PA_VOLUME_MUTED)
1304             continue;
1305
1306         /* Don't update the reference ratio unless necessary */
1307         if (pa_sw_volume_multiply(
1308                     ratio.values[c],
1309                     remapped.values[c]) == o->volume.values[c])
1310             continue;
1311
1312         ratio.values[c] = pa_sw_volume_divide(
1313                 o->volume.values[c],
1314                 remapped.values[c]);
1315     }
1316
1317     pa_source_output_set_reference_ratio(o, &ratio);
1318 }
1319
1320 /* Called from main context. Only called for the root source in volume sharing
1321  * cases, except for internal recursive calls. */
1322 static void compute_reference_ratios(pa_source *s) {
1323     uint32_t idx;
1324     pa_source_output *o;
1325
1326     pa_source_assert_ref(s);
1327     pa_assert_ctl_context();
1328     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1329     pa_assert(pa_source_flat_volume_enabled(s));
1330
1331     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1332         compute_reference_ratio(o);
1333
1334         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)
1335                 && PA_SOURCE_IS_LINKED(o->destination_source->state))
1336             compute_reference_ratios(o->destination_source);
1337     }
1338 }
1339
1340 /* Called from main context. Only called for the root source in volume sharing
1341  * cases, except for internal recursive calls. */
1342 static void compute_real_ratios(pa_source *s) {
1343     pa_source_output *o;
1344     uint32_t idx;
1345
1346     pa_source_assert_ref(s);
1347     pa_assert_ctl_context();
1348     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1349     pa_assert(pa_source_flat_volume_enabled(s));
1350
1351     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1352         unsigned c;
1353         pa_cvolume remapped;
1354
1355         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1356             /* The origin source uses volume sharing, so this input's real ratio
1357              * is handled as a special case - the real ratio must be 0 dB, and
1358              * as a result i->soft_volume must equal i->volume_factor. */
1359             pa_cvolume_reset(&o->real_ratio, o->real_ratio.channels);
1360             o->soft_volume = o->volume_factor;
1361
1362             if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1363                 compute_real_ratios(o->destination_source);
1364
1365             continue;
1366         }
1367
1368         /*
1369          * This basically calculates:
1370          *
1371          * i->real_ratio := i->volume / s->real_volume
1372          * i->soft_volume := i->real_ratio * i->volume_factor
1373          */
1374
1375         remapped = s->real_volume;
1376         pa_cvolume_remap(&remapped, &s->channel_map, &o->channel_map);
1377
1378         o->real_ratio.channels = o->sample_spec.channels;
1379         o->soft_volume.channels = o->sample_spec.channels;
1380
1381         for (c = 0; c < o->sample_spec.channels; c++) {
1382
1383             if (remapped.values[c] <= PA_VOLUME_MUTED) {
1384                 /* We leave o->real_ratio untouched */
1385                 o->soft_volume.values[c] = PA_VOLUME_MUTED;
1386                 continue;
1387             }
1388
1389             /* Don't lose accuracy unless necessary */
1390             if (pa_sw_volume_multiply(
1391                         o->real_ratio.values[c],
1392                         remapped.values[c]) != o->volume.values[c])
1393
1394                 o->real_ratio.values[c] = pa_sw_volume_divide(
1395                         o->volume.values[c],
1396                         remapped.values[c]);
1397
1398             o->soft_volume.values[c] = pa_sw_volume_multiply(
1399                     o->real_ratio.values[c],
1400                     o->volume_factor.values[c]);
1401         }
1402
1403         /* We don't copy the soft_volume to the thread_info data
1404          * here. That must be done by the caller */
1405     }
1406 }
1407
1408 static pa_cvolume *cvolume_remap_minimal_impact(
1409         pa_cvolume *v,
1410         const pa_cvolume *template,
1411         const pa_channel_map *from,
1412         const pa_channel_map *to) {
1413
1414     pa_cvolume t;
1415
1416     pa_assert(v);
1417     pa_assert(template);
1418     pa_assert(from);
1419     pa_assert(to);
1420     pa_assert(pa_cvolume_compatible_with_channel_map(v, from));
1421     pa_assert(pa_cvolume_compatible_with_channel_map(template, to));
1422
1423     /* Much like pa_cvolume_remap(), but tries to minimize impact when
1424      * mapping from source output to source volumes:
1425      *
1426      * If template is a possible remapping from v it is used instead
1427      * of remapping anew.
1428      *
1429      * If the channel maps don't match we set an all-channel volume on
1430      * the source to ensure that changing a volume on one stream has no
1431      * effect that cannot be compensated for in another stream that
1432      * does not have the same channel map as the source. */
1433
1434     if (pa_channel_map_equal(from, to))
1435         return v;
1436
1437     t = *template;
1438     if (pa_cvolume_equal(pa_cvolume_remap(&t, to, from), v)) {
1439         *v = *template;
1440         return v;
1441     }
1442
1443     pa_cvolume_set(v, to->channels, pa_cvolume_max(v));
1444     return v;
1445 }
1446
1447 /* Called from main thread. Only called for the root source in volume sharing
1448  * cases, except for internal recursive calls. */
1449 static void get_maximum_output_volume(pa_source *s, pa_cvolume *max_volume, const pa_channel_map *channel_map) {
1450     pa_source_output *o;
1451     uint32_t idx;
1452
1453     pa_source_assert_ref(s);
1454     pa_assert(max_volume);
1455     pa_assert(channel_map);
1456     pa_assert(pa_source_flat_volume_enabled(s));
1457
1458     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1459         pa_cvolume remapped;
1460
1461         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1462             if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1463                 get_maximum_output_volume(o->destination_source, max_volume, channel_map);
1464
1465             /* Ignore this output. The origin source uses volume sharing, so this
1466              * output's volume will be set to be equal to the root source's real
1467              * volume. Obviously this output's current volume must not then
1468              * affect what the root source's real volume will be. */
1469             continue;
1470         }
1471
1472         remapped = o->volume;
1473         cvolume_remap_minimal_impact(&remapped, max_volume, &o->channel_map, channel_map);
1474         pa_cvolume_merge(max_volume, max_volume, &remapped);
1475     }
1476 }
1477
1478 /* Called from main thread. Only called for the root source in volume sharing
1479  * cases, except for internal recursive calls. */
1480 static bool has_outputs(pa_source *s) {
1481     pa_source_output *o;
1482     uint32_t idx;
1483
1484     pa_source_assert_ref(s);
1485
1486     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1487         if (!o->destination_source || !(o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER) || has_outputs(o->destination_source))
1488             return true;
1489     }
1490
1491     return false;
1492 }
1493
1494 /* Called from main thread. Only called for the root source in volume sharing
1495  * cases, except for internal recursive calls. */
1496 static void update_real_volume(pa_source *s, const pa_cvolume *new_volume, pa_channel_map *channel_map) {
1497     pa_source_output *o;
1498     uint32_t idx;
1499
1500     pa_source_assert_ref(s);
1501     pa_assert(new_volume);
1502     pa_assert(channel_map);
1503
1504     s->real_volume = *new_volume;
1505     pa_cvolume_remap(&s->real_volume, channel_map, &s->channel_map);
1506
1507     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1508         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1509             if (pa_source_flat_volume_enabled(s)) {
1510                 pa_cvolume new_output_volume;
1511
1512                 /* Follow the root source's real volume. */
1513                 new_output_volume = *new_volume;
1514                 pa_cvolume_remap(&new_output_volume, channel_map, &o->channel_map);
1515                 pa_source_output_set_volume_direct(o, &new_output_volume);
1516                 compute_reference_ratio(o);
1517             }
1518
1519             if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1520                 update_real_volume(o->destination_source, new_volume, channel_map);
1521         }
1522     }
1523 }
1524
1525 /* Called from main thread. Only called for the root source in shared volume
1526  * cases. */
1527 static void compute_real_volume(pa_source *s) {
1528     pa_source_assert_ref(s);
1529     pa_assert_ctl_context();
1530     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1531     pa_assert(pa_source_flat_volume_enabled(s));
1532     pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1533
1534     /* This determines the maximum volume of all streams and sets
1535      * s->real_volume accordingly. */
1536
1537     if (!has_outputs(s)) {
1538         /* In the special case that we have no source outputs we leave the
1539          * volume unmodified. */
1540         update_real_volume(s, &s->reference_volume, &s->channel_map);
1541         return;
1542     }
1543
1544     pa_cvolume_mute(&s->real_volume, s->channel_map.channels);
1545
1546     /* First let's determine the new maximum volume of all outputs
1547      * connected to this source */
1548     get_maximum_output_volume(s, &s->real_volume, &s->channel_map);
1549     update_real_volume(s, &s->real_volume, &s->channel_map);
1550
1551     /* Then, let's update the real ratios/soft volumes of all outputs
1552      * connected to this source */
1553     compute_real_ratios(s);
1554 }
1555
1556 /* Called from main thread. Only called for the root source in shared volume
1557  * cases, except for internal recursive calls. */
1558 static void propagate_reference_volume(pa_source *s) {
1559     pa_source_output *o;
1560     uint32_t idx;
1561
1562     pa_source_assert_ref(s);
1563     pa_assert_ctl_context();
1564     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1565     pa_assert(pa_source_flat_volume_enabled(s));
1566
1567     /* This is called whenever the source volume changes that is not
1568      * caused by a source output volume change. We need to fix up the
1569      * source output volumes accordingly */
1570
1571     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1572         pa_cvolume new_volume;
1573
1574         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1575             if (PA_SOURCE_IS_LINKED(o->destination_source->state))
1576                 propagate_reference_volume(o->destination_source);
1577
1578             /* Since the origin source uses volume sharing, this output's volume
1579              * needs to be updated to match the root source's real volume, but
1580              * that will be done later in update_real_volume(). */
1581             continue;
1582         }
1583
1584         /* This basically calculates:
1585          *
1586          * o->volume := o->reference_volume * o->reference_ratio  */
1587
1588         new_volume = s->reference_volume;
1589         pa_cvolume_remap(&new_volume, &s->channel_map, &o->channel_map);
1590         pa_sw_cvolume_multiply(&new_volume, &new_volume, &o->reference_ratio);
1591         pa_source_output_set_volume_direct(o, &new_volume);
1592     }
1593 }
1594
1595 /* Called from main thread. Only called for the root source in volume sharing
1596  * cases, except for internal recursive calls. The return value indicates
1597  * whether any reference volume actually changed. */
1598 static bool update_reference_volume(pa_source *s, const pa_cvolume *v, const pa_channel_map *channel_map, bool save) {
1599     pa_cvolume volume;
1600     bool reference_volume_changed;
1601     pa_source_output *o;
1602     uint32_t idx;
1603
1604     pa_source_assert_ref(s);
1605     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1606     pa_assert(v);
1607     pa_assert(channel_map);
1608     pa_assert(pa_cvolume_valid(v));
1609
1610     volume = *v;
1611     pa_cvolume_remap(&volume, channel_map, &s->channel_map);
1612
1613     reference_volume_changed = !pa_cvolume_equal(&volume, &s->reference_volume);
1614     pa_source_set_reference_volume_direct(s, &volume);
1615
1616     s->save_volume = (!reference_volume_changed && s->save_volume) || save;
1617
1618     if (!reference_volume_changed && !(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1619         /* If the root source's volume doesn't change, then there can't be any
1620          * changes in the other source in the source tree either.
1621          *
1622          * It's probably theoretically possible that even if the root source's
1623          * volume changes slightly, some filter source doesn't change its volume
1624          * due to rounding errors. If that happens, we still want to propagate
1625          * the changed root source volume to the sources connected to the
1626          * intermediate source that didn't change its volume. This theoretical
1627          * possibility is the reason why we have that !(s->flags &
1628          * PA_SOURCE_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
1629          * notice even if we returned here false always if
1630          * reference_volume_changed is false. */
1631         return false;
1632
1633     PA_IDXSET_FOREACH(o, s->outputs, idx) {
1634         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)
1635                 && PA_SOURCE_IS_LINKED(o->destination_source->state))
1636             update_reference_volume(o->destination_source, v, channel_map, false);
1637     }
1638
1639     return true;
1640 }
1641
1642 /* Called from main thread */
1643 void pa_source_set_volume(
1644         pa_source *s,
1645         const pa_cvolume *volume,
1646         bool send_msg,
1647         bool save) {
1648
1649     pa_cvolume new_reference_volume, root_real_volume;
1650     pa_source *root_source;
1651
1652     pa_source_assert_ref(s);
1653     pa_assert_ctl_context();
1654     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1655     pa_assert(!volume || pa_cvolume_valid(volume));
1656     pa_assert(volume || pa_source_flat_volume_enabled(s));
1657     pa_assert(!volume || volume->channels == 1 || pa_cvolume_compatible(volume, &s->sample_spec));
1658
1659     /* make sure we don't change the volume in PASSTHROUGH mode ...
1660      * ... *except* if we're being invoked to reset the volume to ensure 0 dB gain */
1661     if (pa_source_is_passthrough(s) && (!volume || !pa_cvolume_is_norm(volume))) {
1662         pa_log_warn("Cannot change volume, source is monitor of a PASSTHROUGH sink");
1663         return;
1664     }
1665
1666     /* In case of volume sharing, the volume is set for the root source first,
1667      * from which it's then propagated to the sharing sources. */
1668     root_source = pa_source_get_master(s);
1669
1670     if (PA_UNLIKELY(!root_source))
1671         return;
1672
1673     /* As a special exception we accept mono volumes on all sources --
1674      * even on those with more complex channel maps */
1675
1676     if (volume) {
1677         if (pa_cvolume_compatible(volume, &s->sample_spec))
1678             new_reference_volume = *volume;
1679         else {
1680             new_reference_volume = s->reference_volume;
1681             pa_cvolume_scale(&new_reference_volume, pa_cvolume_max(volume));
1682         }
1683
1684         pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
1685
1686         if (update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save)) {
1687             if (pa_source_flat_volume_enabled(root_source)) {
1688                 /* OK, propagate this volume change back to the outputs */
1689                 propagate_reference_volume(root_source);
1690
1691                 /* And now recalculate the real volume */
1692                 compute_real_volume(root_source);
1693             } else
1694                 update_real_volume(root_source, &root_source->reference_volume, &root_source->channel_map);
1695         }
1696
1697     } else {
1698         /* If volume is NULL we synchronize the source's real and
1699          * reference volumes with the stream volumes. */
1700
1701         pa_assert(pa_source_flat_volume_enabled(root_source));
1702
1703         /* Ok, let's determine the new real volume */
1704         compute_real_volume(root_source);
1705
1706         /* To propagate the reference volume from the filter to the root source,
1707          * we first take the real volume from the root source and remap it to
1708          * match the filter. Then, we merge in the reference volume from the
1709          * filter on top of this, and remap it back to the root source channel
1710          * count and map */
1711         root_real_volume = root_source->real_volume;
1712         /* First we remap root's real volume to filter channel count and map if needed */
1713         if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
1714             pa_cvolume_remap(&root_real_volume, &root_source->channel_map, &s->channel_map);
1715         /* Then let's 'push' the reference volume if necessary */
1716         pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_real_volume);
1717         /* If the source and its root don't have the same number of channels, we need to remap back */
1718         if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
1719             pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
1720
1721         update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save);
1722
1723         /* Now that the reference volume is updated, we can update the streams'
1724          * reference ratios. */
1725         compute_reference_ratios(root_source);
1726     }
1727
1728     if (root_source->set_volume) {
1729         /* If we have a function set_volume(), then we do not apply a
1730          * soft volume by default. However, set_volume() is free to
1731          * apply one to root_source->soft_volume */
1732
1733         pa_cvolume_reset(&root_source->soft_volume, root_source->sample_spec.channels);
1734         if (!(root_source->flags & PA_SOURCE_DEFERRED_VOLUME))
1735             root_source->set_volume(root_source);
1736
1737     } else
1738         /* If we have no function set_volume(), then the soft volume
1739          * becomes the real volume */
1740         root_source->soft_volume = root_source->real_volume;
1741
1742     /* This tells the source that soft volume and/or real volume changed */
1743     if (send_msg)
1744         pa_assert_se(pa_asyncmsgq_send(root_source->asyncmsgq, PA_MSGOBJECT(root_source), PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL) == 0);
1745 }
1746
1747 /* Called from the io thread if sync volume is used, otherwise from the main thread.
1748  * Only to be called by source implementor */
1749 void pa_source_set_soft_volume(pa_source *s, const pa_cvolume *volume) {
1750
1751     pa_source_assert_ref(s);
1752     pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1753
1754     if (s->flags & PA_SOURCE_DEFERRED_VOLUME)
1755         pa_source_assert_io_context(s);
1756     else
1757         pa_assert_ctl_context();
1758
1759     if (!volume)
1760         pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
1761     else
1762         s->soft_volume = *volume;
1763
1764     if (PA_SOURCE_IS_LINKED(s->state) && !(s->flags & PA_SOURCE_DEFERRED_VOLUME))
1765         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_VOLUME, NULL, 0, NULL) == 0);
1766     else
1767         s->thread_info.soft_volume = s->soft_volume;
1768 }
1769
1770 /* Called from the main thread. Only called for the root source in volume sharing
1771  * cases, except for internal recursive calls. */
1772 static void propagate_real_volume(pa_source *s, const pa_cvolume *old_real_volume) {
1773     pa_source_output *o;
1774     uint32_t idx;
1775
1776     pa_source_assert_ref(s);
1777     pa_assert(old_real_volume);
1778     pa_assert_ctl_context();
1779     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1780
1781     /* This is called when the hardware's real volume changes due to
1782      * some external event. We copy the real volume into our
1783      * reference volume and then rebuild the stream volumes based on
1784      * i->real_ratio which should stay fixed. */
1785
1786     if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) {
1787         if (pa_cvolume_equal(old_real_volume, &s->real_volume))
1788             return;
1789
1790         /* 1. Make the real volume the reference volume */
1791         update_reference_volume(s, &s->real_volume, &s->channel_map, true);
1792     }
1793
1794     if (pa_source_flat_volume_enabled(s)) {
1795         PA_IDXSET_FOREACH(o, s->outputs, idx) {
1796             pa_cvolume new_volume;
1797
1798             /* 2. Since the source's reference and real volumes are equal
1799              * now our ratios should be too. */
1800             pa_source_output_set_reference_ratio(o, &o->real_ratio);
1801
1802             /* 3. Recalculate the new stream reference volume based on the
1803              * reference ratio and the sink's reference volume.
1804              *
1805              * This basically calculates:
1806              *
1807              * o->volume = s->reference_volume * o->reference_ratio
1808              *
1809              * This is identical to propagate_reference_volume() */
1810             new_volume = s->reference_volume;
1811             pa_cvolume_remap(&new_volume, &s->channel_map, &o->channel_map);
1812             pa_sw_cvolume_multiply(&new_volume, &new_volume, &o->reference_ratio);
1813             pa_source_output_set_volume_direct(o, &new_volume);
1814
1815             if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)
1816                     && PA_SOURCE_IS_LINKED(o->destination_source->state))
1817                 propagate_real_volume(o->destination_source, old_real_volume);
1818         }
1819     }
1820
1821     /* Something got changed in the hardware. It probably makes sense
1822      * to save changed hw settings given that hw volume changes not
1823      * triggered by PA are almost certainly done by the user. */
1824     if (!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
1825         s->save_volume = true;
1826 }
1827
1828 /* Called from io thread */
1829 void pa_source_update_volume_and_mute(pa_source *s) {
1830     pa_assert(s);
1831     pa_source_assert_io_context(s);
1832
1833     pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_UPDATE_VOLUME_AND_MUTE, NULL, 0, NULL, NULL);
1834 }
1835
1836 /* Called from main thread */
1837 const pa_cvolume *pa_source_get_volume(pa_source *s, bool force_refresh) {
1838     pa_source_assert_ref(s);
1839     pa_assert_ctl_context();
1840     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1841
1842     if (s->refresh_volume || force_refresh) {
1843         struct pa_cvolume old_real_volume;
1844
1845         pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1846
1847         old_real_volume = s->real_volume;
1848
1849         if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_volume)
1850             s->get_volume(s);
1851
1852         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_VOLUME, NULL, 0, NULL) == 0);
1853
1854         update_real_volume(s, &s->real_volume, &s->channel_map);
1855         propagate_real_volume(s, &old_real_volume);
1856     }
1857
1858     return &s->reference_volume;
1859 }
1860
1861 /* Called from main thread. In volume sharing cases, only the root source may
1862  * call this. */
1863 void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_real_volume) {
1864     pa_cvolume old_real_volume;
1865
1866     pa_source_assert_ref(s);
1867     pa_assert_ctl_context();
1868     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1869     pa_assert(!(s->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER));
1870
1871     /* The source implementor may call this if the volume changed to make sure everyone is notified */
1872
1873     old_real_volume = s->real_volume;
1874     update_real_volume(s, new_real_volume, &s->channel_map);
1875     propagate_real_volume(s, &old_real_volume);
1876 }
1877
1878 /* Called from main thread */
1879 void pa_source_set_mute(pa_source *s, bool mute, bool save) {
1880     bool old_muted;
1881
1882     pa_source_assert_ref(s);
1883     pa_assert_ctl_context();
1884
1885     old_muted = s->muted;
1886
1887     if (mute == old_muted) {
1888         s->save_muted |= save;
1889         return;
1890     }
1891
1892     s->muted = mute;
1893     s->save_muted = save;
1894
1895     if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->set_mute) {
1896         s->set_mute_in_progress = true;
1897         s->set_mute(s);
1898         s->set_mute_in_progress = false;
1899     }
1900
1901     if (!PA_SOURCE_IS_LINKED(s->state))
1902         return;
1903
1904     pa_log_debug("The mute of source %s changed from %s to %s.", s->name, pa_yes_no(old_muted), pa_yes_no(mute));
1905     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MUTE, NULL, 0, NULL) == 0);
1906     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1907     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_MUTE_CHANGED], s);
1908 }
1909
1910 /* Called from main thread */
1911 bool pa_source_get_mute(pa_source *s, bool force_refresh) {
1912
1913     pa_source_assert_ref(s);
1914     pa_assert_ctl_context();
1915     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1916
1917     if ((s->refresh_muted || force_refresh) && s->get_mute) {
1918         bool mute;
1919
1920         if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
1921             if (pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MUTE, &mute, 0, NULL) >= 0)
1922                 pa_source_mute_changed(s, mute);
1923         } else {
1924             if (s->get_mute(s, &mute) >= 0)
1925                 pa_source_mute_changed(s, mute);
1926         }
1927     }
1928
1929     return s->muted;
1930 }
1931
1932 /* Called from main thread */
1933 void pa_source_mute_changed(pa_source *s, bool new_muted) {
1934     pa_source_assert_ref(s);
1935     pa_assert_ctl_context();
1936     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1937
1938     if (s->set_mute_in_progress)
1939         return;
1940
1941     /* pa_source_set_mute() does this same check, so this may appear redundant,
1942      * but we must have this here also, because the save parameter of
1943      * pa_source_set_mute() would otherwise have unintended side effects
1944      * (saving the mute state when it shouldn't be saved). */
1945     if (new_muted == s->muted)
1946         return;
1947
1948     pa_source_set_mute(s, new_muted, true);
1949 }
1950
1951 /* Called from main thread */
1952 bool pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist *p) {
1953     pa_source_assert_ref(s);
1954     pa_assert_ctl_context();
1955
1956     if (p)
1957         pa_proplist_update(s->proplist, mode, p);
1958
1959     if (PA_SOURCE_IS_LINKED(s->state)) {
1960         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], s);
1961         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1962     }
1963
1964     return true;
1965 }
1966
1967 /* Called from main thread */
1968 /* FIXME -- this should be dropped and be merged into pa_source_update_proplist() */
1969 void pa_source_set_description(pa_source *s, const char *description) {
1970     const char *old;
1971     pa_source_assert_ref(s);
1972     pa_assert_ctl_context();
1973
1974     if (!description && !pa_proplist_contains(s->proplist, PA_PROP_DEVICE_DESCRIPTION))
1975         return;
1976
1977     old = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
1978
1979     if (old && description && pa_streq(old, description))
1980         return;
1981
1982     if (description)
1983         pa_proplist_sets(s->proplist, PA_PROP_DEVICE_DESCRIPTION, description);
1984     else
1985         pa_proplist_unset(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
1986
1987     if (PA_SOURCE_IS_LINKED(s->state)) {
1988         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
1989         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], s);
1990     }
1991 }
1992
1993 /* Called from main thread */
1994 unsigned pa_source_linked_by(pa_source *s) {
1995     pa_source_assert_ref(s);
1996     pa_assert_ctl_context();
1997     pa_assert(PA_SOURCE_IS_LINKED(s->state));
1998
1999     return pa_idxset_size(s->outputs);
2000 }
2001
2002 /* Called from main thread */
2003 unsigned pa_source_used_by(pa_source *s) {
2004     unsigned ret;
2005
2006     pa_source_assert_ref(s);
2007     pa_assert_ctl_context();
2008     pa_assert(PA_SOURCE_IS_LINKED(s->state));
2009
2010     ret = pa_idxset_size(s->outputs);
2011     pa_assert(ret >= s->n_corked);
2012
2013     return ret - s->n_corked;
2014 }
2015
2016 /* Called from main thread */
2017 unsigned pa_source_check_suspend(pa_source *s, pa_source_output *ignore) {
2018     unsigned ret;
2019     pa_source_output *o;
2020     uint32_t idx;
2021
2022     pa_source_assert_ref(s);
2023     pa_assert_ctl_context();
2024
2025     if (!PA_SOURCE_IS_LINKED(s->state))
2026         return 0;
2027
2028     ret = 0;
2029
2030     PA_IDXSET_FOREACH(o, s->outputs, idx) {
2031         pa_source_output_state_t st;
2032
2033         if (o == ignore)
2034             continue;
2035
2036         st = pa_source_output_get_state(o);
2037
2038         /* We do not assert here. It is perfectly valid for a source output to
2039          * be in the INIT state (i.e. created, marked done but not yet put)
2040          * and we should not care if it's unlinked as it won't contribute
2041          * towards our busy status.
2042          */
2043         if (!PA_SOURCE_OUTPUT_IS_LINKED(st))
2044             continue;
2045
2046         if (st == PA_SOURCE_OUTPUT_CORKED)
2047             continue;
2048
2049         if (o->flags & PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND)
2050             continue;
2051
2052         ret ++;
2053     }
2054
2055     return ret;
2056 }
2057
2058 const char *pa_source_state_to_string(pa_source_state_t state) {
2059     switch (state) {
2060         case PA_SOURCE_INIT:          return "INIT";
2061         case PA_SOURCE_IDLE:          return "IDLE";
2062         case PA_SOURCE_RUNNING:       return "RUNNING";
2063         case PA_SOURCE_SUSPENDED:     return "SUSPENDED";
2064         case PA_SOURCE_UNLINKED:      return "UNLINKED";
2065         case PA_SOURCE_INVALID_STATE: return "INVALID_STATE";
2066     }
2067
2068     pa_assert_not_reached();
2069 }
2070
2071 /* Called from the IO thread */
2072 static void sync_output_volumes_within_thread(pa_source *s) {
2073     pa_source_output *o;
2074     void *state = NULL;
2075
2076     pa_source_assert_ref(s);
2077     pa_source_assert_io_context(s);
2078
2079     PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
2080         if (pa_cvolume_equal(&o->thread_info.soft_volume, &o->soft_volume))
2081             continue;
2082
2083         o->thread_info.soft_volume = o->soft_volume;
2084         //pa_source_output_request_rewind(o, 0, true, false, false);
2085     }
2086 }
2087
2088 /* Called from the IO thread. Only called for the root source in volume sharing
2089  * cases, except for internal recursive calls. */
2090 static void set_shared_volume_within_thread(pa_source *s) {
2091     pa_source_output *o;
2092     void *state = NULL;
2093
2094     pa_source_assert_ref(s);
2095
2096     PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED, NULL, 0, NULL);
2097
2098     PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state) {
2099         if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER))
2100             set_shared_volume_within_thread(o->destination_source);
2101     }
2102 }
2103
2104 /* Called from IO thread, except when it is not */
2105 int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
2106     pa_source *s = PA_SOURCE(object);
2107     pa_source_assert_ref(s);
2108
2109     switch ((pa_source_message_t) code) {
2110
2111         case PA_SOURCE_MESSAGE_ADD_OUTPUT: {
2112             pa_source_output *o = PA_SOURCE_OUTPUT(userdata);
2113
2114             pa_hashmap_put(s->thread_info.outputs, PA_UINT32_TO_PTR(o->index), pa_source_output_ref(o));
2115
2116             if (o->direct_on_input) {
2117                 o->thread_info.direct_on_input = o->direct_on_input;
2118                 pa_hashmap_put(o->thread_info.direct_on_input->thread_info.direct_outputs, PA_UINT32_TO_PTR(o->index), o);
2119             }
2120
2121             pa_source_output_attach(o);
2122
2123             pa_source_output_set_state_within_thread(o, o->state);
2124
2125             if (o->thread_info.requested_source_latency != (pa_usec_t) -1)
2126                 pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
2127
2128             pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
2129
2130             /* We don't just invalidate the requested latency here,
2131              * because if we are in a move we might need to fix up the
2132              * requested latency. */
2133             pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
2134
2135             /* In flat volume mode we need to update the volume as
2136              * well */
2137             return object->process_msg(object, PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2138         }
2139
2140         case PA_SOURCE_MESSAGE_REMOVE_OUTPUT: {
2141             pa_source_output *o = PA_SOURCE_OUTPUT(userdata);
2142
2143             pa_source_output_set_state_within_thread(o, o->state);
2144
2145             pa_source_output_detach(o);
2146
2147             if (o->thread_info.direct_on_input) {
2148                 pa_hashmap_remove(o->thread_info.direct_on_input->thread_info.direct_outputs, PA_UINT32_TO_PTR(o->index));
2149                 o->thread_info.direct_on_input = NULL;
2150             }
2151
2152             pa_hashmap_remove_and_free(s->thread_info.outputs, PA_UINT32_TO_PTR(o->index));
2153             pa_source_invalidate_requested_latency(s, true);
2154
2155             /* In flat volume mode we need to update the volume as
2156              * well */
2157             return object->process_msg(object, PA_SOURCE_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2158         }
2159
2160         case PA_SOURCE_MESSAGE_SET_SHARED_VOLUME: {
2161             pa_source *root_source = pa_source_get_master(s);
2162
2163             if (PA_LIKELY(root_source))
2164                 set_shared_volume_within_thread(root_source);
2165
2166             return 0;
2167         }
2168
2169         case PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED:
2170
2171             if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
2172                 s->set_volume(s);
2173                 pa_source_volume_change_push(s);
2174             }
2175             /* Fall through ... */
2176
2177         case PA_SOURCE_MESSAGE_SET_VOLUME:
2178
2179             if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2180                 s->thread_info.soft_volume = s->soft_volume;
2181             }
2182
2183             /* Fall through ... */
2184
2185         case PA_SOURCE_MESSAGE_SYNC_VOLUMES:
2186             sync_output_volumes_within_thread(s);
2187             return 0;
2188
2189         case PA_SOURCE_MESSAGE_GET_VOLUME:
2190
2191             if ((s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->get_volume) {
2192                 s->get_volume(s);
2193                 pa_source_volume_change_flush(s);
2194                 pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
2195             }
2196
2197             /* In case source implementor reset SW volume. */
2198             if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2199                 s->thread_info.soft_volume = s->soft_volume;
2200             }
2201
2202             return 0;
2203
2204         case PA_SOURCE_MESSAGE_SET_MUTE:
2205
2206             if (s->thread_info.soft_muted != s->muted) {
2207                 s->thread_info.soft_muted = s->muted;
2208             }
2209
2210             if (s->flags & PA_SOURCE_DEFERRED_VOLUME && s->set_mute)
2211                 s->set_mute(s);
2212
2213             return 0;
2214
2215         case PA_SOURCE_MESSAGE_GET_MUTE:
2216
2217             if (s->flags & PA_SOURCE_DEFERRED_VOLUME && s->get_mute)
2218                 return s->get_mute(s, userdata);
2219
2220             return 0;
2221
2222         case PA_SOURCE_MESSAGE_SET_STATE: {
2223
2224             bool suspend_change =
2225                 (s->thread_info.state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(PA_PTR_TO_UINT(userdata))) ||
2226                 (PA_SOURCE_IS_OPENED(s->thread_info.state) && PA_PTR_TO_UINT(userdata) == PA_SOURCE_SUSPENDED);
2227
2228             if (s->set_state_in_io_thread) {
2229                 int r;
2230
2231                 if ((r = s->set_state_in_io_thread(s, PA_PTR_TO_UINT(userdata))) < 0)
2232                     return r;
2233             }
2234
2235             s->thread_info.state = PA_PTR_TO_UINT(userdata);
2236
2237             if (suspend_change) {
2238                 pa_source_output *o;
2239                 void *state = NULL;
2240
2241                 while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
2242                     if (o->suspend_within_thread)
2243                         o->suspend_within_thread(o, s->thread_info.state == PA_SOURCE_SUSPENDED);
2244             }
2245
2246             return 0;
2247         }
2248
2249         case PA_SOURCE_MESSAGE_GET_REQUESTED_LATENCY: {
2250
2251             pa_usec_t *usec = userdata;
2252             *usec = pa_source_get_requested_latency_within_thread(s);
2253
2254             /* Yes, that's right, the IO thread will see -1 when no
2255              * explicit requested latency is configured, the main
2256              * thread will see max_latency */
2257             if (*usec == (pa_usec_t) -1)
2258                 *usec = s->thread_info.max_latency;
2259
2260             return 0;
2261         }
2262
2263         case PA_SOURCE_MESSAGE_SET_LATENCY_RANGE: {
2264             pa_usec_t *r = userdata;
2265
2266             pa_source_set_latency_range_within_thread(s, r[0], r[1]);
2267
2268             return 0;
2269         }
2270
2271         case PA_SOURCE_MESSAGE_GET_LATENCY_RANGE: {
2272             pa_usec_t *r = userdata;
2273
2274             r[0] = s->thread_info.min_latency;
2275             r[1] = s->thread_info.max_latency;
2276
2277             return 0;
2278         }
2279
2280         case PA_SOURCE_MESSAGE_GET_FIXED_LATENCY:
2281
2282             *((pa_usec_t*) userdata) = s->thread_info.fixed_latency;
2283             return 0;
2284
2285         case PA_SOURCE_MESSAGE_SET_FIXED_LATENCY:
2286
2287             pa_source_set_fixed_latency_within_thread(s, (pa_usec_t) offset);
2288             return 0;
2289
2290         case PA_SOURCE_MESSAGE_GET_MAX_REWIND:
2291
2292             *((size_t*) userdata) = s->thread_info.max_rewind;
2293             return 0;
2294
2295         case PA_SOURCE_MESSAGE_SET_MAX_REWIND:
2296
2297             pa_source_set_max_rewind_within_thread(s, (size_t) offset);
2298             return 0;
2299
2300         case PA_SOURCE_MESSAGE_GET_LATENCY:
2301
2302             if (s->monitor_of) {
2303                 *((int64_t*) userdata) = -pa_sink_get_latency_within_thread(s->monitor_of, true);
2304                 return 0;
2305             }
2306
2307             /* Implementors need to overwrite this implementation! */
2308             return -1;
2309
2310         case PA_SOURCE_MESSAGE_SET_PORT:
2311
2312             pa_assert(userdata);
2313             if (s->set_port) {
2314                 struct source_message_set_port *msg_data = userdata;
2315                 msg_data->ret = s->set_port(s, msg_data->port);
2316             }
2317             return 0;
2318
2319         case PA_SOURCE_MESSAGE_UPDATE_VOLUME_AND_MUTE:
2320             /* This message is sent from IO-thread and handled in main thread. */
2321             pa_assert_ctl_context();
2322
2323             /* Make sure we're not messing with main thread when no longer linked */
2324             if (!PA_SOURCE_IS_LINKED(s->state))
2325                 return 0;
2326
2327             pa_source_get_volume(s, true);
2328             pa_source_get_mute(s, true);
2329             return 0;
2330
2331         case PA_SOURCE_MESSAGE_SET_PORT_LATENCY_OFFSET:
2332             s->thread_info.port_latency_offset = offset;
2333             return 0;
2334
2335         case PA_SOURCE_MESSAGE_MAX:
2336             ;
2337     }
2338
2339     return -1;
2340 }
2341
2342 /* Called from main thread */
2343 int pa_source_suspend_all(pa_core *c, bool suspend, pa_suspend_cause_t cause) {
2344     pa_source *source;
2345     uint32_t idx;
2346     int ret = 0;
2347
2348     pa_core_assert_ref(c);
2349     pa_assert_ctl_context();
2350     pa_assert(cause != 0);
2351
2352     for (source = PA_SOURCE(pa_idxset_first(c->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(c->sources, &idx))) {
2353         int r;
2354
2355         if (source->monitor_of)
2356             continue;
2357
2358         if ((r = pa_source_suspend(source, suspend, cause)) < 0)
2359             ret = r;
2360     }
2361
2362     return ret;
2363 }
2364
2365 /* Called from IO thread */
2366 void pa_source_detach_within_thread(pa_source *s) {
2367     pa_source_output *o;
2368     void *state = NULL;
2369
2370     pa_source_assert_ref(s);
2371     pa_source_assert_io_context(s);
2372     pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
2373
2374     PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2375         pa_source_output_detach(o);
2376 }
2377
2378 /* Called from IO thread */
2379 void pa_source_attach_within_thread(pa_source *s) {
2380     pa_source_output *o;
2381     void *state = NULL;
2382
2383     pa_source_assert_ref(s);
2384     pa_source_assert_io_context(s);
2385     pa_assert(PA_SOURCE_IS_LINKED(s->thread_info.state));
2386
2387     PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2388         pa_source_output_attach(o);
2389 }
2390
2391 /* Called from IO thread */
2392 pa_usec_t pa_source_get_requested_latency_within_thread(pa_source *s) {
2393     pa_usec_t result = (pa_usec_t) -1;
2394     pa_source_output *o;
2395     void *state = NULL;
2396
2397     pa_source_assert_ref(s);
2398     pa_source_assert_io_context(s);
2399
2400     if (!(s->flags & PA_SOURCE_DYNAMIC_LATENCY))
2401         return PA_CLAMP(s->thread_info.fixed_latency, s->thread_info.min_latency, s->thread_info.max_latency);
2402
2403     if (s->thread_info.requested_latency_valid)
2404         return s->thread_info.requested_latency;
2405
2406     PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2407         if (o->thread_info.requested_source_latency != (pa_usec_t) -1 &&
2408             (result == (pa_usec_t) -1 || result > o->thread_info.requested_source_latency))
2409             result = o->thread_info.requested_source_latency;
2410
2411     if (result != (pa_usec_t) -1)
2412         result = PA_CLAMP(result, s->thread_info.min_latency, s->thread_info.max_latency);
2413
2414     if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2415         /* Only cache this if we are fully set up */
2416         s->thread_info.requested_latency = result;
2417         s->thread_info.requested_latency_valid = true;
2418     }
2419
2420     return result;
2421 }
2422
2423 /* Called from main thread */
2424 pa_usec_t pa_source_get_requested_latency(pa_source *s) {
2425     pa_usec_t usec = 0;
2426
2427     pa_source_assert_ref(s);
2428     pa_assert_ctl_context();
2429     pa_assert(PA_SOURCE_IS_LINKED(s->state));
2430
2431     if (s->state == PA_SOURCE_SUSPENDED)
2432         return 0;
2433
2434     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
2435
2436     return usec;
2437 }
2438
2439 /* Called from IO thread */
2440 void pa_source_set_max_rewind_within_thread(pa_source *s, size_t max_rewind) {
2441     pa_source_output *o;
2442     void *state = NULL;
2443
2444     pa_source_assert_ref(s);
2445     pa_source_assert_io_context(s);
2446
2447     if (max_rewind == s->thread_info.max_rewind)
2448         return;
2449
2450     s->thread_info.max_rewind = max_rewind;
2451
2452     if (PA_SOURCE_IS_LINKED(s->thread_info.state))
2453         PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2454             pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
2455 }
2456
2457 /* Called from main thread */
2458 void pa_source_set_max_rewind(pa_source *s, size_t max_rewind) {
2459     pa_source_assert_ref(s);
2460     pa_assert_ctl_context();
2461
2462     if (PA_SOURCE_IS_LINKED(s->state))
2463         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_MAX_REWIND, NULL, max_rewind, NULL) == 0);
2464     else
2465         pa_source_set_max_rewind_within_thread(s, max_rewind);
2466 }
2467
2468 /* Called from IO thread */
2469 void pa_source_invalidate_requested_latency(pa_source *s, bool dynamic) {
2470     pa_source_output *o;
2471     void *state = NULL;
2472
2473     pa_source_assert_ref(s);
2474     pa_source_assert_io_context(s);
2475
2476     if ((s->flags & PA_SOURCE_DYNAMIC_LATENCY))
2477         s->thread_info.requested_latency_valid = false;
2478     else if (dynamic)
2479         return;
2480
2481     if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2482
2483         if (s->update_requested_latency)
2484             s->update_requested_latency(s);
2485
2486         while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
2487             if (o->update_source_requested_latency)
2488                 o->update_source_requested_latency(o);
2489     }
2490
2491     if (s->monitor_of)
2492         pa_sink_invalidate_requested_latency(s->monitor_of, dynamic);
2493 }
2494
2495 /* Called from main thread */
2496 void pa_source_set_latency_range(pa_source *s, pa_usec_t min_latency, pa_usec_t max_latency) {
2497     pa_source_assert_ref(s);
2498     pa_assert_ctl_context();
2499
2500     /* min_latency == 0:           no limit
2501      * min_latency anything else:  specified limit
2502      *
2503      * Similar for max_latency */
2504
2505     if (min_latency < ABSOLUTE_MIN_LATENCY)
2506         min_latency = ABSOLUTE_MIN_LATENCY;
2507
2508     if (max_latency <= 0 ||
2509         max_latency > ABSOLUTE_MAX_LATENCY)
2510         max_latency = ABSOLUTE_MAX_LATENCY;
2511
2512     pa_assert(min_latency <= max_latency);
2513
2514     /* Hmm, let's see if someone forgot to set PA_SOURCE_DYNAMIC_LATENCY here... */
2515     pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
2516                max_latency == ABSOLUTE_MAX_LATENCY) ||
2517               (s->flags & PA_SOURCE_DYNAMIC_LATENCY));
2518
2519     if (PA_SOURCE_IS_LINKED(s->state)) {
2520         pa_usec_t r[2];
2521
2522         r[0] = min_latency;
2523         r[1] = max_latency;
2524
2525         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_LATENCY_RANGE, r, 0, NULL) == 0);
2526     } else
2527         pa_source_set_latency_range_within_thread(s, min_latency, max_latency);
2528 }
2529
2530 /* Called from main thread */
2531 void pa_source_get_latency_range(pa_source *s, pa_usec_t *min_latency, pa_usec_t *max_latency) {
2532     pa_source_assert_ref(s);
2533     pa_assert_ctl_context();
2534     pa_assert(min_latency);
2535     pa_assert(max_latency);
2536
2537     if (PA_SOURCE_IS_LINKED(s->state)) {
2538         pa_usec_t r[2] = { 0, 0 };
2539
2540         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY_RANGE, r, 0, NULL) == 0);
2541
2542         *min_latency = r[0];
2543         *max_latency = r[1];
2544     } else {
2545         *min_latency = s->thread_info.min_latency;
2546         *max_latency = s->thread_info.max_latency;
2547     }
2548 }
2549
2550 /* Called from IO thread, and from main thread before pa_source_put() is called */
2551 void pa_source_set_latency_range_within_thread(pa_source *s, pa_usec_t min_latency, pa_usec_t max_latency) {
2552     pa_source_assert_ref(s);
2553     pa_source_assert_io_context(s);
2554
2555     pa_assert(min_latency >= ABSOLUTE_MIN_LATENCY);
2556     pa_assert(max_latency <= ABSOLUTE_MAX_LATENCY);
2557     pa_assert(min_latency <= max_latency);
2558
2559     /* Hmm, let's see if someone forgot to set PA_SOURCE_DYNAMIC_LATENCY here... */
2560     pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
2561                max_latency == ABSOLUTE_MAX_LATENCY) ||
2562               (s->flags & PA_SOURCE_DYNAMIC_LATENCY) ||
2563               s->monitor_of);
2564
2565     if (s->thread_info.min_latency == min_latency &&
2566         s->thread_info.max_latency == max_latency)
2567         return;
2568
2569     s->thread_info.min_latency = min_latency;
2570     s->thread_info.max_latency = max_latency;
2571
2572     if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2573         pa_source_output *o;
2574         void *state = NULL;
2575
2576         PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2577             if (o->update_source_latency_range)
2578                 o->update_source_latency_range(o);
2579     }
2580
2581     pa_source_invalidate_requested_latency(s, false);
2582 }
2583
2584 /* Called from main thread, before the source is put */
2585 void pa_source_set_fixed_latency(pa_source *s, pa_usec_t latency) {
2586     pa_source_assert_ref(s);
2587     pa_assert_ctl_context();
2588
2589     if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
2590         pa_assert(latency == 0);
2591         return;
2592     }
2593
2594     if (latency < ABSOLUTE_MIN_LATENCY)
2595         latency = ABSOLUTE_MIN_LATENCY;
2596
2597     if (latency > ABSOLUTE_MAX_LATENCY)
2598         latency = ABSOLUTE_MAX_LATENCY;
2599
2600     if (PA_SOURCE_IS_LINKED(s->state))
2601         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_FIXED_LATENCY, NULL, (int64_t) latency, NULL) == 0);
2602     else
2603         s->thread_info.fixed_latency = latency;
2604 }
2605
2606 /* Called from main thread */
2607 pa_usec_t pa_source_get_fixed_latency(pa_source *s) {
2608     pa_usec_t latency;
2609
2610     pa_source_assert_ref(s);
2611     pa_assert_ctl_context();
2612
2613     if (s->flags & PA_SOURCE_DYNAMIC_LATENCY)
2614         return 0;
2615
2616     if (PA_SOURCE_IS_LINKED(s->state))
2617         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_FIXED_LATENCY, &latency, 0, NULL) == 0);
2618     else
2619         latency = s->thread_info.fixed_latency;
2620
2621     return latency;
2622 }
2623
2624 /* Called from IO thread */
2625 void pa_source_set_fixed_latency_within_thread(pa_source *s, pa_usec_t latency) {
2626     pa_source_assert_ref(s);
2627     pa_source_assert_io_context(s);
2628
2629     if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
2630         pa_assert(latency == 0);
2631         s->thread_info.fixed_latency = 0;
2632
2633         return;
2634     }
2635
2636     pa_assert(latency >= ABSOLUTE_MIN_LATENCY);
2637     pa_assert(latency <= ABSOLUTE_MAX_LATENCY);
2638
2639     if (s->thread_info.fixed_latency == latency)
2640         return;
2641
2642     s->thread_info.fixed_latency = latency;
2643
2644     if (PA_SOURCE_IS_LINKED(s->thread_info.state)) {
2645         pa_source_output *o;
2646         void *state = NULL;
2647
2648         PA_HASHMAP_FOREACH(o, s->thread_info.outputs, state)
2649             if (o->update_source_fixed_latency)
2650                 o->update_source_fixed_latency(o);
2651     }
2652
2653     pa_source_invalidate_requested_latency(s, false);
2654 }
2655
2656 /* Called from main thread */
2657 void pa_source_set_port_latency_offset(pa_source *s, int64_t offset) {
2658     pa_source_assert_ref(s);
2659
2660     s->port_latency_offset = offset;
2661
2662     if (PA_SOURCE_IS_LINKED(s->state))
2663         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_PORT_LATENCY_OFFSET, NULL, offset, NULL) == 0);
2664     else
2665         s->thread_info.port_latency_offset = offset;
2666
2667     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_LATENCY_OFFSET_CHANGED], s);
2668 }
2669
2670 /* Called from main thread */
2671 size_t pa_source_get_max_rewind(pa_source *s) {
2672     size_t r;
2673     pa_assert_ctl_context();
2674     pa_source_assert_ref(s);
2675
2676     if (!PA_SOURCE_IS_LINKED(s->state))
2677         return s->thread_info.max_rewind;
2678
2679     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MAX_REWIND, &r, 0, NULL) == 0);
2680
2681     return r;
2682 }
2683
2684 /* Called from main context */
2685 int pa_source_set_port(pa_source *s, const char *name, bool save) {
2686     pa_device_port *port;
2687     int ret;
2688
2689     pa_source_assert_ref(s);
2690     pa_assert_ctl_context();
2691
2692     if (!s->set_port) {
2693         pa_log_debug("set_port() operation not implemented for source %u \"%s\"", s->index, s->name);
2694         return -PA_ERR_NOTIMPLEMENTED;
2695     }
2696
2697     if (!name)
2698         return -PA_ERR_NOENTITY;
2699
2700     if (!(port = pa_hashmap_get(s->ports, name)))
2701         return -PA_ERR_NOENTITY;
2702
2703     if (s->active_port == port) {
2704         s->save_port = s->save_port || save;
2705         return 0;
2706     }
2707
2708     if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
2709         struct source_message_set_port msg = { .port = port, .ret = 0 };
2710         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_SET_PORT, &msg, 0, NULL) == 0);
2711         ret = msg.ret;
2712     }
2713     else
2714         ret = s->set_port(s, port);
2715
2716     if (ret < 0)
2717         return -PA_ERR_NOENTITY;
2718
2719     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2720
2721     pa_log_info("Changed port of source %u \"%s\" to %s", s->index, s->name, port->name);
2722
2723     s->active_port = port;
2724     s->save_port = save;
2725
2726     /* The active port affects the default source selection. */
2727     pa_core_update_default_source(s->core);
2728
2729     pa_source_set_port_latency_offset(s, s->active_port->latency_offset);
2730
2731     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], s);
2732
2733     return 0;
2734 }
2735
2736 PA_STATIC_FLIST_DECLARE(pa_source_volume_change, 0, pa_xfree);
2737
2738 /* Called from the IO thread. */
2739 static pa_source_volume_change *pa_source_volume_change_new(pa_source *s) {
2740     pa_source_volume_change *c;
2741     if (!(c = pa_flist_pop(PA_STATIC_FLIST_GET(pa_source_volume_change))))
2742         c = pa_xnew(pa_source_volume_change, 1);
2743
2744     PA_LLIST_INIT(pa_source_volume_change, c);
2745     c->at = 0;
2746     pa_cvolume_reset(&c->hw_volume, s->sample_spec.channels);
2747     return c;
2748 }
2749
2750 /* Called from the IO thread. */
2751 static void pa_source_volume_change_free(pa_source_volume_change *c) {
2752     pa_assert(c);
2753     if (pa_flist_push(PA_STATIC_FLIST_GET(pa_source_volume_change), c) < 0)
2754         pa_xfree(c);
2755 }
2756
2757 /* Called from the IO thread. */
2758 void pa_source_volume_change_push(pa_source *s) {
2759     pa_source_volume_change *c = NULL;
2760     pa_source_volume_change *nc = NULL;
2761     pa_source_volume_change *pc = NULL;
2762     uint32_t safety_margin = s->thread_info.volume_change_safety_margin;
2763
2764     const char *direction = NULL;
2765
2766     pa_assert(s);
2767     nc = pa_source_volume_change_new(s);
2768
2769     /* NOTE: There is already more different volumes in pa_source that I can remember.
2770      *       Adding one more volume for HW would get us rid of this, but I am trying
2771      *       to survive with the ones we already have. */
2772     pa_sw_cvolume_divide(&nc->hw_volume, &s->real_volume, &s->soft_volume);
2773
2774     if (!s->thread_info.volume_changes && pa_cvolume_equal(&nc->hw_volume, &s->thread_info.current_hw_volume)) {
2775         pa_log_debug("Volume not changing");
2776         pa_source_volume_change_free(nc);
2777         return;
2778     }
2779
2780     nc->at = pa_source_get_latency_within_thread(s, false);
2781     nc->at += pa_rtclock_now() + s->thread_info.volume_change_extra_delay;
2782
2783     if (s->thread_info.volume_changes_tail) {
2784         for (c = s->thread_info.volume_changes_tail; c; c = c->prev) {
2785             /* If volume is going up let's do it a bit late. If it is going
2786              * down let's do it a bit early. */
2787             if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&c->hw_volume)) {
2788                 if (nc->at + safety_margin > c->at) {
2789                     nc->at += safety_margin;
2790                     direction = "up";
2791                     break;
2792                 }
2793             }
2794             else if (nc->at - safety_margin > c->at) {
2795                     nc->at -= safety_margin;
2796                     direction = "down";
2797                     break;
2798             }
2799         }
2800     }
2801
2802     if (c == NULL) {
2803         if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&s->thread_info.current_hw_volume)) {
2804             nc->at += safety_margin;
2805             direction = "up";
2806         } else {
2807             nc->at -= safety_margin;
2808             direction = "down";
2809         }
2810         PA_LLIST_PREPEND(pa_source_volume_change, s->thread_info.volume_changes, nc);
2811     }
2812     else {
2813         PA_LLIST_INSERT_AFTER(pa_source_volume_change, s->thread_info.volume_changes, c, nc);
2814     }
2815
2816     pa_log_debug("Volume going %s to %d at %llu", direction, pa_cvolume_avg(&nc->hw_volume), (long long unsigned) nc->at);
2817
2818     /* We can ignore volume events that came earlier but should happen later than this. */
2819     PA_LLIST_FOREACH_SAFE(c, pc, nc->next) {
2820         pa_log_debug("Volume change to %d at %llu was dropped", pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at);
2821         pa_source_volume_change_free(c);
2822     }
2823     nc->next = NULL;
2824     s->thread_info.volume_changes_tail = nc;
2825 }
2826
2827 /* Called from the IO thread. */
2828 static void pa_source_volume_change_flush(pa_source *s) {
2829     pa_source_volume_change *c = s->thread_info.volume_changes;
2830     pa_assert(s);
2831     s->thread_info.volume_changes = NULL;
2832     s->thread_info.volume_changes_tail = NULL;
2833     while (c) {
2834         pa_source_volume_change *next = c->next;
2835         pa_source_volume_change_free(c);
2836         c = next;
2837     }
2838 }
2839
2840 /* Called from the IO thread. */
2841 bool pa_source_volume_change_apply(pa_source *s, pa_usec_t *usec_to_next) {
2842     pa_usec_t now;
2843     bool ret = false;
2844
2845     pa_assert(s);
2846
2847     if (!s->thread_info.volume_changes || !PA_SOURCE_IS_LINKED(s->state)) {
2848         if (usec_to_next)
2849             *usec_to_next = 0;
2850         return ret;
2851     }
2852
2853     pa_assert(s->write_volume);
2854
2855     now = pa_rtclock_now();
2856
2857     while (s->thread_info.volume_changes && now >= s->thread_info.volume_changes->at) {
2858         pa_source_volume_change *c = s->thread_info.volume_changes;
2859         PA_LLIST_REMOVE(pa_source_volume_change, s->thread_info.volume_changes, c);
2860         pa_log_debug("Volume change to %d at %llu was written %llu usec late",
2861                      pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at, (long long unsigned) (now - c->at));
2862         ret = true;
2863         s->thread_info.current_hw_volume = c->hw_volume;
2864         pa_source_volume_change_free(c);
2865     }
2866
2867     if (ret)
2868         s->write_volume(s);
2869
2870     if (s->thread_info.volume_changes) {
2871         if (usec_to_next)
2872             *usec_to_next = s->thread_info.volume_changes->at - now;
2873         if (pa_log_ratelimit(PA_LOG_DEBUG))
2874             pa_log_debug("Next volume change in %lld usec", (long long) (s->thread_info.volume_changes->at - now));
2875     }
2876     else {
2877         if (usec_to_next)
2878             *usec_to_next = 0;
2879         s->thread_info.volume_changes_tail = NULL;
2880     }
2881     return ret;
2882 }
2883
2884 /* Called from the main thread */
2885 /* Gets the list of formats supported by the source. The members and idxset must
2886  * be freed by the caller. */
2887 pa_idxset* pa_source_get_formats(pa_source *s) {
2888     pa_idxset *ret;
2889
2890     pa_assert(s);
2891
2892     if (s->get_formats) {
2893         /* Source supports format query, all is good */
2894         ret = s->get_formats(s);
2895     } else {
2896         /* Source doesn't support format query, so assume it does PCM */
2897         pa_format_info *f = pa_format_info_new();
2898         f->encoding = PA_ENCODING_PCM;
2899
2900         ret = pa_idxset_new(NULL, NULL);
2901         pa_idxset_put(ret, f, NULL);
2902     }
2903
2904     return ret;
2905 }
2906
2907 /* Called from the main thread */
2908 /* Checks if the source can accept this format */
2909 bool pa_source_check_format(pa_source *s, pa_format_info *f) {
2910     pa_idxset *formats = NULL;
2911     bool ret = false;
2912
2913     pa_assert(s);
2914     pa_assert(f);
2915
2916     formats = pa_source_get_formats(s);
2917
2918     if (formats) {
2919         pa_format_info *finfo_device;
2920         uint32_t i;
2921
2922         PA_IDXSET_FOREACH(finfo_device, formats, i) {
2923             if (pa_format_info_is_compatible(finfo_device, f)) {
2924                 ret = true;
2925                 break;
2926             }
2927         }
2928
2929         pa_idxset_free(formats, (pa_free_cb_t) pa_format_info_free);
2930     }
2931
2932     return ret;
2933 }
2934
2935 /* Called from the main thread */
2936 /* Calculates the intersection between formats supported by the source and
2937  * in_formats, and returns these, in the order of the source's formats. */
2938 pa_idxset* pa_source_check_formats(pa_source *s, pa_idxset *in_formats) {
2939     pa_idxset *out_formats = pa_idxset_new(NULL, NULL), *source_formats = NULL;
2940     pa_format_info *f_source, *f_in;
2941     uint32_t i, j;
2942
2943     pa_assert(s);
2944
2945     if (!in_formats || pa_idxset_isempty(in_formats))
2946         goto done;
2947
2948     source_formats = pa_source_get_formats(s);
2949
2950     PA_IDXSET_FOREACH(f_source, source_formats, i) {
2951         PA_IDXSET_FOREACH(f_in, in_formats, j) {
2952             if (pa_format_info_is_compatible(f_source, f_in))
2953                 pa_idxset_put(out_formats, pa_format_info_copy(f_in), NULL);
2954         }
2955     }
2956
2957 done:
2958     if (source_formats)
2959         pa_idxset_free(source_formats, (pa_free_cb_t) pa_format_info_free);
2960
2961     return out_formats;
2962 }
2963
2964 /* Called from the main thread. */
2965 void pa_source_set_reference_volume_direct(pa_source *s, const pa_cvolume *volume) {
2966     pa_cvolume old_volume;
2967     char old_volume_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
2968     char new_volume_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
2969
2970     pa_assert(s);
2971     pa_assert(volume);
2972
2973     old_volume = s->reference_volume;
2974
2975     if (pa_cvolume_equal(volume, &old_volume))
2976         return;
2977
2978     s->reference_volume = *volume;
2979     pa_log_debug("The reference volume of source %s changed from %s to %s.", s->name,
2980                  pa_cvolume_snprint_verbose(old_volume_str, sizeof(old_volume_str), &old_volume, &s->channel_map,
2981                                             s->flags & PA_SOURCE_DECIBEL_VOLUME),
2982                  pa_cvolume_snprint_verbose(new_volume_str, sizeof(new_volume_str), volume, &s->channel_map,
2983                                             s->flags & PA_SOURCE_DECIBEL_VOLUME));
2984
2985     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2986     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_VOLUME_CHANGED], s);
2987 }