Merge branch 'passthrough'
[platform/upstream/pulseaudio.git] / src / pulsecore / sink-input.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/utf8.h>
32 #include <pulse/xmalloc.h>
33 #include <pulse/util.h>
34 #include <pulse/internal.h>
35
36 #include <pulsecore/sample-util.h>
37 #include <pulsecore/core-subscribe.h>
38 #include <pulsecore/log.h>
39 #include <pulsecore/play-memblockq.h>
40 #include <pulsecore/namereg.h>
41 #include <pulsecore/core-util.h>
42
43 #include "sink-input.h"
44
45 #define MEMBLOCKQ_MAXLENGTH (32*1024*1024)
46 #define CONVERT_BUFFER_LENGTH (PA_PAGE_SIZE)
47
48 PA_DEFINE_PUBLIC_CLASS(pa_sink_input, pa_msgobject);
49
50 static void sink_input_free(pa_object *o);
51 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v);
52
53 static int check_passthrough_connection(pa_bool_t passthrough, pa_sink *dest) {
54     if (pa_sink_is_passthrough(dest)) {
55         pa_log_warn("Sink is already connected to PASSTHROUGH input");
56         return -PA_ERR_BUSY;
57     }
58
59     /* If current input(s) exist, check new input is not PASSTHROUGH */
60     if (pa_idxset_size(dest->inputs) > 0 && passthrough) {
61         pa_log_warn("Sink is already connected, cannot accept new PASSTHROUGH INPUT");
62         return -PA_ERR_BUSY;
63     }
64
65     return PA_OK;
66 }
67
68 pa_sink_input_new_data* pa_sink_input_new_data_init(pa_sink_input_new_data *data) {
69     pa_assert(data);
70
71     pa_zero(*data);
72     data->resample_method = PA_RESAMPLER_INVALID;
73     data->proplist = pa_proplist_new();
74     data->volume_writable = TRUE;
75
76     return data;
77 }
78
79 void pa_sink_input_new_data_set_sample_spec(pa_sink_input_new_data *data, const pa_sample_spec *spec) {
80     pa_assert(data);
81
82     if ((data->sample_spec_is_set = !!spec))
83         data->sample_spec = *spec;
84 }
85
86 void pa_sink_input_new_data_set_channel_map(pa_sink_input_new_data *data, const pa_channel_map *map) {
87     pa_assert(data);
88
89     if ((data->channel_map_is_set = !!map))
90         data->channel_map = *map;
91 }
92
93 pa_bool_t pa_sink_input_new_data_is_passthrough(pa_sink_input_new_data *data) {
94     pa_assert(data);
95
96     if (PA_LIKELY(data->format) && PA_UNLIKELY(!pa_format_info_is_pcm(data->format)))
97         return TRUE;
98
99     if (PA_UNLIKELY(data->flags & PA_SINK_INPUT_PASSTHROUGH))
100         return TRUE;
101
102     return FALSE;
103 }
104
105 void pa_sink_input_new_data_set_volume(pa_sink_input_new_data *data, const pa_cvolume *volume) {
106     pa_assert(data);
107     pa_assert(data->volume_writable);
108
109     if ((data->volume_is_set = !!volume))
110         data->volume = *volume;
111 }
112
113 void pa_sink_input_new_data_apply_volume_factor(pa_sink_input_new_data *data, const pa_cvolume *volume_factor) {
114     pa_assert(data);
115     pa_assert(volume_factor);
116
117     if (data->volume_factor_is_set)
118         pa_sw_cvolume_multiply(&data->volume_factor, &data->volume_factor, volume_factor);
119     else {
120         data->volume_factor_is_set = TRUE;
121         data->volume_factor = *volume_factor;
122     }
123 }
124
125 void pa_sink_input_new_data_apply_volume_factor_sink(pa_sink_input_new_data *data, const pa_cvolume *volume_factor) {
126     pa_assert(data);
127     pa_assert(volume_factor);
128
129     if (data->volume_factor_sink_is_set)
130         pa_sw_cvolume_multiply(&data->volume_factor_sink, &data->volume_factor_sink, volume_factor);
131     else {
132         data->volume_factor_sink_is_set = TRUE;
133         data->volume_factor_sink = *volume_factor;
134     }
135 }
136
137 void pa_sink_input_new_data_set_muted(pa_sink_input_new_data *data, pa_bool_t mute) {
138     pa_assert(data);
139
140     data->muted_is_set = TRUE;
141     data->muted = !!mute;
142 }
143
144 pa_bool_t pa_sink_input_new_data_set_sink(pa_sink_input_new_data *data, pa_sink *s, pa_bool_t save) {
145     pa_bool_t ret = TRUE;
146     pa_idxset *formats = NULL;
147
148     pa_assert(data);
149     pa_assert(s);
150
151     if (!data->req_formats) {
152         /* We're not working with the extended API */
153         data->sink = s;
154         data->save_sink = save;
155     } else {
156         /* Extended API: let's see if this sink supports the formats the client can provide */
157         formats = pa_sink_check_formats(s, data->req_formats);
158
159         if (formats && !pa_idxset_isempty(formats)) {
160             /* Sink supports at least one of the requested formats */
161             data->sink = s;
162             data->save_sink = save;
163             if (data->nego_formats)
164                 pa_idxset_free(data->nego_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
165             data->nego_formats = formats;
166         } else {
167             /* Sink doesn't support any of the formats requested by the client */
168             if (formats)
169                 pa_idxset_free(formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
170             ret = FALSE;
171         }
172     }
173
174     return ret;
175 }
176
177 pa_bool_t pa_sink_input_new_data_set_formats(pa_sink_input_new_data *data, pa_idxset *formats) {
178     pa_assert(data);
179     pa_assert(formats);
180
181     if (data->req_formats)
182         pa_idxset_free(formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
183
184     data->req_formats = formats;
185
186     if (data->sink) {
187         /* Trigger format negotiation */
188         return pa_sink_input_new_data_set_sink(data, data->sink, data->save_sink);
189     }
190
191     return TRUE;
192 }
193
194 void pa_sink_input_new_data_done(pa_sink_input_new_data *data) {
195     pa_assert(data);
196
197     if (data->req_formats)
198         pa_idxset_free(data->req_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
199
200     if (data->nego_formats)
201         pa_idxset_free(data->nego_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
202
203     if (data->format)
204         pa_format_info_free(data->format);
205
206     pa_proplist_free(data->proplist);
207 }
208
209 /* Called from main context */
210 static void reset_callbacks(pa_sink_input *i) {
211     pa_assert(i);
212
213     i->pop = NULL;
214     i->process_rewind = NULL;
215     i->update_max_rewind = NULL;
216     i->update_max_request = NULL;
217     i->update_sink_requested_latency = NULL;
218     i->update_sink_latency_range = NULL;
219     i->update_sink_fixed_latency = NULL;
220     i->attach = NULL;
221     i->detach = NULL;
222     i->suspend = NULL;
223     i->suspend_within_thread = NULL;
224     i->moving = NULL;
225     i->kill = NULL;
226     i->get_latency = NULL;
227     i->state_change = NULL;
228     i->may_move_to = NULL;
229     i->send_event = NULL;
230     i->volume_changed = NULL;
231     i->mute_changed = NULL;
232 }
233
234 /* Called from main context */
235 int pa_sink_input_new(
236         pa_sink_input **_i,
237         pa_core *core,
238         pa_sink_input_new_data *data) {
239
240     pa_sink_input *i;
241     pa_resampler *resampler = NULL;
242     char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
243     pa_channel_map original_cm;
244     int r;
245     char *pt;
246     pa_sample_spec ss;
247     pa_channel_map map;
248
249     pa_assert(_i);
250     pa_assert(core);
251     pa_assert(data);
252     pa_assert_ctl_context();
253
254     if (data->client)
255         pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->client->proplist);
256
257     if (data->origin_sink && (data->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER))
258         data->volume_writable = FALSE;
259
260     if (!data->req_formats) {
261         /* From this point on, we want to work only with formats, and get back
262          * to using the sample spec and channel map after all decisions w.r.t.
263          * routing are complete. */
264         pa_idxset *tmp = pa_idxset_new(NULL, NULL);
265         pa_format_info *f = pa_format_info_from_sample_spec(&data->sample_spec, &data->channel_map);
266         pa_idxset_put(tmp, f, NULL);
267         pa_sink_input_new_data_set_formats(data, tmp);
268     }
269
270     if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], data)) < 0)
271         return r;
272
273     pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
274
275     if (!data->sink)
276         pa_sink_input_new_data_set_sink(data, pa_namereg_get(core, NULL, PA_NAMEREG_SINK), FALSE);
277
278     /* Routing's done, we have a sink. Now let's fix the format and set up the
279      * sample spec */
280
281     /* If something didn't pick a format for us, pick the top-most format since
282      * we assume this is sorted in priority order */
283     if (!data->format && data->nego_formats && !pa_idxset_isempty(data->nego_formats))
284         data->format = pa_format_info_copy(pa_idxset_first(data->nego_formats, NULL));
285
286     pa_return_val_if_fail(data->format, -PA_ERR_NOTSUPPORTED);
287
288     /* Now populate the sample spec and format according to the final
289      * format that we've negotiated */
290     if (PA_LIKELY(data->format->encoding == PA_ENCODING_PCM)) {
291         pa_return_val_if_fail(pa_format_info_to_sample_spec(data->format, &ss, &map), -PA_ERR_INVALID);
292         pa_sink_input_new_data_set_sample_spec(data, &ss);
293         if (pa_channel_map_valid(&map))
294             pa_sink_input_new_data_set_channel_map(data, &map);
295     } else {
296         pa_return_val_if_fail(pa_format_info_to_sample_spec_fake(data->format, &ss), -PA_ERR_INVALID);
297         pa_sink_input_new_data_set_sample_spec(data, &ss);
298     }
299
300     pa_return_val_if_fail(data->sink, -PA_ERR_NOENTITY);
301     pa_return_val_if_fail(PA_SINK_IS_LINKED(pa_sink_get_state(data->sink)), -PA_ERR_BADSTATE);
302     pa_return_val_if_fail(!data->sync_base || (data->sync_base->sink == data->sink && pa_sink_input_get_state(data->sync_base) == PA_SINK_INPUT_CORKED), -PA_ERR_INVALID);
303
304     r = check_passthrough_connection(pa_sink_input_new_data_is_passthrough(data), data->sink);
305     if (r != PA_OK)
306         return r;
307
308     if (!data->sample_spec_is_set)
309         data->sample_spec = data->sink->sample_spec;
310
311     pa_return_val_if_fail(pa_sample_spec_valid(&data->sample_spec), -PA_ERR_INVALID);
312
313     if (!data->channel_map_is_set) {
314         if (pa_channel_map_compatible(&data->sink->channel_map, &data->sample_spec))
315             data->channel_map = data->sink->channel_map;
316         else
317             pa_channel_map_init_extend(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
318     }
319
320     pa_return_val_if_fail(pa_channel_map_compatible(&data->channel_map, &data->sample_spec), -PA_ERR_INVALID);
321
322     /* Don't restore (or save) stream volume for passthrough streams */
323     if (!pa_format_info_is_pcm(data->format)) {
324         data->volume_is_set = FALSE;
325         data->volume_factor_is_set = FALSE;
326     }
327
328     if (!data->volume_is_set) {
329         pa_cvolume_reset(&data->volume, data->sample_spec.channels);
330         data->volume_is_absolute = FALSE;
331         data->save_volume = FALSE;
332     }
333
334     pa_return_val_if_fail(pa_cvolume_compatible(&data->volume, &data->sample_spec), -PA_ERR_INVALID);
335
336     if (!data->volume_factor_is_set)
337         pa_cvolume_reset(&data->volume_factor, data->sample_spec.channels);
338
339     pa_return_val_if_fail(pa_cvolume_compatible(&data->volume_factor, &data->sample_spec), -PA_ERR_INVALID);
340
341     if (!data->volume_factor_sink_is_set)
342         pa_cvolume_reset(&data->volume_factor_sink, data->sink->sample_spec.channels);
343
344     pa_return_val_if_fail(pa_cvolume_compatible(&data->volume_factor_sink, &data->sink->sample_spec), -PA_ERR_INVALID);
345
346     if (!data->muted_is_set)
347         data->muted = FALSE;
348
349     if (data->flags & PA_SINK_INPUT_FIX_FORMAT)
350         data->sample_spec.format = data->sink->sample_spec.format;
351
352     if (data->flags & PA_SINK_INPUT_FIX_RATE)
353         data->sample_spec.rate = data->sink->sample_spec.rate;
354
355     original_cm = data->channel_map;
356
357     if (data->flags & PA_SINK_INPUT_FIX_CHANNELS) {
358         data->sample_spec.channels = data->sink->sample_spec.channels;
359         data->channel_map = data->sink->channel_map;
360     }
361
362     pa_assert(pa_sample_spec_valid(&data->sample_spec));
363     pa_assert(pa_channel_map_valid(&data->channel_map));
364
365     /* Due to the fixing of the sample spec the volume might not match anymore */
366     pa_cvolume_remap(&data->volume, &original_cm, &data->channel_map);
367
368     if (data->resample_method == PA_RESAMPLER_INVALID)
369         data->resample_method = core->resample_method;
370
371     pa_return_val_if_fail(data->resample_method < PA_RESAMPLER_MAX, -PA_ERR_INVALID);
372
373     if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_INPUT_FIXATE], data)) < 0)
374         return r;
375
376     if ((data->flags & PA_SINK_INPUT_NO_CREATE_ON_SUSPEND) &&
377         pa_sink_get_state(data->sink) == PA_SINK_SUSPENDED) {
378         pa_log_warn("Failed to create sink input: sink is suspended.");
379         return -PA_ERR_BADSTATE;
380     }
381
382     if (pa_idxset_size(data->sink->inputs) >= PA_MAX_INPUTS_PER_SINK) {
383         pa_log_warn("Failed to create sink input: too many inputs per sink.");
384         return -PA_ERR_TOOLARGE;
385     }
386
387     if ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ||
388         !pa_sample_spec_equal(&data->sample_spec, &data->sink->sample_spec) ||
389         !pa_channel_map_equal(&data->channel_map, &data->sink->channel_map)) {
390
391         /* Note: for passthrough content we need to adjust the output rate to that of the current sink-input */
392         if (!pa_sink_input_new_data_is_passthrough(data)) /* no resampler for passthrough content */
393             if (!(resampler = pa_resampler_new(
394                           core->mempool,
395                           &data->sample_spec, &data->channel_map,
396                           &data->sink->sample_spec, &data->sink->channel_map,
397                           data->resample_method,
398                           ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
399                           ((data->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
400                           (core->disable_remixing || (data->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
401                           (core->disable_lfe_remixing ? PA_RESAMPLER_NO_LFE : 0)))) {
402                 pa_log_warn("Unsupported resampling operation.");
403                 return -PA_ERR_NOTSUPPORTED;
404             }
405     }
406
407     i = pa_msgobject_new(pa_sink_input);
408     i->parent.parent.free = sink_input_free;
409     i->parent.process_msg = pa_sink_input_process_msg;
410
411     i->core = core;
412     i->state = PA_SINK_INPUT_INIT;
413     i->flags = data->flags;
414     i->proplist = pa_proplist_copy(data->proplist);
415     i->driver = pa_xstrdup(pa_path_get_filename(data->driver));
416     i->module = data->module;
417     i->sink = data->sink;
418     i->origin_sink = data->origin_sink;
419     i->client = data->client;
420
421     i->requested_resample_method = data->resample_method;
422     i->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID;
423     i->sample_spec = data->sample_spec;
424     i->channel_map = data->channel_map;
425     i->format = pa_format_info_copy(data->format);
426
427     if (!data->volume_is_absolute && pa_sink_flat_volume_enabled(i->sink)) {
428         pa_cvolume remapped;
429
430         /* When the 'absolute' bool is not set then we'll treat the volume
431          * as relative to the sink volume even in flat volume mode */
432         remapped = data->sink->reference_volume;
433         pa_cvolume_remap(&remapped, &data->sink->channel_map, &data->channel_map);
434         pa_sw_cvolume_multiply(&i->volume, &data->volume, &remapped);
435     } else
436         i->volume = data->volume;
437
438     i->volume_factor = data->volume_factor;
439     i->volume_factor_sink = data->volume_factor_sink;
440     i->real_ratio = i->reference_ratio = data->volume;
441     pa_cvolume_reset(&i->soft_volume, i->sample_spec.channels);
442     pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels);
443     i->volume_writable = data->volume_writable;
444     i->save_volume = data->save_volume;
445     i->save_sink = data->save_sink;
446     i->save_muted = data->save_muted;
447
448     i->muted = data->muted;
449
450     if (data->sync_base) {
451         i->sync_next = data->sync_base->sync_next;
452         i->sync_prev = data->sync_base;
453
454         if (data->sync_base->sync_next)
455             data->sync_base->sync_next->sync_prev = i;
456         data->sync_base->sync_next = i;
457     } else
458         i->sync_next = i->sync_prev = NULL;
459
460     i->direct_outputs = pa_idxset_new(NULL, NULL);
461
462     reset_callbacks(i);
463     i->userdata = NULL;
464
465     i->thread_info.state = i->state;
466     i->thread_info.attached = FALSE;
467     pa_atomic_store(&i->thread_info.drained, 1);
468     i->thread_info.sample_spec = i->sample_spec;
469     i->thread_info.resampler = resampler;
470     i->thread_info.soft_volume = i->soft_volume;
471     i->thread_info.muted = i->muted;
472     i->thread_info.requested_sink_latency = (pa_usec_t) -1;
473     i->thread_info.rewrite_nbytes = 0;
474     i->thread_info.rewrite_flush = FALSE;
475     i->thread_info.dont_rewind_render = FALSE;
476     i->thread_info.underrun_for = (uint64_t) -1;
477     i->thread_info.playing_for = 0;
478     i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
479
480     i->thread_info.render_memblockq = pa_memblockq_new(
481             0,
482             MEMBLOCKQ_MAXLENGTH,
483             0,
484             pa_frame_size(&i->sink->sample_spec),
485             0,
486             1,
487             0,
488             &i->sink->silence);
489
490     pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0);
491     pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0);
492
493     if (i->client)
494         pa_assert_se(pa_idxset_put(i->client->sink_inputs, i, NULL) >= 0);
495
496     pt = pa_proplist_to_string_sep(i->proplist, "\n    ");
497     pa_log_info("Created input %u \"%s\" on %s with sample spec %s and channel map %s\n    %s",
498                 i->index,
499                 pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)),
500                 i->sink->name,
501                 pa_sample_spec_snprint(st, sizeof(st), &i->sample_spec),
502                 pa_channel_map_snprint(cm, sizeof(cm), &i->channel_map),
503                 pt);
504     pa_xfree(pt);
505
506     /* Don't forget to call pa_sink_input_put! */
507
508     *_i = i;
509     return 0;
510 }
511
512 /* Called from main context */
513 static void update_n_corked(pa_sink_input *i, pa_sink_input_state_t state) {
514     pa_assert(i);
515     pa_assert_ctl_context();
516
517     if (!i->sink)
518         return;
519
520     if (i->state == PA_SINK_INPUT_CORKED && state != PA_SINK_INPUT_CORKED)
521         pa_assert_se(i->sink->n_corked -- >= 1);
522     else if (i->state != PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_CORKED)
523         i->sink->n_corked++;
524 }
525
526 /* Called from main context */
527 static void sink_input_set_state(pa_sink_input *i, pa_sink_input_state_t state) {
528     pa_sink_input *ssync;
529     pa_assert(i);
530     pa_assert_ctl_context();
531
532     if (state == PA_SINK_INPUT_DRAINED)
533         state = PA_SINK_INPUT_RUNNING;
534
535     if (i->state == state)
536         return;
537
538     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_STATE, PA_UINT_TO_PTR(state), 0, NULL) == 0);
539
540     update_n_corked(i, state);
541     i->state = state;
542
543     for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev) {
544         update_n_corked(ssync, state);
545         ssync->state = state;
546     }
547     for (ssync = i->sync_next; ssync; ssync = ssync->sync_next) {
548         update_n_corked(ssync, state);
549         ssync->state = state;
550     }
551
552     if (state != PA_SINK_INPUT_UNLINKED) {
553         pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], i);
554
555         for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev)
556             pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync);
557
558         for (ssync = i->sync_next; ssync; ssync = ssync->sync_next)
559             pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync);
560
561         if (PA_SINK_INPUT_IS_LINKED(state))
562             pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
563     }
564
565     pa_sink_update_status(i->sink);
566 }
567
568 /* Called from main context */
569 void pa_sink_input_unlink(pa_sink_input *i) {
570     pa_bool_t linked;
571     pa_source_output *o, *p = NULL;
572
573     pa_assert(i);
574     pa_assert_ctl_context();
575
576     /* See pa_sink_unlink() for a couple of comments how this function
577      * works */
578
579     pa_sink_input_ref(i);
580
581     linked = PA_SINK_INPUT_IS_LINKED(i->state);
582
583     if (linked)
584         pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], i);
585
586     if (i->sync_prev)
587         i->sync_prev->sync_next = i->sync_next;
588     if (i->sync_next)
589         i->sync_next->sync_prev = i->sync_prev;
590
591     i->sync_prev = i->sync_next = NULL;
592
593     pa_idxset_remove_by_data(i->core->sink_inputs, i, NULL);
594
595     if (i->sink)
596         if (pa_idxset_remove_by_data(i->sink->inputs, i, NULL))
597             pa_sink_input_unref(i);
598
599     if (i->client)
600         pa_idxset_remove_by_data(i->client->sink_inputs, i, NULL);
601
602     while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
603         pa_assert(o != p);
604         pa_source_output_kill(o);
605         p = o;
606     }
607
608     update_n_corked(i, PA_SINK_INPUT_UNLINKED);
609     i->state = PA_SINK_INPUT_UNLINKED;
610
611     if (linked && i->sink) {
612         /* We might need to update the sink's volume if we are in flat volume mode. */
613         if (pa_sink_flat_volume_enabled(i->sink))
614             pa_sink_set_volume(i->sink, NULL, FALSE, FALSE);
615
616         if (i->sink->asyncmsgq)
617             pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_REMOVE_INPUT, i, 0, NULL) == 0);
618
619         /* We suspend the monitor if there was a passthrough sink, unsuspend now if required */
620         if (pa_sink_input_is_passthrough(i) && i->sink->monitor_source)
621             pa_source_suspend(i->sink->monitor_source, FALSE, PA_SUSPEND_PASSTHROUGH);
622     }
623
624     reset_callbacks(i);
625
626     if (linked) {
627         pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_REMOVE, i->index);
628         pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST], i);
629     }
630
631     if (i->sink) {
632         pa_sink_update_status(i->sink);
633         i->sink = NULL;
634     }
635
636     pa_core_maybe_vacuum(i->core);
637
638     pa_sink_input_unref(i);
639 }
640
641 /* Called from main context */
642 static void sink_input_free(pa_object *o) {
643     pa_sink_input* i = PA_SINK_INPUT(o);
644
645     pa_assert(i);
646     pa_assert_ctl_context();
647     pa_assert(pa_sink_input_refcnt(i) == 0);
648
649     if (PA_SINK_INPUT_IS_LINKED(i->state))
650         pa_sink_input_unlink(i);
651
652     pa_log_info("Freeing input %u \"%s\"", i->index, pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)));
653
654     /* Side note: this function must be able to destruct properly any
655      * kind of sink input in any state, even those which are
656      * "half-moved" or are connected to sinks that have no asyncmsgq
657      * and are hence half-destructed themselves! */
658
659     if (i->thread_info.render_memblockq)
660         pa_memblockq_free(i->thread_info.render_memblockq);
661
662     if (i->thread_info.resampler)
663         pa_resampler_free(i->thread_info.resampler);
664
665     if (i->format)
666         pa_format_info_free(i->format);
667
668     if (i->proplist)
669         pa_proplist_free(i->proplist);
670
671     if (i->direct_outputs)
672         pa_idxset_free(i->direct_outputs, NULL, NULL);
673
674     if (i->thread_info.direct_outputs)
675         pa_hashmap_free(i->thread_info.direct_outputs, NULL, NULL);
676
677     pa_xfree(i->driver);
678     pa_xfree(i);
679 }
680
681 /* Called from main context */
682 void pa_sink_input_put(pa_sink_input *i) {
683     pa_sink_input_state_t state;
684
685     pa_sink_input_assert_ref(i);
686     pa_assert_ctl_context();
687
688     pa_assert(i->state == PA_SINK_INPUT_INIT);
689
690     /* The following fields must be initialized properly */
691     pa_assert(i->pop);
692     pa_assert(i->process_rewind);
693     pa_assert(i->kill);
694
695     state = i->flags & PA_SINK_INPUT_START_CORKED ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING;
696
697     update_n_corked(i, state);
698     i->state = state;
699
700     /* We might need to update the sink's volume if we are in flat volume mode. */
701     if (pa_sink_flat_volume_enabled(i->sink))
702         pa_sink_set_volume(i->sink, NULL, FALSE, i->save_volume);
703     else {
704         if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
705             pa_assert(pa_cvolume_is_norm(&i->volume));
706             pa_assert(pa_cvolume_is_norm(&i->reference_ratio));
707         }
708
709         set_real_ratio(i, &i->volume);
710     }
711
712     /* If we're entering passthrough mode, disable the monitor */
713     if (pa_sink_input_is_passthrough(i) && i->sink->monitor_source)
714         pa_source_suspend(i->sink->monitor_source, TRUE, PA_SUSPEND_PASSTHROUGH);
715
716     i->thread_info.soft_volume = i->soft_volume;
717     i->thread_info.muted = i->muted;
718
719     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_ADD_INPUT, i, 0, NULL) == 0);
720
721     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, i->index);
722     pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], i);
723
724     pa_sink_update_status(i->sink);
725 }
726
727 /* Called from main context */
728 void pa_sink_input_kill(pa_sink_input*i) {
729     pa_sink_input_assert_ref(i);
730     pa_assert_ctl_context();
731     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
732
733     i->kill(i);
734 }
735
736 /* Called from main context */
737 pa_usec_t pa_sink_input_get_latency(pa_sink_input *i, pa_usec_t *sink_latency) {
738     pa_usec_t r[2] = { 0, 0 };
739
740     pa_sink_input_assert_ref(i);
741     pa_assert_ctl_context();
742     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
743
744     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_LATENCY, r, 0, NULL) == 0);
745
746     if (i->get_latency)
747         r[0] += i->get_latency(i);
748
749     if (sink_latency)
750         *sink_latency = r[1];
751
752     return r[0];
753 }
754
755 /* Called from thread context */
756 void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, pa_memchunk *chunk, pa_cvolume *volume) {
757     pa_bool_t do_volume_adj_here, need_volume_factor_sink;
758     pa_bool_t volume_is_norm;
759     size_t block_size_max_sink, block_size_max_sink_input;
760     size_t ilength;
761
762     pa_sink_input_assert_ref(i);
763     pa_sink_input_assert_io_context(i);
764     pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
765     pa_assert(pa_frame_aligned(slength, &i->sink->sample_spec));
766     pa_assert(chunk);
767     pa_assert(volume);
768
769 /*     pa_log_debug("peek"); */
770
771     pa_assert(i->thread_info.state == PA_SINK_INPUT_RUNNING ||
772               i->thread_info.state == PA_SINK_INPUT_CORKED ||
773               i->thread_info.state == PA_SINK_INPUT_DRAINED);
774
775     block_size_max_sink_input = i->thread_info.resampler ?
776         pa_resampler_max_block_size(i->thread_info.resampler) :
777         pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sample_spec);
778
779     block_size_max_sink = pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sink->sample_spec);
780
781     /* Default buffer size */
782     if (slength <= 0)
783         slength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sink->sample_spec);
784
785     if (slength > block_size_max_sink)
786         slength = block_size_max_sink;
787
788     if (i->thread_info.resampler) {
789         ilength = pa_resampler_request(i->thread_info.resampler, slength);
790
791         if (ilength <= 0)
792             ilength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sample_spec);
793     } else
794         ilength = slength;
795
796     if (ilength > block_size_max_sink_input)
797         ilength = block_size_max_sink_input;
798
799     /* If the channel maps of the sink and this stream differ, we need
800      * to adjust the volume *before* we resample. Otherwise we can do
801      * it after and leave it for the sink code */
802
803     do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map);
804     volume_is_norm = pa_cvolume_is_norm(&i->thread_info.soft_volume) && !i->thread_info.muted;
805     need_volume_factor_sink = !pa_cvolume_is_norm(&i->volume_factor_sink);
806
807     while (!pa_memblockq_is_readable(i->thread_info.render_memblockq)) {
808         pa_memchunk tchunk;
809
810         /* There's nothing in our render queue. We need to fill it up
811          * with data from the implementor. */
812
813         if (i->thread_info.state == PA_SINK_INPUT_CORKED ||
814             i->pop(i, ilength, &tchunk) < 0) {
815
816             /* OK, we're corked or the implementor didn't give us any
817              * data, so let's just hand out silence */
818             pa_atomic_store(&i->thread_info.drained, 1);
819
820             pa_memblockq_seek(i->thread_info.render_memblockq, (int64_t) slength, PA_SEEK_RELATIVE, TRUE);
821             i->thread_info.playing_for = 0;
822             if (i->thread_info.underrun_for != (uint64_t) -1)
823                 i->thread_info.underrun_for += ilength;
824             break;
825         }
826
827         pa_atomic_store(&i->thread_info.drained, 0);
828
829         pa_assert(tchunk.length > 0);
830         pa_assert(tchunk.memblock);
831
832         i->thread_info.underrun_for = 0;
833         i->thread_info.playing_for += tchunk.length;
834
835         while (tchunk.length > 0) {
836             pa_memchunk wchunk;
837             pa_bool_t nvfs = need_volume_factor_sink;
838
839             wchunk = tchunk;
840             pa_memblock_ref(wchunk.memblock);
841
842             if (wchunk.length > block_size_max_sink_input)
843                 wchunk.length = block_size_max_sink_input;
844
845             /* It might be necessary to adjust the volume here */
846             if (do_volume_adj_here && !volume_is_norm) {
847                 pa_memchunk_make_writable(&wchunk, 0);
848
849                 if (i->thread_info.muted) {
850                     pa_silence_memchunk(&wchunk, &i->thread_info.sample_spec);
851                     nvfs = FALSE;
852
853                 } else if (!i->thread_info.resampler && nvfs) {
854                     pa_cvolume v;
855
856                     /* If we don't need a resampler we can merge the
857                      * post and the pre volume adjustment into one */
858
859                     pa_sw_cvolume_multiply(&v, &i->thread_info.soft_volume, &i->volume_factor_sink);
860                     pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &v);
861                     nvfs = FALSE;
862
863                 } else
864                     pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &i->thread_info.soft_volume);
865             }
866
867             if (!i->thread_info.resampler) {
868
869                 if (nvfs) {
870                     pa_memchunk_make_writable(&wchunk, 0);
871                     pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &i->volume_factor_sink);
872                 }
873
874                 pa_memblockq_push_align(i->thread_info.render_memblockq, &wchunk);
875             } else {
876                 pa_memchunk rchunk;
877                 pa_resampler_run(i->thread_info.resampler, &wchunk, &rchunk);
878
879 /*                 pa_log_debug("pushing %lu", (unsigned long) rchunk.length); */
880
881                 if (rchunk.memblock) {
882
883                     if (nvfs) {
884                         pa_memchunk_make_writable(&rchunk, 0);
885                         pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink);
886                     }
887
888                     pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk);
889                     pa_memblock_unref(rchunk.memblock);
890                 }
891             }
892
893             pa_memblock_unref(wchunk.memblock);
894
895             tchunk.index += wchunk.length;
896             tchunk.length -= wchunk.length;
897         }
898
899         pa_memblock_unref(tchunk.memblock);
900     }
901
902     pa_assert_se(pa_memblockq_peek(i->thread_info.render_memblockq, chunk) >= 0);
903
904     pa_assert(chunk->length > 0);
905     pa_assert(chunk->memblock);
906
907 /*     pa_log_debug("peeking %lu", (unsigned long) chunk->length); */
908
909     if (chunk->length > block_size_max_sink)
910         chunk->length = block_size_max_sink;
911
912     /* Let's see if we had to apply the volume adjustment ourselves,
913      * or if this can be done by the sink for us */
914
915     if (do_volume_adj_here)
916         /* We had different channel maps, so we already did the adjustment */
917         pa_cvolume_reset(volume, i->sink->sample_spec.channels);
918     else if (i->thread_info.muted)
919         /* We've both the same channel map, so let's have the sink do the adjustment for us*/
920         pa_cvolume_mute(volume, i->sink->sample_spec.channels);
921     else
922         *volume = i->thread_info.soft_volume;
923 }
924
925 /* Called from thread context */
926 void pa_sink_input_drop(pa_sink_input *i, size_t nbytes /* in sink sample spec */) {
927
928     pa_sink_input_assert_ref(i);
929     pa_sink_input_assert_io_context(i);
930     pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
931     pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
932     pa_assert(nbytes > 0);
933
934 /*     pa_log_debug("dropping %lu", (unsigned long) nbytes); */
935
936     pa_memblockq_drop(i->thread_info.render_memblockq, nbytes);
937 }
938
939 /* Called from thread context */
940 void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sample spec */) {
941     size_t lbq;
942     pa_bool_t called = FALSE;
943
944     pa_sink_input_assert_ref(i);
945     pa_sink_input_assert_io_context(i);
946     pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
947     pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
948
949 /*     pa_log_debug("rewind(%lu, %lu)", (unsigned long) nbytes, (unsigned long) i->thread_info.rewrite_nbytes); */
950
951     lbq = pa_memblockq_get_length(i->thread_info.render_memblockq);
952
953     if (nbytes > 0 && !i->thread_info.dont_rewind_render) {
954         pa_log_debug("Have to rewind %lu bytes on render memblockq.", (unsigned long) nbytes);
955         pa_memblockq_rewind(i->thread_info.render_memblockq, nbytes);
956     }
957
958     if (i->thread_info.rewrite_nbytes == (size_t) -1) {
959
960         /* We were asked to drop all buffered data, and rerequest new
961          * data from implementor the next time push() is called */
962
963         pa_memblockq_flush_write(i->thread_info.render_memblockq, TRUE);
964
965     } else if (i->thread_info.rewrite_nbytes > 0) {
966         size_t max_rewrite, amount;
967
968         /* Calculate how much make sense to rewrite at most */
969         max_rewrite = nbytes + lbq;
970
971         /* Transform into local domain */
972         if (i->thread_info.resampler)
973             max_rewrite = pa_resampler_request(i->thread_info.resampler, max_rewrite);
974
975         /* Calculate how much of the rewinded data should actually be rewritten */
976         amount = PA_MIN(i->thread_info.rewrite_nbytes, max_rewrite);
977
978         if (amount > 0) {
979             pa_log_debug("Have to rewind %lu bytes on implementor.", (unsigned long) amount);
980
981             /* Tell the implementor */
982             if (i->process_rewind)
983                 i->process_rewind(i, amount);
984             called = TRUE;
985
986             /* Convert back to to sink domain */
987             if (i->thread_info.resampler)
988                 amount = pa_resampler_result(i->thread_info.resampler, amount);
989
990             if (amount > 0)
991                 /* Ok, now update the write pointer */
992                 pa_memblockq_seek(i->thread_info.render_memblockq, - ((int64_t) amount), PA_SEEK_RELATIVE, TRUE);
993
994             if (i->thread_info.rewrite_flush)
995                 pa_memblockq_silence(i->thread_info.render_memblockq);
996
997             /* And reset the resampler */
998             if (i->thread_info.resampler)
999                 pa_resampler_reset(i->thread_info.resampler);
1000         }
1001     }
1002
1003     if (!called)
1004         if (i->process_rewind)
1005             i->process_rewind(i, 0);
1006
1007     i->thread_info.rewrite_nbytes = 0;
1008     i->thread_info.rewrite_flush = FALSE;
1009     i->thread_info.dont_rewind_render = FALSE;
1010 }
1011
1012 /* Called from thread context */
1013 size_t pa_sink_input_get_max_rewind(pa_sink_input *i) {
1014     pa_sink_input_assert_ref(i);
1015     pa_sink_input_assert_io_context(i);
1016
1017     return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_info.max_rewind) : i->sink->thread_info.max_rewind;
1018 }
1019
1020 /* Called from thread context */
1021 size_t pa_sink_input_get_max_request(pa_sink_input *i) {
1022     pa_sink_input_assert_ref(i);
1023     pa_sink_input_assert_io_context(i);
1024
1025     /* We're not verifying the status here, to allow this to be called
1026      * in the state change handler between _INIT and _RUNNING */
1027
1028     return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_info.max_request) : i->sink->thread_info.max_request;
1029 }
1030
1031 /* Called from thread context */
1032 void pa_sink_input_update_max_rewind(pa_sink_input *i, size_t nbytes  /* in the sink's sample spec */) {
1033     pa_sink_input_assert_ref(i);
1034     pa_sink_input_assert_io_context(i);
1035     pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1036     pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1037
1038     pa_memblockq_set_maxrewind(i->thread_info.render_memblockq, nbytes);
1039
1040     if (i->update_max_rewind)
1041         i->update_max_rewind(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, nbytes) : nbytes);
1042 }
1043
1044 /* Called from thread context */
1045 void pa_sink_input_update_max_request(pa_sink_input *i, size_t nbytes  /* in the sink's sample spec */) {
1046     pa_sink_input_assert_ref(i);
1047     pa_sink_input_assert_io_context(i);
1048     pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1049     pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1050
1051     if (i->update_max_request)
1052         i->update_max_request(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, nbytes) : nbytes);
1053 }
1054
1055 /* Called from thread context */
1056 pa_usec_t pa_sink_input_set_requested_latency_within_thread(pa_sink_input *i, pa_usec_t usec) {
1057     pa_sink_input_assert_ref(i);
1058     pa_sink_input_assert_io_context(i);
1059
1060     if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY))
1061         usec = i->sink->thread_info.fixed_latency;
1062
1063     if (usec != (pa_usec_t) -1)
1064         usec = PA_CLAMP(usec, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
1065
1066     i->thread_info.requested_sink_latency = usec;
1067     pa_sink_invalidate_requested_latency(i->sink, TRUE);
1068
1069     return usec;
1070 }
1071
1072 /* Called from main context */
1073 pa_usec_t pa_sink_input_set_requested_latency(pa_sink_input *i, pa_usec_t usec) {
1074     pa_sink_input_assert_ref(i);
1075     pa_assert_ctl_context();
1076
1077     if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) {
1078         pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
1079         return usec;
1080     }
1081
1082     /* If this sink input is not realized yet or we are being moved,
1083      * we have to touch the thread info data directly */
1084
1085     if (i->sink) {
1086         if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY))
1087             usec = pa_sink_get_fixed_latency(i->sink);
1088
1089         if (usec != (pa_usec_t) -1) {
1090             pa_usec_t min_latency, max_latency;
1091             pa_sink_get_latency_range(i->sink, &min_latency, &max_latency);
1092             usec = PA_CLAMP(usec, min_latency, max_latency);
1093         }
1094     }
1095
1096     i->thread_info.requested_sink_latency = usec;
1097
1098     return usec;
1099 }
1100
1101 /* Called from main context */
1102 pa_usec_t pa_sink_input_get_requested_latency(pa_sink_input *i) {
1103     pa_sink_input_assert_ref(i);
1104     pa_assert_ctl_context();
1105
1106     if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) {
1107         pa_usec_t usec = 0;
1108         pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
1109         return usec;
1110     }
1111
1112     /* If this sink input is not realized yet or we are being moved,
1113      * we have to touch the thread info data directly */
1114
1115     return i->thread_info.requested_sink_latency;
1116 }
1117
1118 /* Called from main context */
1119 void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute) {
1120     pa_cvolume v;
1121
1122     pa_sink_input_assert_ref(i);
1123     pa_assert_ctl_context();
1124     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1125     pa_assert(volume);
1126     pa_assert(pa_cvolume_valid(volume));
1127     pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &i->sample_spec));
1128     pa_assert(i->volume_writable);
1129
1130     if (!absolute && pa_sink_flat_volume_enabled(i->sink)) {
1131         v = i->sink->reference_volume;
1132         pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
1133
1134         if (pa_cvolume_compatible(volume, &i->sample_spec))
1135             volume = pa_sw_cvolume_multiply(&v, &v, volume);
1136         else
1137             volume = pa_sw_cvolume_multiply_scalar(&v, &v, pa_cvolume_max(volume));
1138     } else {
1139         if (!pa_cvolume_compatible(volume, &i->sample_spec)) {
1140             v = i->volume;
1141             volume = pa_cvolume_scale(&v, pa_cvolume_max(volume));
1142         }
1143     }
1144
1145     if (pa_cvolume_equal(volume, &i->volume)) {
1146         i->save_volume = i->save_volume || save;
1147         return;
1148     }
1149
1150     i->volume = *volume;
1151     i->save_volume = save;
1152
1153     if (pa_sink_flat_volume_enabled(i->sink)) {
1154         /* We are in flat volume mode, so let's update all sink input
1155          * volumes and update the flat volume of the sink */
1156
1157         pa_sink_set_volume(i->sink, NULL, TRUE, save);
1158
1159     } else {
1160         /* OK, we are in normal volume mode. The volume only affects
1161          * ourselves */
1162         set_real_ratio(i, volume);
1163
1164         /* Copy the new soft_volume to the thread_info struct */
1165         pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
1166     }
1167
1168     /* The volume changed, let's tell people so */
1169     if (i->volume_changed)
1170         i->volume_changed(i);
1171
1172     /* The virtual volume changed, let's tell people so */
1173     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1174 }
1175
1176 /* Called from main context */
1177 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v) {
1178     pa_sink_input_assert_ref(i);
1179     pa_assert_ctl_context();
1180     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1181     pa_assert(!v || pa_cvolume_compatible(v, &i->sample_spec));
1182
1183     /* This basically calculates:
1184      *
1185      * i->real_ratio := v
1186      * i->soft_volume := i->real_ratio * i->volume_factor */
1187
1188     if (v)
1189         i->real_ratio = *v;
1190     else
1191         pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels);
1192
1193     pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1194     /* We don't copy the data to the thread_info data. That's left for someone else to do */
1195 }
1196
1197 /* Called from main or I/O context */
1198 pa_bool_t pa_sink_input_is_passthrough(pa_sink_input *i) {
1199     pa_sink_input_assert_ref(i);
1200
1201     if (PA_UNLIKELY(!pa_format_info_is_pcm(i->format)))
1202         return TRUE;
1203
1204     if (PA_UNLIKELY(i->flags & PA_SINK_INPUT_PASSTHROUGH))
1205         return TRUE;
1206
1207     return FALSE;
1208 }
1209
1210 /* Called from main context */
1211 pa_bool_t pa_sink_input_is_volume_readable(pa_sink_input *i) {
1212     pa_sink_input_assert_ref(i);
1213     pa_assert_ctl_context();
1214
1215     return !pa_sink_input_is_passthrough(i);
1216 }
1217
1218 /* Called from main context */
1219 pa_cvolume *pa_sink_input_get_volume(pa_sink_input *i, pa_cvolume *volume, pa_bool_t absolute) {
1220     pa_sink_input_assert_ref(i);
1221     pa_assert_ctl_context();
1222     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1223     pa_assert(pa_sink_input_is_volume_readable(i));
1224
1225     if (absolute || !pa_sink_flat_volume_enabled(i->sink))
1226         *volume = i->volume;
1227     else
1228         *volume = i->reference_ratio;
1229
1230     return volume;
1231 }
1232
1233 /* Called from main context */
1234 void pa_sink_input_set_mute(pa_sink_input *i, pa_bool_t mute, pa_bool_t save) {
1235     pa_sink_input_assert_ref(i);
1236     pa_assert_ctl_context();
1237     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1238
1239     if (!i->muted == !mute) {
1240         i->save_muted = i->save_muted || mute;
1241         return;
1242     }
1243
1244     i->muted = mute;
1245     i->save_muted = save;
1246
1247     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE, NULL, 0, NULL) == 0);
1248
1249     /* The mute status changed, let's tell people so */
1250     if (i->mute_changed)
1251         i->mute_changed(i);
1252
1253     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1254 }
1255
1256 /* Called from main context */
1257 pa_bool_t pa_sink_input_get_mute(pa_sink_input *i) {
1258     pa_sink_input_assert_ref(i);
1259     pa_assert_ctl_context();
1260     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1261
1262     return i->muted;
1263 }
1264
1265 /* Called from main thread */
1266 void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p) {
1267     pa_sink_input_assert_ref(i);
1268     pa_assert_ctl_context();
1269
1270     if (p)
1271         pa_proplist_update(i->proplist, mode, p);
1272
1273     if (PA_SINK_INPUT_IS_LINKED(i->state)) {
1274         pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
1275         pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1276     }
1277 }
1278
1279 /* Called from main context */
1280 void pa_sink_input_cork(pa_sink_input *i, pa_bool_t b) {
1281     pa_sink_input_assert_ref(i);
1282     pa_assert_ctl_context();
1283     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1284
1285     sink_input_set_state(i, b ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING);
1286 }
1287
1288 /* Called from main context */
1289 int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate) {
1290     pa_sink_input_assert_ref(i);
1291     pa_assert_ctl_context();
1292     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1293     pa_return_val_if_fail(i->thread_info.resampler, -PA_ERR_BADSTATE);
1294
1295     if (i->sample_spec.rate == rate)
1296         return 0;
1297
1298     i->sample_spec.rate = rate;
1299
1300     pa_asyncmsgq_post(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), 0, NULL, NULL);
1301
1302     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1303     return 0;
1304 }
1305
1306 /* Called from main context */
1307 void pa_sink_input_set_name(pa_sink_input *i, const char *name) {
1308     const char *old;
1309     pa_sink_input_assert_ref(i);
1310     pa_assert_ctl_context();
1311
1312     if (!name && !pa_proplist_contains(i->proplist, PA_PROP_MEDIA_NAME))
1313         return;
1314
1315     old = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME);
1316
1317     if (old && name && pa_streq(old, name))
1318         return;
1319
1320     if (name)
1321         pa_proplist_sets(i->proplist, PA_PROP_MEDIA_NAME, name);
1322     else
1323         pa_proplist_unset(i->proplist, PA_PROP_MEDIA_NAME);
1324
1325     if (PA_SINK_INPUT_IS_LINKED(i->state)) {
1326         pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
1327         pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1328     }
1329 }
1330
1331 /* Called from main context */
1332 pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i) {
1333     pa_sink_input_assert_ref(i);
1334     pa_assert_ctl_context();
1335
1336     return i->actual_resample_method;
1337 }
1338
1339 /* Called from main context */
1340 pa_bool_t pa_sink_input_may_move(pa_sink_input *i) {
1341     pa_sink_input_assert_ref(i);
1342     pa_assert_ctl_context();
1343     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1344
1345     if (i->flags & PA_SINK_INPUT_DONT_MOVE)
1346         return FALSE;
1347
1348     if (i->sync_next || i->sync_prev) {
1349         pa_log_warn("Moving synchronized streams not supported.");
1350         return FALSE;
1351     }
1352
1353     return TRUE;
1354 }
1355
1356 /* Called from main context */
1357 pa_bool_t pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest) {
1358     pa_sink_input_assert_ref(i);
1359     pa_assert_ctl_context();
1360     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1361     pa_sink_assert_ref(dest);
1362
1363     if (dest == i->sink)
1364         return TRUE;
1365
1366     if (!pa_sink_input_may_move(i))
1367         return FALSE;
1368
1369     if (pa_idxset_size(dest->inputs) >= PA_MAX_INPUTS_PER_SINK) {
1370         pa_log_warn("Failed to move sink input: too many inputs per sink.");
1371         return FALSE;
1372     }
1373
1374     if (check_passthrough_connection(pa_sink_input_is_passthrough(i), dest) < 0)
1375         return FALSE;
1376
1377     if (i->may_move_to)
1378         if (!i->may_move_to(i, dest))
1379             return FALSE;
1380
1381     return TRUE;
1382 }
1383
1384 /* Called from main context */
1385 int pa_sink_input_start_move(pa_sink_input *i) {
1386     pa_source_output *o, *p = NULL;
1387     int r;
1388
1389     pa_sink_input_assert_ref(i);
1390     pa_assert_ctl_context();
1391     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1392     pa_assert(i->sink);
1393
1394     if (!pa_sink_input_may_move(i))
1395         return -PA_ERR_NOTSUPPORTED;
1396
1397     if ((r = pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], i)) < 0)
1398         return r;
1399
1400     /* Kill directly connected outputs */
1401     while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
1402         pa_assert(o != p);
1403         pa_source_output_kill(o);
1404         p = o;
1405     }
1406     pa_assert(pa_idxset_isempty(i->direct_outputs));
1407
1408     pa_idxset_remove_by_data(i->sink->inputs, i, NULL);
1409
1410     if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
1411         pa_assert_se(i->sink->n_corked-- >= 1);
1412
1413     if (pa_sink_flat_volume_enabled(i->sink))
1414         /* We might need to update the sink's volume if we are in flat
1415          * volume mode. */
1416         pa_sink_set_volume(i->sink, NULL, FALSE, FALSE);
1417
1418     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_START_MOVE, i, 0, NULL) == 0);
1419
1420     /* We suspend the monitor if there was a passthrough sink, unsuspend now if required */
1421     if (pa_sink_input_is_passthrough(i) && i->sink->monitor_source)
1422         pa_source_suspend(i->sink->monitor_source, FALSE, PA_SUSPEND_PASSTHROUGH);
1423
1424     pa_sink_update_status(i->sink);
1425     pa_cvolume_remap(&i->volume_factor_sink, &i->sink->channel_map, &i->channel_map);
1426     i->sink = NULL;
1427
1428     pa_sink_input_unref(i);
1429
1430     return 0;
1431 }
1432
1433 /* Called from main context. If i has an origin sink that uses volume sharing,
1434  * then also the origin sink and all streams connected to it need to update
1435  * their volume - this function does all that by using recursion. */
1436 static void update_volume_due_to_moving(pa_sink_input *i, pa_sink *dest) {
1437     pa_cvolume old_volume;
1438
1439     pa_assert(i);
1440     pa_assert(dest);
1441     pa_assert(i->sink); /* The destination sink should already be set. */
1442
1443     if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1444         pa_sink *root_sink = i->sink;
1445         pa_sink_input *origin_sink_input;
1446         uint32_t idx;
1447
1448         while (root_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)
1449             root_sink = root_sink->input_to_master->sink;
1450
1451         if (pa_sink_flat_volume_enabled(i->sink)) {
1452             /* Ok, so the origin sink uses volume sharing, and flat volume is
1453              * enabled. The volume will have to be updated as follows:
1454              *
1455              *     i->volume := i->sink->real_volume
1456              *         (handled later by pa_sink_set_volume)
1457              *     i->reference_ratio := i->volume / i->sink->reference_volume
1458              *         (handled later by pa_sink_set_volume)
1459              *     i->real_ratio stays unchanged
1460              *         (streams whose origin sink uses volume sharing should
1461              *          always have real_ratio of 0 dB)
1462              *     i->soft_volume stays unchanged
1463              *         (streams whose origin sink uses volume sharing should
1464              *          always have volume_factor as soft_volume, so no change
1465              *          should be needed) */
1466
1467             pa_assert(pa_cvolume_is_norm(&i->real_ratio));
1468             pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor));
1469
1470             /* Notifications will be sent by pa_sink_set_volume(). */
1471
1472         } else {
1473             /* Ok, so the origin sink uses volume sharing, and flat volume is
1474              * disabled. The volume will have to be updated as follows:
1475              *
1476              *     i->volume := 0 dB
1477              *     i->reference_ratio := 0 dB
1478              *     i->real_ratio stays unchanged
1479              *         (streams whose origin sink uses volume sharing should
1480              *          always have real_ratio of 0 dB)
1481              *     i->soft_volume stays unchanged
1482              *         (streams whose origin sink uses volume sharing should
1483              *          always have volume_factor as soft_volume, so no change
1484              *          should be needed) */
1485
1486             old_volume = i->volume;
1487             pa_cvolume_reset(&i->volume, i->volume.channels);
1488             pa_cvolume_reset(&i->reference_ratio, i->reference_ratio.channels);
1489             pa_assert(pa_cvolume_is_norm(&i->real_ratio));
1490             pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor));
1491
1492             /* Notify others about the changed sink input volume. */
1493             if (!pa_cvolume_equal(&i->volume, &old_volume)) {
1494                 if (i->volume_changed)
1495                     i->volume_changed(i);
1496
1497                 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1498             }
1499         }
1500
1501         /* Additionally, the origin sink volume needs updating:
1502          *
1503          *     i->origin_sink->reference_volume := root_sink->reference_volume
1504          *     i->origin_sink->real_volume := root_sink->real_volume
1505          *     i->origin_sink->soft_volume stays unchanged
1506          *         (sinks that use volume sharing should always have
1507          *          soft_volume of 0 dB) */
1508
1509         old_volume = i->origin_sink->reference_volume;
1510
1511         i->origin_sink->reference_volume = root_sink->reference_volume;
1512         pa_cvolume_remap(&i->origin_sink->reference_volume, &root_sink->channel_map, &i->origin_sink->channel_map);
1513
1514         i->origin_sink->real_volume = root_sink->real_volume;
1515         pa_cvolume_remap(&i->origin_sink->real_volume, &root_sink->channel_map, &i->origin_sink->channel_map);
1516
1517         pa_assert(pa_cvolume_is_norm(&i->origin_sink->soft_volume));
1518
1519         /* Notify others about the changed sink volume. If you wonder whether
1520          * i->origin_sink->set_volume() should be called somewhere, that's not
1521          * the case, because sinks that use volume sharing shouldn't have any
1522          * internal volume that set_volume() would update. If you wonder
1523          * whether the thread_info variables should be synced, yes, they
1524          * should, and it's done by the PA_SINK_MESSAGE_FINISH_MOVE message
1525          * handler. */
1526         if (!pa_cvolume_equal(&i->origin_sink->reference_volume, &old_volume))
1527             pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, i->origin_sink->index);
1528
1529         /* Recursively update origin sink inputs. */
1530         PA_IDXSET_FOREACH(origin_sink_input, i->origin_sink->inputs, idx)
1531             update_volume_due_to_moving(origin_sink_input, dest);
1532
1533     } else {
1534         old_volume = i->volume;
1535
1536         if (pa_sink_flat_volume_enabled(i->sink)) {
1537             /* Ok, so this is a regular stream, and flat volume is enabled. The
1538              * volume will have to be updated as follows:
1539              *
1540              *     i->volume := i->reference_ratio * i->sink->reference_volume
1541              *     i->reference_ratio stays unchanged
1542              *     i->real_ratio := i->volume / i->sink->real_volume
1543              *         (handled later by pa_sink_set_volume)
1544              *     i->soft_volume := i->real_ratio * i->volume_factor
1545              *         (handled later by pa_sink_set_volume) */
1546
1547             i->volume = i->sink->reference_volume;
1548             pa_cvolume_remap(&i->volume, &i->sink->channel_map, &i->channel_map);
1549             pa_sw_cvolume_multiply(&i->volume, &i->volume, &i->reference_ratio);
1550
1551         } else {
1552             /* Ok, so this is a regular stream, and flat volume is disabled.
1553              * The volume will have to be updated as follows:
1554              *
1555              *     i->volume := i->reference_ratio
1556              *     i->reference_ratio stays unchanged
1557              *     i->real_ratio := i->reference_ratio
1558              *     i->soft_volume := i->real_ratio * i->volume_factor */
1559
1560             i->volume = i->reference_ratio;
1561             i->real_ratio = i->reference_ratio;
1562             pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1563         }
1564
1565         /* Notify others about the changed sink input volume. */
1566         if (!pa_cvolume_equal(&i->volume, &old_volume)) {
1567             /* XXX: In case i->sink has flat volume enabled, then real_ratio
1568              * and soft_volume are not updated yet. Let's hope that the
1569              * callback implementation doesn't care about those variables... */
1570             if (i->volume_changed)
1571                 i->volume_changed(i);
1572
1573             pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1574         }
1575     }
1576
1577     /* If i->sink == dest, then recursion has finished, and we can finally call
1578      * pa_sink_set_volume(), which will do the rest of the updates. */
1579     if ((i->sink == dest) && pa_sink_flat_volume_enabled(i->sink))
1580         pa_sink_set_volume(i->sink, NULL, FALSE, i->save_volume);
1581 }
1582
1583 /* Called from main context */
1584 int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
1585     pa_resampler *new_resampler;
1586
1587     pa_sink_input_assert_ref(i);
1588     pa_assert_ctl_context();
1589     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1590     pa_assert(!i->sink);
1591     pa_sink_assert_ref(dest);
1592
1593     if (!pa_sink_input_may_move_to(i, dest))
1594         return -PA_ERR_NOTSUPPORTED;
1595
1596     if (pa_sink_input_is_passthrough(i) && !pa_sink_check_format(dest, i->format)) {
1597         pa_proplist *p = pa_proplist_new();
1598         pa_log_debug("New sink doesn't support stream format, sending format-changed and killing");
1599         /* Tell the client what device we want to be on if it is going to
1600          * reconnect */
1601         pa_proplist_sets(p, "device", dest->name);
1602         pa_sink_input_send_event(i, PA_STREAM_EVENT_FORMAT_LOST, p);
1603         return -PA_ERR_NOTSUPPORTED;
1604     }
1605
1606     if (i->thread_info.resampler &&
1607         pa_sample_spec_equal(pa_resampler_output_sample_spec(i->thread_info.resampler), &dest->sample_spec) &&
1608         pa_channel_map_equal(pa_resampler_output_channel_map(i->thread_info.resampler), &dest->channel_map))
1609
1610         /* Try to reuse the old resampler if possible */
1611         new_resampler = i->thread_info.resampler;
1612
1613     else if ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ||
1614              !pa_sample_spec_equal(&i->sample_spec, &dest->sample_spec) ||
1615              !pa_channel_map_equal(&i->channel_map, &dest->channel_map)) {
1616
1617         /* Okey, we need a new resampler for the new sink */
1618
1619         if (!(new_resampler = pa_resampler_new(
1620                       i->core->mempool,
1621                       &i->sample_spec, &i->channel_map,
1622                       &dest->sample_spec, &dest->channel_map,
1623                       i->requested_resample_method,
1624                       ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
1625                       ((i->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
1626                       (i->core->disable_remixing || (i->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0)))) {
1627             pa_log_warn("Unsupported resampling operation.");
1628             return -PA_ERR_NOTSUPPORTED;
1629         }
1630     } else
1631         new_resampler = NULL;
1632
1633     if (i->moving)
1634         i->moving(i, dest);
1635
1636     i->sink = dest;
1637     i->save_sink = save;
1638     pa_idxset_put(dest->inputs, pa_sink_input_ref(i), NULL);
1639
1640     pa_cvolume_remap(&i->volume_factor_sink, &i->channel_map, &i->sink->channel_map);
1641
1642     if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
1643         i->sink->n_corked++;
1644
1645     /* Replace resampler and render queue */
1646     if (new_resampler != i->thread_info.resampler) {
1647
1648         if (i->thread_info.resampler)
1649             pa_resampler_free(i->thread_info.resampler);
1650         i->thread_info.resampler = new_resampler;
1651
1652         pa_memblockq_free(i->thread_info.render_memblockq);
1653
1654         i->thread_info.render_memblockq = pa_memblockq_new(
1655                 0,
1656                 MEMBLOCKQ_MAXLENGTH,
1657                 0,
1658                 pa_frame_size(&i->sink->sample_spec),
1659                 0,
1660                 1,
1661                 0,
1662                 &i->sink->silence);
1663     }
1664     pa_sink_update_status(dest);
1665
1666     update_volume_due_to_moving(i, dest);
1667
1668     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_FINISH_MOVE, i, 0, NULL) == 0);
1669
1670     /* If we're entering passthrough mode, disable the monitor */
1671     if (pa_sink_input_is_passthrough(i) && i->sink->monitor_source)
1672         pa_source_suspend(i->sink->monitor_source, TRUE, PA_SUSPEND_PASSTHROUGH);
1673
1674     pa_log_debug("Successfully moved sink input %i to %s.", i->index, dest->name);
1675
1676     /* Notify everyone */
1677     pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], i);
1678
1679     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1680
1681     return 0;
1682 }
1683
1684 /* Called from main context */
1685 void pa_sink_input_fail_move(pa_sink_input *i) {
1686
1687     pa_sink_input_assert_ref(i);
1688     pa_assert_ctl_context();
1689     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1690     pa_assert(!i->sink);
1691
1692     /* Check if someone wants this sink input? */
1693     if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FAIL], i) == PA_HOOK_STOP)
1694         return;
1695
1696     if (i->moving)
1697         i->moving(i, NULL);
1698
1699     pa_sink_input_kill(i);
1700 }
1701
1702 /* Called from main context */
1703 int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
1704     int r;
1705
1706     pa_sink_input_assert_ref(i);
1707     pa_assert_ctl_context();
1708     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1709     pa_assert(i->sink);
1710     pa_sink_assert_ref(dest);
1711
1712     if (dest == i->sink)
1713         return 0;
1714
1715     if (!pa_sink_input_may_move_to(i, dest))
1716         return -PA_ERR_NOTSUPPORTED;
1717
1718     pa_sink_input_ref(i);
1719
1720     if ((r = pa_sink_input_start_move(i)) < 0) {
1721         pa_sink_input_unref(i);
1722         return r;
1723     }
1724
1725     if ((r = pa_sink_input_finish_move(i, dest, save)) < 0) {
1726         pa_sink_input_fail_move(i);
1727         pa_sink_input_unref(i);
1728         return r;
1729     }
1730
1731     pa_sink_input_unref(i);
1732
1733     return 0;
1734 }
1735
1736 /* Called from IO thread context */
1737 void pa_sink_input_set_state_within_thread(pa_sink_input *i, pa_sink_input_state_t state) {
1738     pa_bool_t corking, uncorking;
1739
1740     pa_sink_input_assert_ref(i);
1741     pa_sink_input_assert_io_context(i);
1742
1743     if (state == i->thread_info.state)
1744         return;
1745
1746     if ((state == PA_SINK_INPUT_DRAINED || state == PA_SINK_INPUT_RUNNING) &&
1747         !(i->thread_info.state == PA_SINK_INPUT_DRAINED || i->thread_info.state != PA_SINK_INPUT_RUNNING))
1748         pa_atomic_store(&i->thread_info.drained, 1);
1749
1750     corking = state == PA_SINK_INPUT_CORKED && i->thread_info.state == PA_SINK_INPUT_RUNNING;
1751     uncorking = i->thread_info.state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING;
1752
1753     if (i->state_change)
1754         i->state_change(i, state);
1755
1756     i->thread_info.state = state;
1757
1758     if (corking) {
1759
1760         pa_log_debug("Requesting rewind due to corking");
1761
1762         /* This will tell the implementing sink input driver to rewind
1763          * so that the unplayed already mixed data is not lost */
1764         pa_sink_input_request_rewind(i, 0, TRUE, TRUE, FALSE);
1765
1766     } else if (uncorking) {
1767
1768         i->thread_info.underrun_for = (uint64_t) -1;
1769         i->thread_info.playing_for = 0;
1770
1771         pa_log_debug("Requesting rewind due to uncorking");
1772
1773         /* OK, we're being uncorked. Make sure we're not rewound when
1774          * the hw buffer is remixed and request a remix. */
1775         pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE);
1776     }
1777 }
1778
1779 /* Called from thread context, except when it is not. */
1780 int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
1781     pa_sink_input *i = PA_SINK_INPUT(o);
1782     pa_sink_input_assert_ref(i);
1783
1784     switch (code) {
1785
1786         case PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME:
1787             if (!pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume)) {
1788                 i->thread_info.soft_volume = i->soft_volume;
1789                 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
1790             }
1791             return 0;
1792
1793         case PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE:
1794             if (i->thread_info.muted != i->muted) {
1795                 i->thread_info.muted = i->muted;
1796                 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
1797             }
1798             return 0;
1799
1800         case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
1801             pa_usec_t *r = userdata;
1802
1803             r[0] += pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sample_spec);
1804             r[1] += pa_sink_get_latency_within_thread(i->sink);
1805
1806             return 0;
1807         }
1808
1809         case PA_SINK_INPUT_MESSAGE_SET_RATE:
1810
1811             i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
1812             pa_resampler_set_input_rate(i->thread_info.resampler, PA_PTR_TO_UINT(userdata));
1813
1814             return 0;
1815
1816         case PA_SINK_INPUT_MESSAGE_SET_STATE: {
1817             pa_sink_input *ssync;
1818
1819             pa_sink_input_set_state_within_thread(i, PA_PTR_TO_UINT(userdata));
1820
1821             for (ssync = i->thread_info.sync_prev; ssync; ssync = ssync->thread_info.sync_prev)
1822                 pa_sink_input_set_state_within_thread(ssync, PA_PTR_TO_UINT(userdata));
1823
1824             for (ssync = i->thread_info.sync_next; ssync; ssync = ssync->thread_info.sync_next)
1825                 pa_sink_input_set_state_within_thread(ssync, PA_PTR_TO_UINT(userdata));
1826
1827             return 0;
1828         }
1829
1830         case PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY: {
1831             pa_usec_t *usec = userdata;
1832
1833             *usec = pa_sink_input_set_requested_latency_within_thread(i, *usec);
1834             return 0;
1835         }
1836
1837         case PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY: {
1838             pa_usec_t *r = userdata;
1839
1840             *r = i->thread_info.requested_sink_latency;
1841             return 0;
1842         }
1843     }
1844
1845     return -PA_ERR_NOTIMPLEMENTED;
1846 }
1847
1848 /* Called from main thread */
1849 pa_sink_input_state_t pa_sink_input_get_state(pa_sink_input *i) {
1850     pa_sink_input_assert_ref(i);
1851     pa_assert_ctl_context();
1852
1853     if (i->state == PA_SINK_INPUT_RUNNING || i->state == PA_SINK_INPUT_DRAINED)
1854         return pa_atomic_load(&i->thread_info.drained) ? PA_SINK_INPUT_DRAINED : PA_SINK_INPUT_RUNNING;
1855
1856     return i->state;
1857 }
1858
1859 /* Called from IO context */
1860 pa_bool_t pa_sink_input_safe_to_remove(pa_sink_input *i) {
1861     pa_sink_input_assert_ref(i);
1862     pa_sink_input_assert_io_context(i);
1863
1864     if (PA_SINK_INPUT_IS_LINKED(i->thread_info.state))
1865         return pa_memblockq_is_empty(i->thread_info.render_memblockq);
1866
1867     return TRUE;
1868 }
1869
1870 /* Called from IO context */
1871 void pa_sink_input_request_rewind(
1872         pa_sink_input *i,
1873         size_t nbytes  /* in our sample spec */,
1874         pa_bool_t rewrite,
1875         pa_bool_t flush,
1876         pa_bool_t dont_rewind_render) {
1877
1878     size_t lbq;
1879
1880     /* If 'rewrite' is TRUE the sink is rewound as far as requested
1881      * and possible and the exact value of this is passed back the
1882      * implementor via process_rewind(). If 'flush' is also TRUE all
1883      * already rendered data is also dropped.
1884      *
1885      * If 'rewrite' is FALSE the sink is rewound as far as requested
1886      * and possible and the already rendered data is dropped so that
1887      * in the next iteration we read new data from the
1888      * implementor. This implies 'flush' is TRUE.  If
1889      * dont_rewind_render is TRUE then the render memblockq is not
1890      * rewound. */
1891
1892     /* nbytes = 0 means maximum rewind request */
1893
1894     pa_sink_input_assert_ref(i);
1895     pa_sink_input_assert_io_context(i);
1896     pa_assert(rewrite || flush);
1897     pa_assert(!dont_rewind_render || !rewrite);
1898
1899     /* We don't take rewind requests while we are corked */
1900     if (i->thread_info.state == PA_SINK_INPUT_CORKED)
1901         return;
1902
1903     nbytes = PA_MAX(i->thread_info.rewrite_nbytes, nbytes);
1904
1905     /* pa_log_debug("request rewrite %zu", nbytes); */
1906
1907     /* Calculate how much we can rewind locally without having to
1908      * touch the sink */
1909     if (rewrite)
1910         lbq = pa_memblockq_get_length(i->thread_info.render_memblockq);
1911     else
1912         lbq = 0;
1913
1914     /* Check if rewinding for the maximum is requested, and if so, fix up */
1915     if (nbytes <= 0) {
1916
1917         /* Calculate maximum number of bytes that could be rewound in theory */
1918         nbytes = i->sink->thread_info.max_rewind + lbq;
1919
1920         /* Transform from sink domain */
1921         if (i->thread_info.resampler)
1922             nbytes = pa_resampler_request(i->thread_info.resampler, nbytes);
1923     }
1924
1925     /* Remember how much we actually want to rewrite */
1926     if (i->thread_info.rewrite_nbytes != (size_t) -1) {
1927         if (rewrite) {
1928             /* Make sure to not overwrite over underruns */
1929             if (nbytes > i->thread_info.playing_for)
1930                 nbytes = (size_t) i->thread_info.playing_for;
1931
1932             i->thread_info.rewrite_nbytes = nbytes;
1933         } else
1934             i->thread_info.rewrite_nbytes = (size_t) -1;
1935     }
1936
1937     i->thread_info.rewrite_flush =
1938         i->thread_info.rewrite_flush ||
1939         (flush && i->thread_info.rewrite_nbytes != 0);
1940
1941     i->thread_info.dont_rewind_render =
1942         i->thread_info.dont_rewind_render ||
1943         dont_rewind_render;
1944
1945     if (nbytes != (size_t) -1) {
1946
1947         /* Transform to sink domain */
1948         if (i->thread_info.resampler)
1949             nbytes = pa_resampler_result(i->thread_info.resampler, nbytes);
1950
1951         if (nbytes > lbq)
1952             pa_sink_request_rewind(i->sink, nbytes - lbq);
1953         else
1954             /* This call will make sure process_rewind() is called later */
1955             pa_sink_request_rewind(i->sink, 0);
1956     }
1957 }
1958
1959 /* Called from main context */
1960 pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, pa_memchunk *ret) {
1961     pa_sink_input_assert_ref(i);
1962     pa_assert_ctl_context();
1963     pa_assert(ret);
1964
1965     /* FIXME: Shouldn't access resampler object from main context! */
1966
1967     pa_silence_memchunk_get(
1968                 &i->core->silence_cache,
1969                 i->core->mempool,
1970                 ret,
1971                 &i->sample_spec,
1972                 i->thread_info.resampler ? pa_resampler_max_block_size(i->thread_info.resampler) : 0);
1973
1974     return ret;
1975 }
1976
1977 /* Called from main context */
1978 void pa_sink_input_send_event(pa_sink_input *i, const char *event, pa_proplist *data) {
1979     pa_proplist *pl = NULL;
1980     pa_sink_input_send_event_hook_data hook_data;
1981
1982     pa_sink_input_assert_ref(i);
1983     pa_assert_ctl_context();
1984     pa_assert(event);
1985
1986     if (!i->send_event)
1987         return;
1988
1989     if (!data)
1990         data = pl = pa_proplist_new();
1991
1992     hook_data.sink_input = i;
1993     hook_data.data = data;
1994     hook_data.event = event;
1995
1996     if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT], &hook_data) < 0)
1997         goto finish;
1998
1999     i->send_event(i, event, data);
2000
2001 finish:
2002     if (pl)
2003         pa_proplist_free(pl);
2004 }