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