2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
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.
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.
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
30 #include <pulse/utf8.h>
31 #include <pulse/xmalloc.h>
32 #include <pulse/util.h>
33 #include <pulse/internal.h>
35 #include <pulsecore/core-format.h>
36 #include <pulsecore/mix.h>
37 #include <pulsecore/stream-util.h>
38 #include <pulsecore/core-subscribe.h>
39 #include <pulsecore/log.h>
40 #include <pulsecore/play-memblockq.h>
41 #include <pulsecore/namereg.h>
42 #include <pulsecore/core-util.h>
44 #include "sink-input.h"
46 /* #define SINK_INPUT_DEBUG */
48 #define MEMBLOCKQ_MAXLENGTH (32*1024*1024)
49 #define CONVERT_BUFFER_LENGTH (PA_PAGE_SIZE)
51 PA_DEFINE_PUBLIC_CLASS(pa_sink_input, pa_msgobject);
53 struct volume_factor_entry {
58 static struct volume_factor_entry *volume_factor_entry_new(const char *key, const pa_cvolume *volume) {
59 struct volume_factor_entry *entry;
64 entry = pa_xnew(struct volume_factor_entry, 1);
65 entry->key = pa_xstrdup(key);
67 entry->volume = *volume;
72 static void volume_factor_entry_free(struct volume_factor_entry *volume_entry) {
73 pa_assert(volume_entry);
75 pa_xfree(volume_entry->key);
76 pa_xfree(volume_entry);
79 static void volume_factor_from_hashmap(pa_cvolume *v, pa_hashmap *items, uint8_t channels) {
80 struct volume_factor_entry *entry;
83 pa_cvolume_reset(v, channels);
84 PA_HASHMAP_FOREACH(entry, items, state)
85 pa_sw_cvolume_multiply(v, v, &entry->volume);
88 static void sink_input_free(pa_object *o);
89 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v);
91 static int check_passthrough_connection(bool passthrough, pa_sink *dest) {
92 if (pa_sink_is_passthrough(dest)) {
93 pa_log_warn("Sink is already connected to PASSTHROUGH input");
97 /* If current input(s) exist, check new input is not PASSTHROUGH */
98 if (pa_idxset_size(dest->inputs) > 0 && passthrough) {
99 pa_log_warn("Sink is already connected, cannot accept new PASSTHROUGH INPUT");
106 pa_sink_input_new_data* pa_sink_input_new_data_init(pa_sink_input_new_data *data) {
110 data->resample_method = PA_RESAMPLER_INVALID;
111 data->proplist = pa_proplist_new();
112 data->volume_writable = true;
114 data->volume_factor_items = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL,
115 (pa_free_cb_t) volume_factor_entry_free);
116 data->volume_factor_sink_items = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL,
117 (pa_free_cb_t) volume_factor_entry_free);
122 void pa_sink_input_new_data_set_sample_spec(pa_sink_input_new_data *data, const pa_sample_spec *spec) {
125 if ((data->sample_spec_is_set = !!spec))
126 data->sample_spec = *spec;
129 void pa_sink_input_new_data_set_channel_map(pa_sink_input_new_data *data, const pa_channel_map *map) {
132 if ((data->channel_map_is_set = !!map))
133 data->channel_map = *map;
136 bool pa_sink_input_new_data_is_passthrough(pa_sink_input_new_data *data) {
139 if (PA_LIKELY(data->format) && PA_UNLIKELY(!pa_format_info_is_pcm(data->format)))
142 if (PA_UNLIKELY(data->flags & PA_SINK_INPUT_PASSTHROUGH))
148 void pa_sink_input_new_data_set_volume(pa_sink_input_new_data *data, const pa_cvolume *volume) {
150 pa_assert(data->volume_writable);
152 if ((data->volume_is_set = !!volume))
153 data->volume = *volume;
156 void pa_sink_input_new_data_add_volume_factor(pa_sink_input_new_data *data, const char *key, const pa_cvolume *volume_factor) {
157 struct volume_factor_entry *v;
161 pa_assert(volume_factor);
163 v = volume_factor_entry_new(key, volume_factor);
164 pa_assert_se(pa_hashmap_put(data->volume_factor_items, v->key, v) >= 0);
167 void pa_sink_input_new_data_add_volume_factor_sink(pa_sink_input_new_data *data, const char *key, const pa_cvolume *volume_factor) {
168 struct volume_factor_entry *v;
172 pa_assert(volume_factor);
174 v = volume_factor_entry_new(key, volume_factor);
175 pa_assert_se(pa_hashmap_put(data->volume_factor_sink_items, v->key, v) >= 0);
178 void pa_sink_input_new_data_set_muted(pa_sink_input_new_data *data, bool mute) {
181 data->muted_is_set = true;
182 data->muted = !!mute;
185 bool pa_sink_input_new_data_set_sink(pa_sink_input_new_data *data, pa_sink *s, bool save) {
187 pa_idxset *formats = NULL;
192 if (!data->req_formats) {
193 /* We're not working with the extended API */
195 data->save_sink = save;
197 /* Extended API: let's see if this sink supports the formats the client can provide */
198 formats = pa_sink_check_formats(s, data->req_formats);
200 if (formats && !pa_idxset_isempty(formats)) {
201 /* Sink supports at least one of the requested formats */
203 data->save_sink = save;
204 if (data->nego_formats)
205 pa_idxset_free(data->nego_formats, (pa_free_cb_t) pa_format_info_free);
206 data->nego_formats = formats;
208 /* Sink doesn't support any of the formats requested by the client */
210 pa_idxset_free(formats, (pa_free_cb_t) pa_format_info_free);
218 bool pa_sink_input_new_data_set_formats(pa_sink_input_new_data *data, pa_idxset *formats) {
222 if (data->req_formats)
223 pa_idxset_free(data->req_formats, (pa_free_cb_t) pa_format_info_free);
225 data->req_formats = formats;
228 /* Trigger format negotiation */
229 return pa_sink_input_new_data_set_sink(data, data->sink, data->save_sink);
235 void pa_sink_input_new_data_done(pa_sink_input_new_data *data) {
238 if (data->req_formats)
239 pa_idxset_free(data->req_formats, (pa_free_cb_t) pa_format_info_free);
241 if (data->nego_formats)
242 pa_idxset_free(data->nego_formats, (pa_free_cb_t) pa_format_info_free);
245 pa_format_info_free(data->format);
247 if (data->volume_factor_items)
248 pa_hashmap_free(data->volume_factor_items);
250 if (data->volume_factor_sink_items)
251 pa_hashmap_free(data->volume_factor_sink_items);
253 pa_proplist_free(data->proplist);
256 /* Called from main context */
257 static void reset_callbacks(pa_sink_input *i) {
261 i->process_underrun = NULL;
262 i->process_rewind = NULL;
263 i->update_max_rewind = NULL;
264 i->update_max_request = NULL;
265 i->update_sink_requested_latency = NULL;
266 i->update_sink_latency_range = NULL;
267 i->update_sink_fixed_latency = NULL;
271 i->suspend_within_thread = NULL;
274 i->get_latency = NULL;
275 i->state_change = NULL;
276 i->may_move_to = NULL;
277 i->send_event = NULL;
278 i->volume_changed = NULL;
279 i->mute_changed = NULL;
282 /* Called from main context */
283 int pa_sink_input_new(
286 pa_sink_input_new_data *data) {
289 pa_resampler *resampler = NULL;
290 char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX], fmt[PA_FORMAT_INFO_SNPRINT_MAX];
291 pa_channel_map volume_map;
294 char *memblockq_name;
299 pa_assert_ctl_context();
302 pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->client->proplist);
304 if (data->origin_sink && (data->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER))
305 data->volume_writable = false;
307 if (!data->req_formats) {
308 /* From this point on, we want to work only with formats, and get back
309 * to using the sample spec and channel map after all decisions w.r.t.
310 * routing are complete. */
314 f = pa_format_info_from_sample_spec2(&data->sample_spec, data->channel_map_is_set ? &data->channel_map : NULL,
315 !(data->flags & PA_SINK_INPUT_FIX_FORMAT),
316 !(data->flags & PA_SINK_INPUT_FIX_RATE),
317 !(data->flags & PA_SINK_INPUT_FIX_CHANNELS));
319 return -PA_ERR_INVALID;
321 formats = pa_idxset_new(NULL, NULL);
322 pa_idxset_put(formats, f, NULL);
323 pa_sink_input_new_data_set_formats(data, formats);
326 if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], data)) < 0)
329 pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
332 pa_sink *sink = pa_namereg_get(core, NULL, PA_NAMEREG_SINK);
333 pa_return_val_if_fail(sink, -PA_ERR_NOENTITY);
334 pa_sink_input_new_data_set_sink(data, sink, false);
337 /* If something didn't pick a format for us, pick the top-most format since
338 * we assume this is sorted in priority order */
339 if (!data->format && data->nego_formats && !pa_idxset_isempty(data->nego_formats))
340 data->format = pa_format_info_copy(pa_idxset_first(data->nego_formats, NULL));
342 if (PA_LIKELY(data->format)) {
343 pa_log_debug("Negotiated format: %s", pa_format_info_snprint(fmt, sizeof(fmt), data->format));
345 pa_format_info *format;
348 pa_log_info("Sink does not support any requested format:");
349 PA_IDXSET_FOREACH(format, data->req_formats, idx)
350 pa_log_info(" -- %s", pa_format_info_snprint(fmt, sizeof(fmt), format));
352 return -PA_ERR_NOTSUPPORTED;
355 pa_return_val_if_fail(PA_SINK_IS_LINKED(pa_sink_get_state(data->sink)), -PA_ERR_BADSTATE);
356 pa_return_val_if_fail(!data->sync_base || (data->sync_base->sink == data->sink
357 && pa_sink_input_get_state(data->sync_base) == PA_SINK_INPUT_CORKED),
360 /* Routing is done. We have a sink and a format. */
362 if (data->volume_is_set && pa_format_info_is_pcm(data->format)) {
363 /* If volume is set, we need to save the original data->channel_map,
364 * so that we can remap the volume from the original channel map to the
365 * final channel map of the stream in case data->channel_map gets
366 * modified in pa_format_info_to_sample_spec2(). */
367 r = pa_stream_get_volume_channel_map(&data->volume, data->channel_map_is_set ? &data->channel_map : NULL, data->format, &volume_map);
372 /* Now populate the sample spec and channel map according to the final
373 * format that we've negotiated */
374 r = pa_format_info_to_sample_spec2(data->format, &data->sample_spec, &data->channel_map, &data->sink->sample_spec,
375 &data->sink->channel_map);
379 r = check_passthrough_connection(pa_sink_input_new_data_is_passthrough(data), data->sink);
383 /* Don't restore (or save) stream volume for passthrough streams and
384 * prevent attenuation/gain */
385 if (pa_sink_input_new_data_is_passthrough(data)) {
386 data->volume_is_set = true;
387 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
388 data->volume_is_absolute = true;
389 data->save_volume = false;
392 if (!data->volume_is_set) {
393 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
394 data->volume_is_absolute = false;
395 data->save_volume = false;
398 if (!data->volume_writable)
399 data->save_volume = false;
401 if (data->volume_is_set)
402 /* The original volume channel map may be different than the final
403 * stream channel map, so remapping may be needed. */
404 pa_cvolume_remap(&data->volume, &volume_map, &data->channel_map);
406 if (!data->muted_is_set)
409 if (!(data->flags & PA_SINK_INPUT_VARIABLE_RATE) &&
410 !pa_sample_spec_equal(&data->sample_spec, &data->sink->sample_spec)) {
411 /* try to change sink rate. This is done before the FIXATE hook since
412 module-suspend-on-idle can resume a sink */
414 pa_log_info("Trying to change sample rate");
415 if (pa_sink_update_rate(data->sink, data->sample_spec.rate, pa_sink_input_new_data_is_passthrough(data)) >= 0)
416 pa_log_info("Rate changed to %u Hz", data->sink->sample_spec.rate);
419 if (pa_sink_input_new_data_is_passthrough(data) &&
420 !pa_sample_spec_equal(&data->sample_spec, &data->sink->sample_spec)) {
421 /* rate update failed, or other parts of sample spec didn't match */
423 pa_log_debug("Could not update sink sample spec to match passthrough stream");
424 return -PA_ERR_NOTSUPPORTED;
427 if (data->resample_method == PA_RESAMPLER_INVALID)
428 data->resample_method = core->resample_method;
430 pa_return_val_if_fail(data->resample_method < PA_RESAMPLER_MAX, -PA_ERR_INVALID);
432 if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_INPUT_FIXATE], data)) < 0)
435 if ((data->flags & PA_SINK_INPUT_NO_CREATE_ON_SUSPEND) &&
436 pa_sink_get_state(data->sink) == PA_SINK_SUSPENDED) {
437 pa_log_warn("Failed to create sink input: sink is suspended.");
438 return -PA_ERR_BADSTATE;
441 if (pa_idxset_size(data->sink->inputs) >= PA_MAX_INPUTS_PER_SINK) {
442 pa_log_warn("Failed to create sink input: too many inputs per sink.");
443 return -PA_ERR_TOOLARGE;
446 if ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ||
447 !pa_sample_spec_equal(&data->sample_spec, &data->sink->sample_spec) ||
448 !pa_channel_map_equal(&data->channel_map, &data->sink->channel_map)) {
450 /* Note: for passthrough content we need to adjust the output rate to that of the current sink-input */
451 if (!pa_sink_input_new_data_is_passthrough(data)) /* no resampler for passthrough content */
452 if (!(resampler = pa_resampler_new(
454 &data->sample_spec, &data->channel_map,
455 &data->sink->sample_spec, &data->sink->channel_map,
456 data->resample_method,
457 ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
458 ((data->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
459 (core->disable_remixing || (data->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
460 (core->disable_lfe_remixing ? PA_RESAMPLER_NO_LFE : 0)))) {
461 pa_log_warn("Unsupported resampling operation.");
462 return -PA_ERR_NOTSUPPORTED;
466 i = pa_msgobject_new(pa_sink_input);
467 i->parent.parent.free = sink_input_free;
468 i->parent.process_msg = pa_sink_input_process_msg;
471 i->state = PA_SINK_INPUT_INIT;
472 i->flags = data->flags;
473 i->proplist = pa_proplist_copy(data->proplist);
474 i->driver = pa_xstrdup(pa_path_get_filename(data->driver));
475 i->module = data->module;
476 i->sink = data->sink;
477 i->origin_sink = data->origin_sink;
478 i->client = data->client;
480 i->requested_resample_method = data->resample_method;
481 i->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID;
482 i->sample_spec = data->sample_spec;
483 i->channel_map = data->channel_map;
484 i->format = pa_format_info_copy(data->format);
486 if (!data->volume_is_absolute && pa_sink_flat_volume_enabled(i->sink)) {
489 /* When the 'absolute' bool is not set then we'll treat the volume
490 * as relative to the sink volume even in flat volume mode */
491 remapped = data->sink->reference_volume;
492 pa_cvolume_remap(&remapped, &data->sink->channel_map, &data->channel_map);
493 pa_sw_cvolume_multiply(&i->volume, &data->volume, &remapped);
495 i->volume = data->volume;
497 i->volume_factor_items = data->volume_factor_items;
498 data->volume_factor_items = NULL;
499 volume_factor_from_hashmap(&i->volume_factor, i->volume_factor_items, i->sample_spec.channels);
501 i->volume_factor_sink_items = data->volume_factor_sink_items;
502 data->volume_factor_sink_items = NULL;
503 volume_factor_from_hashmap(&i->volume_factor_sink, i->volume_factor_sink_items, i->sink->sample_spec.channels);
505 i->real_ratio = i->reference_ratio = data->volume;
506 pa_cvolume_reset(&i->soft_volume, i->sample_spec.channels);
507 pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels);
508 i->volume_writable = data->volume_writable;
509 i->save_volume = data->save_volume;
510 i->save_sink = data->save_sink;
511 i->save_muted = data->save_muted;
513 i->muted = data->muted;
515 if (data->sync_base) {
516 i->sync_next = data->sync_base->sync_next;
517 i->sync_prev = data->sync_base;
519 if (data->sync_base->sync_next)
520 data->sync_base->sync_next->sync_prev = i;
521 data->sync_base->sync_next = i;
523 i->sync_next = i->sync_prev = NULL;
525 i->direct_outputs = pa_idxset_new(NULL, NULL);
530 if (data->flags & PA_SINK_INPUT_START_RAMP_MUTED)
531 pa_cvolume_ramp_int_init(&i->ramp, PA_VOLUME_MUTED, data->sink->sample_spec.channels);
533 pa_cvolume_ramp_int_init(&i->ramp, PA_VOLUME_NORM, data->sink->sample_spec.channels);
535 i->thread_info.state = i->state;
536 i->thread_info.attached = false;
537 pa_atomic_store(&i->thread_info.drained, 1);
538 i->thread_info.sample_spec = i->sample_spec;
539 i->thread_info.resampler = resampler;
540 i->thread_info.soft_volume = i->soft_volume;
541 i->thread_info.muted = i->muted;
542 i->thread_info.requested_sink_latency = (pa_usec_t) -1;
543 i->thread_info.rewrite_nbytes = 0;
544 i->thread_info.rewrite_flush = false;
545 i->thread_info.dont_rewind_render = false;
546 i->thread_info.underrun_for = (uint64_t) -1;
547 i->thread_info.underrun_for_sink = 0;
548 i->thread_info.playing_for = 0;
549 i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
551 i->thread_info.ramp = i->ramp;
553 pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0);
554 pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0);
557 pa_assert_se(pa_idxset_put(i->client->sink_inputs, i, NULL) >= 0);
559 memblockq_name = pa_sprintf_malloc("sink input render_memblockq [%u]", i->index);
560 i->thread_info.render_memblockq = pa_memblockq_new(
565 &i->sink->sample_spec,
570 pa_xfree(memblockq_name);
572 pt = pa_proplist_to_string_sep(i->proplist, "\n ");
573 pa_log_info("Created input %u \"%s\" on %s with sample spec %s and channel map %s\n %s",
575 pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)),
577 pa_sample_spec_snprint(st, sizeof(st), &i->sample_spec),
578 pa_channel_map_snprint(cm, sizeof(cm), &i->channel_map),
582 /* Don't forget to call pa_sink_input_put! */
588 /* Called from main context */
589 static void update_n_corked(pa_sink_input *i, pa_sink_input_state_t state) {
591 pa_assert_ctl_context();
596 if (i->state == PA_SINK_INPUT_CORKED && state != PA_SINK_INPUT_CORKED)
597 pa_assert_se(i->sink->n_corked -- >= 1);
598 else if (i->state != PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_CORKED)
602 /* Called from main context */
603 static void sink_input_set_state(pa_sink_input *i, pa_sink_input_state_t state) {
604 pa_sink_input *ssync;
606 pa_assert_ctl_context();
608 if (state == PA_SINK_INPUT_DRAINED)
609 state = PA_SINK_INPUT_RUNNING;
611 if (i->state == state)
614 if (i->state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING && pa_sink_used_by(i->sink) == 0 &&
615 !pa_sample_spec_equal(&i->sample_spec, &i->sink->sample_spec)) {
616 /* We were uncorked and the sink was not playing anything -- let's try
617 * to update the sample rate to avoid resampling */
618 pa_sink_update_rate(i->sink, i->sample_spec.rate, pa_sink_input_is_passthrough(i));
621 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);
623 update_n_corked(i, state);
626 for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev) {
627 update_n_corked(ssync, state);
628 ssync->state = state;
630 for (ssync = i->sync_next; ssync; ssync = ssync->sync_next) {
631 update_n_corked(ssync, state);
632 ssync->state = state;
635 if (state != PA_SINK_INPUT_UNLINKED) {
636 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], i);
638 for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev)
639 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync);
641 for (ssync = i->sync_next; ssync; ssync = ssync->sync_next)
642 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync);
644 if (PA_SINK_INPUT_IS_LINKED(state))
645 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
648 pa_sink_update_status(i->sink);
651 /* Called from main context */
652 void pa_sink_input_unlink(pa_sink_input *i) {
654 pa_source_output *o, *p = NULL;
657 pa_assert_ctl_context();
659 /* See pa_sink_unlink() for a couple of comments how this function
662 pa_sink_input_ref(i);
664 linked = PA_SINK_INPUT_IS_LINKED(i->state);
667 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], i);
670 i->sync_prev->sync_next = i->sync_next;
672 i->sync_next->sync_prev = i->sync_prev;
674 i->sync_prev = i->sync_next = NULL;
676 pa_idxset_remove_by_data(i->core->sink_inputs, i, NULL);
679 if (pa_idxset_remove_by_data(i->sink->inputs, i, NULL))
680 pa_sink_input_unref(i);
683 pa_idxset_remove_by_data(i->client->sink_inputs, i, NULL);
685 while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
687 pa_source_output_kill(o);
691 update_n_corked(i, PA_SINK_INPUT_UNLINKED);
692 i->state = PA_SINK_INPUT_UNLINKED;
694 if (linked && i->sink) {
695 if (pa_sink_input_is_passthrough(i))
696 pa_sink_leave_passthrough(i->sink);
698 /* We might need to update the sink's volume if we are in flat volume mode. */
699 if (pa_sink_flat_volume_enabled(i->sink))
700 pa_sink_set_volume(i->sink, NULL, false, false);
702 if (i->sink->asyncmsgq)
703 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_REMOVE_INPUT, i, 0, NULL) == 0);
709 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_REMOVE, i->index);
710 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST], i);
714 if (PA_SINK_IS_LINKED(pa_sink_get_state(i->sink)))
715 pa_sink_update_status(i->sink);
720 pa_core_maybe_vacuum(i->core);
722 pa_sink_input_unref(i);
725 /* Called from main context */
726 static void sink_input_free(pa_object *o) {
727 pa_sink_input* i = PA_SINK_INPUT(o);
730 pa_assert_ctl_context();
731 pa_assert(pa_sink_input_refcnt(i) == 0);
733 if (PA_SINK_INPUT_IS_LINKED(i->state))
734 pa_sink_input_unlink(i);
736 pa_log_info("Freeing input %u \"%s\"", i->index,
737 i->proplist ? pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)) : "");
739 /* Side note: this function must be able to destruct properly any
740 * kind of sink input in any state, even those which are
741 * "half-moved" or are connected to sinks that have no asyncmsgq
742 * and are hence half-destructed themselves! */
744 if (i->thread_info.render_memblockq)
745 pa_memblockq_free(i->thread_info.render_memblockq);
747 if (i->thread_info.resampler)
748 pa_resampler_free(i->thread_info.resampler);
751 pa_format_info_free(i->format);
754 pa_proplist_free(i->proplist);
756 if (i->direct_outputs)
757 pa_idxset_free(i->direct_outputs, NULL);
759 if (i->thread_info.direct_outputs)
760 pa_hashmap_free(i->thread_info.direct_outputs);
762 if (i->volume_factor_items)
763 pa_hashmap_free(i->volume_factor_items);
765 if (i->volume_factor_sink_items)
766 pa_hashmap_free(i->volume_factor_sink_items);
772 /* Called from main context */
773 void pa_sink_input_put(pa_sink_input *i) {
774 pa_sink_input_state_t state;
776 pa_sink_input_assert_ref(i);
777 pa_assert_ctl_context();
779 pa_assert(i->state == PA_SINK_INPUT_INIT);
781 /* The following fields must be initialized properly */
783 pa_assert(i->process_rewind);
786 state = i->flags & PA_SINK_INPUT_START_CORKED ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING;
788 update_n_corked(i, state);
791 /* We might need to update the sink's volume if we are in flat volume mode. */
792 if (pa_sink_flat_volume_enabled(i->sink))
793 pa_sink_set_volume(i->sink, NULL, false, i->save_volume);
795 if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
796 pa_assert(pa_cvolume_is_norm(&i->volume));
797 pa_assert(pa_cvolume_is_norm(&i->reference_ratio));
800 set_real_ratio(i, &i->volume);
803 if (pa_sink_input_is_passthrough(i))
804 pa_sink_enter_passthrough(i->sink);
806 i->thread_info.soft_volume = i->soft_volume;
807 i->thread_info.muted = i->muted;
809 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_ADD_INPUT, i, 0, NULL) == 0);
811 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, i->index);
812 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], i);
814 pa_sink_update_status(i->sink);
817 /* Called from main context */
818 void pa_sink_input_kill(pa_sink_input*i) {
819 pa_sink_input_assert_ref(i);
820 pa_assert_ctl_context();
821 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
826 /* Called from main context */
827 pa_usec_t pa_sink_input_get_latency(pa_sink_input *i, pa_usec_t *sink_latency) {
828 pa_usec_t r[2] = { 0, 0 };
830 pa_sink_input_assert_ref(i);
831 pa_assert_ctl_context();
832 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
834 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_LATENCY, r, 0, NULL) == 0);
837 r[0] += i->get_latency(i);
840 *sink_latency = r[1];
845 /* Called from thread context */
846 void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa_memchunk *chunk, pa_cvolume *volume) {
847 bool do_volume_adj_here, need_volume_factor_sink;
849 size_t block_size_max_sink, block_size_max_sink_input;
853 pa_sink_input_assert_ref(i);
854 pa_sink_input_assert_io_context(i);
855 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
856 pa_assert(pa_frame_aligned(slength, &i->sink->sample_spec));
860 #ifdef SINK_INPUT_DEBUG
861 pa_log_debug("peek");
864 block_size_max_sink_input = i->thread_info.resampler ?
865 pa_resampler_max_block_size(i->thread_info.resampler) :
866 pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sample_spec);
868 block_size_max_sink = pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sink->sample_spec);
870 /* Default buffer size */
872 slength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sink->sample_spec);
874 if (slength > block_size_max_sink)
875 slength = block_size_max_sink;
877 if (i->thread_info.resampler) {
878 ilength = pa_resampler_request(i->thread_info.resampler, slength);
881 ilength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sample_spec);
885 /* Length corresponding to slength (without limiting to
886 * block_size_max_sink_input). */
887 ilength_full = ilength;
889 if (ilength > block_size_max_sink_input)
890 ilength = block_size_max_sink_input;
892 /* If the channel maps of the sink and this stream differ, we need
893 * to adjust the volume *before* we resample. Otherwise we can do
894 * it after and leave it for the sink code */
896 do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map);
897 volume_is_norm = pa_cvolume_is_norm(&i->thread_info.soft_volume) && !i->thread_info.muted;
898 need_volume_factor_sink = !pa_cvolume_is_norm(&i->volume_factor_sink);
900 while (!pa_memblockq_is_readable(i->thread_info.render_memblockq)) {
903 /* There's nothing in our render queue. We need to fill it up
904 * with data from the implementor. */
906 if (i->thread_info.state == PA_SINK_INPUT_CORKED ||
907 i->pop(i, ilength, &tchunk) < 0) {
909 /* OK, we're corked or the implementor didn't give us any
910 * data, so let's just hand out silence */
911 pa_atomic_store(&i->thread_info.drained, 1);
913 pa_memblockq_seek(i->thread_info.render_memblockq, (int64_t) slength, PA_SEEK_RELATIVE, true);
914 i->thread_info.playing_for = 0;
915 if (i->thread_info.underrun_for != (uint64_t) -1) {
916 i->thread_info.underrun_for += ilength_full;
917 i->thread_info.underrun_for_sink += slength;
922 pa_atomic_store(&i->thread_info.drained, 0);
924 pa_assert(tchunk.length > 0);
925 pa_assert(tchunk.memblock);
927 i->thread_info.underrun_for = 0;
928 i->thread_info.underrun_for_sink = 0;
929 i->thread_info.playing_for += tchunk.length;
931 while (tchunk.length > 0) {
933 bool nvfs = need_volume_factor_sink;
938 pa_memblock_ref(wchunk.memblock);
940 if (wchunk.length > block_size_max_sink_input)
941 wchunk.length = block_size_max_sink_input;
943 /* It might be necessary to adjust the volume here */
944 if (do_volume_adj_here && !volume_is_norm) {
945 pa_memchunk_make_writable(&wchunk, 0);
947 if (i->thread_info.muted) {
948 pa_silence_memchunk(&wchunk, &i->thread_info.sample_spec);
951 } else if (!i->thread_info.resampler && nvfs) {
954 /* If we don't need a resampler we can merge the
955 * post and the pre volume adjustment into one */
957 pa_sw_cvolume_multiply(&v, &i->thread_info.soft_volume, &i->volume_factor_sink);
958 pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &v);
962 pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &i->thread_info.soft_volume);
965 if (!i->thread_info.resampler) {
968 pa_memchunk_make_writable(&wchunk, 0);
969 pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &i->volume_factor_sink);
972 /* check for possible volume ramp */
973 if (pa_cvolume_ramp_active(&i->thread_info.ramp)) {
974 pa_memchunk_make_writable(&wchunk, 0);
975 pa_volume_ramp_memchunk(&wchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
976 } else if ((tmp = pa_cvolume_ramp_target_active(&(i->thread_info.ramp)))) {
977 pa_memchunk_make_writable(&wchunk, 0);
978 pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
979 pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &target);
982 pa_memblockq_push_align(i->thread_info.render_memblockq, &wchunk);
985 pa_resampler_run(i->thread_info.resampler, &wchunk, &rchunk);
987 #ifdef SINK_INPUT_DEBUG
988 pa_log_debug("pushing %lu", (unsigned long) rchunk.length);
991 if (rchunk.memblock) {
994 pa_memchunk_make_writable(&rchunk, 0);
995 pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink);
998 /* check for possible volume ramp */
999 if (pa_cvolume_ramp_active(&(i->thread_info.ramp))) {
1000 pa_memchunk_make_writable(&rchunk, 0);
1001 pa_volume_ramp_memchunk(&rchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
1002 } else if (pa_cvolume_ramp_target_active(&(i->thread_info.ramp))) {
1003 pa_memchunk_make_writable(&rchunk, 0);
1004 pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
1005 pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &target);
1008 pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk);
1009 pa_memblock_unref(rchunk.memblock);
1013 pa_memblock_unref(wchunk.memblock);
1015 tchunk.index += wchunk.length;
1016 tchunk.length -= wchunk.length;
1019 pa_memblock_unref(tchunk.memblock);
1022 pa_assert_se(pa_memblockq_peek(i->thread_info.render_memblockq, chunk) >= 0);
1024 pa_assert(chunk->length > 0);
1025 pa_assert(chunk->memblock);
1027 #ifdef SINK_INPUT_DEBUG
1028 pa_log_debug("peeking %lu", (unsigned long) chunk->length);
1031 if (chunk->length > block_size_max_sink)
1032 chunk->length = block_size_max_sink;
1034 /* Let's see if we had to apply the volume adjustment ourselves,
1035 * or if this can be done by the sink for us */
1037 if (do_volume_adj_here)
1038 /* We had different channel maps, so we already did the adjustment */
1039 pa_cvolume_reset(volume, i->sink->sample_spec.channels);
1040 else if (i->thread_info.muted)
1041 /* We've both the same channel map, so let's have the sink do the adjustment for us*/
1042 pa_cvolume_mute(volume, i->sink->sample_spec.channels);
1044 *volume = i->thread_info.soft_volume;
1047 /* Called from thread context */
1048 void pa_sink_input_drop(pa_sink_input *i, size_t nbytes /* in sink sample spec */) {
1050 pa_sink_input_assert_ref(i);
1051 pa_sink_input_assert_io_context(i);
1052 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1053 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1054 pa_assert(nbytes > 0);
1056 #ifdef SINK_INPUT_DEBUG
1057 pa_log_debug("dropping %lu", (unsigned long) nbytes);
1060 pa_memblockq_drop(i->thread_info.render_memblockq, nbytes);
1063 /* Called from thread context */
1064 bool pa_sink_input_process_underrun(pa_sink_input *i) {
1065 pa_sink_input_assert_ref(i);
1066 pa_sink_input_assert_io_context(i);
1068 if (pa_memblockq_is_readable(i->thread_info.render_memblockq))
1071 if (i->process_underrun && i->process_underrun(i)) {
1072 /* All valid data has been played back, so we can empty this queue. */
1073 pa_memblockq_silence(i->thread_info.render_memblockq);
1079 /* Called from thread context */
1080 void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sample spec */) {
1082 bool called = false;
1084 pa_sink_input_assert_ref(i);
1085 pa_sink_input_assert_io_context(i);
1086 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1087 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1089 #ifdef SINK_INPUT_DEBUG
1090 pa_log_debug("rewind(%lu, %lu)", (unsigned long) nbytes, (unsigned long) i->thread_info.rewrite_nbytes);
1093 lbq = pa_memblockq_get_length(i->thread_info.render_memblockq);
1095 if (nbytes > 0 && !i->thread_info.dont_rewind_render) {
1096 pa_log_debug("Have to rewind %lu bytes on render memblockq.", (unsigned long) nbytes);
1097 pa_memblockq_rewind(i->thread_info.render_memblockq, nbytes);
1100 if (i->thread_info.rewrite_nbytes == (size_t) -1) {
1102 /* We were asked to drop all buffered data, and rerequest new
1103 * data from implementor the next time peek() is called */
1105 pa_memblockq_flush_write(i->thread_info.render_memblockq, true);
1107 } else if (i->thread_info.rewrite_nbytes > 0) {
1108 size_t max_rewrite, amount;
1110 /* Calculate how much make sense to rewrite at most */
1111 max_rewrite = nbytes + lbq;
1113 /* Transform into local domain */
1114 if (i->thread_info.resampler)
1115 max_rewrite = pa_resampler_request(i->thread_info.resampler, max_rewrite);
1117 /* Calculate how much of the rewinded data should actually be rewritten */
1118 amount = PA_MIN(i->thread_info.rewrite_nbytes, max_rewrite);
1121 pa_log_debug("Have to rewind %lu bytes on implementor.", (unsigned long) amount);
1123 /* Tell the implementor */
1124 if (i->process_rewind)
1125 i->process_rewind(i, amount);
1128 /* Convert back to to sink domain */
1129 if (i->thread_info.resampler)
1130 amount = pa_resampler_result(i->thread_info.resampler, amount);
1133 /* Ok, now update the write pointer */
1134 pa_memblockq_seek(i->thread_info.render_memblockq, - ((int64_t) amount), PA_SEEK_RELATIVE, true);
1136 if (i->thread_info.rewrite_flush)
1137 pa_memblockq_silence(i->thread_info.render_memblockq);
1139 /* And reset the resampler */
1140 if (i->thread_info.resampler)
1141 pa_resampler_reset(i->thread_info.resampler);
1146 if (i->process_rewind)
1147 i->process_rewind(i, 0);
1149 i->thread_info.rewrite_nbytes = 0;
1150 i->thread_info.rewrite_flush = false;
1151 i->thread_info.dont_rewind_render = false;
1154 /* Called from thread context */
1155 size_t pa_sink_input_get_max_rewind(pa_sink_input *i) {
1156 pa_sink_input_assert_ref(i);
1157 pa_sink_input_assert_io_context(i);
1159 return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_info.max_rewind) : i->sink->thread_info.max_rewind;
1162 /* Called from thread context */
1163 size_t pa_sink_input_get_max_request(pa_sink_input *i) {
1164 pa_sink_input_assert_ref(i);
1165 pa_sink_input_assert_io_context(i);
1167 /* We're not verifying the status here, to allow this to be called
1168 * in the state change handler between _INIT and _RUNNING */
1170 return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_info.max_request) : i->sink->thread_info.max_request;
1173 /* Called from thread context */
1174 void pa_sink_input_update_max_rewind(pa_sink_input *i, size_t nbytes /* in the sink's sample spec */) {
1175 pa_sink_input_assert_ref(i);
1176 pa_sink_input_assert_io_context(i);
1177 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1178 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1180 pa_memblockq_set_maxrewind(i->thread_info.render_memblockq, nbytes);
1182 if (i->update_max_rewind)
1183 i->update_max_rewind(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, nbytes) : nbytes);
1186 /* Called from thread context */
1187 void pa_sink_input_update_max_request(pa_sink_input *i, size_t nbytes /* in the sink's sample spec */) {
1188 pa_sink_input_assert_ref(i);
1189 pa_sink_input_assert_io_context(i);
1190 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1191 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1193 if (i->update_max_request)
1194 i->update_max_request(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, nbytes) : nbytes);
1197 /* Called from thread context */
1198 pa_usec_t pa_sink_input_set_requested_latency_within_thread(pa_sink_input *i, pa_usec_t usec) {
1199 pa_sink_input_assert_ref(i);
1200 pa_sink_input_assert_io_context(i);
1202 if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY))
1203 usec = i->sink->thread_info.fixed_latency;
1205 if (usec != (pa_usec_t) -1)
1206 usec = PA_CLAMP(usec, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
1208 i->thread_info.requested_sink_latency = usec;
1209 pa_sink_invalidate_requested_latency(i->sink, true);
1214 /* Called from main context */
1215 pa_usec_t pa_sink_input_set_requested_latency(pa_sink_input *i, pa_usec_t usec) {
1216 pa_sink_input_assert_ref(i);
1217 pa_assert_ctl_context();
1219 if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) {
1220 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
1224 /* If this sink input is not realized yet or we are being moved,
1225 * we have to touch the thread info data directly */
1228 if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY))
1229 usec = pa_sink_get_fixed_latency(i->sink);
1231 if (usec != (pa_usec_t) -1) {
1232 pa_usec_t min_latency, max_latency;
1233 pa_sink_get_latency_range(i->sink, &min_latency, &max_latency);
1234 usec = PA_CLAMP(usec, min_latency, max_latency);
1238 i->thread_info.requested_sink_latency = usec;
1243 /* Called from main context */
1244 pa_usec_t pa_sink_input_get_requested_latency(pa_sink_input *i) {
1245 pa_sink_input_assert_ref(i);
1246 pa_assert_ctl_context();
1248 if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) {
1250 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
1254 /* If this sink input is not realized yet or we are being moved,
1255 * we have to touch the thread info data directly */
1257 return i->thread_info.requested_sink_latency;
1260 /* Called from main context */
1261 void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, bool save, bool absolute) {
1264 pa_sink_input_assert_ref(i);
1265 pa_assert_ctl_context();
1266 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1268 pa_assert(pa_cvolume_valid(volume));
1269 pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &i->sample_spec));
1270 pa_assert(i->volume_writable);
1272 if (!absolute && pa_sink_flat_volume_enabled(i->sink)) {
1273 v = i->sink->reference_volume;
1274 pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
1276 if (pa_cvolume_compatible(volume, &i->sample_spec))
1277 volume = pa_sw_cvolume_multiply(&v, &v, volume);
1279 volume = pa_sw_cvolume_multiply_scalar(&v, &v, pa_cvolume_max(volume));
1281 if (!pa_cvolume_compatible(volume, &i->sample_spec)) {
1283 volume = pa_cvolume_scale(&v, pa_cvolume_max(volume));
1287 if (pa_cvolume_equal(volume, &i->volume)) {
1288 i->save_volume = i->save_volume || save;
1292 i->volume = *volume;
1293 i->save_volume = save;
1295 if (pa_sink_flat_volume_enabled(i->sink)) {
1296 /* We are in flat volume mode, so let's update all sink input
1297 * volumes and update the flat volume of the sink */
1299 pa_sink_set_volume(i->sink, NULL, true, save);
1302 /* OK, we are in normal volume mode. The volume only affects
1304 set_real_ratio(i, volume);
1305 i->reference_ratio = i->volume;
1307 /* Copy the new soft_volume to the thread_info struct */
1308 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
1311 /* The volume changed, let's tell people so */
1312 if (i->volume_changed)
1313 i->volume_changed(i);
1315 /* The virtual volume changed, let's tell people so */
1316 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1319 void pa_sink_input_add_volume_factor(pa_sink_input *i, const char *key, const pa_cvolume *volume_factor) {
1320 struct volume_factor_entry *v;
1322 pa_sink_input_assert_ref(i);
1323 pa_assert_ctl_context();
1324 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1325 pa_assert(volume_factor);
1327 pa_assert(pa_cvolume_valid(volume_factor));
1328 pa_assert(volume_factor->channels == 1 || pa_cvolume_compatible(volume_factor, &i->sample_spec));
1330 v = volume_factor_entry_new(key, volume_factor);
1331 if (!pa_cvolume_compatible(volume_factor, &i->sample_spec))
1332 pa_cvolume_set(&v->volume, i->sample_spec.channels, volume_factor->values[0]);
1334 pa_assert_se(pa_hashmap_put(i->volume_factor_items, v->key, v) >= 0);
1335 if (pa_hashmap_size(i->volume_factor_items) == 1)
1336 i->volume_factor = v->volume;
1338 pa_sw_cvolume_multiply(&i->volume_factor, &i->volume_factor, &v->volume);
1340 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1342 /* Copy the new soft_volume to the thread_info struct */
1343 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
1346 /* Returns 0 if an entry was removed and -1 if no entry for the given key was
1348 int pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key) {
1349 struct volume_factor_entry *v;
1351 pa_sink_input_assert_ref(i);
1353 pa_assert_ctl_context();
1354 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1356 v = pa_hashmap_remove(i->volume_factor_items, key);
1361 volume_factor_entry_free(v);
1363 switch (pa_hashmap_size(i->volume_factor_items)) {
1365 pa_cvolume_reset(&i->volume_factor, i->sample_spec.channels);
1368 v = pa_hashmap_first(i->volume_factor_items);
1369 i->volume_factor = v->volume;
1372 volume_factor_from_hashmap(&i->volume_factor, i->volume_factor_items, i->volume_factor.channels);
1375 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1377 /* Copy the new soft_volume to the thread_info struct */
1378 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
1383 /* Called from main thread */
1384 void pa_sink_input_set_volume_ramp(
1386 const pa_cvolume_ramp *ramp,
1390 pa_sink_input_assert_ref(i);
1391 pa_assert_ctl_context();
1392 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1395 pa_cvolume_ramp_convert(ramp, &i->ramp, i->sample_spec.rate);
1397 pa_log_debug("setting volume ramp with target vol:%d and length:%ld",
1398 i->ramp.ramps[0].target,
1399 i->ramp.ramps[0].length);
1401 /* This tells the sink that volume ramp changed */
1403 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP, NULL, 0, NULL) == 0);
1406 /* Called from main context */
1407 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v) {
1408 pa_sink_input_assert_ref(i);
1409 pa_assert_ctl_context();
1410 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1411 pa_assert(!v || pa_cvolume_compatible(v, &i->sample_spec));
1413 /* This basically calculates:
1415 * i->real_ratio := v
1416 * i->soft_volume := i->real_ratio * i->volume_factor */
1421 pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels);
1423 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1424 /* We don't copy the data to the thread_info data. That's left for someone else to do */
1427 /* Called from main or I/O context */
1428 bool pa_sink_input_is_passthrough(pa_sink_input *i) {
1429 pa_sink_input_assert_ref(i);
1431 if (PA_UNLIKELY(!pa_format_info_is_pcm(i->format)))
1434 if (PA_UNLIKELY(i->flags & PA_SINK_INPUT_PASSTHROUGH))
1440 /* Called from main context */
1441 bool pa_sink_input_is_volume_readable(pa_sink_input *i) {
1442 pa_sink_input_assert_ref(i);
1443 pa_assert_ctl_context();
1445 return !pa_sink_input_is_passthrough(i);
1448 /* Called from main context */
1449 pa_cvolume *pa_sink_input_get_volume(pa_sink_input *i, pa_cvolume *volume, bool absolute) {
1450 pa_sink_input_assert_ref(i);
1451 pa_assert_ctl_context();
1452 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1453 pa_assert(pa_sink_input_is_volume_readable(i));
1455 if (absolute || !pa_sink_flat_volume_enabled(i->sink))
1456 *volume = i->volume;
1458 *volume = i->reference_ratio;
1463 /* Called from main context */
1464 void pa_sink_input_set_mute(pa_sink_input *i, bool mute, bool save) {
1465 pa_sink_input_assert_ref(i);
1466 pa_assert_ctl_context();
1467 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1469 if (!i->muted == !mute) {
1470 i->save_muted = i->save_muted || mute;
1475 i->save_muted = save;
1477 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE, NULL, 0, NULL) == 0);
1479 /* The mute status changed, let's tell people so */
1480 if (i->mute_changed)
1483 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1486 /* Called from main context */
1487 bool pa_sink_input_get_mute(pa_sink_input *i) {
1488 pa_sink_input_assert_ref(i);
1489 pa_assert_ctl_context();
1490 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1495 /* Called from main thread */
1496 void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p) {
1497 pa_sink_input_assert_ref(i);
1498 pa_assert_ctl_context();
1501 pa_proplist_update(i->proplist, mode, p);
1503 if (PA_SINK_INPUT_IS_LINKED(i->state)) {
1504 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
1505 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1509 /* Called from main context */
1510 void pa_sink_input_cork(pa_sink_input *i, bool b) {
1511 pa_sink_input_assert_ref(i);
1512 pa_assert_ctl_context();
1513 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1515 sink_input_set_state(i, b ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING);
1518 /* Called from main context */
1519 int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate) {
1520 pa_sink_input_assert_ref(i);
1521 pa_assert_ctl_context();
1522 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1523 pa_return_val_if_fail(i->thread_info.resampler, -PA_ERR_BADSTATE);
1525 if (i->sample_spec.rate == rate)
1528 i->sample_spec.rate = rate;
1530 pa_asyncmsgq_post(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), 0, NULL, NULL);
1532 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1536 /* Called from main context */
1537 void pa_sink_input_set_name(pa_sink_input *i, const char *name) {
1539 pa_sink_input_assert_ref(i);
1540 pa_assert_ctl_context();
1542 if (!name && !pa_proplist_contains(i->proplist, PA_PROP_MEDIA_NAME))
1545 old = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME);
1547 if (old && name && pa_streq(old, name))
1551 pa_proplist_sets(i->proplist, PA_PROP_MEDIA_NAME, name);
1553 pa_proplist_unset(i->proplist, PA_PROP_MEDIA_NAME);
1555 if (PA_SINK_INPUT_IS_LINKED(i->state)) {
1556 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
1557 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1561 /* Called from main context */
1562 pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i) {
1563 pa_sink_input_assert_ref(i);
1564 pa_assert_ctl_context();
1566 return i->actual_resample_method;
1569 /* Called from main context */
1570 bool pa_sink_input_may_move(pa_sink_input *i) {
1571 pa_sink_input_assert_ref(i);
1572 pa_assert_ctl_context();
1573 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1575 if (i->flags & PA_SINK_INPUT_DONT_MOVE)
1578 if (i->sync_next || i->sync_prev) {
1579 pa_log_warn("Moving synchronized streams not supported.");
1586 static bool find_filter_sink_input(pa_sink_input *target, pa_sink *s) {
1588 while (s && s->input_to_master) {
1589 if (s->input_to_master == target)
1591 s = s->input_to_master->sink;
1592 pa_assert(i++ < 100);
1597 /* Called from main context */
1598 bool pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest) {
1599 pa_sink_input_assert_ref(i);
1600 pa_assert_ctl_context();
1601 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1602 pa_sink_assert_ref(dest);
1604 if (dest == i->sink)
1607 if (!pa_sink_input_may_move(i))
1610 /* Make sure we're not creating a filter sink cycle */
1611 if (find_filter_sink_input(i, dest)) {
1612 pa_log_debug("Can't connect input to %s, as that would create a cycle.", dest->name);
1616 if (pa_idxset_size(dest->inputs) >= PA_MAX_INPUTS_PER_SINK) {
1617 pa_log_warn("Failed to move sink input: too many inputs per sink.");
1621 if (check_passthrough_connection(pa_sink_input_is_passthrough(i), dest) < 0)
1625 if (!i->may_move_to(i, dest))
1631 /* Called from main context */
1632 int pa_sink_input_start_move(pa_sink_input *i) {
1633 pa_source_output *o, *p = NULL;
1634 struct volume_factor_entry *v;
1638 pa_sink_input_assert_ref(i);
1639 pa_assert_ctl_context();
1640 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1643 if (!pa_sink_input_may_move(i))
1644 return -PA_ERR_NOTSUPPORTED;
1646 if ((r = pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], i)) < 0)
1649 /* Kill directly connected outputs */
1650 while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
1652 pa_source_output_kill(o);
1655 pa_assert(pa_idxset_isempty(i->direct_outputs));
1657 pa_idxset_remove_by_data(i->sink->inputs, i, NULL);
1659 if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
1660 pa_assert_se(i->sink->n_corked-- >= 1);
1662 if (pa_sink_input_is_passthrough(i))
1663 pa_sink_leave_passthrough(i->sink);
1665 if (pa_sink_flat_volume_enabled(i->sink))
1666 /* We might need to update the sink's volume if we are in flat
1668 pa_sink_set_volume(i->sink, NULL, false, false);
1670 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_START_MOVE, i, 0, NULL) == 0);
1672 pa_sink_update_status(i->sink);
1674 PA_HASHMAP_FOREACH(v, i->volume_factor_sink_items, state)
1675 pa_cvolume_remap(&v->volume, &i->sink->channel_map, &i->channel_map);
1677 pa_cvolume_remap(&i->volume_factor_sink, &i->sink->channel_map, &i->channel_map);
1681 pa_sink_input_unref(i);
1686 /* Called from main context. If i has an origin sink that uses volume sharing,
1687 * then also the origin sink and all streams connected to it need to update
1688 * their volume - this function does all that by using recursion. */
1689 static void update_volume_due_to_moving(pa_sink_input *i, pa_sink *dest) {
1690 pa_cvolume old_volume;
1694 pa_assert(i->sink); /* The destination sink should already be set. */
1696 if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1697 pa_sink *root_sink = pa_sink_get_master(i->sink);
1698 pa_sink_input *origin_sink_input;
1701 if (PA_UNLIKELY(!root_sink))
1704 if (pa_sink_flat_volume_enabled(i->sink)) {
1705 /* Ok, so the origin sink uses volume sharing, and flat volume is
1706 * enabled. The volume will have to be updated as follows:
1708 * i->volume := i->sink->real_volume
1709 * (handled later by pa_sink_set_volume)
1710 * i->reference_ratio := i->volume / i->sink->reference_volume
1711 * (handled later by pa_sink_set_volume)
1712 * i->real_ratio stays unchanged
1713 * (streams whose origin sink uses volume sharing should
1714 * always have real_ratio of 0 dB)
1715 * i->soft_volume stays unchanged
1716 * (streams whose origin sink uses volume sharing should
1717 * always have volume_factor as soft_volume, so no change
1718 * should be needed) */
1720 pa_assert(pa_cvolume_is_norm(&i->real_ratio));
1721 pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor));
1723 /* Notifications will be sent by pa_sink_set_volume(). */
1726 /* Ok, so the origin sink uses volume sharing, and flat volume is
1727 * disabled. The volume will have to be updated as follows:
1730 * i->reference_ratio := 0 dB
1731 * i->real_ratio stays unchanged
1732 * (streams whose origin sink uses volume sharing should
1733 * always have real_ratio of 0 dB)
1734 * i->soft_volume stays unchanged
1735 * (streams whose origin sink uses volume sharing should
1736 * always have volume_factor as soft_volume, so no change
1737 * should be needed) */
1739 old_volume = i->volume;
1740 pa_cvolume_reset(&i->volume, i->volume.channels);
1741 pa_cvolume_reset(&i->reference_ratio, i->reference_ratio.channels);
1742 pa_assert(pa_cvolume_is_norm(&i->real_ratio));
1743 pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor));
1745 /* Notify others about the changed sink input volume. */
1746 if (!pa_cvolume_equal(&i->volume, &old_volume)) {
1747 if (i->volume_changed)
1748 i->volume_changed(i);
1750 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1754 /* Additionally, the origin sink volume needs updating:
1756 * i->origin_sink->reference_volume := root_sink->reference_volume
1757 * i->origin_sink->real_volume := root_sink->real_volume
1758 * i->origin_sink->soft_volume stays unchanged
1759 * (sinks that use volume sharing should always have
1760 * soft_volume of 0 dB) */
1762 old_volume = i->origin_sink->reference_volume;
1764 i->origin_sink->reference_volume = root_sink->reference_volume;
1765 pa_cvolume_remap(&i->origin_sink->reference_volume, &root_sink->channel_map, &i->origin_sink->channel_map);
1767 i->origin_sink->real_volume = root_sink->real_volume;
1768 pa_cvolume_remap(&i->origin_sink->real_volume, &root_sink->channel_map, &i->origin_sink->channel_map);
1770 pa_assert(pa_cvolume_is_norm(&i->origin_sink->soft_volume));
1772 /* Notify others about the changed sink volume. If you wonder whether
1773 * i->origin_sink->set_volume() should be called somewhere, that's not
1774 * the case, because sinks that use volume sharing shouldn't have any
1775 * internal volume that set_volume() would update. If you wonder
1776 * whether the thread_info variables should be synced, yes, they
1777 * should, and it's done by the PA_SINK_MESSAGE_FINISH_MOVE message
1779 if (!pa_cvolume_equal(&i->origin_sink->reference_volume, &old_volume))
1780 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, i->origin_sink->index);
1782 /* Recursively update origin sink inputs. */
1783 PA_IDXSET_FOREACH(origin_sink_input, i->origin_sink->inputs, idx)
1784 update_volume_due_to_moving(origin_sink_input, dest);
1787 old_volume = i->volume;
1789 if (pa_sink_flat_volume_enabled(i->sink)) {
1790 /* Ok, so this is a regular stream, and flat volume is enabled. The
1791 * volume will have to be updated as follows:
1793 * i->volume := i->reference_ratio * i->sink->reference_volume
1794 * i->reference_ratio stays unchanged
1795 * i->real_ratio := i->volume / i->sink->real_volume
1796 * (handled later by pa_sink_set_volume)
1797 * i->soft_volume := i->real_ratio * i->volume_factor
1798 * (handled later by pa_sink_set_volume) */
1800 i->volume = i->sink->reference_volume;
1801 pa_cvolume_remap(&i->volume, &i->sink->channel_map, &i->channel_map);
1802 pa_sw_cvolume_multiply(&i->volume, &i->volume, &i->reference_ratio);
1805 /* Ok, so this is a regular stream, and flat volume is disabled.
1806 * The volume will have to be updated as follows:
1808 * i->volume := i->reference_ratio
1809 * i->reference_ratio stays unchanged
1810 * i->real_ratio := i->reference_ratio
1811 * i->soft_volume := i->real_ratio * i->volume_factor */
1813 i->volume = i->reference_ratio;
1814 i->real_ratio = i->reference_ratio;
1815 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1818 /* Notify others about the changed sink input volume. */
1819 if (!pa_cvolume_equal(&i->volume, &old_volume)) {
1820 /* XXX: In case i->sink has flat volume enabled, then real_ratio
1821 * and soft_volume are not updated yet. Let's hope that the
1822 * callback implementation doesn't care about those variables... */
1823 if (i->volume_changed)
1824 i->volume_changed(i);
1826 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1830 /* If i->sink == dest, then recursion has finished, and we can finally call
1831 * pa_sink_set_volume(), which will do the rest of the updates. */
1832 if ((i->sink == dest) && pa_sink_flat_volume_enabled(i->sink))
1833 pa_sink_set_volume(i->sink, NULL, false, i->save_volume);
1836 /* Called from main context */
1837 int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, bool save) {
1838 struct volume_factor_entry *v;
1841 pa_sink_input_assert_ref(i);
1842 pa_assert_ctl_context();
1843 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1844 pa_assert(!i->sink);
1845 pa_sink_assert_ref(dest);
1847 if (!pa_sink_input_may_move_to(i, dest))
1848 return -PA_ERR_NOTSUPPORTED;
1850 if (pa_sink_input_is_passthrough(i) && !pa_sink_check_format(dest, i->format)) {
1851 pa_proplist *p = pa_proplist_new();
1852 pa_log_debug("New sink doesn't support stream format, sending format-changed and killing");
1853 /* Tell the client what device we want to be on if it is going to
1855 pa_proplist_sets(p, "device", dest->name);
1856 pa_sink_input_send_event(i, PA_STREAM_EVENT_FORMAT_LOST, p);
1857 pa_proplist_free(p);
1858 return -PA_ERR_NOTSUPPORTED;
1861 if (!(i->flags & PA_SINK_INPUT_VARIABLE_RATE) &&
1862 !pa_sample_spec_equal(&i->sample_spec, &dest->sample_spec)) {
1863 /* try to change dest sink rate if possible without glitches.
1864 module-suspend-on-idle resumes destination sink with
1865 SINK_INPUT_MOVE_FINISH hook */
1867 pa_log_info("Trying to change sample rate");
1868 if (pa_sink_update_rate(dest, i->sample_spec.rate, pa_sink_input_is_passthrough(i)) >= 0)
1869 pa_log_info("Rate changed to %u Hz", dest->sample_spec.rate);
1876 i->save_sink = save;
1877 pa_idxset_put(dest->inputs, pa_sink_input_ref(i), NULL);
1879 PA_HASHMAP_FOREACH(v, i->volume_factor_sink_items, state)
1880 pa_cvolume_remap(&v->volume, &i->channel_map, &i->sink->channel_map);
1882 pa_cvolume_remap(&i->volume_factor_sink, &i->channel_map, &i->sink->channel_map);
1884 if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
1885 i->sink->n_corked++;
1887 pa_sink_input_update_rate(i);
1889 pa_sink_update_status(dest);
1891 update_volume_due_to_moving(i, dest);
1893 if (pa_sink_input_is_passthrough(i))
1894 pa_sink_enter_passthrough(i->sink);
1896 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_FINISH_MOVE, i, 0, NULL) == 0);
1898 pa_log_debug("Successfully moved sink input %i to %s.", i->index, dest->name);
1900 /* Notify everyone */
1901 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], i);
1902 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1907 /* Called from main context */
1908 void pa_sink_input_fail_move(pa_sink_input *i) {
1910 pa_sink_input_assert_ref(i);
1911 pa_assert_ctl_context();
1912 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1913 pa_assert(!i->sink);
1915 /* Check if someone wants this sink input? */
1916 if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FAIL], i) == PA_HOOK_STOP)
1922 pa_sink_input_kill(i);
1925 /* Called from main context */
1926 int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, bool save) {
1929 pa_sink_input_assert_ref(i);
1930 pa_assert_ctl_context();
1931 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1933 pa_sink_assert_ref(dest);
1935 if (dest == i->sink)
1938 if (!pa_sink_input_may_move_to(i, dest))
1939 return -PA_ERR_NOTSUPPORTED;
1941 pa_sink_input_ref(i);
1943 if ((r = pa_sink_input_start_move(i)) < 0) {
1944 pa_sink_input_unref(i);
1948 if ((r = pa_sink_input_finish_move(i, dest, save)) < 0) {
1949 pa_sink_input_fail_move(i);
1950 pa_sink_input_unref(i);
1954 pa_sink_input_unref(i);
1959 /* Called from IO thread context */
1960 void pa_sink_input_set_state_within_thread(pa_sink_input *i, pa_sink_input_state_t state) {
1961 bool corking, uncorking;
1963 pa_sink_input_assert_ref(i);
1964 pa_sink_input_assert_io_context(i);
1966 if (state == i->thread_info.state)
1969 if ((state == PA_SINK_INPUT_DRAINED || state == PA_SINK_INPUT_RUNNING) &&
1970 !(i->thread_info.state == PA_SINK_INPUT_DRAINED || i->thread_info.state != PA_SINK_INPUT_RUNNING))
1971 pa_atomic_store(&i->thread_info.drained, 1);
1973 corking = state == PA_SINK_INPUT_CORKED && i->thread_info.state == PA_SINK_INPUT_RUNNING;
1974 uncorking = i->thread_info.state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING;
1976 if (i->state_change)
1977 i->state_change(i, state);
1981 pa_log_debug("Requesting rewind due to corking");
1983 /* This will tell the implementing sink input driver to rewind
1984 * so that the unplayed already mixed data is not lost */
1985 pa_sink_input_request_rewind(i, 0, true, true, false);
1987 /* Set the corked state *after* requesting rewind */
1988 i->thread_info.state = state;
1990 } else if (uncorking) {
1992 pa_log_debug("Requesting rewind due to uncorking");
1994 i->thread_info.underrun_for = (uint64_t) -1;
1995 i->thread_info.underrun_for_sink = 0;
1996 i->thread_info.playing_for = 0;
1998 /* Set the uncorked state *before* requesting rewind */
1999 i->thread_info.state = state;
2001 /* OK, we're being uncorked. Make sure we're not rewound when
2002 * the hw buffer is remixed and request a remix. */
2003 pa_sink_input_request_rewind(i, 0, false, true, true);
2005 /* We may not be corking or uncorking, but we still need to set the state. */
2006 i->thread_info.state = state;
2009 /* Called from thread context, except when it is not. */
2010 int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
2011 pa_sink_input *i = PA_SINK_INPUT(o);
2012 pa_sink_input_assert_ref(i);
2016 case PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME:
2017 if (!pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume)) {
2018 i->thread_info.soft_volume = i->soft_volume;
2019 pa_sink_input_request_rewind(i, 0, true, false, false);
2023 case PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP:
2024 /* we have ongoing ramp where we take current start values */
2025 pa_cvolume_ramp_start_from(&i->thread_info.ramp, &i->ramp);
2026 i->thread_info.ramp = i->ramp;
2027 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
2030 case PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE:
2031 if (i->thread_info.muted != i->muted) {
2032 i->thread_info.muted = i->muted;
2033 pa_sink_input_request_rewind(i, 0, true, false, false);
2037 case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
2038 pa_usec_t *r = userdata;
2040 r[0] += pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sample_spec);
2041 r[1] += pa_sink_get_latency_within_thread(i->sink);
2046 case PA_SINK_INPUT_MESSAGE_SET_RATE:
2048 i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
2049 pa_resampler_set_input_rate(i->thread_info.resampler, PA_PTR_TO_UINT(userdata));
2053 case PA_SINK_INPUT_MESSAGE_SET_STATE: {
2054 pa_sink_input *ssync;
2056 pa_sink_input_set_state_within_thread(i, PA_PTR_TO_UINT(userdata));
2058 for (ssync = i->thread_info.sync_prev; ssync; ssync = ssync->thread_info.sync_prev)
2059 pa_sink_input_set_state_within_thread(ssync, PA_PTR_TO_UINT(userdata));
2061 for (ssync = i->thread_info.sync_next; ssync; ssync = ssync->thread_info.sync_next)
2062 pa_sink_input_set_state_within_thread(ssync, PA_PTR_TO_UINT(userdata));
2067 case PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY: {
2068 pa_usec_t *usec = userdata;
2070 *usec = pa_sink_input_set_requested_latency_within_thread(i, *usec);
2074 case PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY: {
2075 pa_usec_t *r = userdata;
2077 *r = i->thread_info.requested_sink_latency;
2082 return -PA_ERR_NOTIMPLEMENTED;
2085 /* Called from main thread */
2086 pa_sink_input_state_t pa_sink_input_get_state(pa_sink_input *i) {
2087 pa_sink_input_assert_ref(i);
2088 pa_assert_ctl_context();
2090 if (i->state == PA_SINK_INPUT_RUNNING || i->state == PA_SINK_INPUT_DRAINED)
2091 return pa_atomic_load(&i->thread_info.drained) ? PA_SINK_INPUT_DRAINED : PA_SINK_INPUT_RUNNING;
2096 /* Called from IO context */
2097 bool pa_sink_input_safe_to_remove(pa_sink_input *i) {
2098 pa_sink_input_assert_ref(i);
2099 pa_sink_input_assert_io_context(i);
2101 if (PA_SINK_INPUT_IS_LINKED(i->thread_info.state))
2102 return pa_memblockq_is_empty(i->thread_info.render_memblockq);
2107 /* Called from IO context */
2108 void pa_sink_input_request_rewind(
2110 size_t nbytes /* in our sample spec */,
2113 bool dont_rewind_render) {
2117 /* If 'rewrite' is true the sink is rewound as far as requested
2118 * and possible and the exact value of this is passed back the
2119 * implementor via process_rewind(). If 'flush' is also true all
2120 * already rendered data is also dropped.
2122 * If 'rewrite' is false the sink is rewound as far as requested
2123 * and possible and the already rendered data is dropped so that
2124 * in the next iteration we read new data from the
2125 * implementor. This implies 'flush' is true. If
2126 * dont_rewind_render is true then the render memblockq is not
2129 /* nbytes = 0 means maximum rewind request */
2131 pa_sink_input_assert_ref(i);
2132 pa_sink_input_assert_io_context(i);
2133 pa_assert(rewrite || flush);
2134 pa_assert(!dont_rewind_render || !rewrite);
2136 /* We don't take rewind requests while we are corked */
2137 if (i->thread_info.state == PA_SINK_INPUT_CORKED)
2140 nbytes = PA_MAX(i->thread_info.rewrite_nbytes, nbytes);
2142 #ifdef SINK_INPUT_DEBUG
2143 pa_log_debug("request rewrite %zu", nbytes);
2146 /* Calculate how much we can rewind locally without having to
2149 lbq = pa_memblockq_get_length(i->thread_info.render_memblockq);
2153 /* Check if rewinding for the maximum is requested, and if so, fix up */
2156 /* Calculate maximum number of bytes that could be rewound in theory */
2157 nbytes = i->sink->thread_info.max_rewind + lbq;
2159 /* Transform from sink domain */
2160 if (i->thread_info.resampler)
2161 nbytes = pa_resampler_request(i->thread_info.resampler, nbytes);
2164 /* Remember how much we actually want to rewrite */
2165 if (i->thread_info.rewrite_nbytes != (size_t) -1) {
2167 /* Make sure to not overwrite over underruns */
2168 if (nbytes > i->thread_info.playing_for)
2169 nbytes = (size_t) i->thread_info.playing_for;
2171 i->thread_info.rewrite_nbytes = nbytes;
2173 i->thread_info.rewrite_nbytes = (size_t) -1;
2176 i->thread_info.rewrite_flush =
2177 i->thread_info.rewrite_flush || flush;
2179 i->thread_info.dont_rewind_render =
2180 i->thread_info.dont_rewind_render ||
2183 /* nbytes is -1 if some earlier rewind request had rewrite == false. */
2184 if (nbytes != (size_t) -1) {
2186 /* Transform to sink domain */
2187 if (i->thread_info.resampler)
2188 nbytes = pa_resampler_result(i->thread_info.resampler, nbytes);
2191 pa_sink_request_rewind(i->sink, nbytes - lbq);
2193 /* This call will make sure process_rewind() is called later */
2194 pa_sink_request_rewind(i->sink, 0);
2198 /* Called from main context */
2199 pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, pa_memchunk *ret) {
2200 pa_sink_input_assert_ref(i);
2201 pa_assert_ctl_context();
2204 /* FIXME: Shouldn't access resampler object from main context! */
2206 pa_silence_memchunk_get(
2207 &i->core->silence_cache,
2211 i->thread_info.resampler ? pa_resampler_max_block_size(i->thread_info.resampler) : 0);
2216 /* Called from main context */
2217 void pa_sink_input_send_event(pa_sink_input *i, const char *event, pa_proplist *data) {
2218 pa_proplist *pl = NULL;
2219 pa_sink_input_send_event_hook_data hook_data;
2221 pa_sink_input_assert_ref(i);
2222 pa_assert_ctl_context();
2229 data = pl = pa_proplist_new();
2231 hook_data.sink_input = i;
2232 hook_data.data = data;
2233 hook_data.event = event;
2235 if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT], &hook_data) < 0)
2238 i->send_event(i, event, data);
2242 pa_proplist_free(pl);
2245 /* Called from main context */
2246 /* Updates the sink input's resampler with whatever the current sink requires
2247 * -- useful when the underlying sink's rate might have changed */
2248 int pa_sink_input_update_rate(pa_sink_input *i) {
2249 pa_resampler *new_resampler;
2250 char *memblockq_name;
2252 pa_sink_input_assert_ref(i);
2253 pa_assert_ctl_context();
2255 if (i->thread_info.resampler &&
2256 pa_sample_spec_equal(pa_resampler_output_sample_spec(i->thread_info.resampler), &i->sink->sample_spec) &&
2257 pa_channel_map_equal(pa_resampler_output_channel_map(i->thread_info.resampler), &i->sink->channel_map))
2259 new_resampler = i->thread_info.resampler;
2261 else if (!pa_sink_input_is_passthrough(i) &&
2262 ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ||
2263 !pa_sample_spec_equal(&i->sample_spec, &i->sink->sample_spec) ||
2264 !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map))) {
2266 new_resampler = pa_resampler_new(i->core->mempool,
2267 &i->sample_spec, &i->channel_map,
2268 &i->sink->sample_spec, &i->sink->channel_map,
2269 i->requested_resample_method,
2270 ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
2271 ((i->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
2272 (i->core->disable_remixing || (i->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
2273 (i->core->disable_lfe_remixing ? PA_RESAMPLER_NO_LFE : 0));
2275 if (!new_resampler) {
2276 pa_log_warn("Unsupported resampling operation.");
2277 return -PA_ERR_NOTSUPPORTED;
2280 new_resampler = NULL;
2282 if (new_resampler == i->thread_info.resampler)
2285 if (i->thread_info.resampler)
2286 pa_resampler_free(i->thread_info.resampler);
2288 i->thread_info.resampler = new_resampler;
2290 pa_memblockq_free(i->thread_info.render_memblockq);
2292 memblockq_name = pa_sprintf_malloc("sink input render_memblockq [%u]", i->index);
2293 i->thread_info.render_memblockq = pa_memblockq_new(
2296 MEMBLOCKQ_MAXLENGTH,
2298 &i->sink->sample_spec,
2303 pa_xfree(memblockq_name);
2305 i->actual_resample_method = new_resampler ? pa_resampler_get_method(new_resampler) : PA_RESAMPLER_INVALID;
2307 pa_log_debug("Updated resampler for sink input %d", i->index);