core: move sink-inputs conditionally when update default_sink
[platform/upstream/pulseaudio.git] / src / pulsecore / sink.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 #include <string.h>
28
29 #include <pulse/introspect.h>
30 #include <pulse/format.h>
31 #include <pulse/utf8.h>
32 #include <pulse/xmalloc.h>
33 #include <pulse/timeval.h>
34 #include <pulse/util.h>
35 #include <pulse/rtclock.h>
36 #include <pulse/internal.h>
37
38 #include <pulsecore/i18n.h>
39 #include <pulsecore/sink-input.h>
40 #include <pulsecore/namereg.h>
41 #include <pulsecore/core-util.h>
42 #include <pulsecore/sample-util.h>
43 #include <pulsecore/mix.h>
44 #include <pulsecore/core-subscribe.h>
45 #include <pulsecore/log.h>
46 #include <pulsecore/macro.h>
47 #include <pulsecore/play-memblockq.h>
48 #include <pulsecore/flist.h>
49
50 #include "sink.h"
51
52 #define MAX_MIX_CHANNELS 32
53 #define MIX_BUFFER_LENGTH (pa_page_size())
54 #define ABSOLUTE_MIN_LATENCY (500)
55 #define ABSOLUTE_MAX_LATENCY (10*PA_USEC_PER_SEC)
56 #define DEFAULT_FIXED_LATENCY (250*PA_USEC_PER_MSEC)
57
58 PA_DEFINE_PUBLIC_CLASS(pa_sink, pa_msgobject);
59
60 struct pa_sink_volume_change {
61     pa_usec_t at;
62     pa_cvolume hw_volume;
63
64     PA_LLIST_FIELDS(pa_sink_volume_change);
65 };
66
67 struct set_state_data {
68     pa_sink_state_t state;
69     pa_suspend_cause_t suspend_cause;
70 };
71
72 static void sink_free(pa_object *s);
73
74 static void pa_sink_volume_change_push(pa_sink *s);
75 static void pa_sink_volume_change_flush(pa_sink *s);
76 static void pa_sink_volume_change_rewind(pa_sink *s, size_t nbytes);
77
78 pa_sink_new_data* pa_sink_new_data_init(pa_sink_new_data *data) {
79     pa_assert(data);
80
81     pa_zero(*data);
82     data->proplist = pa_proplist_new();
83     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);
84
85     return data;
86 }
87
88 void pa_sink_new_data_set_name(pa_sink_new_data *data, const char *name) {
89     pa_assert(data);
90
91     pa_xfree(data->name);
92     data->name = pa_xstrdup(name);
93 }
94
95 void pa_sink_new_data_set_sample_spec(pa_sink_new_data *data, const pa_sample_spec *spec) {
96     pa_assert(data);
97
98     if ((data->sample_spec_is_set = !!spec))
99         data->sample_spec = *spec;
100 }
101
102 void pa_sink_new_data_set_channel_map(pa_sink_new_data *data, const pa_channel_map *map) {
103     pa_assert(data);
104
105     if ((data->channel_map_is_set = !!map))
106         data->channel_map = *map;
107 }
108
109 void pa_sink_new_data_set_alternate_sample_rate(pa_sink_new_data *data, const uint32_t alternate_sample_rate) {
110     pa_assert(data);
111
112     data->alternate_sample_rate_is_set = true;
113     data->alternate_sample_rate = alternate_sample_rate;
114 }
115
116 void pa_sink_new_data_set_volume(pa_sink_new_data *data, const pa_cvolume *volume) {
117     pa_assert(data);
118
119     if ((data->volume_is_set = !!volume))
120         data->volume = *volume;
121 }
122
123 void pa_sink_new_data_set_muted(pa_sink_new_data *data, bool mute) {
124     pa_assert(data);
125
126     data->muted_is_set = true;
127     data->muted = mute;
128 }
129
130 void pa_sink_new_data_set_port(pa_sink_new_data *data, const char *port) {
131     pa_assert(data);
132
133     pa_xfree(data->active_port);
134     data->active_port = pa_xstrdup(port);
135 }
136
137 void pa_sink_new_data_done(pa_sink_new_data *data) {
138     pa_assert(data);
139
140     pa_proplist_free(data->proplist);
141
142     if (data->ports)
143         pa_hashmap_free(data->ports);
144
145     pa_xfree(data->name);
146     pa_xfree(data->active_port);
147 }
148
149 /* Called from main context */
150 static void reset_callbacks(pa_sink *s) {
151     pa_assert(s);
152
153     s->set_state_in_main_thread = NULL;
154     s->set_state_in_io_thread = NULL;
155     s->get_volume = NULL;
156     s->set_volume = NULL;
157     s->write_volume = NULL;
158     s->get_mute = NULL;
159     s->set_mute = NULL;
160     s->request_rewind = NULL;
161     s->update_requested_latency = NULL;
162     s->set_port = NULL;
163     s->get_formats = NULL;
164     s->set_formats = NULL;
165     s->reconfigure = NULL;
166 }
167
168 /* Called from main context */
169 pa_sink* pa_sink_new(
170         pa_core *core,
171         pa_sink_new_data *data,
172         pa_sink_flags_t flags) {
173
174     pa_sink *s;
175     const char *name;
176     char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
177     pa_source_new_data source_data;
178     const char *dn;
179     char *pt;
180
181     pa_assert(core);
182     pa_assert(data);
183     pa_assert(data->name);
184     pa_assert_ctl_context();
185
186     s = pa_msgobject_new(pa_sink);
187
188     if (!(name = pa_namereg_register(core, data->name, PA_NAMEREG_SINK, s, data->namereg_fail))) {
189         pa_log_debug("Failed to register name %s.", data->name);
190         pa_xfree(s);
191         return NULL;
192     }
193
194     pa_sink_new_data_set_name(data, name);
195
196     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_NEW], data) < 0) {
197         pa_xfree(s);
198         pa_namereg_unregister(core, name);
199         return NULL;
200     }
201
202     /* FIXME, need to free s here on failure */
203
204     pa_return_null_if_fail(!data->driver || pa_utf8_valid(data->driver));
205     pa_return_null_if_fail(data->name && pa_utf8_valid(data->name) && data->name[0]);
206
207     pa_return_null_if_fail(data->sample_spec_is_set && pa_sample_spec_valid(&data->sample_spec));
208
209     if (!data->channel_map_is_set)
210         pa_return_null_if_fail(pa_channel_map_init_auto(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT));
211
212     pa_return_null_if_fail(pa_channel_map_valid(&data->channel_map));
213     pa_return_null_if_fail(data->channel_map.channels == data->sample_spec.channels);
214
215     /* FIXME: There should probably be a general function for checking whether
216      * the sink volume is allowed to be set, like there is for sink inputs. */
217     pa_assert(!data->volume_is_set || !(flags & PA_SINK_SHARE_VOLUME_WITH_MASTER));
218
219     if (!data->volume_is_set) {
220         pa_cvolume_reset(&data->volume, data->sample_spec.channels);
221         data->save_volume = false;
222     }
223
224     pa_return_null_if_fail(pa_cvolume_valid(&data->volume));
225     pa_return_null_if_fail(pa_cvolume_compatible(&data->volume, &data->sample_spec));
226
227     if (!data->muted_is_set)
228         data->muted = false;
229
230     if (data->card)
231         pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->card->proplist);
232
233     pa_device_init_description(data->proplist, data->card);
234     pa_device_init_icon(data->proplist, true);
235     pa_device_init_intended_roles(data->proplist);
236
237     if (!data->active_port) {
238         pa_device_port *p = pa_device_port_find_best(data->ports);
239         if (p)
240             pa_sink_new_data_set_port(data, p->name);
241     }
242
243     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_FIXATE], data) < 0) {
244         pa_xfree(s);
245         pa_namereg_unregister(core, name);
246         return NULL;
247     }
248
249     s->parent.parent.free = sink_free;
250     s->parent.process_msg = pa_sink_process_msg;
251
252     s->core = core;
253     s->state = PA_SINK_INIT;
254     s->flags = flags;
255     s->priority = 0;
256     s->suspend_cause = data->suspend_cause;
257     s->name = pa_xstrdup(name);
258     s->proplist = pa_proplist_copy(data->proplist);
259     s->driver = pa_xstrdup(pa_path_get_filename(data->driver));
260     s->module = data->module;
261     s->card = data->card;
262
263     s->priority = pa_device_init_priority(s->proplist);
264
265     s->sample_spec = data->sample_spec;
266     s->channel_map = data->channel_map;
267     s->default_sample_rate = s->sample_spec.rate;
268
269     if (data->alternate_sample_rate_is_set)
270         s->alternate_sample_rate = data->alternate_sample_rate;
271     else
272         s->alternate_sample_rate = s->core->alternate_sample_rate;
273
274     s->avoid_resampling = data->avoid_resampling;
275
276     s->inputs = pa_idxset_new(NULL, NULL);
277     s->n_corked = 0;
278     s->input_to_master = NULL;
279
280     s->reference_volume = s->real_volume = data->volume;
281     pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
282     s->base_volume = PA_VOLUME_NORM;
283     s->n_volume_steps = PA_VOLUME_NORM+1;
284     s->muted = data->muted;
285     s->refresh_volume = s->refresh_muted = false;
286
287     reset_callbacks(s);
288     s->userdata = NULL;
289
290     s->asyncmsgq = NULL;
291
292     /* As a minor optimization we just steal the list instead of
293      * copying it here */
294     s->ports = data->ports;
295     data->ports = NULL;
296
297     s->active_port = NULL;
298     s->save_port = false;
299
300     if (data->active_port)
301         if ((s->active_port = pa_hashmap_get(s->ports, data->active_port)))
302             s->save_port = data->save_port;
303
304     /* Hopefully the active port has already been assigned in the previous call
305        to pa_device_port_find_best, but better safe than sorry */
306     if (!s->active_port)
307         s->active_port = pa_device_port_find_best(s->ports);
308
309     if (s->active_port)
310         s->port_latency_offset = s->active_port->latency_offset;
311     else
312         s->port_latency_offset = 0;
313
314     s->save_volume = data->save_volume;
315     s->save_muted = data->save_muted;
316
317     pa_silence_memchunk_get(
318             &core->silence_cache,
319             core->mempool,
320             &s->silence,
321             &s->sample_spec,
322             0);
323
324     s->thread_info.rtpoll = NULL;
325     s->thread_info.inputs = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL,
326                                                 (pa_free_cb_t) pa_sink_input_unref);
327     s->thread_info.soft_volume =  s->soft_volume;
328     s->thread_info.soft_muted = s->muted;
329     s->thread_info.state = s->state;
330     s->thread_info.rewind_nbytes = 0;
331     s->thread_info.rewind_requested = false;
332     s->thread_info.max_rewind = 0;
333     s->thread_info.max_request = 0;
334     s->thread_info.requested_latency_valid = false;
335     s->thread_info.requested_latency = 0;
336     s->thread_info.min_latency = ABSOLUTE_MIN_LATENCY;
337     s->thread_info.max_latency = ABSOLUTE_MAX_LATENCY;
338     s->thread_info.fixed_latency = flags & PA_SINK_DYNAMIC_LATENCY ? 0 : DEFAULT_FIXED_LATENCY;
339
340     PA_LLIST_HEAD_INIT(pa_sink_volume_change, s->thread_info.volume_changes);
341     s->thread_info.volume_changes_tail = NULL;
342     pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
343     s->thread_info.volume_change_safety_margin = core->deferred_volume_safety_margin_usec;
344     s->thread_info.volume_change_extra_delay = core->deferred_volume_extra_delay_usec;
345     s->thread_info.port_latency_offset = s->port_latency_offset;
346
347     /* FIXME: This should probably be moved to pa_sink_put() */
348     pa_assert_se(pa_idxset_put(core->sinks, s, &s->index) >= 0);
349
350     if (s->card)
351         pa_assert_se(pa_idxset_put(s->card->sinks, s, NULL) >= 0);
352
353     pt = pa_proplist_to_string_sep(s->proplist, "\n    ");
354     pa_log_info("Created sink %u \"%s\" with sample spec %s and channel map %s\n    %s",
355                 s->index,
356                 s->name,
357                 pa_sample_spec_snprint(st, sizeof(st), &s->sample_spec),
358                 pa_channel_map_snprint(cm, sizeof(cm), &s->channel_map),
359                 pt);
360     pa_xfree(pt);
361
362     pa_source_new_data_init(&source_data);
363     pa_source_new_data_set_sample_spec(&source_data, &s->sample_spec);
364     pa_source_new_data_set_channel_map(&source_data, &s->channel_map);
365     pa_source_new_data_set_alternate_sample_rate(&source_data, s->alternate_sample_rate);
366     source_data.name = pa_sprintf_malloc("%s.monitor", name);
367     source_data.driver = data->driver;
368     source_data.module = data->module;
369     source_data.card = data->card;
370     source_data.avoid_resampling = data->avoid_resampling;
371
372     dn = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
373     pa_proplist_setf(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Monitor of %s", dn ? dn : s->name);
374     pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "monitor");
375
376     s->monitor_source = pa_source_new(core, &source_data,
377                                       ((flags & PA_SINK_LATENCY) ? PA_SOURCE_LATENCY : 0) |
378                                       ((flags & PA_SINK_DYNAMIC_LATENCY) ? PA_SOURCE_DYNAMIC_LATENCY : 0));
379
380     pa_source_new_data_done(&source_data);
381
382     if (!s->monitor_source) {
383         pa_sink_unlink(s);
384         pa_sink_unref(s);
385         return NULL;
386     }
387
388     s->monitor_source->monitor_of = s;
389
390     pa_source_set_latency_range(s->monitor_source, s->thread_info.min_latency, s->thread_info.max_latency);
391     pa_source_set_fixed_latency(s->monitor_source, s->thread_info.fixed_latency);
392     pa_source_set_max_rewind(s->monitor_source, s->thread_info.max_rewind);
393
394     return s;
395 }
396
397 /* Called from main context */
398 static int sink_set_state(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
399     int ret = 0;
400     bool state_changed;
401     bool suspend_cause_changed;
402     bool suspending;
403     bool resuming;
404     pa_sink_state_t old_state;
405     pa_suspend_cause_t old_suspend_cause;
406
407     pa_assert(s);
408     pa_assert_ctl_context();
409
410     state_changed = state != s->state;
411     suspend_cause_changed = suspend_cause != s->suspend_cause;
412
413     if (!state_changed && !suspend_cause_changed)
414         return 0;
415
416     suspending = PA_SINK_IS_OPENED(s->state) && state == PA_SINK_SUSPENDED;
417     resuming = s->state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(state);
418
419     /* If we are resuming, suspend_cause must be 0. */
420     pa_assert(!resuming || !suspend_cause);
421
422     /* Here's something to think about: what to do with the suspend cause if
423      * resuming the sink fails? The old suspend cause will be incorrect, so we
424      * can't use that. On the other hand, if we set no suspend cause (as is the
425      * case currently), then it looks strange to have a sink suspended without
426      * any cause. It might be a good idea to add a new "resume failed" suspend
427      * cause, or it might just add unnecessary complexity, given that the
428      * current approach of not setting any suspend cause works well enough. */
429
430     if (s->set_state_in_main_thread) {
431         if ((ret = s->set_state_in_main_thread(s, state, suspend_cause)) < 0) {
432             /* set_state_in_main_thread() is allowed to fail only when resuming. */
433             pa_assert(resuming);
434
435             /* If resuming fails, we set the state to SUSPENDED and
436              * suspend_cause to 0. */
437             state = PA_SINK_SUSPENDED;
438             suspend_cause = 0;
439             state_changed = false;
440             suspend_cause_changed = suspend_cause != s->suspend_cause;
441             resuming = false;
442
443             /* We know the state isn't changing. If the suspend cause isn't
444              * changing either, then there's nothing more to do. */
445             if (!suspend_cause_changed)
446                 return ret;
447         }
448     }
449
450     if (s->asyncmsgq) {
451         struct set_state_data data = { .state = state, .suspend_cause = suspend_cause };
452
453         if ((ret = pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_STATE, &data, 0, NULL)) < 0) {
454             /* SET_STATE is allowed to fail only when resuming. */
455             pa_assert(resuming);
456
457             if (s->set_state_in_main_thread)
458                 s->set_state_in_main_thread(s, PA_SINK_SUSPENDED, 0);
459
460             /* If resuming fails, we set the state to SUSPENDED and
461              * suspend_cause to 0. */
462             state = PA_SINK_SUSPENDED;
463             suspend_cause = 0;
464             state_changed = false;
465             suspend_cause_changed = suspend_cause != s->suspend_cause;
466             resuming = false;
467
468             /* We know the state isn't changing. If the suspend cause isn't
469              * changing either, then there's nothing more to do. */
470             if (!suspend_cause_changed)
471                 return ret;
472         }
473     }
474
475     old_suspend_cause = s->suspend_cause;
476     if (suspend_cause_changed) {
477         char old_cause_buf[PA_SUSPEND_CAUSE_TO_STRING_BUF_SIZE];
478         char new_cause_buf[PA_SUSPEND_CAUSE_TO_STRING_BUF_SIZE];
479
480         pa_log_debug("%s: suspend_cause: %s -> %s", s->name, pa_suspend_cause_to_string(s->suspend_cause, old_cause_buf),
481                      pa_suspend_cause_to_string(suspend_cause, new_cause_buf));
482         s->suspend_cause = suspend_cause;
483     }
484
485     old_state = s->state;
486     if (state_changed) {
487         pa_log_debug("%s: state: %s -> %s", s->name, pa_sink_state_to_string(s->state), pa_sink_state_to_string(state));
488         s->state = state;
489
490         /* If we enter UNLINKED state, then we don't send change notifications.
491          * pa_sink_unlink() will send unlink notifications instead. */
492         if (state != PA_SINK_UNLINKED) {
493             pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], s);
494             pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
495         }
496     }
497
498     if (suspending || resuming || suspend_cause_changed) {
499         pa_sink_input *i;
500         uint32_t idx;
501
502         /* We're suspending or resuming, tell everyone about it */
503
504         PA_IDXSET_FOREACH(i, s->inputs, idx)
505             if (s->state == PA_SINK_SUSPENDED &&
506                 (i->flags & PA_SINK_INPUT_KILL_ON_SUSPEND))
507                 pa_sink_input_kill(i);
508             else if (i->suspend)
509                 i->suspend(i, old_state, old_suspend_cause);
510     }
511
512     if ((suspending || resuming || suspend_cause_changed) && s->monitor_source && state != PA_SINK_UNLINKED)
513         pa_source_sync_suspend(s->monitor_source);
514
515     return ret;
516 }
517
518 void pa_sink_set_get_volume_callback(pa_sink *s, pa_sink_cb_t cb) {
519     pa_assert(s);
520
521     s->get_volume = cb;
522 }
523
524 void pa_sink_set_set_volume_callback(pa_sink *s, pa_sink_cb_t cb) {
525     pa_sink_flags_t flags;
526
527     pa_assert(s);
528     pa_assert(!s->write_volume || cb);
529
530     s->set_volume = cb;
531
532     /* Save the current flags so we can tell if they've changed */
533     flags = s->flags;
534
535     if (cb) {
536         /* The sink implementor is responsible for setting decibel volume support */
537         s->flags |= PA_SINK_HW_VOLUME_CTRL;
538     } else {
539         s->flags &= ~PA_SINK_HW_VOLUME_CTRL;
540         /* See note below in pa_sink_put() about volume sharing and decibel volumes */
541         pa_sink_enable_decibel_volume(s, !(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER));
542     }
543
544     /* If the flags have changed after init, let any clients know via a change event */
545     if (s->state != PA_SINK_INIT && flags != s->flags)
546         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
547 }
548
549 void pa_sink_set_write_volume_callback(pa_sink *s, pa_sink_cb_t cb) {
550     pa_sink_flags_t flags;
551
552     pa_assert(s);
553     pa_assert(!cb || s->set_volume);
554
555     s->write_volume = cb;
556
557     /* Save the current flags so we can tell if they've changed */
558     flags = s->flags;
559
560     if (cb)
561         s->flags |= PA_SINK_DEFERRED_VOLUME;
562     else
563         s->flags &= ~PA_SINK_DEFERRED_VOLUME;
564
565     /* If the flags have changed after init, let any clients know via a change event */
566     if (s->state != PA_SINK_INIT && flags != s->flags)
567         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
568 }
569
570 void pa_sink_set_get_mute_callback(pa_sink *s, pa_sink_get_mute_cb_t cb) {
571     pa_assert(s);
572
573     s->get_mute = cb;
574 }
575
576 void pa_sink_set_set_mute_callback(pa_sink *s, pa_sink_cb_t cb) {
577     pa_sink_flags_t flags;
578
579     pa_assert(s);
580
581     s->set_mute = cb;
582
583     /* Save the current flags so we can tell if they've changed */
584     flags = s->flags;
585
586     if (cb)
587         s->flags |= PA_SINK_HW_MUTE_CTRL;
588     else
589         s->flags &= ~PA_SINK_HW_MUTE_CTRL;
590
591     /* If the flags have changed after init, let any clients know via a change event */
592     if (s->state != PA_SINK_INIT && flags != s->flags)
593         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
594 }
595
596 static void enable_flat_volume(pa_sink *s, bool enable) {
597     pa_sink_flags_t flags;
598
599     pa_assert(s);
600
601     /* Always follow the overall user preference here */
602     enable = enable && s->core->flat_volumes;
603
604     /* Save the current flags so we can tell if they've changed */
605     flags = s->flags;
606
607     if (enable)
608         s->flags |= PA_SINK_FLAT_VOLUME;
609     else
610         s->flags &= ~PA_SINK_FLAT_VOLUME;
611
612     /* If the flags have changed after init, let any clients know via a change event */
613     if (s->state != PA_SINK_INIT && flags != s->flags)
614         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
615 }
616
617 void pa_sink_enable_decibel_volume(pa_sink *s, bool enable) {
618     pa_sink_flags_t flags;
619
620     pa_assert(s);
621
622     /* Save the current flags so we can tell if they've changed */
623     flags = s->flags;
624
625     if (enable) {
626         s->flags |= PA_SINK_DECIBEL_VOLUME;
627         enable_flat_volume(s, true);
628     } else {
629         s->flags &= ~PA_SINK_DECIBEL_VOLUME;
630         enable_flat_volume(s, false);
631     }
632
633     /* If the flags have changed after init, let any clients know via a change event */
634     if (s->state != PA_SINK_INIT && flags != s->flags)
635         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
636 }
637
638 /* Called from main context */
639 void pa_sink_put(pa_sink* s) {
640     pa_sink_assert_ref(s);
641     pa_assert_ctl_context();
642
643     pa_assert(s->state == PA_SINK_INIT);
644     pa_assert(!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER) || pa_sink_is_filter(s));
645
646     /* The following fields must be initialized properly when calling _put() */
647     pa_assert(s->asyncmsgq);
648     pa_assert(s->thread_info.min_latency <= s->thread_info.max_latency);
649
650     /* Generally, flags should be initialized via pa_sink_new(). As a
651      * special exception we allow some volume related flags to be set
652      * between _new() and _put() by the callback setter functions above.
653      *
654      * Thus we implement a couple safeguards here which ensure the above
655      * setters were used (or at least the implementor made manual changes
656      * in a compatible way).
657      *
658      * Note: All of these flags set here can change over the life time
659      * of the sink. */
660     pa_assert(!(s->flags & PA_SINK_HW_VOLUME_CTRL) || s->set_volume);
661     pa_assert(!(s->flags & PA_SINK_DEFERRED_VOLUME) || s->write_volume);
662     pa_assert(!(s->flags & PA_SINK_HW_MUTE_CTRL) || s->set_mute);
663
664     /* XXX: Currently decibel volume is disabled for all sinks that use volume
665      * sharing. When the master sink supports decibel volume, it would be good
666      * to have the flag also in the filter sink, but currently we don't do that
667      * so that the flags of the filter sink never change when it's moved from
668      * a master sink to another. One solution for this problem would be to
669      * remove user-visible volume altogether from filter sinks when volume
670      * sharing is used, but the current approach was easier to implement... */
671     /* We always support decibel volumes in software, otherwise we leave it to
672      * the sink implementor to set this flag as needed.
673      *
674      * Note: This flag can also change over the life time of the sink. */
675     if (!(s->flags & PA_SINK_HW_VOLUME_CTRL) && !(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
676         pa_sink_enable_decibel_volume(s, true);
677         s->soft_volume = s->reference_volume;
678     }
679
680     /* If the sink implementor support DB volumes by itself, we should always
681      * try and enable flat volumes too */
682     if ((s->flags & PA_SINK_DECIBEL_VOLUME))
683         enable_flat_volume(s, true);
684
685     if (s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER) {
686         pa_sink *root_sink = pa_sink_get_master(s);
687
688         pa_assert(root_sink);
689
690         s->reference_volume = root_sink->reference_volume;
691         pa_cvolume_remap(&s->reference_volume, &root_sink->channel_map, &s->channel_map);
692
693         s->real_volume = root_sink->real_volume;
694         pa_cvolume_remap(&s->real_volume, &root_sink->channel_map, &s->channel_map);
695     } else
696         /* We assume that if the sink implementor changed the default
697          * volume he did so in real_volume, because that is the usual
698          * place where he is supposed to place his changes.  */
699         s->reference_volume = s->real_volume;
700
701     s->thread_info.soft_volume = s->soft_volume;
702     s->thread_info.soft_muted = s->muted;
703     pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
704
705     pa_assert((s->flags & PA_SINK_HW_VOLUME_CTRL)
706               || (s->base_volume == PA_VOLUME_NORM
707                   && ((s->flags & PA_SINK_DECIBEL_VOLUME || (s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)))));
708     pa_assert(!(s->flags & PA_SINK_DECIBEL_VOLUME) || s->n_volume_steps == PA_VOLUME_NORM+1);
709     pa_assert(!(s->flags & PA_SINK_DYNAMIC_LATENCY) == !(s->thread_info.fixed_latency == 0));
710     pa_assert(!(s->flags & PA_SINK_LATENCY) == !(s->monitor_source->flags & PA_SOURCE_LATENCY));
711     pa_assert(!(s->flags & PA_SINK_DYNAMIC_LATENCY) == !(s->monitor_source->flags & PA_SOURCE_DYNAMIC_LATENCY));
712
713     pa_assert(s->monitor_source->thread_info.fixed_latency == s->thread_info.fixed_latency);
714     pa_assert(s->monitor_source->thread_info.min_latency == s->thread_info.min_latency);
715     pa_assert(s->monitor_source->thread_info.max_latency == s->thread_info.max_latency);
716
717     if (s->suspend_cause)
718         pa_assert_se(sink_set_state(s, PA_SINK_SUSPENDED, s->suspend_cause) == 0);
719     else
720         pa_assert_se(sink_set_state(s, PA_SINK_IDLE, 0) == 0);
721
722     pa_source_put(s->monitor_source);
723
724     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_NEW, s->index);
725     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PUT], s);
726
727     /* It's good to fire the SINK_PUT hook before updating the default sink,
728      * because module-switch-on-connect will set the new sink as the default
729      * sink, and if we were to call pa_core_update_default_sink() before that,
730      * the default sink might change twice, causing unnecessary stream moving. */
731
732     pa_core_update_default_sink(s->core);
733 }
734
735 /* Called from main context */
736 void pa_sink_unlink(pa_sink* s) {
737     bool linked;
738     pa_sink_input *i, PA_UNUSED *j = NULL;
739
740     pa_sink_assert_ref(s);
741     pa_assert_ctl_context();
742
743     /* Please note that pa_sink_unlink() does more than simply
744      * reversing pa_sink_put(). It also undoes the registrations
745      * already done in pa_sink_new()! */
746
747     if (s->unlink_requested)
748         return;
749
750     s->unlink_requested = true;
751
752     linked = PA_SINK_IS_LINKED(s->state);
753
754     if (linked)
755         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_UNLINK], s);
756
757     if (s->state != PA_SINK_UNLINKED)
758         pa_namereg_unregister(s->core, s->name);
759     pa_idxset_remove_by_data(s->core->sinks, s, NULL);
760
761     pa_core_update_default_sink(s->core);
762
763     if (s->card)
764         pa_idxset_remove_by_data(s->card->sinks, s, NULL);
765
766     while ((i = pa_idxset_first(s->inputs, NULL))) {
767         pa_assert(i != j);
768         pa_sink_input_kill(i);
769         j = i;
770     }
771
772     if (linked)
773         /* It's important to keep the suspend cause unchanged when unlinking,
774          * because if we remove the SESSION suspend cause here, the alsa sink
775          * will sync its volume with the hardware while another user is
776          * active, messing up the volume for that other user. */
777         sink_set_state(s, PA_SINK_UNLINKED, s->suspend_cause);
778     else
779         s->state = PA_SINK_UNLINKED;
780
781     reset_callbacks(s);
782
783     if (s->monitor_source)
784         pa_source_unlink(s->monitor_source);
785
786     if (linked) {
787         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_REMOVE, s->index);
788         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_UNLINK_POST], s);
789     }
790 }
791
792 /* Called from main context */
793 static void sink_free(pa_object *o) {
794     pa_sink *s = PA_SINK(o);
795
796     pa_assert(s);
797     pa_assert_ctl_context();
798     pa_assert(pa_sink_refcnt(s) == 0);
799     pa_assert(!PA_SINK_IS_LINKED(s->state));
800
801     pa_log_info("Freeing sink %u \"%s\"", s->index, s->name);
802
803     pa_sink_volume_change_flush(s);
804
805     if (s->monitor_source) {
806         pa_source_unref(s->monitor_source);
807         s->monitor_source = NULL;
808     }
809
810     pa_idxset_free(s->inputs, NULL);
811     pa_hashmap_free(s->thread_info.inputs);
812
813     if (s->silence.memblock)
814         pa_memblock_unref(s->silence.memblock);
815
816     pa_xfree(s->name);
817     pa_xfree(s->driver);
818
819     if (s->proplist)
820         pa_proplist_free(s->proplist);
821
822     if (s->ports)
823         pa_hashmap_free(s->ports);
824
825     pa_xfree(s);
826 }
827
828 /* Called from main context, and not while the IO thread is active, please */
829 void pa_sink_set_asyncmsgq(pa_sink *s, pa_asyncmsgq *q) {
830     pa_sink_assert_ref(s);
831     pa_assert_ctl_context();
832
833     s->asyncmsgq = q;
834
835     if (s->monitor_source)
836         pa_source_set_asyncmsgq(s->monitor_source, q);
837 }
838
839 /* Called from main context, and not while the IO thread is active, please */
840 void pa_sink_update_flags(pa_sink *s, pa_sink_flags_t mask, pa_sink_flags_t value) {
841     pa_sink_flags_t old_flags;
842     pa_sink_input *input;
843     uint32_t idx;
844
845     pa_sink_assert_ref(s);
846     pa_assert_ctl_context();
847
848     /* For now, allow only a minimal set of flags to be changed. */
849     pa_assert((mask & ~(PA_SINK_DYNAMIC_LATENCY|PA_SINK_LATENCY)) == 0);
850
851     old_flags = s->flags;
852     s->flags = (s->flags & ~mask) | (value & mask);
853
854     if (s->flags == old_flags)
855         return;
856
857     if ((s->flags & PA_SINK_LATENCY) != (old_flags & PA_SINK_LATENCY))
858         pa_log_debug("Sink %s: LATENCY flag %s.", s->name, (s->flags & PA_SINK_LATENCY) ? "enabled" : "disabled");
859
860     if ((s->flags & PA_SINK_DYNAMIC_LATENCY) != (old_flags & PA_SINK_DYNAMIC_LATENCY))
861         pa_log_debug("Sink %s: DYNAMIC_LATENCY flag %s.",
862                      s->name, (s->flags & PA_SINK_DYNAMIC_LATENCY) ? "enabled" : "disabled");
863
864     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
865     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_FLAGS_CHANGED], s);
866
867     if (s->monitor_source)
868         pa_source_update_flags(s->monitor_source,
869                                ((mask & PA_SINK_LATENCY) ? PA_SOURCE_LATENCY : 0) |
870                                ((mask & PA_SINK_DYNAMIC_LATENCY) ? PA_SOURCE_DYNAMIC_LATENCY : 0),
871                                ((value & PA_SINK_LATENCY) ? PA_SOURCE_LATENCY : 0) |
872                                ((value & PA_SINK_DYNAMIC_LATENCY) ? PA_SOURCE_DYNAMIC_LATENCY : 0));
873
874     PA_IDXSET_FOREACH(input, s->inputs, idx) {
875         if (input->origin_sink)
876             pa_sink_update_flags(input->origin_sink, mask, value);
877     }
878 }
879
880 /* Called from IO context, or before _put() from main context */
881 void pa_sink_set_rtpoll(pa_sink *s, pa_rtpoll *p) {
882     pa_sink_assert_ref(s);
883     pa_sink_assert_io_context(s);
884
885     s->thread_info.rtpoll = p;
886
887     if (s->monitor_source)
888         pa_source_set_rtpoll(s->monitor_source, p);
889 }
890
891 /* Called from main context */
892 int pa_sink_update_status(pa_sink*s) {
893     pa_sink_assert_ref(s);
894     pa_assert_ctl_context();
895     pa_assert(PA_SINK_IS_LINKED(s->state));
896
897     if (s->state == PA_SINK_SUSPENDED)
898         return 0;
899
900     return sink_set_state(s, pa_sink_used_by(s) ? PA_SINK_RUNNING : PA_SINK_IDLE, 0);
901 }
902
903 /* Called from main context */
904 int pa_sink_suspend(pa_sink *s, bool suspend, pa_suspend_cause_t cause) {
905     pa_suspend_cause_t merged_cause;
906
907     pa_sink_assert_ref(s);
908     pa_assert_ctl_context();
909     pa_assert(PA_SINK_IS_LINKED(s->state));
910     pa_assert(cause != 0);
911
912     if (suspend)
913         merged_cause = s->suspend_cause | cause;
914     else
915         merged_cause = s->suspend_cause & ~cause;
916
917     if (merged_cause)
918         return sink_set_state(s, PA_SINK_SUSPENDED, merged_cause);
919     else
920         return sink_set_state(s, pa_sink_used_by(s) ? PA_SINK_RUNNING : PA_SINK_IDLE, 0);
921 }
922
923 /* Called from main context */
924 pa_queue *pa_sink_move_all_start(pa_sink *s, pa_queue *q) {
925     pa_sink_input *i, *n;
926     uint32_t idx;
927
928     pa_sink_assert_ref(s);
929     pa_assert_ctl_context();
930     pa_assert(PA_SINK_IS_LINKED(s->state));
931
932     if (!q)
933         q = pa_queue_new();
934
935     for (i = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); i; i = n) {
936         n = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx));
937
938         pa_sink_input_ref(i);
939
940         if (pa_sink_input_start_move(i) >= 0)
941             pa_queue_push(q, i);
942         else
943             pa_sink_input_unref(i);
944     }
945
946     return q;
947 }
948
949 /* Called from main context */
950 void pa_sink_move_all_finish(pa_sink *s, pa_queue *q, bool save) {
951     pa_sink_input *i;
952
953     pa_sink_assert_ref(s);
954     pa_assert_ctl_context();
955     pa_assert(PA_SINK_IS_LINKED(s->state));
956     pa_assert(q);
957
958     while ((i = PA_SINK_INPUT(pa_queue_pop(q)))) {
959         if (PA_SINK_INPUT_IS_LINKED(i->state)) {
960             if (pa_sink_input_finish_move(i, s, save) < 0)
961                 pa_sink_input_fail_move(i);
962
963         }
964         pa_sink_input_unref(i);
965     }
966
967     pa_queue_free(q, NULL);
968 }
969
970 /* Called from main context */
971 void pa_sink_move_all_fail(pa_queue *q) {
972     pa_sink_input *i;
973
974     pa_assert_ctl_context();
975     pa_assert(q);
976
977     while ((i = PA_SINK_INPUT(pa_queue_pop(q)))) {
978         pa_sink_input_fail_move(i);
979         pa_sink_input_unref(i);
980     }
981
982     pa_queue_free(q, NULL);
983 }
984
985  /* Called from IO thread context */
986 size_t pa_sink_process_input_underruns(pa_sink *s, size_t left_to_play) {
987     pa_sink_input *i;
988     void *state = NULL;
989     size_t result = 0;
990
991     pa_sink_assert_ref(s);
992     pa_sink_assert_io_context(s);
993
994     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
995         size_t uf = i->thread_info.underrun_for_sink;
996
997         /* Propagate down the filter tree */
998         if (i->origin_sink) {
999             size_t filter_result, left_to_play_origin;
1000
1001             /* The recursive call works in the origin sink domain ... */
1002             left_to_play_origin = pa_convert_size(left_to_play, &i->sink->sample_spec, &i->origin_sink->sample_spec);
1003
1004             /* .. and returns the time to sleep before waking up. We need the
1005              * underrun duration for comparisons, so we undo the subtraction on
1006              * the return value... */
1007             filter_result = left_to_play_origin - pa_sink_process_input_underruns(i->origin_sink, left_to_play_origin);
1008
1009             /* ... and convert it back to the master sink domain */
1010             filter_result = pa_convert_size(filter_result, &i->origin_sink->sample_spec, &i->sink->sample_spec);
1011
1012             /* Remember the longest underrun so far */
1013             if (filter_result > result)
1014                 result = filter_result;
1015         }
1016
1017         if (uf == 0) {
1018             /* No underrun here, move on */
1019             continue;
1020         } else if (uf >= left_to_play) {
1021             /* The sink has possibly consumed all the data the sink input provided */
1022             pa_sink_input_process_underrun(i);
1023         } else if (uf > result) {
1024             /* Remember the longest underrun so far */
1025             result = uf;
1026         }
1027     }
1028
1029     if (result > 0)
1030         pa_log_debug("%s: Found underrun %ld bytes ago (%ld bytes ahead in playback buffer)", s->name,
1031                 (long) result, (long) left_to_play - result);
1032     return left_to_play - result;
1033 }
1034
1035 /* Called from IO thread context */
1036 void pa_sink_process_rewind(pa_sink *s, size_t nbytes) {
1037     pa_sink_input *i;
1038     void *state = NULL;
1039
1040     pa_sink_assert_ref(s);
1041     pa_sink_assert_io_context(s);
1042     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
1043
1044     /* If nobody requested this and this is actually no real rewind
1045      * then we can short cut this. Please note that this means that
1046      * not all rewind requests triggered upstream will always be
1047      * translated in actual requests! */
1048     if (!s->thread_info.rewind_requested && nbytes <= 0)
1049         return;
1050
1051     s->thread_info.rewind_nbytes = 0;
1052     s->thread_info.rewind_requested = false;
1053
1054     if (nbytes > 0) {
1055         pa_log_debug("Processing rewind...");
1056         if (s->flags & PA_SINK_DEFERRED_VOLUME)
1057             pa_sink_volume_change_rewind(s, nbytes);
1058     }
1059
1060     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
1061         pa_sink_input_assert_ref(i);
1062         pa_sink_input_process_rewind(i, nbytes);
1063     }
1064
1065     if (nbytes > 0) {
1066         if (s->monitor_source && PA_SOURCE_IS_LINKED(s->monitor_source->thread_info.state))
1067             pa_source_process_rewind(s->monitor_source, nbytes);
1068     }
1069 }
1070
1071 /* Called from IO thread context */
1072 static unsigned fill_mix_info(pa_sink *s, size_t *length, pa_mix_info *info, unsigned maxinfo) {
1073     pa_sink_input *i;
1074     unsigned n = 0;
1075     void *state = NULL;
1076     size_t mixlength = *length;
1077
1078     pa_sink_assert_ref(s);
1079     pa_sink_assert_io_context(s);
1080     pa_assert(info);
1081
1082     while ((i = pa_hashmap_iterate(s->thread_info.inputs, &state, NULL)) && maxinfo > 0) {
1083         pa_sink_input_assert_ref(i);
1084
1085         pa_sink_input_peek(i, *length, &info->chunk, &info->volume);
1086
1087         if (mixlength == 0 || info->chunk.length < mixlength)
1088             mixlength = info->chunk.length;
1089
1090         if (pa_memblock_is_silence(info->chunk.memblock)) {
1091             pa_memblock_unref(info->chunk.memblock);
1092             continue;
1093         }
1094
1095         info->userdata = pa_sink_input_ref(i);
1096
1097         pa_assert(info->chunk.memblock);
1098         pa_assert(info->chunk.length > 0);
1099
1100         info++;
1101         n++;
1102         maxinfo--;
1103     }
1104
1105     if (mixlength > 0)
1106         *length = mixlength;
1107
1108     return n;
1109 }
1110
1111 /* Called from IO thread context */
1112 static void inputs_drop(pa_sink *s, pa_mix_info *info, unsigned n, pa_memchunk *result) {
1113     pa_sink_input *i;
1114     void *state;
1115     unsigned p = 0;
1116     unsigned n_unreffed = 0;
1117
1118     pa_sink_assert_ref(s);
1119     pa_sink_assert_io_context(s);
1120     pa_assert(result);
1121     pa_assert(result->memblock);
1122     pa_assert(result->length > 0);
1123
1124     /* We optimize for the case where the order of the inputs has not changed */
1125
1126     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
1127         unsigned j;
1128         pa_mix_info* m = NULL;
1129
1130         pa_sink_input_assert_ref(i);
1131
1132         /* Let's try to find the matching entry info the pa_mix_info array */
1133         for (j = 0; j < n; j ++) {
1134
1135             if (info[p].userdata == i) {
1136                 m = info + p;
1137                 break;
1138             }
1139
1140             p++;
1141             if (p >= n)
1142                 p = 0;
1143         }
1144
1145         /* Drop read data */
1146         pa_sink_input_drop(i, result->length);
1147
1148         if (s->monitor_source && PA_SOURCE_IS_LINKED(s->monitor_source->thread_info.state)) {
1149
1150             if (pa_hashmap_size(i->thread_info.direct_outputs) > 0) {
1151                 void *ostate = NULL;
1152                 pa_source_output *o;
1153                 pa_memchunk c;
1154
1155                 if (m && m->chunk.memblock) {
1156                     c = m->chunk;
1157                     pa_memblock_ref(c.memblock);
1158                     pa_assert(result->length <= c.length);
1159                     c.length = result->length;
1160
1161                     pa_memchunk_make_writable(&c, 0);
1162                     pa_volume_memchunk(&c, &s->sample_spec, &m->volume);
1163                 } else {
1164                     c = s->silence;
1165                     pa_memblock_ref(c.memblock);
1166                     pa_assert(result->length <= c.length);
1167                     c.length = result->length;
1168                 }
1169
1170                 while ((o = pa_hashmap_iterate(i->thread_info.direct_outputs, &ostate, NULL))) {
1171                     pa_source_output_assert_ref(o);
1172                     pa_assert(o->direct_on_input == i);
1173                     pa_source_post_direct(s->monitor_source, o, &c);
1174                 }
1175
1176                 pa_memblock_unref(c.memblock);
1177             }
1178         }
1179
1180         if (m) {
1181             if (m->chunk.memblock) {
1182                 pa_memblock_unref(m->chunk.memblock);
1183                 pa_memchunk_reset(&m->chunk);
1184             }
1185
1186             pa_sink_input_unref(m->userdata);
1187             m->userdata = NULL;
1188
1189             n_unreffed += 1;
1190         }
1191     }
1192
1193     /* Now drop references to entries that are included in the
1194      * pa_mix_info array but don't exist anymore */
1195
1196     if (n_unreffed < n) {
1197         for (; n > 0; info++, n--) {
1198             if (info->userdata)
1199                 pa_sink_input_unref(info->userdata);
1200             if (info->chunk.memblock)
1201                 pa_memblock_unref(info->chunk.memblock);
1202         }
1203     }
1204
1205     if (s->monitor_source && PA_SOURCE_IS_LINKED(s->monitor_source->thread_info.state))
1206         pa_source_post(s->monitor_source, result);
1207 }
1208
1209 /* Called from IO thread context */
1210 void pa_sink_render(pa_sink*s, size_t length, pa_memchunk *result) {
1211     pa_mix_info info[MAX_MIX_CHANNELS];
1212     unsigned n;
1213     size_t block_size_max;
1214
1215     pa_sink_assert_ref(s);
1216     pa_sink_assert_io_context(s);
1217     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
1218     pa_assert(pa_frame_aligned(length, &s->sample_spec));
1219     pa_assert(result);
1220
1221     pa_assert(!s->thread_info.rewind_requested);
1222     pa_assert(s->thread_info.rewind_nbytes == 0);
1223
1224     if (s->thread_info.state == PA_SINK_SUSPENDED) {
1225         result->memblock = pa_memblock_ref(s->silence.memblock);
1226         result->index = s->silence.index;
1227         result->length = PA_MIN(s->silence.length, length);
1228         return;
1229     }
1230
1231     pa_sink_ref(s);
1232
1233     if (length <= 0)
1234         length = pa_frame_align(MIX_BUFFER_LENGTH, &s->sample_spec);
1235
1236     block_size_max = pa_mempool_block_size_max(s->core->mempool);
1237     if (length > block_size_max)
1238         length = pa_frame_align(block_size_max, &s->sample_spec);
1239
1240     pa_assert(length > 0);
1241
1242     n = fill_mix_info(s, &length, info, MAX_MIX_CHANNELS);
1243
1244     if (n == 0) {
1245
1246         *result = s->silence;
1247         pa_memblock_ref(result->memblock);
1248
1249         if (result->length > length)
1250             result->length = length;
1251
1252     } else if (n == 1) {
1253         pa_cvolume volume;
1254
1255         *result = info[0].chunk;
1256         pa_memblock_ref(result->memblock);
1257
1258         if (result->length > length)
1259             result->length = length;
1260
1261         pa_sw_cvolume_multiply(&volume, &s->thread_info.soft_volume, &info[0].volume);
1262
1263         if (s->thread_info.soft_muted || pa_cvolume_is_muted(&volume)) {
1264             pa_memblock_unref(result->memblock);
1265             pa_silence_memchunk_get(&s->core->silence_cache,
1266                                     s->core->mempool,
1267                                     result,
1268                                     &s->sample_spec,
1269                                     result->length);
1270         } else if (!pa_cvolume_is_norm(&volume)) {
1271             pa_memchunk_make_writable(result, 0);
1272             pa_volume_memchunk(result, &s->sample_spec, &volume);
1273         }
1274     } else {
1275         void *ptr;
1276         result->memblock = pa_memblock_new(s->core->mempool, length);
1277
1278         ptr = pa_memblock_acquire(result->memblock);
1279         result->length = pa_mix(info, n,
1280                                 ptr, length,
1281                                 &s->sample_spec,
1282                                 &s->thread_info.soft_volume,
1283                                 s->thread_info.soft_muted);
1284         pa_memblock_release(result->memblock);
1285
1286         result->index = 0;
1287     }
1288
1289     inputs_drop(s, info, n, result);
1290
1291     pa_sink_unref(s);
1292 }
1293
1294 /* Called from IO thread context */
1295 void pa_sink_render_into(pa_sink*s, pa_memchunk *target) {
1296     pa_mix_info info[MAX_MIX_CHANNELS];
1297     unsigned n;
1298     size_t length, block_size_max;
1299
1300     pa_sink_assert_ref(s);
1301     pa_sink_assert_io_context(s);
1302     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
1303     pa_assert(target);
1304     pa_assert(target->memblock);
1305     pa_assert(target->length > 0);
1306     pa_assert(pa_frame_aligned(target->length, &s->sample_spec));
1307
1308     pa_assert(!s->thread_info.rewind_requested);
1309     pa_assert(s->thread_info.rewind_nbytes == 0);
1310
1311     if (s->thread_info.state == PA_SINK_SUSPENDED) {
1312         pa_silence_memchunk(target, &s->sample_spec);
1313         return;
1314     }
1315
1316     pa_sink_ref(s);
1317
1318     length = target->length;
1319     block_size_max = pa_mempool_block_size_max(s->core->mempool);
1320     if (length > block_size_max)
1321         length = pa_frame_align(block_size_max, &s->sample_spec);
1322
1323     pa_assert(length > 0);
1324
1325     n = fill_mix_info(s, &length, info, MAX_MIX_CHANNELS);
1326
1327     if (n == 0) {
1328         if (target->length > length)
1329             target->length = length;
1330
1331         pa_silence_memchunk(target, &s->sample_spec);
1332     } else if (n == 1) {
1333         pa_cvolume volume;
1334
1335         if (target->length > length)
1336             target->length = length;
1337
1338         pa_sw_cvolume_multiply(&volume, &s->thread_info.soft_volume, &info[0].volume);
1339
1340         if (s->thread_info.soft_muted || pa_cvolume_is_muted(&volume))
1341             pa_silence_memchunk(target, &s->sample_spec);
1342         else {
1343             pa_memchunk vchunk;
1344
1345             vchunk = info[0].chunk;
1346             pa_memblock_ref(vchunk.memblock);
1347
1348             if (vchunk.length > length)
1349                 vchunk.length = length;
1350
1351             if (!pa_cvolume_is_norm(&volume)) {
1352                 pa_memchunk_make_writable(&vchunk, 0);
1353                 pa_volume_memchunk(&vchunk, &s->sample_spec, &volume);
1354             }
1355
1356             pa_memchunk_memcpy(target, &vchunk);
1357             pa_memblock_unref(vchunk.memblock);
1358         }
1359
1360     } else {
1361         void *ptr;
1362
1363         ptr = pa_memblock_acquire(target->memblock);
1364
1365         target->length = pa_mix(info, n,
1366                                 (uint8_t*) ptr + target->index, length,
1367                                 &s->sample_spec,
1368                                 &s->thread_info.soft_volume,
1369                                 s->thread_info.soft_muted);
1370
1371         pa_memblock_release(target->memblock);
1372     }
1373
1374     inputs_drop(s, info, n, target);
1375
1376     pa_sink_unref(s);
1377 }
1378
1379 /* Called from IO thread context */
1380 void pa_sink_render_into_full(pa_sink *s, pa_memchunk *target) {
1381     pa_memchunk chunk;
1382     size_t l, d;
1383
1384     pa_sink_assert_ref(s);
1385     pa_sink_assert_io_context(s);
1386     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
1387     pa_assert(target);
1388     pa_assert(target->memblock);
1389     pa_assert(target->length > 0);
1390     pa_assert(pa_frame_aligned(target->length, &s->sample_spec));
1391
1392     pa_assert(!s->thread_info.rewind_requested);
1393     pa_assert(s->thread_info.rewind_nbytes == 0);
1394
1395     if (s->thread_info.state == PA_SINK_SUSPENDED) {
1396         pa_silence_memchunk(target, &s->sample_spec);
1397         return;
1398     }
1399
1400     pa_sink_ref(s);
1401
1402     l = target->length;
1403     d = 0;
1404     while (l > 0) {
1405         chunk = *target;
1406         chunk.index += d;
1407         chunk.length -= d;
1408
1409         pa_sink_render_into(s, &chunk);
1410
1411         d += chunk.length;
1412         l -= chunk.length;
1413     }
1414
1415     pa_sink_unref(s);
1416 }
1417
1418 /* Called from IO thread context */
1419 void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result) {
1420     pa_sink_assert_ref(s);
1421     pa_sink_assert_io_context(s);
1422     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
1423     pa_assert(length > 0);
1424     pa_assert(pa_frame_aligned(length, &s->sample_spec));
1425     pa_assert(result);
1426
1427     pa_assert(!s->thread_info.rewind_requested);
1428     pa_assert(s->thread_info.rewind_nbytes == 0);
1429
1430     pa_sink_ref(s);
1431
1432     pa_sink_render(s, length, result);
1433
1434     if (result->length < length) {
1435         pa_memchunk chunk;
1436
1437         pa_memchunk_make_writable(result, length);
1438
1439         chunk.memblock = result->memblock;
1440         chunk.index = result->index + result->length;
1441         chunk.length = length - result->length;
1442
1443         pa_sink_render_into_full(s, &chunk);
1444
1445         result->length = length;
1446     }
1447
1448     pa_sink_unref(s);
1449 }
1450
1451 /* Called from main thread */
1452 void pa_sink_reconfigure(pa_sink *s, pa_sample_spec *spec, bool passthrough) {
1453     pa_sample_spec desired_spec;
1454     uint32_t default_rate = s->default_sample_rate;
1455     uint32_t alternate_rate = s->alternate_sample_rate;
1456     uint32_t idx;
1457     pa_sink_input *i;
1458     bool default_rate_is_usable = false;
1459     bool alternate_rate_is_usable = false;
1460     bool avoid_resampling = s->avoid_resampling;
1461
1462     if (pa_sample_spec_equal(spec, &s->sample_spec))
1463         return;
1464
1465     if (!s->reconfigure)
1466         return;
1467
1468     if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough && !avoid_resampling)) {
1469         pa_log_debug("Default and alternate sample rates are the same, so there is no point in switching.");
1470         return;
1471     }
1472
1473     if (PA_SINK_IS_RUNNING(s->state)) {
1474         pa_log_info("Cannot update sample spec, SINK_IS_RUNNING, will keep using %s and %u Hz",
1475                     pa_sample_format_to_string(s->sample_spec.format), s->sample_spec.rate);
1476         return;
1477     }
1478
1479     if (s->monitor_source) {
1480         if (PA_SOURCE_IS_RUNNING(s->monitor_source->state) == true) {
1481             pa_log_info("Cannot update sample spec, monitor source is RUNNING");
1482             return;
1483         }
1484     }
1485
1486     if (PA_UNLIKELY(!pa_sample_spec_valid(spec)))
1487         return;
1488
1489     desired_spec = s->sample_spec;
1490
1491     if (passthrough) {
1492         /* We have to try to use the sink input format and rate */
1493         desired_spec.format = spec->format;
1494         desired_spec.rate = spec->rate;
1495
1496     } else if (avoid_resampling) {
1497         /* We just try to set the sink input's sample rate if it's not too low */
1498         if (spec->rate >= default_rate || spec->rate >= alternate_rate)
1499             desired_spec.rate = spec->rate;
1500         desired_spec.format = spec->format;
1501
1502     } else if (default_rate == spec->rate || alternate_rate == spec->rate) {
1503         /* We can directly try to use this rate */
1504         desired_spec.rate = spec->rate;
1505
1506     }
1507
1508     if (desired_spec.rate != spec->rate) {
1509         /* See if we can pick a rate that results in less resampling effort */
1510         if (default_rate % 11025 == 0 && spec->rate % 11025 == 0)
1511             default_rate_is_usable = true;
1512         if (default_rate % 4000 == 0 && spec->rate % 4000 == 0)
1513             default_rate_is_usable = true;
1514         if (alternate_rate % 11025 == 0 && spec->rate % 11025 == 0)
1515             alternate_rate_is_usable = true;
1516         if (alternate_rate % 4000 == 0 && spec->rate % 4000 == 0)
1517             alternate_rate_is_usable = true;
1518
1519         if (alternate_rate_is_usable && !default_rate_is_usable)
1520             desired_spec.rate = alternate_rate;
1521         else
1522             desired_spec.rate = default_rate;
1523     }
1524
1525     if (pa_sample_spec_equal(&desired_spec, &s->sample_spec) && passthrough == pa_sink_is_passthrough(s))
1526         return;
1527
1528     if (!passthrough && pa_sink_used_by(s) > 0)
1529         return;
1530
1531     pa_log_debug("Suspending sink %s due to changing format, desired format = %s rate = %u",
1532                  s->name, pa_sample_format_to_string(desired_spec.format), desired_spec.rate);
1533     pa_sink_suspend(s, true, PA_SUSPEND_INTERNAL);
1534
1535     s->reconfigure(s, &desired_spec, passthrough);
1536
1537     /* update monitor source as well */
1538     if (s->monitor_source && !passthrough)
1539         pa_source_reconfigure(s->monitor_source, &s->sample_spec, false);
1540     pa_log_info("Reconfigured successfully");
1541
1542     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1543         if (i->state == PA_SINK_INPUT_CORKED)
1544             pa_sink_input_update_resampler(i);
1545     }
1546
1547     pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL);
1548 }
1549
1550 /* Called from main thread */
1551 pa_usec_t pa_sink_get_latency(pa_sink *s) {
1552     int64_t usec = 0;
1553
1554     pa_sink_assert_ref(s);
1555     pa_assert_ctl_context();
1556     pa_assert(PA_SINK_IS_LINKED(s->state));
1557
1558     /* The returned value is supposed to be in the time domain of the sound card! */
1559
1560     if (s->state == PA_SINK_SUSPENDED)
1561         return 0;
1562
1563     if (!(s->flags & PA_SINK_LATENCY))
1564         return 0;
1565
1566     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) == 0);
1567
1568     /* the return value is unsigned, so check that the offset can be added to usec without
1569      * underflowing. */
1570     if (-s->port_latency_offset <= usec)
1571         usec += s->port_latency_offset;
1572     else
1573         usec = 0;
1574
1575     return (pa_usec_t)usec;
1576 }
1577
1578 /* Called from IO thread */
1579 int64_t pa_sink_get_latency_within_thread(pa_sink *s, bool allow_negative) {
1580     int64_t usec = 0;
1581     pa_msgobject *o;
1582
1583     pa_sink_assert_ref(s);
1584     pa_sink_assert_io_context(s);
1585     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
1586
1587     /* The returned value is supposed to be in the time domain of the sound card! */
1588
1589     if (s->thread_info.state == PA_SINK_SUSPENDED)
1590         return 0;
1591
1592     if (!(s->flags & PA_SINK_LATENCY))
1593         return 0;
1594
1595     o = PA_MSGOBJECT(s);
1596
1597     /* FIXME: We probably should make this a proper vtable callback instead of going through process_msg() */
1598
1599     o->process_msg(o, PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL);
1600
1601     /* If allow_negative is false, the call should only return positive values, */
1602     usec += s->thread_info.port_latency_offset;
1603     if (!allow_negative && usec < 0)
1604         usec = 0;
1605
1606     return usec;
1607 }
1608
1609 /* Called from the main thread (and also from the IO thread while the main
1610  * thread is waiting).
1611  *
1612  * When a sink uses volume sharing, it never has the PA_SINK_FLAT_VOLUME flag
1613  * set. Instead, flat volume mode is detected by checking whether the root sink
1614  * has the flag set. */
1615 bool pa_sink_flat_volume_enabled(pa_sink *s) {
1616     pa_sink_assert_ref(s);
1617
1618     s = pa_sink_get_master(s);
1619
1620     if (PA_LIKELY(s))
1621         return (s->flags & PA_SINK_FLAT_VOLUME);
1622     else
1623         return false;
1624 }
1625
1626 /* Called from the main thread (and also from the IO thread while the main
1627  * thread is waiting). */
1628 pa_sink *pa_sink_get_master(pa_sink *s) {
1629     pa_sink_assert_ref(s);
1630
1631     while (s && (s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1632         if (PA_UNLIKELY(!s->input_to_master))
1633             return NULL;
1634
1635         s = s->input_to_master->sink;
1636     }
1637
1638     return s;
1639 }
1640
1641 /* Called from main context */
1642 bool pa_sink_is_filter(pa_sink *s) {
1643     pa_sink_assert_ref(s);
1644
1645     return (s->input_to_master != NULL);
1646 }
1647
1648 /* Called from main context */
1649 bool pa_sink_is_passthrough(pa_sink *s) {
1650     pa_sink_input *alt_i;
1651     uint32_t idx;
1652
1653     pa_sink_assert_ref(s);
1654
1655     /* one and only one PASSTHROUGH input can possibly be connected */
1656     if (pa_idxset_size(s->inputs) == 1) {
1657         alt_i = pa_idxset_first(s->inputs, &idx);
1658
1659         if (pa_sink_input_is_passthrough(alt_i))
1660             return true;
1661     }
1662
1663     return false;
1664 }
1665
1666 /* Called from main context */
1667 void pa_sink_enter_passthrough(pa_sink *s) {
1668     pa_cvolume volume;
1669
1670     /* The sink implementation is reconfigured for passthrough in
1671      * pa_sink_reconfigure(). This function sets the PA core objects to
1672      * passthrough mode. */
1673
1674     /* disable the monitor in passthrough mode */
1675     if (s->monitor_source) {
1676         pa_log_debug("Suspending monitor source %s, because the sink is entering the passthrough mode.", s->monitor_source->name);
1677         pa_source_suspend(s->monitor_source, true, PA_SUSPEND_PASSTHROUGH);
1678     }
1679
1680     /* set the volume to NORM */
1681     s->saved_volume = *pa_sink_get_volume(s, true);
1682     s->saved_save_volume = s->save_volume;
1683
1684     pa_cvolume_set(&volume, s->sample_spec.channels, PA_MIN(s->base_volume, PA_VOLUME_NORM));
1685     pa_sink_set_volume(s, &volume, true, false);
1686
1687     pa_log_debug("Suspending/Restarting sink %s to enter passthrough mode", s->name);
1688 }
1689
1690 /* Called from main context */
1691 void pa_sink_leave_passthrough(pa_sink *s) {
1692     /* Unsuspend monitor */
1693     if (s->monitor_source) {
1694         pa_log_debug("Resuming monitor source %s, because the sink is leaving the passthrough mode.", s->monitor_source->name);
1695         pa_source_suspend(s->monitor_source, false, PA_SUSPEND_PASSTHROUGH);
1696     }
1697
1698     /* Restore sink volume to what it was before we entered passthrough mode */
1699     pa_sink_set_volume(s, &s->saved_volume, true, s->saved_save_volume);
1700
1701     pa_cvolume_init(&s->saved_volume);
1702     s->saved_save_volume = false;
1703
1704 }
1705
1706 /* Called from main context. */
1707 static void compute_reference_ratio(pa_sink_input *i) {
1708     unsigned c = 0;
1709     pa_cvolume remapped;
1710     pa_cvolume ratio;
1711
1712     pa_assert(i);
1713     pa_assert(pa_sink_flat_volume_enabled(i->sink));
1714
1715     /*
1716      * Calculates the reference ratio from the sink's reference
1717      * volume. This basically calculates:
1718      *
1719      * i->reference_ratio = i->volume / i->sink->reference_volume
1720      */
1721
1722     remapped = i->sink->reference_volume;
1723     pa_cvolume_remap(&remapped, &i->sink->channel_map, &i->channel_map);
1724
1725     ratio = i->reference_ratio;
1726
1727     for (c = 0; c < i->sample_spec.channels; c++) {
1728
1729         /* We don't update when the sink volume is 0 anyway */
1730         if (remapped.values[c] <= PA_VOLUME_MUTED)
1731             continue;
1732
1733         /* Don't update the reference ratio unless necessary */
1734         if (pa_sw_volume_multiply(
1735                     ratio.values[c],
1736                     remapped.values[c]) == i->volume.values[c])
1737             continue;
1738
1739         ratio.values[c] = pa_sw_volume_divide(
1740                 i->volume.values[c],
1741                 remapped.values[c]);
1742     }
1743
1744     pa_sink_input_set_reference_ratio(i, &ratio);
1745 }
1746
1747 /* Called from main context. Only called for the root sink in volume sharing
1748  * cases, except for internal recursive calls. */
1749 static void compute_reference_ratios(pa_sink *s) {
1750     uint32_t idx;
1751     pa_sink_input *i;
1752
1753     pa_sink_assert_ref(s);
1754     pa_assert_ctl_context();
1755     pa_assert(PA_SINK_IS_LINKED(s->state));
1756     pa_assert(pa_sink_flat_volume_enabled(s));
1757
1758     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1759         compute_reference_ratio(i);
1760
1761         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)
1762                 && PA_SINK_IS_LINKED(i->origin_sink->state))
1763             compute_reference_ratios(i->origin_sink);
1764     }
1765 }
1766
1767 /* Called from main context. Only called for the root sink in volume sharing
1768  * cases, except for internal recursive calls. */
1769 static void compute_real_ratios(pa_sink *s) {
1770     pa_sink_input *i;
1771     uint32_t idx;
1772
1773     pa_sink_assert_ref(s);
1774     pa_assert_ctl_context();
1775     pa_assert(PA_SINK_IS_LINKED(s->state));
1776     pa_assert(pa_sink_flat_volume_enabled(s));
1777
1778     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1779         unsigned c;
1780         pa_cvolume remapped;
1781
1782         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1783             /* The origin sink uses volume sharing, so this input's real ratio
1784              * is handled as a special case - the real ratio must be 0 dB, and
1785              * as a result i->soft_volume must equal i->volume_factor. */
1786             pa_cvolume_reset(&i->real_ratio, i->real_ratio.channels);
1787             i->soft_volume = i->volume_factor;
1788
1789             if (PA_SINK_IS_LINKED(i->origin_sink->state))
1790                 compute_real_ratios(i->origin_sink);
1791
1792             continue;
1793         }
1794
1795         /*
1796          * This basically calculates:
1797          *
1798          * i->real_ratio := i->volume / s->real_volume
1799          * i->soft_volume := i->real_ratio * i->volume_factor
1800          */
1801
1802         remapped = s->real_volume;
1803         pa_cvolume_remap(&remapped, &s->channel_map, &i->channel_map);
1804
1805         i->real_ratio.channels = i->sample_spec.channels;
1806         i->soft_volume.channels = i->sample_spec.channels;
1807
1808         for (c = 0; c < i->sample_spec.channels; c++) {
1809
1810             if (remapped.values[c] <= PA_VOLUME_MUTED) {
1811                 /* We leave i->real_ratio untouched */
1812                 i->soft_volume.values[c] = PA_VOLUME_MUTED;
1813                 continue;
1814             }
1815
1816             /* Don't lose accuracy unless necessary */
1817             if (pa_sw_volume_multiply(
1818                         i->real_ratio.values[c],
1819                         remapped.values[c]) != i->volume.values[c])
1820
1821                 i->real_ratio.values[c] = pa_sw_volume_divide(
1822                         i->volume.values[c],
1823                         remapped.values[c]);
1824
1825             i->soft_volume.values[c] = pa_sw_volume_multiply(
1826                     i->real_ratio.values[c],
1827                     i->volume_factor.values[c]);
1828         }
1829
1830         /* We don't copy the soft_volume to the thread_info data
1831          * here. That must be done by the caller */
1832     }
1833 }
1834
1835 static pa_cvolume *cvolume_remap_minimal_impact(
1836         pa_cvolume *v,
1837         const pa_cvolume *template,
1838         const pa_channel_map *from,
1839         const pa_channel_map *to) {
1840
1841     pa_cvolume t;
1842
1843     pa_assert(v);
1844     pa_assert(template);
1845     pa_assert(from);
1846     pa_assert(to);
1847     pa_assert(pa_cvolume_compatible_with_channel_map(v, from));
1848     pa_assert(pa_cvolume_compatible_with_channel_map(template, to));
1849
1850     /* Much like pa_cvolume_remap(), but tries to minimize impact when
1851      * mapping from sink input to sink volumes:
1852      *
1853      * If template is a possible remapping from v it is used instead
1854      * of remapping anew.
1855      *
1856      * If the channel maps don't match we set an all-channel volume on
1857      * the sink to ensure that changing a volume on one stream has no
1858      * effect that cannot be compensated for in another stream that
1859      * does not have the same channel map as the sink. */
1860
1861     if (pa_channel_map_equal(from, to))
1862         return v;
1863
1864     t = *template;
1865     if (pa_cvolume_equal(pa_cvolume_remap(&t, to, from), v)) {
1866         *v = *template;
1867         return v;
1868     }
1869
1870     pa_cvolume_set(v, to->channels, pa_cvolume_max(v));
1871     return v;
1872 }
1873
1874 /* Called from main thread. Only called for the root sink in volume sharing
1875  * cases, except for internal recursive calls. */
1876 static void get_maximum_input_volume(pa_sink *s, pa_cvolume *max_volume, const pa_channel_map *channel_map) {
1877     pa_sink_input *i;
1878     uint32_t idx;
1879
1880     pa_sink_assert_ref(s);
1881     pa_assert(max_volume);
1882     pa_assert(channel_map);
1883     pa_assert(pa_sink_flat_volume_enabled(s));
1884
1885     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1886         pa_cvolume remapped;
1887
1888         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1889             if (PA_SINK_IS_LINKED(i->origin_sink->state))
1890                 get_maximum_input_volume(i->origin_sink, max_volume, channel_map);
1891
1892             /* Ignore this input. The origin sink uses volume sharing, so this
1893              * input's volume will be set to be equal to the root sink's real
1894              * volume. Obviously this input's current volume must not then
1895              * affect what the root sink's real volume will be. */
1896             continue;
1897         }
1898
1899         remapped = i->volume;
1900         cvolume_remap_minimal_impact(&remapped, max_volume, &i->channel_map, channel_map);
1901         pa_cvolume_merge(max_volume, max_volume, &remapped);
1902     }
1903 }
1904
1905 /* Called from main thread. Only called for the root sink in volume sharing
1906  * cases, except for internal recursive calls. */
1907 static bool has_inputs(pa_sink *s) {
1908     pa_sink_input *i;
1909     uint32_t idx;
1910
1911     pa_sink_assert_ref(s);
1912
1913     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1914         if (!i->origin_sink || !(i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER) || has_inputs(i->origin_sink))
1915             return true;
1916     }
1917
1918     return false;
1919 }
1920
1921 /* Called from main thread. Only called for the root sink in volume sharing
1922  * cases, except for internal recursive calls. */
1923 static void update_real_volume(pa_sink *s, const pa_cvolume *new_volume, pa_channel_map *channel_map) {
1924     pa_sink_input *i;
1925     uint32_t idx;
1926
1927     pa_sink_assert_ref(s);
1928     pa_assert(new_volume);
1929     pa_assert(channel_map);
1930
1931     s->real_volume = *new_volume;
1932     pa_cvolume_remap(&s->real_volume, channel_map, &s->channel_map);
1933
1934     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1935         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1936             if (pa_sink_flat_volume_enabled(s)) {
1937                 pa_cvolume new_input_volume;
1938
1939                 /* Follow the root sink's real volume. */
1940                 new_input_volume = *new_volume;
1941                 pa_cvolume_remap(&new_input_volume, channel_map, &i->channel_map);
1942                 pa_sink_input_set_volume_direct(i, &new_input_volume);
1943                 compute_reference_ratio(i);
1944             }
1945
1946             if (PA_SINK_IS_LINKED(i->origin_sink->state))
1947                 update_real_volume(i->origin_sink, new_volume, channel_map);
1948         }
1949     }
1950 }
1951
1952 /* Called from main thread. Only called for the root sink in shared volume
1953  * cases. */
1954 static void compute_real_volume(pa_sink *s) {
1955     pa_sink_assert_ref(s);
1956     pa_assert_ctl_context();
1957     pa_assert(PA_SINK_IS_LINKED(s->state));
1958     pa_assert(pa_sink_flat_volume_enabled(s));
1959     pa_assert(!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER));
1960
1961     /* This determines the maximum volume of all streams and sets
1962      * s->real_volume accordingly. */
1963
1964     if (!has_inputs(s)) {
1965         /* In the special case that we have no sink inputs we leave the
1966          * volume unmodified. */
1967         update_real_volume(s, &s->reference_volume, &s->channel_map);
1968         return;
1969     }
1970
1971     pa_cvolume_mute(&s->real_volume, s->channel_map.channels);
1972
1973     /* First let's determine the new maximum volume of all inputs
1974      * connected to this sink */
1975     get_maximum_input_volume(s, &s->real_volume, &s->channel_map);
1976     update_real_volume(s, &s->real_volume, &s->channel_map);
1977
1978     /* Then, let's update the real ratios/soft volumes of all inputs
1979      * connected to this sink */
1980     compute_real_ratios(s);
1981 }
1982
1983 /* Called from main thread. Only called for the root sink in shared volume
1984  * cases, except for internal recursive calls. */
1985 static void propagate_reference_volume(pa_sink *s) {
1986     pa_sink_input *i;
1987     uint32_t idx;
1988
1989     pa_sink_assert_ref(s);
1990     pa_assert_ctl_context();
1991     pa_assert(PA_SINK_IS_LINKED(s->state));
1992     pa_assert(pa_sink_flat_volume_enabled(s));
1993
1994     /* This is called whenever the sink volume changes that is not
1995      * caused by a sink input volume change. We need to fix up the
1996      * sink input volumes accordingly */
1997
1998     PA_IDXSET_FOREACH(i, s->inputs, idx) {
1999         pa_cvolume new_volume;
2000
2001         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
2002             if (PA_SINK_IS_LINKED(i->origin_sink->state))
2003                 propagate_reference_volume(i->origin_sink);
2004
2005             /* Since the origin sink uses volume sharing, this input's volume
2006              * needs to be updated to match the root sink's real volume, but
2007              * that will be done later in update_real_volume(). */
2008             continue;
2009         }
2010
2011         /* This basically calculates:
2012          *
2013          * i->volume := s->reference_volume * i->reference_ratio  */
2014
2015         new_volume = s->reference_volume;
2016         pa_cvolume_remap(&new_volume, &s->channel_map, &i->channel_map);
2017         pa_sw_cvolume_multiply(&new_volume, &new_volume, &i->reference_ratio);
2018         pa_sink_input_set_volume_direct(i, &new_volume);
2019     }
2020 }
2021
2022 /* Called from main thread. Only called for the root sink in volume sharing
2023  * cases, except for internal recursive calls. The return value indicates
2024  * whether any reference volume actually changed. */
2025 static bool update_reference_volume(pa_sink *s, const pa_cvolume *v, const pa_channel_map *channel_map, bool save) {
2026     pa_cvolume volume;
2027     bool reference_volume_changed;
2028     pa_sink_input *i;
2029     uint32_t idx;
2030
2031     pa_sink_assert_ref(s);
2032     pa_assert(PA_SINK_IS_LINKED(s->state));
2033     pa_assert(v);
2034     pa_assert(channel_map);
2035     pa_assert(pa_cvolume_valid(v));
2036
2037     volume = *v;
2038     pa_cvolume_remap(&volume, channel_map, &s->channel_map);
2039
2040     reference_volume_changed = !pa_cvolume_equal(&volume, &s->reference_volume);
2041     pa_sink_set_reference_volume_direct(s, &volume);
2042
2043     s->save_volume = (!reference_volume_changed && s->save_volume) || save;
2044
2045     if (!reference_volume_changed && !(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER))
2046         /* If the root sink's volume doesn't change, then there can't be any
2047          * changes in the other sinks in the sink tree either.
2048          *
2049          * It's probably theoretically possible that even if the root sink's
2050          * volume changes slightly, some filter sink doesn't change its volume
2051          * due to rounding errors. If that happens, we still want to propagate
2052          * the changed root sink volume to the sinks connected to the
2053          * intermediate sink that didn't change its volume. This theoretical
2054          * possibility is the reason why we have that !(s->flags &
2055          * PA_SINK_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
2056          * notice even if we returned here false always if
2057          * reference_volume_changed is false. */
2058         return false;
2059
2060     PA_IDXSET_FOREACH(i, s->inputs, idx) {
2061         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)
2062                 && PA_SINK_IS_LINKED(i->origin_sink->state))
2063             update_reference_volume(i->origin_sink, v, channel_map, false);
2064     }
2065
2066     return true;
2067 }
2068
2069 /* Called from main thread */
2070 void pa_sink_set_volume(
2071         pa_sink *s,
2072         const pa_cvolume *volume,
2073         bool send_msg,
2074         bool save) {
2075
2076     pa_cvolume new_reference_volume;
2077     pa_sink *root_sink;
2078
2079     pa_sink_assert_ref(s);
2080     pa_assert_ctl_context();
2081     pa_assert(PA_SINK_IS_LINKED(s->state));
2082     pa_assert(!volume || pa_cvolume_valid(volume));
2083     pa_assert(volume || pa_sink_flat_volume_enabled(s));
2084     pa_assert(!volume || volume->channels == 1 || pa_cvolume_compatible(volume, &s->sample_spec));
2085
2086     /* make sure we don't change the volume when a PASSTHROUGH input is connected ...
2087      * ... *except* if we're being invoked to reset the volume to ensure 0 dB gain */
2088     if (pa_sink_is_passthrough(s) && (!volume || !pa_cvolume_is_norm(volume))) {
2089         pa_log_warn("Cannot change volume, Sink is connected to PASSTHROUGH input");
2090         return;
2091     }
2092
2093     /* In case of volume sharing, the volume is set for the root sink first,
2094      * from which it's then propagated to the sharing sinks. */
2095     root_sink = pa_sink_get_master(s);
2096
2097     if (PA_UNLIKELY(!root_sink))
2098         return;
2099
2100     /* As a special exception we accept mono volumes on all sinks --
2101      * even on those with more complex channel maps */
2102
2103     if (volume) {
2104         if (pa_cvolume_compatible(volume, &s->sample_spec))
2105             new_reference_volume = *volume;
2106         else {
2107             new_reference_volume = s->reference_volume;
2108             pa_cvolume_scale(&new_reference_volume, pa_cvolume_max(volume));
2109         }
2110
2111         pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_sink->channel_map);
2112
2113         if (update_reference_volume(root_sink, &new_reference_volume, &root_sink->channel_map, save)) {
2114             if (pa_sink_flat_volume_enabled(root_sink)) {
2115                 /* OK, propagate this volume change back to the inputs */
2116                 propagate_reference_volume(root_sink);
2117
2118                 /* And now recalculate the real volume */
2119                 compute_real_volume(root_sink);
2120             } else
2121                 update_real_volume(root_sink, &root_sink->reference_volume, &root_sink->channel_map);
2122         }
2123
2124     } else {
2125         /* If volume is NULL we synchronize the sink's real and
2126          * reference volumes with the stream volumes. */
2127
2128         pa_assert(pa_sink_flat_volume_enabled(root_sink));
2129
2130         /* Ok, let's determine the new real volume */
2131         compute_real_volume(root_sink);
2132
2133         /* Let's 'push' the reference volume if necessary */
2134         pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_sink->real_volume);
2135         /* If the sink and its root don't have the same number of channels, we need to remap */
2136         if (s != root_sink && !pa_channel_map_equal(&s->channel_map, &root_sink->channel_map))
2137             pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_sink->channel_map);
2138         update_reference_volume(root_sink, &new_reference_volume, &root_sink->channel_map, save);
2139
2140         /* Now that the reference volume is updated, we can update the streams'
2141          * reference ratios. */
2142         compute_reference_ratios(root_sink);
2143     }
2144
2145     if (root_sink->set_volume) {
2146         /* If we have a function set_volume(), then we do not apply a
2147          * soft volume by default. However, set_volume() is free to
2148          * apply one to root_sink->soft_volume */
2149
2150         pa_cvolume_reset(&root_sink->soft_volume, root_sink->sample_spec.channels);
2151         if (!(root_sink->flags & PA_SINK_DEFERRED_VOLUME))
2152             root_sink->set_volume(root_sink);
2153
2154     } else
2155         /* If we have no function set_volume(), then the soft volume
2156          * becomes the real volume */
2157         root_sink->soft_volume = root_sink->real_volume;
2158
2159     /* This tells the sink that soft volume and/or real volume changed */
2160     if (send_msg)
2161         pa_assert_se(pa_asyncmsgq_send(root_sink->asyncmsgq, PA_MSGOBJECT(root_sink), PA_SINK_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL) == 0);
2162 }
2163
2164 /* Called from the io thread if sync volume is used, otherwise from the main thread.
2165  * Only to be called by sink implementor */
2166 void pa_sink_set_soft_volume(pa_sink *s, const pa_cvolume *volume) {
2167
2168     pa_sink_assert_ref(s);
2169     pa_assert(!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER));
2170
2171     if (s->flags & PA_SINK_DEFERRED_VOLUME)
2172         pa_sink_assert_io_context(s);
2173     else
2174         pa_assert_ctl_context();
2175
2176     if (!volume)
2177         pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
2178     else
2179         s->soft_volume = *volume;
2180
2181     if (PA_SINK_IS_LINKED(s->state) && !(s->flags & PA_SINK_DEFERRED_VOLUME))
2182         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_VOLUME, NULL, 0, NULL) == 0);
2183     else
2184         s->thread_info.soft_volume = s->soft_volume;
2185 }
2186
2187 /* Called from the main thread. Only called for the root sink in volume sharing
2188  * cases, except for internal recursive calls. */
2189 static void propagate_real_volume(pa_sink *s, const pa_cvolume *old_real_volume) {
2190     pa_sink_input *i;
2191     uint32_t idx;
2192
2193     pa_sink_assert_ref(s);
2194     pa_assert(old_real_volume);
2195     pa_assert_ctl_context();
2196     pa_assert(PA_SINK_IS_LINKED(s->state));
2197
2198     /* This is called when the hardware's real volume changes due to
2199      * some external event. We copy the real volume into our
2200      * reference volume and then rebuild the stream volumes based on
2201      * i->real_ratio which should stay fixed. */
2202
2203     if (!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
2204         if (pa_cvolume_equal(old_real_volume, &s->real_volume))
2205             return;
2206
2207         /* 1. Make the real volume the reference volume */
2208         update_reference_volume(s, &s->real_volume, &s->channel_map, true);
2209     }
2210
2211     if (pa_sink_flat_volume_enabled(s)) {
2212
2213         PA_IDXSET_FOREACH(i, s->inputs, idx) {
2214             pa_cvolume new_volume;
2215
2216             /* 2. Since the sink's reference and real volumes are equal
2217              * now our ratios should be too. */
2218             pa_sink_input_set_reference_ratio(i, &i->real_ratio);
2219
2220             /* 3. Recalculate the new stream reference volume based on the
2221              * reference ratio and the sink's reference volume.
2222              *
2223              * This basically calculates:
2224              *
2225              * i->volume = s->reference_volume * i->reference_ratio
2226              *
2227              * This is identical to propagate_reference_volume() */
2228             new_volume = s->reference_volume;
2229             pa_cvolume_remap(&new_volume, &s->channel_map, &i->channel_map);
2230             pa_sw_cvolume_multiply(&new_volume, &new_volume, &i->reference_ratio);
2231             pa_sink_input_set_volume_direct(i, &new_volume);
2232
2233             if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)
2234                     && PA_SINK_IS_LINKED(i->origin_sink->state))
2235                 propagate_real_volume(i->origin_sink, old_real_volume);
2236         }
2237     }
2238
2239     /* Something got changed in the hardware. It probably makes sense
2240      * to save changed hw settings given that hw volume changes not
2241      * triggered by PA are almost certainly done by the user. */
2242     if (!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER))
2243         s->save_volume = true;
2244 }
2245
2246 /* Called from io thread */
2247 void pa_sink_update_volume_and_mute(pa_sink *s) {
2248     pa_assert(s);
2249     pa_sink_assert_io_context(s);
2250
2251     pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_UPDATE_VOLUME_AND_MUTE, NULL, 0, NULL, NULL);
2252 }
2253
2254 /* Called from main thread */
2255 const pa_cvolume *pa_sink_get_volume(pa_sink *s, bool force_refresh) {
2256     pa_sink_assert_ref(s);
2257     pa_assert_ctl_context();
2258     pa_assert(PA_SINK_IS_LINKED(s->state));
2259
2260     if (s->refresh_volume || force_refresh) {
2261         struct pa_cvolume old_real_volume;
2262
2263         pa_assert(!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER));
2264
2265         old_real_volume = s->real_volume;
2266
2267         if (!(s->flags & PA_SINK_DEFERRED_VOLUME) && s->get_volume)
2268             s->get_volume(s);
2269
2270         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_VOLUME, NULL, 0, NULL) == 0);
2271
2272         update_real_volume(s, &s->real_volume, &s->channel_map);
2273         propagate_real_volume(s, &old_real_volume);
2274     }
2275
2276     return &s->reference_volume;
2277 }
2278
2279 /* Called from main thread. In volume sharing cases, only the root sink may
2280  * call this. */
2281 void pa_sink_volume_changed(pa_sink *s, const pa_cvolume *new_real_volume) {
2282     pa_cvolume old_real_volume;
2283
2284     pa_sink_assert_ref(s);
2285     pa_assert_ctl_context();
2286     pa_assert(PA_SINK_IS_LINKED(s->state));
2287     pa_assert(!(s->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER));
2288
2289     /* The sink implementor may call this if the volume changed to make sure everyone is notified */
2290
2291     old_real_volume = s->real_volume;
2292     update_real_volume(s, new_real_volume, &s->channel_map);
2293     propagate_real_volume(s, &old_real_volume);
2294 }
2295
2296 /* Called from main thread */
2297 void pa_sink_set_mute(pa_sink *s, bool mute, bool save) {
2298     bool old_muted;
2299
2300     pa_sink_assert_ref(s);
2301     pa_assert_ctl_context();
2302
2303     old_muted = s->muted;
2304
2305     if (mute == old_muted) {
2306         s->save_muted |= save;
2307         return;
2308     }
2309
2310     s->muted = mute;
2311     s->save_muted = save;
2312
2313     if (!(s->flags & PA_SINK_DEFERRED_VOLUME) && s->set_mute) {
2314         s->set_mute_in_progress = true;
2315         s->set_mute(s);
2316         s->set_mute_in_progress = false;
2317     }
2318
2319     if (!PA_SINK_IS_LINKED(s->state))
2320         return;
2321
2322     pa_log_debug("The mute of sink %s changed from %s to %s.", s->name, pa_yes_no(old_muted), pa_yes_no(mute));
2323     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_MUTE, NULL, 0, NULL) == 0);
2324     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2325     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_MUTE_CHANGED], s);
2326 }
2327
2328 /* Called from main thread */
2329 bool pa_sink_get_mute(pa_sink *s, bool force_refresh) {
2330
2331     pa_sink_assert_ref(s);
2332     pa_assert_ctl_context();
2333     pa_assert(PA_SINK_IS_LINKED(s->state));
2334
2335     if ((s->refresh_muted || force_refresh) && s->get_mute) {
2336         bool mute;
2337
2338         if (s->flags & PA_SINK_DEFERRED_VOLUME) {
2339             if (pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_MUTE, &mute, 0, NULL) >= 0)
2340                 pa_sink_mute_changed(s, mute);
2341         } else {
2342             if (s->get_mute(s, &mute) >= 0)
2343                 pa_sink_mute_changed(s, mute);
2344         }
2345     }
2346
2347     return s->muted;
2348 }
2349
2350 /* Called from main thread */
2351 void pa_sink_mute_changed(pa_sink *s, bool new_muted) {
2352     pa_sink_assert_ref(s);
2353     pa_assert_ctl_context();
2354     pa_assert(PA_SINK_IS_LINKED(s->state));
2355
2356     if (s->set_mute_in_progress)
2357         return;
2358
2359     /* pa_sink_set_mute() does this same check, so this may appear redundant,
2360      * but we must have this here also, because the save parameter of
2361      * pa_sink_set_mute() would otherwise have unintended side effects (saving
2362      * the mute state when it shouldn't be saved). */
2363     if (new_muted == s->muted)
2364         return;
2365
2366     pa_sink_set_mute(s, new_muted, true);
2367 }
2368
2369 /* Called from main thread */
2370 bool pa_sink_update_proplist(pa_sink *s, pa_update_mode_t mode, pa_proplist *p) {
2371     pa_sink_assert_ref(s);
2372     pa_assert_ctl_context();
2373
2374     if (p)
2375         pa_proplist_update(s->proplist, mode, p);
2376
2377     if (PA_SINK_IS_LINKED(s->state)) {
2378         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], s);
2379         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2380     }
2381
2382     return true;
2383 }
2384
2385 /* Called from main thread */
2386 /* FIXME -- this should be dropped and be merged into pa_sink_update_proplist() */
2387 void pa_sink_set_description(pa_sink *s, const char *description) {
2388     const char *old;
2389     pa_sink_assert_ref(s);
2390     pa_assert_ctl_context();
2391
2392     if (!description && !pa_proplist_contains(s->proplist, PA_PROP_DEVICE_DESCRIPTION))
2393         return;
2394
2395     old = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
2396
2397     if (old && description && pa_streq(old, description))
2398         return;
2399
2400     if (description)
2401         pa_proplist_sets(s->proplist, PA_PROP_DEVICE_DESCRIPTION, description);
2402     else
2403         pa_proplist_unset(s->proplist, PA_PROP_DEVICE_DESCRIPTION);
2404
2405     if (s->monitor_source) {
2406         char *n;
2407
2408         n = pa_sprintf_malloc("Monitor Source of %s", description ? description : s->name);
2409         pa_source_set_description(s->monitor_source, n);
2410         pa_xfree(n);
2411     }
2412
2413     if (PA_SINK_IS_LINKED(s->state)) {
2414         pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
2415         pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], s);
2416     }
2417 }
2418
2419 /* Called from main thread */
2420 unsigned pa_sink_linked_by(pa_sink *s) {
2421     unsigned ret;
2422
2423     pa_sink_assert_ref(s);
2424     pa_assert_ctl_context();
2425     pa_assert(PA_SINK_IS_LINKED(s->state));
2426
2427     ret = pa_idxset_size(s->inputs);
2428
2429     /* We add in the number of streams connected to us here. Please
2430      * note the asymmetry to pa_sink_used_by()! */
2431
2432     if (s->monitor_source)
2433         ret += pa_source_linked_by(s->monitor_source);
2434
2435     return ret;
2436 }
2437
2438 /* Called from main thread */
2439 unsigned pa_sink_used_by(pa_sink *s) {
2440     unsigned ret;
2441
2442     pa_sink_assert_ref(s);
2443     pa_assert_ctl_context();
2444     pa_assert(PA_SINK_IS_LINKED(s->state));
2445
2446     ret = pa_idxset_size(s->inputs);
2447     pa_assert(ret >= s->n_corked);
2448
2449     /* Streams connected to our monitor source do not matter for
2450      * pa_sink_used_by()!.*/
2451
2452     return ret - s->n_corked;
2453 }
2454
2455 /* Called from main thread */
2456 unsigned pa_sink_check_suspend(pa_sink *s, pa_sink_input *ignore_input, pa_source_output *ignore_output) {
2457     unsigned ret;
2458     pa_sink_input *i;
2459     uint32_t idx;
2460
2461     pa_sink_assert_ref(s);
2462     pa_assert_ctl_context();
2463
2464     if (!PA_SINK_IS_LINKED(s->state))
2465         return 0;
2466
2467     ret = 0;
2468
2469     PA_IDXSET_FOREACH(i, s->inputs, idx) {
2470         if (i == ignore_input)
2471             continue;
2472
2473         /* We do not assert here. It is perfectly valid for a sink input to
2474          * be in the INIT state (i.e. created, marked done but not yet put)
2475          * and we should not care if it's unlinked as it won't contribute
2476          * towards our busy status.
2477          */
2478         if (!PA_SINK_INPUT_IS_LINKED(i->state))
2479             continue;
2480
2481         if (i->state == PA_SINK_INPUT_CORKED)
2482             continue;
2483
2484         if (i->flags & PA_SINK_INPUT_DONT_INHIBIT_AUTO_SUSPEND)
2485             continue;
2486
2487         ret ++;
2488     }
2489
2490     if (s->monitor_source)
2491         ret += pa_source_check_suspend(s->monitor_source, ignore_output);
2492
2493     return ret;
2494 }
2495
2496 const char *pa_sink_state_to_string(pa_sink_state_t state) {
2497     switch (state) {
2498         case PA_SINK_INIT:          return "INIT";
2499         case PA_SINK_IDLE:          return "IDLE";
2500         case PA_SINK_RUNNING:       return "RUNNING";
2501         case PA_SINK_SUSPENDED:     return "SUSPENDED";
2502         case PA_SINK_UNLINKED:      return "UNLINKED";
2503         case PA_SINK_INVALID_STATE: return "INVALID_STATE";
2504     }
2505
2506     pa_assert_not_reached();
2507 }
2508
2509 /* Called from the IO thread */
2510 static void sync_input_volumes_within_thread(pa_sink *s) {
2511     pa_sink_input *i;
2512     void *state = NULL;
2513
2514     pa_sink_assert_ref(s);
2515     pa_sink_assert_io_context(s);
2516
2517     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
2518         if (pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume))
2519             continue;
2520
2521         i->thread_info.soft_volume = i->soft_volume;
2522         pa_sink_input_request_rewind(i, 0, true, false, false);
2523     }
2524 }
2525
2526 /* Called from the IO thread. Only called for the root sink in volume sharing
2527  * cases, except for internal recursive calls. */
2528 static void set_shared_volume_within_thread(pa_sink *s) {
2529     pa_sink_input *i = NULL;
2530     void *state = NULL;
2531
2532     pa_sink_assert_ref(s);
2533
2534     PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_VOLUME_SYNCED, NULL, 0, NULL);
2535
2536     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
2537         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER))
2538             set_shared_volume_within_thread(i->origin_sink);
2539     }
2540 }
2541
2542 /* Called from IO thread, except when it is not */
2543 int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
2544     pa_sink *s = PA_SINK(o);
2545     pa_sink_assert_ref(s);
2546
2547     switch ((pa_sink_message_t) code) {
2548
2549         case PA_SINK_MESSAGE_ADD_INPUT: {
2550             pa_sink_input *i = PA_SINK_INPUT(userdata);
2551
2552             /* If you change anything here, make sure to change the
2553              * sink input handling a few lines down at
2554              * PA_SINK_MESSAGE_FINISH_MOVE, too. */
2555
2556             pa_hashmap_put(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index), pa_sink_input_ref(i));
2557
2558             /* Since the caller sleeps in pa_sink_input_put(), we can
2559              * safely access data outside of thread_info even though
2560              * it is mutable */
2561
2562             if ((i->thread_info.sync_prev = i->sync_prev)) {
2563                 pa_assert(i->sink == i->thread_info.sync_prev->sink);
2564                 pa_assert(i->sync_prev->sync_next == i);
2565                 i->thread_info.sync_prev->thread_info.sync_next = i;
2566             }
2567
2568             if ((i->thread_info.sync_next = i->sync_next)) {
2569                 pa_assert(i->sink == i->thread_info.sync_next->sink);
2570                 pa_assert(i->sync_next->sync_prev == i);
2571                 i->thread_info.sync_next->thread_info.sync_prev = i;
2572             }
2573
2574             pa_sink_input_attach(i);
2575
2576             pa_sink_input_set_state_within_thread(i, i->state);
2577
2578             /* The requested latency of the sink input needs to be fixed up and
2579              * then configured on the sink. If this causes the sink latency to
2580              * go down, the sink implementor is responsible for doing a rewind
2581              * in the update_requested_latency() callback to ensure that the
2582              * sink buffer doesn't contain more data than what the new latency
2583              * allows.
2584              *
2585              * XXX: Does it really make sense to push this responsibility to
2586              * the sink implementors? Wouldn't it be better to do it once in
2587              * the core than many times in the modules? */
2588
2589             if (i->thread_info.requested_sink_latency != (pa_usec_t) -1)
2590                 pa_sink_input_set_requested_latency_within_thread(i, i->thread_info.requested_sink_latency);
2591
2592             pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
2593             pa_sink_input_update_max_request(i, s->thread_info.max_request);
2594
2595             /* We don't rewind here automatically. This is left to the
2596              * sink input implementor because some sink inputs need a
2597              * slow start, i.e. need some time to buffer client
2598              * samples before beginning streaming.
2599              *
2600              * XXX: Does it really make sense to push this functionality to
2601              * the sink implementors? Wouldn't it be better to do it once in
2602              * the core than many times in the modules? */
2603
2604             /* In flat volume mode we need to update the volume as
2605              * well */
2606             return o->process_msg(o, PA_SINK_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2607         }
2608
2609         case PA_SINK_MESSAGE_REMOVE_INPUT: {
2610             pa_sink_input *i = PA_SINK_INPUT(userdata);
2611
2612             /* If you change anything here, make sure to change the
2613              * sink input handling a few lines down at
2614              * PA_SINK_MESSAGE_START_MOVE, too. */
2615
2616             pa_sink_input_detach(i);
2617
2618             pa_sink_input_set_state_within_thread(i, i->state);
2619
2620             /* Since the caller sleeps in pa_sink_input_unlink(),
2621              * we can safely access data outside of thread_info even
2622              * though it is mutable */
2623
2624             pa_assert(!i->sync_prev);
2625             pa_assert(!i->sync_next);
2626
2627             if (i->thread_info.sync_prev) {
2628                 i->thread_info.sync_prev->thread_info.sync_next = i->thread_info.sync_prev->sync_next;
2629                 i->thread_info.sync_prev = NULL;
2630             }
2631
2632             if (i->thread_info.sync_next) {
2633                 i->thread_info.sync_next->thread_info.sync_prev = i->thread_info.sync_next->sync_prev;
2634                 i->thread_info.sync_next = NULL;
2635             }
2636
2637             pa_hashmap_remove_and_free(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index));
2638             pa_sink_invalidate_requested_latency(s, true);
2639             pa_sink_request_rewind(s, (size_t) -1);
2640
2641             /* In flat volume mode we need to update the volume as
2642              * well */
2643             return o->process_msg(o, PA_SINK_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2644         }
2645
2646         case PA_SINK_MESSAGE_START_MOVE: {
2647             pa_sink_input *i = PA_SINK_INPUT(userdata);
2648
2649             /* We don't support moving synchronized streams. */
2650             pa_assert(!i->sync_prev);
2651             pa_assert(!i->sync_next);
2652             pa_assert(!i->thread_info.sync_next);
2653             pa_assert(!i->thread_info.sync_prev);
2654
2655             if (i->thread_info.state != PA_SINK_INPUT_CORKED) {
2656                 pa_usec_t usec = 0;
2657                 size_t sink_nbytes, total_nbytes;
2658
2659                 /* The old sink probably has some audio from this
2660                  * stream in its buffer. We want to "take it back" as
2661                  * much as possible and play it to the new sink. We
2662                  * don't know at this point how much the old sink can
2663                  * rewind. We have to pick something, and that
2664                  * something is the full latency of the old sink here.
2665                  * So we rewind the stream buffer by the sink latency
2666                  * amount, which may be more than what we should
2667                  * rewind. This can result in a chunk of audio being
2668                  * played both to the old sink and the new sink.
2669                  *
2670                  * FIXME: Fix this code so that we don't have to make
2671                  * guesses about how much the sink will actually be
2672                  * able to rewind. If someone comes up with a solution
2673                  * for this, something to note is that the part of the
2674                  * latency that the old sink couldn't rewind should
2675                  * ideally be compensated after the stream has moved
2676                  * to the new sink by adding silence. The new sink
2677                  * most likely can't start playing the moved stream
2678                  * immediately, and that gap should be removed from
2679                  * the "compensation silence" (at least at the time of
2680                  * writing this, the move finish code will actually
2681                  * already take care of dropping the new sink's
2682                  * unrewindable latency, so taking into account the
2683                  * unrewindable latency of the old sink is the only
2684                  * problem).
2685                  *
2686                  * The render_memblockq contents are discarded,
2687                  * because when the sink changes, the format of the
2688                  * audio stored in the render_memblockq may change
2689                  * too, making the stored audio invalid. FIXME:
2690                  * However, the read and write indices are moved back
2691                  * the same amount, so if they are not the same now,
2692                  * they won't be the same after the rewind either. If
2693                  * the write index of the render_memblockq is ahead of
2694                  * the read index, then the render_memblockq will feed
2695                  * the new sink some silence first, which it shouldn't
2696                  * do. The write index should be flushed to be the
2697                  * same as the read index. */
2698
2699                 /* Get the latency of the sink */
2700                 usec = pa_sink_get_latency_within_thread(s, false);
2701                 sink_nbytes = pa_usec_to_bytes(usec, &s->sample_spec);
2702                 total_nbytes = sink_nbytes + pa_memblockq_get_length(i->thread_info.render_memblockq);
2703
2704                 if (total_nbytes > 0) {
2705                     i->thread_info.rewrite_nbytes = i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, total_nbytes) : total_nbytes;
2706                     i->thread_info.rewrite_flush = true;
2707                     pa_sink_input_process_rewind(i, sink_nbytes);
2708                 }
2709             }
2710
2711             pa_sink_input_detach(i);
2712
2713             /* Let's remove the sink input ...*/
2714             pa_hashmap_remove_and_free(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index));
2715
2716             pa_sink_invalidate_requested_latency(s, true);
2717
2718             pa_log_debug("Requesting rewind due to started move");
2719             pa_sink_request_rewind(s, (size_t) -1);
2720
2721             /* In flat volume mode we need to update the volume as
2722              * well */
2723             return o->process_msg(o, PA_SINK_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2724         }
2725
2726         case PA_SINK_MESSAGE_FINISH_MOVE: {
2727             pa_sink_input *i = PA_SINK_INPUT(userdata);
2728
2729             /* We don't support moving synchronized streams. */
2730             pa_assert(!i->sync_prev);
2731             pa_assert(!i->sync_next);
2732             pa_assert(!i->thread_info.sync_next);
2733             pa_assert(!i->thread_info.sync_prev);
2734
2735             pa_hashmap_put(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index), pa_sink_input_ref(i));
2736
2737             pa_sink_input_attach(i);
2738
2739             if (i->thread_info.state != PA_SINK_INPUT_CORKED) {
2740                 pa_usec_t usec = 0;
2741                 size_t nbytes;
2742
2743                 /* In the ideal case the new sink would start playing
2744                  * the stream immediately. That requires the sink to
2745                  * be able to rewind all of its latency, which usually
2746                  * isn't possible, so there will probably be some gap
2747                  * before the moved stream becomes audible. We then
2748                  * have two possibilities: 1) start playing the stream
2749                  * from where it is now, or 2) drop the unrewindable
2750                  * latency of the sink from the stream. With option 1
2751                  * we won't lose any audio but the stream will have a
2752                  * pause. With option 2 we may lose some audio but the
2753                  * stream time will be somewhat in sync with the wall
2754                  * clock. Lennart seems to have chosen option 2 (one
2755                  * of the reasons might have been that option 1 is
2756                  * actually much harder to implement), so we drop the
2757                  * latency of the new sink from the moved stream and
2758                  * hope that the sink will undo most of that in the
2759                  * rewind. */
2760
2761                 /* Get the latency of the sink */
2762                 usec = pa_sink_get_latency_within_thread(s, false);
2763                 nbytes = pa_usec_to_bytes(usec, &s->sample_spec);
2764
2765                 if (nbytes > 0)
2766                     pa_sink_input_drop(i, nbytes);
2767
2768                 pa_log_debug("Requesting rewind due to finished move");
2769                 pa_sink_request_rewind(s, nbytes);
2770             }
2771
2772             /* Updating the requested sink latency has to be done
2773              * after the sink rewind request, not before, because
2774              * otherwise the sink may limit the rewind amount
2775              * needlessly. */
2776
2777             if (i->thread_info.requested_sink_latency != (pa_usec_t) -1)
2778                 pa_sink_input_set_requested_latency_within_thread(i, i->thread_info.requested_sink_latency);
2779
2780             pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
2781             pa_sink_input_update_max_request(i, s->thread_info.max_request);
2782
2783             return o->process_msg(o, PA_SINK_MESSAGE_SET_SHARED_VOLUME, NULL, 0, NULL);
2784         }
2785
2786         case PA_SINK_MESSAGE_SET_SHARED_VOLUME: {
2787             pa_sink *root_sink = pa_sink_get_master(s);
2788
2789             if (PA_LIKELY(root_sink))
2790                 set_shared_volume_within_thread(root_sink);
2791
2792             return 0;
2793         }
2794
2795         case PA_SINK_MESSAGE_SET_VOLUME_SYNCED:
2796
2797             if (s->flags & PA_SINK_DEFERRED_VOLUME) {
2798                 s->set_volume(s);
2799                 pa_sink_volume_change_push(s);
2800             }
2801             /* Fall through ... */
2802
2803         case PA_SINK_MESSAGE_SET_VOLUME:
2804
2805             if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2806                 s->thread_info.soft_volume = s->soft_volume;
2807                 pa_sink_request_rewind(s, (size_t) -1);
2808             }
2809
2810             /* Fall through ... */
2811
2812         case PA_SINK_MESSAGE_SYNC_VOLUMES:
2813             sync_input_volumes_within_thread(s);
2814             return 0;
2815
2816         case PA_SINK_MESSAGE_GET_VOLUME:
2817
2818             if ((s->flags & PA_SINK_DEFERRED_VOLUME) && s->get_volume) {
2819                 s->get_volume(s);
2820                 pa_sink_volume_change_flush(s);
2821                 pa_sw_cvolume_divide(&s->thread_info.current_hw_volume, &s->real_volume, &s->soft_volume);
2822             }
2823
2824             /* In case sink implementor reset SW volume. */
2825             if (!pa_cvolume_equal(&s->thread_info.soft_volume, &s->soft_volume)) {
2826                 s->thread_info.soft_volume = s->soft_volume;
2827                 pa_sink_request_rewind(s, (size_t) -1);
2828             }
2829
2830             return 0;
2831
2832         case PA_SINK_MESSAGE_SET_MUTE:
2833
2834             if (s->thread_info.soft_muted != s->muted) {
2835                 s->thread_info.soft_muted = s->muted;
2836                 pa_sink_request_rewind(s, (size_t) -1);
2837             }
2838
2839             if (s->flags & PA_SINK_DEFERRED_VOLUME && s->set_mute)
2840                 s->set_mute(s);
2841
2842             return 0;
2843
2844         case PA_SINK_MESSAGE_GET_MUTE:
2845
2846             if (s->flags & PA_SINK_DEFERRED_VOLUME && s->get_mute)
2847                 return s->get_mute(s, userdata);
2848
2849             return 0;
2850
2851         case PA_SINK_MESSAGE_SET_STATE: {
2852             struct set_state_data *data = userdata;
2853             bool suspend_change =
2854                 (s->thread_info.state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(data->state)) ||
2855                 (PA_SINK_IS_OPENED(s->thread_info.state) && data->state == PA_SINK_SUSPENDED);
2856
2857             if (s->set_state_in_io_thread) {
2858                 int r;
2859
2860                 if ((r = s->set_state_in_io_thread(s, data->state, data->suspend_cause)) < 0)
2861                     return r;
2862             }
2863
2864             s->thread_info.state = data->state;
2865
2866             if (s->thread_info.state == PA_SINK_SUSPENDED) {
2867                 s->thread_info.rewind_nbytes = 0;
2868                 s->thread_info.rewind_requested = false;
2869             }
2870
2871             if (suspend_change) {
2872                 pa_sink_input *i;
2873                 void *state = NULL;
2874
2875                 while ((i = pa_hashmap_iterate(s->thread_info.inputs, &state, NULL)))
2876                     if (i->suspend_within_thread)
2877                         i->suspend_within_thread(i, s->thread_info.state == PA_SINK_SUSPENDED);
2878             }
2879
2880             return 0;
2881         }
2882
2883         case PA_SINK_MESSAGE_GET_REQUESTED_LATENCY: {
2884
2885             pa_usec_t *usec = userdata;
2886             *usec = pa_sink_get_requested_latency_within_thread(s);
2887
2888             /* Yes, that's right, the IO thread will see -1 when no
2889              * explicit requested latency is configured, the main
2890              * thread will see max_latency */
2891             if (*usec == (pa_usec_t) -1)
2892                 *usec = s->thread_info.max_latency;
2893
2894             return 0;
2895         }
2896
2897         case PA_SINK_MESSAGE_SET_LATENCY_RANGE: {
2898             pa_usec_t *r = userdata;
2899
2900             pa_sink_set_latency_range_within_thread(s, r[0], r[1]);
2901
2902             return 0;
2903         }
2904
2905         case PA_SINK_MESSAGE_GET_LATENCY_RANGE: {
2906             pa_usec_t *r = userdata;
2907
2908             r[0] = s->thread_info.min_latency;
2909             r[1] = s->thread_info.max_latency;
2910
2911             return 0;
2912         }
2913
2914         case PA_SINK_MESSAGE_GET_FIXED_LATENCY:
2915
2916             *((pa_usec_t*) userdata) = s->thread_info.fixed_latency;
2917             return 0;
2918
2919         case PA_SINK_MESSAGE_SET_FIXED_LATENCY:
2920
2921             pa_sink_set_fixed_latency_within_thread(s, (pa_usec_t) offset);
2922             return 0;
2923
2924         case PA_SINK_MESSAGE_GET_MAX_REWIND:
2925
2926             *((size_t*) userdata) = s->thread_info.max_rewind;
2927             return 0;
2928
2929         case PA_SINK_MESSAGE_GET_MAX_REQUEST:
2930
2931             *((size_t*) userdata) = s->thread_info.max_request;
2932             return 0;
2933
2934         case PA_SINK_MESSAGE_SET_MAX_REWIND:
2935
2936             pa_sink_set_max_rewind_within_thread(s, (size_t) offset);
2937             return 0;
2938
2939         case PA_SINK_MESSAGE_SET_MAX_REQUEST:
2940
2941             pa_sink_set_max_request_within_thread(s, (size_t) offset);
2942             return 0;
2943
2944         case PA_SINK_MESSAGE_UPDATE_VOLUME_AND_MUTE:
2945             /* This message is sent from IO-thread and handled in main thread. */
2946             pa_assert_ctl_context();
2947
2948             /* Make sure we're not messing with main thread when no longer linked */
2949             if (!PA_SINK_IS_LINKED(s->state))
2950                 return 0;
2951
2952             pa_sink_get_volume(s, true);
2953             pa_sink_get_mute(s, true);
2954             return 0;
2955
2956         case PA_SINK_MESSAGE_SET_PORT_LATENCY_OFFSET:
2957             s->thread_info.port_latency_offset = offset;
2958             return 0;
2959
2960         case PA_SINK_MESSAGE_GET_LATENCY:
2961         case PA_SINK_MESSAGE_MAX:
2962             ;
2963     }
2964
2965     return -1;
2966 }
2967
2968 /* Called from main thread */
2969 int pa_sink_suspend_all(pa_core *c, bool suspend, pa_suspend_cause_t cause) {
2970     pa_sink *sink;
2971     uint32_t idx;
2972     int ret = 0;
2973
2974     pa_core_assert_ref(c);
2975     pa_assert_ctl_context();
2976     pa_assert(cause != 0);
2977
2978     PA_IDXSET_FOREACH(sink, c->sinks, idx) {
2979         int r;
2980
2981         if ((r = pa_sink_suspend(sink, suspend, cause)) < 0)
2982             ret = r;
2983     }
2984
2985     return ret;
2986 }
2987
2988 /* Called from IO thread */
2989 void pa_sink_detach_within_thread(pa_sink *s) {
2990     pa_sink_input *i;
2991     void *state = NULL;
2992
2993     pa_sink_assert_ref(s);
2994     pa_sink_assert_io_context(s);
2995     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
2996
2997     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
2998         pa_sink_input_detach(i);
2999
3000     if (s->monitor_source)
3001         pa_source_detach_within_thread(s->monitor_source);
3002 }
3003
3004 /* Called from IO thread */
3005 void pa_sink_attach_within_thread(pa_sink *s) {
3006     pa_sink_input *i;
3007     void *state = NULL;
3008
3009     pa_sink_assert_ref(s);
3010     pa_sink_assert_io_context(s);
3011     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
3012
3013     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3014         pa_sink_input_attach(i);
3015
3016     if (s->monitor_source)
3017         pa_source_attach_within_thread(s->monitor_source);
3018 }
3019
3020 /* Called from IO thread */
3021 void pa_sink_request_rewind(pa_sink*s, size_t nbytes) {
3022     pa_sink_assert_ref(s);
3023     pa_sink_assert_io_context(s);
3024     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
3025
3026     if (nbytes == (size_t) -1)
3027         nbytes = s->thread_info.max_rewind;
3028
3029     nbytes = PA_MIN(nbytes, s->thread_info.max_rewind);
3030
3031     if (s->thread_info.rewind_requested &&
3032         nbytes <= s->thread_info.rewind_nbytes)
3033         return;
3034
3035     s->thread_info.rewind_nbytes = nbytes;
3036     s->thread_info.rewind_requested = true;
3037
3038     if (s->request_rewind)
3039         s->request_rewind(s);
3040 }
3041
3042 /* Called from IO thread */
3043 pa_usec_t pa_sink_get_requested_latency_within_thread(pa_sink *s) {
3044     pa_usec_t result = (pa_usec_t) -1;
3045     pa_sink_input *i;
3046     void *state = NULL;
3047     pa_usec_t monitor_latency;
3048
3049     pa_sink_assert_ref(s);
3050     pa_sink_assert_io_context(s);
3051
3052     if (!(s->flags & PA_SINK_DYNAMIC_LATENCY))
3053         return PA_CLAMP(s->thread_info.fixed_latency, s->thread_info.min_latency, s->thread_info.max_latency);
3054
3055     if (s->thread_info.requested_latency_valid)
3056         return s->thread_info.requested_latency;
3057
3058     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3059         if (i->thread_info.requested_sink_latency != (pa_usec_t) -1 &&
3060             (result == (pa_usec_t) -1 || result > i->thread_info.requested_sink_latency))
3061             result = i->thread_info.requested_sink_latency;
3062
3063     monitor_latency = pa_source_get_requested_latency_within_thread(s->monitor_source);
3064
3065     if (monitor_latency != (pa_usec_t) -1 &&
3066         (result == (pa_usec_t) -1 || result > monitor_latency))
3067         result = monitor_latency;
3068
3069     if (result != (pa_usec_t) -1)
3070         result = PA_CLAMP(result, s->thread_info.min_latency, s->thread_info.max_latency);
3071
3072     if (PA_SINK_IS_LINKED(s->thread_info.state)) {
3073         /* Only cache if properly initialized */
3074         s->thread_info.requested_latency = result;
3075         s->thread_info.requested_latency_valid = true;
3076     }
3077
3078     return result;
3079 }
3080
3081 /* Called from main thread */
3082 pa_usec_t pa_sink_get_requested_latency(pa_sink *s) {
3083     pa_usec_t usec = 0;
3084
3085     pa_sink_assert_ref(s);
3086     pa_assert_ctl_context();
3087     pa_assert(PA_SINK_IS_LINKED(s->state));
3088
3089     if (s->state == PA_SINK_SUSPENDED)
3090         return 0;
3091
3092     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
3093
3094     return usec;
3095 }
3096
3097 /* Called from IO as well as the main thread -- the latter only before the IO thread started up */
3098 void pa_sink_set_max_rewind_within_thread(pa_sink *s, size_t max_rewind) {
3099     pa_sink_input *i;
3100     void *state = NULL;
3101
3102     pa_sink_assert_ref(s);
3103     pa_sink_assert_io_context(s);
3104
3105     if (max_rewind == s->thread_info.max_rewind)
3106         return;
3107
3108     s->thread_info.max_rewind = max_rewind;
3109
3110     if (PA_SINK_IS_LINKED(s->thread_info.state))
3111         PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3112             pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
3113
3114     if (s->monitor_source)
3115         pa_source_set_max_rewind_within_thread(s->monitor_source, s->thread_info.max_rewind);
3116 }
3117
3118 /* Called from main thread */
3119 void pa_sink_set_max_rewind(pa_sink *s, size_t max_rewind) {
3120     pa_sink_assert_ref(s);
3121     pa_assert_ctl_context();
3122
3123     if (PA_SINK_IS_LINKED(s->state))
3124         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_MAX_REWIND, NULL, max_rewind, NULL) == 0);
3125     else
3126         pa_sink_set_max_rewind_within_thread(s, max_rewind);
3127 }
3128
3129 /* Called from IO as well as the main thread -- the latter only before the IO thread started up */
3130 void pa_sink_set_max_request_within_thread(pa_sink *s, size_t max_request) {
3131     void *state = NULL;
3132
3133     pa_sink_assert_ref(s);
3134     pa_sink_assert_io_context(s);
3135
3136     if (max_request == s->thread_info.max_request)
3137         return;
3138
3139     s->thread_info.max_request = max_request;
3140
3141     if (PA_SINK_IS_LINKED(s->thread_info.state)) {
3142         pa_sink_input *i;
3143
3144         PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3145             pa_sink_input_update_max_request(i, s->thread_info.max_request);
3146     }
3147 }
3148
3149 /* Called from main thread */
3150 void pa_sink_set_max_request(pa_sink *s, size_t max_request) {
3151     pa_sink_assert_ref(s);
3152     pa_assert_ctl_context();
3153
3154     if (PA_SINK_IS_LINKED(s->state))
3155         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_MAX_REQUEST, NULL, max_request, NULL) == 0);
3156     else
3157         pa_sink_set_max_request_within_thread(s, max_request);
3158 }
3159
3160 /* Called from IO thread */
3161 void pa_sink_invalidate_requested_latency(pa_sink *s, bool dynamic) {
3162     pa_sink_input *i;
3163     void *state = NULL;
3164
3165     pa_sink_assert_ref(s);
3166     pa_sink_assert_io_context(s);
3167
3168     if ((s->flags & PA_SINK_DYNAMIC_LATENCY))
3169         s->thread_info.requested_latency_valid = false;
3170     else if (dynamic)
3171         return;
3172
3173     if (PA_SINK_IS_LINKED(s->thread_info.state)) {
3174
3175         if (s->update_requested_latency)
3176             s->update_requested_latency(s);
3177
3178         PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3179             if (i->update_sink_requested_latency)
3180                 i->update_sink_requested_latency(i);
3181     }
3182 }
3183
3184 /* Called from main thread */
3185 void pa_sink_set_latency_range(pa_sink *s, pa_usec_t min_latency, pa_usec_t max_latency) {
3186     pa_sink_assert_ref(s);
3187     pa_assert_ctl_context();
3188
3189     /* min_latency == 0:           no limit
3190      * min_latency anything else:  specified limit
3191      *
3192      * Similar for max_latency */
3193
3194     if (min_latency < ABSOLUTE_MIN_LATENCY)
3195         min_latency = ABSOLUTE_MIN_LATENCY;
3196
3197     if (max_latency <= 0 ||
3198         max_latency > ABSOLUTE_MAX_LATENCY)
3199         max_latency = ABSOLUTE_MAX_LATENCY;
3200
3201     pa_assert(min_latency <= max_latency);
3202
3203     /* Hmm, let's see if someone forgot to set PA_SINK_DYNAMIC_LATENCY here... */
3204     pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
3205                max_latency == ABSOLUTE_MAX_LATENCY) ||
3206               (s->flags & PA_SINK_DYNAMIC_LATENCY));
3207
3208     if (PA_SINK_IS_LINKED(s->state)) {
3209         pa_usec_t r[2];
3210
3211         r[0] = min_latency;
3212         r[1] = max_latency;
3213
3214         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_LATENCY_RANGE, r, 0, NULL) == 0);
3215     } else
3216         pa_sink_set_latency_range_within_thread(s, min_latency, max_latency);
3217 }
3218
3219 /* Called from main thread */
3220 void pa_sink_get_latency_range(pa_sink *s, pa_usec_t *min_latency, pa_usec_t *max_latency) {
3221     pa_sink_assert_ref(s);
3222     pa_assert_ctl_context();
3223     pa_assert(min_latency);
3224     pa_assert(max_latency);
3225
3226     if (PA_SINK_IS_LINKED(s->state)) {
3227         pa_usec_t r[2] = { 0, 0 };
3228
3229         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY_RANGE, r, 0, NULL) == 0);
3230
3231         *min_latency = r[0];
3232         *max_latency = r[1];
3233     } else {
3234         *min_latency = s->thread_info.min_latency;
3235         *max_latency = s->thread_info.max_latency;
3236     }
3237 }
3238
3239 /* Called from IO thread */
3240 void pa_sink_set_latency_range_within_thread(pa_sink *s, pa_usec_t min_latency, pa_usec_t max_latency) {
3241     pa_sink_assert_ref(s);
3242     pa_sink_assert_io_context(s);
3243
3244     pa_assert(min_latency >= ABSOLUTE_MIN_LATENCY);
3245     pa_assert(max_latency <= ABSOLUTE_MAX_LATENCY);
3246     pa_assert(min_latency <= max_latency);
3247
3248     /* Hmm, let's see if someone forgot to set PA_SINK_DYNAMIC_LATENCY here... */
3249     pa_assert((min_latency == ABSOLUTE_MIN_LATENCY &&
3250                max_latency == ABSOLUTE_MAX_LATENCY) ||
3251               (s->flags & PA_SINK_DYNAMIC_LATENCY));
3252
3253     if (s->thread_info.min_latency == min_latency &&
3254         s->thread_info.max_latency == max_latency)
3255         return;
3256
3257     s->thread_info.min_latency = min_latency;
3258     s->thread_info.max_latency = max_latency;
3259
3260     if (PA_SINK_IS_LINKED(s->thread_info.state)) {
3261         pa_sink_input *i;
3262         void *state = NULL;
3263
3264         PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3265             if (i->update_sink_latency_range)
3266                 i->update_sink_latency_range(i);
3267     }
3268
3269     pa_sink_invalidate_requested_latency(s, false);
3270
3271     pa_source_set_latency_range_within_thread(s->monitor_source, min_latency, max_latency);
3272 }
3273
3274 /* Called from main thread */
3275 void pa_sink_set_fixed_latency(pa_sink *s, pa_usec_t latency) {
3276     pa_sink_assert_ref(s);
3277     pa_assert_ctl_context();
3278
3279     if (s->flags & PA_SINK_DYNAMIC_LATENCY) {
3280         pa_assert(latency == 0);
3281         return;
3282     }
3283
3284     if (latency < ABSOLUTE_MIN_LATENCY)
3285         latency = ABSOLUTE_MIN_LATENCY;
3286
3287     if (latency > ABSOLUTE_MAX_LATENCY)
3288         latency = ABSOLUTE_MAX_LATENCY;
3289
3290     if (PA_SINK_IS_LINKED(s->state))
3291         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_FIXED_LATENCY, NULL, (int64_t) latency, NULL) == 0);
3292     else
3293         s->thread_info.fixed_latency = latency;
3294
3295     pa_source_set_fixed_latency(s->monitor_source, latency);
3296 }
3297
3298 /* Called from main thread */
3299 pa_usec_t pa_sink_get_fixed_latency(pa_sink *s) {
3300     pa_usec_t latency;
3301
3302     pa_sink_assert_ref(s);
3303     pa_assert_ctl_context();
3304
3305     if (s->flags & PA_SINK_DYNAMIC_LATENCY)
3306         return 0;
3307
3308     if (PA_SINK_IS_LINKED(s->state))
3309         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_FIXED_LATENCY, &latency, 0, NULL) == 0);
3310     else
3311         latency = s->thread_info.fixed_latency;
3312
3313     return latency;
3314 }
3315
3316 /* Called from IO thread */
3317 void pa_sink_set_fixed_latency_within_thread(pa_sink *s, pa_usec_t latency) {
3318     pa_sink_assert_ref(s);
3319     pa_sink_assert_io_context(s);
3320
3321     if (s->flags & PA_SINK_DYNAMIC_LATENCY) {
3322         pa_assert(latency == 0);
3323         s->thread_info.fixed_latency = 0;
3324
3325         if (s->monitor_source)
3326             pa_source_set_fixed_latency_within_thread(s->monitor_source, 0);
3327
3328         return;
3329     }
3330
3331     pa_assert(latency >= ABSOLUTE_MIN_LATENCY);
3332     pa_assert(latency <= ABSOLUTE_MAX_LATENCY);
3333
3334     if (s->thread_info.fixed_latency == latency)
3335         return;
3336
3337     s->thread_info.fixed_latency = latency;
3338
3339     if (PA_SINK_IS_LINKED(s->thread_info.state)) {
3340         pa_sink_input *i;
3341         void *state = NULL;
3342
3343         PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state)
3344             if (i->update_sink_fixed_latency)
3345                 i->update_sink_fixed_latency(i);
3346     }
3347
3348     pa_sink_invalidate_requested_latency(s, false);
3349
3350     pa_source_set_fixed_latency_within_thread(s->monitor_source, latency);
3351 }
3352
3353 /* Called from main context */
3354 void pa_sink_set_port_latency_offset(pa_sink *s, int64_t offset) {
3355     pa_sink_assert_ref(s);
3356
3357     s->port_latency_offset = offset;
3358
3359     if (PA_SINK_IS_LINKED(s->state))
3360         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_PORT_LATENCY_OFFSET, NULL, offset, NULL) == 0);
3361     else
3362         s->thread_info.port_latency_offset = offset;
3363
3364     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PORT_LATENCY_OFFSET_CHANGED], s);
3365 }
3366
3367 /* Called from main context */
3368 size_t pa_sink_get_max_rewind(pa_sink *s) {
3369     size_t r;
3370     pa_assert_ctl_context();
3371     pa_sink_assert_ref(s);
3372
3373     if (!PA_SINK_IS_LINKED(s->state))
3374         return s->thread_info.max_rewind;
3375
3376     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_MAX_REWIND, &r, 0, NULL) == 0);
3377
3378     return r;
3379 }
3380
3381 /* Called from main context */
3382 size_t pa_sink_get_max_request(pa_sink *s) {
3383     size_t r;
3384     pa_sink_assert_ref(s);
3385     pa_assert_ctl_context();
3386
3387     if (!PA_SINK_IS_LINKED(s->state))
3388         return s->thread_info.max_request;
3389
3390     pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_MAX_REQUEST, &r, 0, NULL) == 0);
3391
3392     return r;
3393 }
3394
3395 /* Called from main context */
3396 int pa_sink_set_port(pa_sink *s, const char *name, bool save) {
3397     pa_device_port *port;
3398
3399     pa_sink_assert_ref(s);
3400     pa_assert_ctl_context();
3401
3402     if (!s->set_port) {
3403         pa_log_debug("set_port() operation not implemented for sink %u \"%s\"", s->index, s->name);
3404         return -PA_ERR_NOTIMPLEMENTED;
3405     }
3406
3407     if (!name)
3408         return -PA_ERR_NOENTITY;
3409
3410     if (!(port = pa_hashmap_get(s->ports, name)))
3411         return -PA_ERR_NOENTITY;
3412
3413     if (s->active_port == port) {
3414         s->save_port = s->save_port || save;
3415         return 0;
3416     }
3417
3418     if (s->set_port(s, port) < 0)
3419         return -PA_ERR_NOENTITY;
3420
3421     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
3422
3423     pa_log_info("Changed port of sink %u \"%s\" to %s", s->index, s->name, port->name);
3424
3425     s->active_port = port;
3426     s->save_port = save;
3427
3428     pa_sink_set_port_latency_offset(s, s->active_port->latency_offset);
3429
3430     /* The active port affects the default sink selection. */
3431     pa_core_update_default_sink(s->core);
3432
3433     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PORT_CHANGED], s);
3434
3435     return 0;
3436 }
3437
3438 bool pa_device_init_icon(pa_proplist *p, bool is_sink) {
3439     const char *ff, *c, *t = NULL, *s = "", *profile, *bus;
3440
3441     pa_assert(p);
3442
3443     if (pa_proplist_contains(p, PA_PROP_DEVICE_ICON_NAME))
3444         return true;
3445
3446     if ((ff = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR))) {
3447
3448         if (pa_streq(ff, "microphone"))
3449             t = "audio-input-microphone";
3450         else if (pa_streq(ff, "webcam"))
3451             t = "camera-web";
3452         else if (pa_streq(ff, "computer"))
3453             t = "computer";
3454         else if (pa_streq(ff, "handset"))
3455             t = "phone";
3456         else if (pa_streq(ff, "portable"))
3457             t = "multimedia-player";
3458         else if (pa_streq(ff, "tv"))
3459             t = "video-display";
3460
3461         /*
3462          * The following icons are not part of the icon naming spec,
3463          * because Rodney Dawes sucks as the maintainer of that spec.
3464          *
3465          * http://lists.freedesktop.org/archives/xdg/2009-May/010397.html
3466          */
3467         else if (pa_streq(ff, "headset"))
3468             t = "audio-headset";
3469         else if (pa_streq(ff, "headphone"))
3470             t = "audio-headphones";
3471         else if (pa_streq(ff, "speaker"))
3472             t = "audio-speakers";
3473         else if (pa_streq(ff, "hands-free"))
3474             t = "audio-handsfree";
3475     }
3476
3477     if (!t)
3478         if ((c = pa_proplist_gets(p, PA_PROP_DEVICE_CLASS)))
3479             if (pa_streq(c, "modem"))
3480                 t = "modem";
3481
3482     if (!t) {
3483         if (is_sink)
3484             t = "audio-card";
3485         else
3486             t = "audio-input-microphone";
3487     }
3488
3489     if ((profile = pa_proplist_gets(p, PA_PROP_DEVICE_PROFILE_NAME))) {
3490         if (strstr(profile, "analog"))
3491             s = "-analog";
3492         else if (strstr(profile, "iec958"))
3493             s = "-iec958";
3494         else if (strstr(profile, "hdmi"))
3495             s = "-hdmi";
3496     }
3497
3498     bus = pa_proplist_gets(p, PA_PROP_DEVICE_BUS);
3499
3500     pa_proplist_setf(p, PA_PROP_DEVICE_ICON_NAME, "%s%s%s%s", t, pa_strempty(s), bus ? "-" : "", pa_strempty(bus));
3501
3502     return true;
3503 }
3504
3505 bool pa_device_init_description(pa_proplist *p, pa_card *card) {
3506     const char *s, *d = NULL, *k;
3507     pa_assert(p);
3508
3509     if (pa_proplist_contains(p, PA_PROP_DEVICE_DESCRIPTION))
3510         return true;
3511
3512     if (card)
3513         if ((s = pa_proplist_gets(card->proplist, PA_PROP_DEVICE_DESCRIPTION)))
3514             d = s;
3515
3516     if (!d)
3517         if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR)))
3518             if (pa_streq(s, "internal"))
3519                 d = _("Built-in Audio");
3520
3521     if (!d)
3522         if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_CLASS)))
3523             if (pa_streq(s, "modem"))
3524                 d = _("Modem");
3525
3526     if (!d)
3527         d = pa_proplist_gets(p, PA_PROP_DEVICE_PRODUCT_NAME);
3528
3529     if (!d)
3530         return false;
3531
3532     k = pa_proplist_gets(p, PA_PROP_DEVICE_PROFILE_DESCRIPTION);
3533
3534     if (d && k)
3535         pa_proplist_setf(p, PA_PROP_DEVICE_DESCRIPTION, "%s %s", d, k);
3536     else if (d)
3537         pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, d);
3538
3539     return true;
3540 }
3541
3542 bool pa_device_init_intended_roles(pa_proplist *p) {
3543     const char *s;
3544     pa_assert(p);
3545
3546     if (pa_proplist_contains(p, PA_PROP_DEVICE_INTENDED_ROLES))
3547         return true;
3548
3549     if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR)))
3550         if (pa_streq(s, "handset") || pa_streq(s, "hands-free")
3551             || pa_streq(s, "headset")) {
3552             pa_proplist_sets(p, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
3553             return true;
3554         }
3555
3556     return false;
3557 }
3558
3559 unsigned pa_device_init_priority(pa_proplist *p) {
3560     const char *s;
3561     unsigned priority = 0;
3562
3563     pa_assert(p);
3564
3565     if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_CLASS))) {
3566
3567         if (pa_streq(s, "sound"))
3568             priority += 9000;
3569         else if (!pa_streq(s, "modem"))
3570             priority += 1000;
3571     }
3572
3573     if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR))) {
3574
3575         if (pa_streq(s, "headphone"))
3576             priority += 900;
3577         else if (pa_streq(s, "hifi"))
3578             priority += 600;
3579         else if (pa_streq(s, "speaker"))
3580             priority += 500;
3581         else if (pa_streq(s, "portable"))
3582             priority += 450;
3583     }
3584
3585     if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_BUS))) {
3586
3587         if (pa_streq(s, "bluetooth"))
3588             priority += 50;
3589         else if (pa_streq(s, "usb"))
3590             priority += 40;
3591         else if (pa_streq(s, "pci"))
3592             priority += 30;
3593     }
3594
3595     if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_PROFILE_NAME))) {
3596
3597         if (pa_startswith(s, "analog-"))
3598             priority += 9;
3599         else if (pa_startswith(s, "iec958-"))
3600             priority += 8;
3601     }
3602
3603     return priority;
3604 }
3605
3606 PA_STATIC_FLIST_DECLARE(pa_sink_volume_change, 0, pa_xfree);
3607
3608 /* Called from the IO thread. */
3609 static pa_sink_volume_change *pa_sink_volume_change_new(pa_sink *s) {
3610     pa_sink_volume_change *c;
3611     if (!(c = pa_flist_pop(PA_STATIC_FLIST_GET(pa_sink_volume_change))))
3612         c = pa_xnew(pa_sink_volume_change, 1);
3613
3614     PA_LLIST_INIT(pa_sink_volume_change, c);
3615     c->at = 0;
3616     pa_cvolume_reset(&c->hw_volume, s->sample_spec.channels);
3617     return c;
3618 }
3619
3620 /* Called from the IO thread. */
3621 static void pa_sink_volume_change_free(pa_sink_volume_change *c) {
3622     pa_assert(c);
3623     if (pa_flist_push(PA_STATIC_FLIST_GET(pa_sink_volume_change), c) < 0)
3624         pa_xfree(c);
3625 }
3626
3627 /* Called from the IO thread. */
3628 void pa_sink_volume_change_push(pa_sink *s) {
3629     pa_sink_volume_change *c = NULL;
3630     pa_sink_volume_change *nc = NULL;
3631     pa_sink_volume_change *pc = NULL;
3632     uint32_t safety_margin = s->thread_info.volume_change_safety_margin;
3633
3634     const char *direction = NULL;
3635
3636     pa_assert(s);
3637     nc = pa_sink_volume_change_new(s);
3638
3639     /* NOTE: There is already more different volumes in pa_sink that I can remember.
3640      *       Adding one more volume for HW would get us rid of this, but I am trying
3641      *       to survive with the ones we already have. */
3642     pa_sw_cvolume_divide(&nc->hw_volume, &s->real_volume, &s->soft_volume);
3643
3644     if (!s->thread_info.volume_changes && pa_cvolume_equal(&nc->hw_volume, &s->thread_info.current_hw_volume)) {
3645         pa_log_debug("Volume not changing");
3646         pa_sink_volume_change_free(nc);
3647         return;
3648     }
3649
3650     nc->at = pa_sink_get_latency_within_thread(s, false);
3651     nc->at += pa_rtclock_now() + s->thread_info.volume_change_extra_delay;
3652
3653     if (s->thread_info.volume_changes_tail) {
3654         for (c = s->thread_info.volume_changes_tail; c; c = c->prev) {
3655             /* If volume is going up let's do it a bit late. If it is going
3656              * down let's do it a bit early. */
3657             if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&c->hw_volume)) {
3658                 if (nc->at + safety_margin > c->at) {
3659                     nc->at += safety_margin;
3660                     direction = "up";
3661                     break;
3662                 }
3663             }
3664             else if (nc->at - safety_margin > c->at) {
3665                     nc->at -= safety_margin;
3666                     direction = "down";
3667                     break;
3668             }
3669         }
3670     }
3671
3672     if (c == NULL) {
3673         if (pa_cvolume_avg(&nc->hw_volume) > pa_cvolume_avg(&s->thread_info.current_hw_volume)) {
3674             nc->at += safety_margin;
3675             direction = "up";
3676         } else {
3677             nc->at -= safety_margin;
3678             direction = "down";
3679         }
3680         PA_LLIST_PREPEND(pa_sink_volume_change, s->thread_info.volume_changes, nc);
3681     }
3682     else {
3683         PA_LLIST_INSERT_AFTER(pa_sink_volume_change, s->thread_info.volume_changes, c, nc);
3684     }
3685
3686     pa_log_debug("Volume going %s to %d at %llu", direction, pa_cvolume_avg(&nc->hw_volume), (long long unsigned) nc->at);
3687
3688     /* We can ignore volume events that came earlier but should happen later than this. */
3689     PA_LLIST_FOREACH_SAFE(c, pc, nc->next) {
3690         pa_log_debug("Volume change to %d at %llu was dropped", pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at);
3691         pa_sink_volume_change_free(c);
3692     }
3693     nc->next = NULL;
3694     s->thread_info.volume_changes_tail = nc;
3695 }
3696
3697 /* Called from the IO thread. */
3698 static void pa_sink_volume_change_flush(pa_sink *s) {
3699     pa_sink_volume_change *c = s->thread_info.volume_changes;
3700     pa_assert(s);
3701     s->thread_info.volume_changes = NULL;
3702     s->thread_info.volume_changes_tail = NULL;
3703     while (c) {
3704         pa_sink_volume_change *next = c->next;
3705         pa_sink_volume_change_free(c);
3706         c = next;
3707     }
3708 }
3709
3710 /* Called from the IO thread. */
3711 bool pa_sink_volume_change_apply(pa_sink *s, pa_usec_t *usec_to_next) {
3712     pa_usec_t now;
3713     bool ret = false;
3714
3715     pa_assert(s);
3716
3717     if (!s->thread_info.volume_changes || !PA_SINK_IS_LINKED(s->state)) {
3718         if (usec_to_next)
3719             *usec_to_next = 0;
3720         return ret;
3721     }
3722
3723     pa_assert(s->write_volume);
3724
3725     now = pa_rtclock_now();
3726
3727     while (s->thread_info.volume_changes && now >= s->thread_info.volume_changes->at) {
3728         pa_sink_volume_change *c = s->thread_info.volume_changes;
3729         PA_LLIST_REMOVE(pa_sink_volume_change, s->thread_info.volume_changes, c);
3730         pa_log_debug("Volume change to %d at %llu was written %llu usec late",
3731                      pa_cvolume_avg(&c->hw_volume), (long long unsigned) c->at, (long long unsigned) (now - c->at));
3732         ret = true;
3733         s->thread_info.current_hw_volume = c->hw_volume;
3734         pa_sink_volume_change_free(c);
3735     }
3736
3737     if (ret)
3738         s->write_volume(s);
3739
3740     if (s->thread_info.volume_changes) {
3741         if (usec_to_next)
3742             *usec_to_next = s->thread_info.volume_changes->at - now;
3743         if (pa_log_ratelimit(PA_LOG_DEBUG))
3744             pa_log_debug("Next volume change in %lld usec", (long long) (s->thread_info.volume_changes->at - now));
3745     }
3746     else {
3747         if (usec_to_next)
3748             *usec_to_next = 0;
3749         s->thread_info.volume_changes_tail = NULL;
3750     }
3751     return ret;
3752 }
3753
3754 /* Called from the IO thread. */
3755 static void pa_sink_volume_change_rewind(pa_sink *s, size_t nbytes) {
3756     /* All the queued volume events later than current latency are shifted to happen earlier. */
3757     pa_sink_volume_change *c;
3758     pa_volume_t prev_vol = pa_cvolume_avg(&s->thread_info.current_hw_volume);
3759     pa_usec_t rewound = pa_bytes_to_usec(nbytes, &s->sample_spec);
3760     pa_usec_t limit = pa_sink_get_latency_within_thread(s, false);
3761
3762     pa_log_debug("latency = %lld", (long long) limit);
3763     limit += pa_rtclock_now() + s->thread_info.volume_change_extra_delay;
3764
3765     PA_LLIST_FOREACH(c, s->thread_info.volume_changes) {
3766         pa_usec_t modified_limit = limit;
3767         if (prev_vol > pa_cvolume_avg(&c->hw_volume))
3768             modified_limit -= s->thread_info.volume_change_safety_margin;
3769         else
3770             modified_limit += s->thread_info.volume_change_safety_margin;
3771         if (c->at > modified_limit) {
3772             c->at -= rewound;
3773             if (c->at < modified_limit)
3774                 c->at = modified_limit;
3775         }
3776         prev_vol = pa_cvolume_avg(&c->hw_volume);
3777     }
3778     pa_sink_volume_change_apply(s, NULL);
3779 }
3780
3781 /* Called from the main thread */
3782 /* Gets the list of formats supported by the sink. The members and idxset must
3783  * be freed by the caller. */
3784 pa_idxset* pa_sink_get_formats(pa_sink *s) {
3785     pa_idxset *ret;
3786
3787     pa_assert(s);
3788
3789     if (s->get_formats) {
3790         /* Sink supports format query, all is good */
3791         ret = s->get_formats(s);
3792     } else {
3793         /* Sink doesn't support format query, so assume it does PCM */
3794         pa_format_info *f = pa_format_info_new();
3795         f->encoding = PA_ENCODING_PCM;
3796
3797         ret = pa_idxset_new(NULL, NULL);
3798         pa_idxset_put(ret, f, NULL);
3799     }
3800
3801     return ret;
3802 }
3803
3804 /* Called from the main thread */
3805 /* Allows an external source to set what formats a sink supports if the sink
3806  * permits this. The function makes a copy of the formats on success. */
3807 bool pa_sink_set_formats(pa_sink *s, pa_idxset *formats) {
3808     pa_assert(s);
3809     pa_assert(formats);
3810
3811     if (s->set_formats)
3812         /* Sink supports setting formats -- let's give it a shot */
3813         return s->set_formats(s, formats);
3814     else
3815         /* Sink doesn't support setting this -- bail out */
3816         return false;
3817 }
3818
3819 /* Called from the main thread */
3820 /* Checks if the sink can accept this format */
3821 bool pa_sink_check_format(pa_sink *s, pa_format_info *f) {
3822     pa_idxset *formats = NULL;
3823     bool ret = false;
3824
3825     pa_assert(s);
3826     pa_assert(f);
3827
3828     formats = pa_sink_get_formats(s);
3829
3830     if (formats) {
3831         pa_format_info *finfo_device;
3832         uint32_t i;
3833
3834         PA_IDXSET_FOREACH(finfo_device, formats, i) {
3835             if (pa_format_info_is_compatible(finfo_device, f)) {
3836                 ret = true;
3837                 break;
3838             }
3839         }
3840
3841         pa_idxset_free(formats, (pa_free_cb_t) pa_format_info_free);
3842     }
3843
3844     return ret;
3845 }
3846
3847 /* Called from the main thread */
3848 /* Calculates the intersection between formats supported by the sink and
3849  * in_formats, and returns these, in the order of the sink's formats. */
3850 pa_idxset* pa_sink_check_formats(pa_sink *s, pa_idxset *in_formats) {
3851     pa_idxset *out_formats = pa_idxset_new(NULL, NULL), *sink_formats = NULL;
3852     pa_format_info *f_sink, *f_in;
3853     uint32_t i, j;
3854
3855     pa_assert(s);
3856
3857     if (!in_formats || pa_idxset_isempty(in_formats))
3858         goto done;
3859
3860     sink_formats = pa_sink_get_formats(s);
3861
3862     PA_IDXSET_FOREACH(f_sink, sink_formats, i) {
3863         PA_IDXSET_FOREACH(f_in, in_formats, j) {
3864             if (pa_format_info_is_compatible(f_sink, f_in))
3865                 pa_idxset_put(out_formats, pa_format_info_copy(f_in), NULL);
3866         }
3867     }
3868
3869 done:
3870     if (sink_formats)
3871         pa_idxset_free(sink_formats, (pa_free_cb_t) pa_format_info_free);
3872
3873     return out_formats;
3874 }
3875
3876 /* Called from the main thread */
3877 void pa_sink_set_sample_format(pa_sink *s, pa_sample_format_t format) {
3878     pa_sample_format_t old_format;
3879
3880     pa_assert(s);
3881     pa_assert(pa_sample_format_valid(format));
3882
3883     old_format = s->sample_spec.format;
3884     if (old_format == format)
3885         return;
3886
3887     pa_log_info("%s: format: %s -> %s",
3888                 s->name, pa_sample_format_to_string(old_format), pa_sample_format_to_string(format));
3889
3890     s->sample_spec.format = format;
3891
3892     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
3893 }
3894
3895 /* Called from the main thread */
3896 void pa_sink_set_sample_rate(pa_sink *s, uint32_t rate) {
3897     uint32_t old_rate;
3898
3899     pa_assert(s);
3900     pa_assert(pa_sample_rate_valid(rate));
3901
3902     old_rate = s->sample_spec.rate;
3903     if (old_rate == rate)
3904         return;
3905
3906     pa_log_info("%s: rate: %u -> %u", s->name, old_rate, rate);
3907
3908     s->sample_spec.rate = rate;
3909
3910     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
3911 }
3912
3913 /* Called from the main thread. */
3914 void pa_sink_set_reference_volume_direct(pa_sink *s, const pa_cvolume *volume) {
3915     pa_cvolume old_volume;
3916     char old_volume_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
3917     char new_volume_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
3918
3919     pa_assert(s);
3920     pa_assert(volume);
3921
3922     old_volume = s->reference_volume;
3923
3924     if (pa_cvolume_equal(volume, &old_volume))
3925         return;
3926
3927     s->reference_volume = *volume;
3928     pa_log_debug("The reference volume of sink %s changed from %s to %s.", s->name,
3929                  pa_cvolume_snprint_verbose(old_volume_str, sizeof(old_volume_str), &old_volume, &s->channel_map,
3930                                             s->flags & PA_SINK_DECIBEL_VOLUME),
3931                  pa_cvolume_snprint_verbose(new_volume_str, sizeof(new_volume_str), volume, &s->channel_map,
3932                                             s->flags & PA_SINK_DECIBEL_VOLUME));
3933
3934     pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
3935     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_VOLUME_CHANGED], s);
3936 }
3937
3938 void pa_sink_move_streams_to_default_sink(pa_core *core, pa_sink *old_sink) {
3939     pa_sink_input *i;
3940     uint32_t idx;
3941     bool old_sink_is_unavailable = false;
3942
3943     pa_assert(core);
3944     pa_assert(old_sink);
3945
3946     if (core->default_sink == NULL || core->default_sink->unlink_requested)
3947         return;
3948
3949     if (old_sink == core->default_sink)
3950         return;
3951
3952     if (old_sink->active_port && old_sink->active_port->available == PA_AVAILABLE_NO)
3953         old_sink_is_unavailable = true;
3954
3955     PA_IDXSET_FOREACH(i, old_sink->inputs, idx) {
3956         if (!PA_SINK_INPUT_IS_LINKED(i->state))
3957             continue;
3958
3959         if (!i->sink)
3960             continue;
3961
3962         if (pa_safe_streq(old_sink->name, i->preferred_sink) && !old_sink_is_unavailable)
3963             continue;
3964
3965         pa_log_info("The sink input %u \"%s\" is moving to %s due to change of the default sink.",
3966                     i->index, pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), core->default_sink->name);
3967         pa_sink_input_move_to(i, core->default_sink, false);
3968     }
3969 }