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