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