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