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