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