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