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