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