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