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