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/sample-util.h>
36 #include <pulsecore/core-subscribe.h>
37 #include <pulsecore/log.h>
38 #include <pulsecore/play-memblockq.h>
39 #include <pulsecore/namereg.h>
40 #include <pulsecore/core-util.h>
42 #include "sink-input.h"
44 /* #define SINK_INPUT_DEBUG */
46 #define MEMBLOCKQ_MAXLENGTH (32*1024*1024)
47 #define CONVERT_BUFFER_LENGTH (PA_PAGE_SIZE)
49 PA_DEFINE_PUBLIC_CLASS(pa_sink_input, pa_msgobject);
51 static void sink_input_free(pa_object *o);
52 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v);
54 static int check_passthrough_connection(pa_bool_t passthrough, pa_sink *dest) {
55 if (pa_sink_is_passthrough(dest)) {
56 pa_log_warn("Sink is already connected to PASSTHROUGH input");
60 /* If current input(s) exist, check new input is not PASSTHROUGH */
61 if (pa_idxset_size(dest->inputs) > 0 && passthrough) {
62 pa_log_warn("Sink is already connected, cannot accept new PASSTHROUGH INPUT");
69 pa_sink_input_new_data* pa_sink_input_new_data_init(pa_sink_input_new_data *data) {
73 data->resample_method = PA_RESAMPLER_INVALID;
74 data->proplist = pa_proplist_new();
75 data->volume_writable = TRUE;
80 void pa_sink_input_new_data_set_sample_spec(pa_sink_input_new_data *data, const pa_sample_spec *spec) {
83 if ((data->sample_spec_is_set = !!spec))
84 data->sample_spec = *spec;
87 void pa_sink_input_new_data_set_channel_map(pa_sink_input_new_data *data, const pa_channel_map *map) {
90 if ((data->channel_map_is_set = !!map))
91 data->channel_map = *map;
94 pa_bool_t pa_sink_input_new_data_is_passthrough(pa_sink_input_new_data *data) {
97 if (PA_LIKELY(data->format) && PA_UNLIKELY(!pa_format_info_is_pcm(data->format)))
100 if (PA_UNLIKELY(data->flags & PA_SINK_INPUT_PASSTHROUGH))
106 void pa_sink_input_new_data_set_volume(pa_sink_input_new_data *data, const pa_cvolume *volume) {
108 pa_assert(data->volume_writable);
110 if ((data->volume_is_set = !!volume))
111 data->volume = *volume;
114 void pa_sink_input_new_data_apply_volume_factor(pa_sink_input_new_data *data, const pa_cvolume *volume_factor) {
116 pa_assert(volume_factor);
118 if (data->volume_factor_is_set)
119 pa_sw_cvolume_multiply(&data->volume_factor, &data->volume_factor, volume_factor);
121 data->volume_factor_is_set = TRUE;
122 data->volume_factor = *volume_factor;
126 void pa_sink_input_new_data_apply_volume_factor_sink(pa_sink_input_new_data *data, const pa_cvolume *volume_factor) {
128 pa_assert(volume_factor);
130 if (data->volume_factor_sink_is_set)
131 pa_sw_cvolume_multiply(&data->volume_factor_sink, &data->volume_factor_sink, volume_factor);
133 data->volume_factor_sink_is_set = TRUE;
134 data->volume_factor_sink = *volume_factor;
138 void pa_sink_input_new_data_set_muted(pa_sink_input_new_data *data, pa_bool_t mute) {
141 data->muted_is_set = TRUE;
142 data->muted = !!mute;
145 pa_bool_t pa_sink_input_new_data_set_sink(pa_sink_input_new_data *data, pa_sink *s, pa_bool_t save) {
146 pa_bool_t ret = TRUE;
147 pa_idxset *formats = NULL;
152 if (!data->req_formats) {
153 /* We're not working with the extended API */
155 data->save_sink = save;
157 /* Extended API: let's see if this sink supports the formats the client can provide */
158 formats = pa_sink_check_formats(s, data->req_formats);
160 if (formats && !pa_idxset_isempty(formats)) {
161 /* Sink supports at least one of the requested formats */
163 data->save_sink = save;
164 if (data->nego_formats)
165 pa_idxset_free(data->nego_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
166 data->nego_formats = formats;
168 /* Sink doesn't support any of the formats requested by the client */
170 pa_idxset_free(formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
178 pa_bool_t pa_sink_input_new_data_set_formats(pa_sink_input_new_data *data, pa_idxset *formats) {
182 if (data->req_formats)
183 pa_idxset_free(formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
185 data->req_formats = formats;
188 /* Trigger format negotiation */
189 return pa_sink_input_new_data_set_sink(data, data->sink, data->save_sink);
195 void pa_sink_input_new_data_done(pa_sink_input_new_data *data) {
198 if (data->req_formats)
199 pa_idxset_free(data->req_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
201 if (data->nego_formats)
202 pa_idxset_free(data->nego_formats, (pa_free2_cb_t) pa_format_info_free2, NULL);
205 pa_format_info_free(data->format);
207 pa_proplist_free(data->proplist);
210 /* Called from main context */
211 static void reset_callbacks(pa_sink_input *i) {
215 i->process_rewind = NULL;
216 i->update_max_rewind = NULL;
217 i->update_max_request = NULL;
218 i->update_sink_requested_latency = NULL;
219 i->update_sink_latency_range = NULL;
220 i->update_sink_fixed_latency = NULL;
224 i->suspend_within_thread = NULL;
227 i->get_latency = NULL;
228 i->state_change = NULL;
229 i->may_move_to = NULL;
230 i->send_event = NULL;
231 i->volume_changed = NULL;
232 i->mute_changed = NULL;
235 /* Called from main context */
236 int pa_sink_input_new(
239 pa_sink_input_new_data *data) {
242 pa_resampler *resampler = NULL;
243 char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
244 pa_channel_map original_cm;
247 char *memblockq_name;
254 pa_assert_ctl_context();
257 pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->client->proplist);
259 if (data->origin_sink && (data->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER))
260 data->volume_writable = FALSE;
262 if (!data->req_formats) {
263 /* From this point on, we want to work only with formats, and get back
264 * to using the sample spec and channel map after all decisions w.r.t.
265 * routing are complete. */
266 pa_idxset *tmp = pa_idxset_new(NULL, NULL);
267 pa_format_info *f = pa_format_info_from_sample_spec(&data->sample_spec,
268 data->channel_map_is_set ? &data->channel_map : NULL);
269 pa_idxset_put(tmp, f, NULL);
270 pa_sink_input_new_data_set_formats(data, tmp);
273 if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], data)) < 0)
276 pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
279 pa_sink *sink = pa_namereg_get(core, NULL, PA_NAMEREG_SINK);
280 pa_return_val_if_fail(sink, -PA_ERR_NOENTITY);
281 pa_sink_input_new_data_set_sink(data, sink, FALSE);
283 /* Routing's done, we have a sink. Now let's fix the format and set up the
286 /* If something didn't pick a format for us, pick the top-most format since
287 * we assume this is sorted in priority order */
288 if (!data->format && data->nego_formats && !pa_idxset_isempty(data->nego_formats))
289 data->format = pa_format_info_copy(pa_idxset_first(data->nego_formats, NULL));
291 pa_return_val_if_fail(data->format, -PA_ERR_NOTSUPPORTED);
293 /* Now populate the sample spec and format according to the final
294 * format that we've negotiated */
295 pa_return_val_if_fail(pa_format_info_to_sample_spec(data->format, &ss, &map) == 0, -PA_ERR_INVALID);
296 pa_sink_input_new_data_set_sample_spec(data, &ss);
297 if (pa_format_info_is_pcm(data->format) && pa_channel_map_valid(&map))
298 pa_sink_input_new_data_set_channel_map(data, &map);
300 pa_return_val_if_fail(PA_SINK_IS_LINKED(pa_sink_get_state(data->sink)), -PA_ERR_BADSTATE);
301 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 r = check_passthrough_connection(pa_sink_input_new_data_is_passthrough(data), data->sink);
307 if (!data->sample_spec_is_set)
308 data->sample_spec = data->sink->sample_spec;
310 pa_return_val_if_fail(pa_sample_spec_valid(&data->sample_spec), -PA_ERR_INVALID);
312 if (!data->channel_map_is_set) {
313 if (pa_channel_map_compatible(&data->sink->channel_map, &data->sample_spec))
314 data->channel_map = data->sink->channel_map;
316 pa_channel_map_init_extend(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
319 pa_return_val_if_fail(pa_channel_map_compatible(&data->channel_map, &data->sample_spec), -PA_ERR_INVALID);
321 /* Don't restore (or save) stream volume for passthrough streams and
322 * prevent attenuation/gain */
323 if (pa_sink_input_new_data_is_passthrough(data)) {
324 data->volume_is_set = TRUE;
325 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
326 data->volume_is_absolute = TRUE;
327 data->save_volume = FALSE;
330 if (!data->volume_is_set) {
331 pa_cvolume_reset(&data->volume, data->sample_spec.channels);
332 data->volume_is_absolute = FALSE;
333 data->save_volume = FALSE;
336 pa_return_val_if_fail(pa_cvolume_compatible(&data->volume, &data->sample_spec), -PA_ERR_INVALID);
338 if (!data->volume_factor_is_set)
339 pa_cvolume_reset(&data->volume_factor, data->sample_spec.channels);
341 pa_return_val_if_fail(pa_cvolume_compatible(&data->volume_factor, &data->sample_spec), -PA_ERR_INVALID);
343 if (!data->volume_factor_sink_is_set)
344 pa_cvolume_reset(&data->volume_factor_sink, data->sink->sample_spec.channels);
346 pa_return_val_if_fail(pa_cvolume_compatible(&data->volume_factor_sink, &data->sink->sample_spec), -PA_ERR_INVALID);
348 if (!data->muted_is_set)
351 if (data->flags & PA_SINK_INPUT_FIX_FORMAT)
352 data->sample_spec.format = data->sink->sample_spec.format;
354 if (data->flags & PA_SINK_INPUT_FIX_RATE)
355 data->sample_spec.rate = data->sink->sample_spec.rate;
357 original_cm = data->channel_map;
359 if (data->flags & PA_SINK_INPUT_FIX_CHANNELS) {
360 data->sample_spec.channels = data->sink->sample_spec.channels;
361 data->channel_map = data->sink->channel_map;
364 pa_assert(pa_sample_spec_valid(&data->sample_spec));
365 pa_assert(pa_channel_map_valid(&data->channel_map));
367 if (!(data->flags & PA_SINK_INPUT_VARIABLE_RATE) &&
368 !pa_sample_spec_equal(&data->sample_spec, &data->sink->sample_spec)) {
369 /* try to change sink rate. This is done before the FIXATE hook since
370 module-suspend-on-idle can resume a sink */
372 pa_log_info("Trying to change sample rate");
373 if (pa_sink_update_rate(data->sink, data->sample_spec.rate, pa_sink_input_new_data_is_passthrough(data)) == TRUE)
374 pa_log_info("Rate changed to %u Hz",
375 data->sink->sample_spec.rate);
377 pa_log_info("Resampling enabled to %u Hz", data->sink->sample_spec.rate);
380 /* Due to the fixing of the sample spec the volume might not match anymore */
381 pa_cvolume_remap(&data->volume, &original_cm, &data->channel_map);
383 if (data->resample_method == PA_RESAMPLER_INVALID)
384 data->resample_method = core->resample_method;
386 pa_return_val_if_fail(data->resample_method < PA_RESAMPLER_MAX, -PA_ERR_INVALID);
388 if ((r = pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_INPUT_FIXATE], data)) < 0)
391 if ((data->flags & PA_SINK_INPUT_NO_CREATE_ON_SUSPEND) &&
392 pa_sink_get_state(data->sink) == PA_SINK_SUSPENDED) {
393 pa_log_warn("Failed to create sink input: sink is suspended.");
394 return -PA_ERR_BADSTATE;
397 if (pa_idxset_size(data->sink->inputs) >= PA_MAX_INPUTS_PER_SINK) {
398 pa_log_warn("Failed to create sink input: too many inputs per sink.");
399 return -PA_ERR_TOOLARGE;
402 if ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ||
403 !pa_sample_spec_equal(&data->sample_spec, &data->sink->sample_spec) ||
404 !pa_channel_map_equal(&data->channel_map, &data->sink->channel_map)) {
406 /* Note: for passthrough content we need to adjust the output rate to that of the current sink-input */
407 if (!pa_sink_input_new_data_is_passthrough(data)) /* no resampler for passthrough content */
408 if (!(resampler = pa_resampler_new(
410 &data->sample_spec, &data->channel_map,
411 &data->sink->sample_spec, &data->sink->channel_map,
412 data->resample_method,
413 ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
414 ((data->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
415 (core->disable_remixing || (data->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
416 (core->disable_lfe_remixing ? PA_RESAMPLER_NO_LFE : 0)))) {
417 pa_log_warn("Unsupported resampling operation.");
418 return -PA_ERR_NOTSUPPORTED;
422 i = pa_msgobject_new(pa_sink_input);
423 i->parent.parent.free = sink_input_free;
424 i->parent.process_msg = pa_sink_input_process_msg;
427 i->state = PA_SINK_INPUT_INIT;
428 i->flags = data->flags;
429 i->proplist = pa_proplist_copy(data->proplist);
430 i->driver = pa_xstrdup(pa_path_get_filename(data->driver));
431 i->module = data->module;
432 i->sink = data->sink;
433 i->origin_sink = data->origin_sink;
434 i->client = data->client;
436 i->requested_resample_method = data->resample_method;
437 i->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID;
438 i->sample_spec = data->sample_spec;
439 i->channel_map = data->channel_map;
440 i->format = pa_format_info_copy(data->format);
442 if (!data->volume_is_absolute && pa_sink_flat_volume_enabled(i->sink)) {
445 /* When the 'absolute' bool is not set then we'll treat the volume
446 * as relative to the sink volume even in flat volume mode */
447 remapped = data->sink->reference_volume;
448 pa_cvolume_remap(&remapped, &data->sink->channel_map, &data->channel_map);
449 pa_sw_cvolume_multiply(&i->volume, &data->volume, &remapped);
451 i->volume = data->volume;
453 i->volume_factor = data->volume_factor;
454 i->volume_factor_sink = data->volume_factor_sink;
455 i->real_ratio = i->reference_ratio = data->volume;
456 pa_cvolume_reset(&i->soft_volume, i->sample_spec.channels);
457 pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels);
458 i->volume_writable = data->volume_writable;
459 i->save_volume = data->save_volume;
460 i->save_sink = data->save_sink;
461 i->save_muted = data->save_muted;
463 i->muted = data->muted;
465 if (data->sync_base) {
466 i->sync_next = data->sync_base->sync_next;
467 i->sync_prev = data->sync_base;
469 if (data->sync_base->sync_next)
470 data->sync_base->sync_next->sync_prev = i;
471 data->sync_base->sync_next = i;
473 i->sync_next = i->sync_prev = NULL;
475 i->direct_outputs = pa_idxset_new(NULL, NULL);
480 if (data->flags & PA_SINK_INPUT_START_RAMP_MUTED)
481 pa_cvolume_ramp_int_init(&i->ramp, PA_VOLUME_MUTED, data->sample_spec.channels);
483 pa_cvolume_ramp_int_init(&i->ramp, PA_VOLUME_NORM, data->sample_spec.channels);
485 i->thread_info.state = i->state;
486 i->thread_info.attached = FALSE;
487 pa_atomic_store(&i->thread_info.drained, 1);
488 i->thread_info.sample_spec = i->sample_spec;
489 i->thread_info.resampler = resampler;
490 i->thread_info.soft_volume = i->soft_volume;
491 i->thread_info.muted = i->muted;
492 i->thread_info.requested_sink_latency = (pa_usec_t) -1;
493 i->thread_info.rewrite_nbytes = 0;
494 i->thread_info.rewrite_flush = FALSE;
495 i->thread_info.dont_rewind_render = FALSE;
496 i->thread_info.underrun_for = (uint64_t) -1;
497 i->thread_info.playing_for = 0;
498 i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
500 i->thread_info.ramp = i->ramp;
502 pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0);
503 pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0);
506 pa_assert_se(pa_idxset_put(i->client->sink_inputs, i, NULL) >= 0);
508 memblockq_name = pa_sprintf_malloc("sink input render_memblockq [%u]", i->index);
509 i->thread_info.render_memblockq = pa_memblockq_new(
514 &i->sink->sample_spec,
519 pa_xfree(memblockq_name);
521 pt = pa_proplist_to_string_sep(i->proplist, "\n ");
522 pa_log_info("Created input %u \"%s\" on %s with sample spec %s and channel map %s\n %s",
524 pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)),
526 pa_sample_spec_snprint(st, sizeof(st), &i->sample_spec),
527 pa_channel_map_snprint(cm, sizeof(cm), &i->channel_map),
531 /* Don't forget to call pa_sink_input_put! */
537 /* Called from main context */
538 static void update_n_corked(pa_sink_input *i, pa_sink_input_state_t state) {
540 pa_assert_ctl_context();
545 if (i->state == PA_SINK_INPUT_CORKED && state != PA_SINK_INPUT_CORKED)
546 pa_assert_se(i->sink->n_corked -- >= 1);
547 else if (i->state != PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_CORKED)
551 /* Called from main context */
552 static void sink_input_set_state(pa_sink_input *i, pa_sink_input_state_t state) {
553 pa_sink_input *ssync;
555 pa_assert_ctl_context();
557 if (state == PA_SINK_INPUT_DRAINED)
558 state = PA_SINK_INPUT_RUNNING;
560 if (i->state == state)
563 if (i->state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING && pa_sink_used_by(i->sink) == 0 &&
564 !pa_sample_spec_equal(&i->sample_spec, &i->sink->sample_spec)) {
565 /* We were uncorked and the sink was not playing anything -- let's try
566 * to update the sample rate to avoid resampling */
567 pa_sink_update_rate(i->sink, i->sample_spec.rate, pa_sink_input_is_passthrough(i));
570 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);
572 update_n_corked(i, state);
575 for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev) {
576 update_n_corked(ssync, state);
577 ssync->state = state;
579 for (ssync = i->sync_next; ssync; ssync = ssync->sync_next) {
580 update_n_corked(ssync, state);
581 ssync->state = state;
584 if (state != PA_SINK_INPUT_UNLINKED) {
585 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], i);
587 for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev)
588 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync);
590 for (ssync = i->sync_next; ssync; ssync = ssync->sync_next)
591 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync);
593 if (PA_SINK_INPUT_IS_LINKED(state))
594 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
597 pa_sink_update_status(i->sink);
600 /* Called from main context */
601 void pa_sink_input_unlink(pa_sink_input *i) {
603 pa_source_output *o, *p = NULL;
606 pa_assert_ctl_context();
608 /* See pa_sink_unlink() for a couple of comments how this function
611 pa_sink_input_ref(i);
613 linked = PA_SINK_INPUT_IS_LINKED(i->state);
616 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], i);
619 i->sync_prev->sync_next = i->sync_next;
621 i->sync_next->sync_prev = i->sync_prev;
623 i->sync_prev = i->sync_next = NULL;
625 pa_idxset_remove_by_data(i->core->sink_inputs, i, NULL);
628 if (pa_idxset_remove_by_data(i->sink->inputs, i, NULL))
629 pa_sink_input_unref(i);
632 pa_idxset_remove_by_data(i->client->sink_inputs, i, NULL);
634 while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
636 pa_source_output_kill(o);
640 update_n_corked(i, PA_SINK_INPUT_UNLINKED);
641 i->state = PA_SINK_INPUT_UNLINKED;
643 if (linked && i->sink) {
644 if (pa_sink_input_is_passthrough(i))
645 pa_sink_leave_passthrough(i->sink);
647 /* We might need to update the sink's volume if we are in flat volume mode. */
648 if (pa_sink_flat_volume_enabled(i->sink))
649 pa_sink_set_volume(i->sink, NULL, FALSE, FALSE);
651 if (i->sink->asyncmsgq)
652 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_REMOVE_INPUT, i, 0, NULL) == 0);
658 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_REMOVE, i->index);
659 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST], i);
663 if (PA_SINK_IS_LINKED(pa_sink_get_state(i->sink)))
664 pa_sink_update_status(i->sink);
669 pa_core_maybe_vacuum(i->core);
671 pa_sink_input_unref(i);
674 /* Called from main context */
675 static void sink_input_free(pa_object *o) {
676 pa_sink_input* i = PA_SINK_INPUT(o);
679 pa_assert_ctl_context();
680 pa_assert(pa_sink_input_refcnt(i) == 0);
682 if (PA_SINK_INPUT_IS_LINKED(i->state))
683 pa_sink_input_unlink(i);
685 pa_log_info("Freeing input %u \"%s\"", i->index, pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)));
687 /* Side note: this function must be able to destruct properly any
688 * kind of sink input in any state, even those which are
689 * "half-moved" or are connected to sinks that have no asyncmsgq
690 * and are hence half-destructed themselves! */
692 if (i->thread_info.render_memblockq)
693 pa_memblockq_free(i->thread_info.render_memblockq);
695 if (i->thread_info.resampler)
696 pa_resampler_free(i->thread_info.resampler);
699 pa_format_info_free(i->format);
702 pa_proplist_free(i->proplist);
704 if (i->direct_outputs)
705 pa_idxset_free(i->direct_outputs, NULL, NULL);
707 if (i->thread_info.direct_outputs)
708 pa_hashmap_free(i->thread_info.direct_outputs, NULL, NULL);
714 /* Called from main context */
715 void pa_sink_input_put(pa_sink_input *i) {
716 pa_sink_input_state_t state;
718 pa_sink_input_assert_ref(i);
719 pa_assert_ctl_context();
721 pa_assert(i->state == PA_SINK_INPUT_INIT);
723 /* The following fields must be initialized properly */
725 pa_assert(i->process_rewind);
728 state = i->flags & PA_SINK_INPUT_START_CORKED ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING;
730 update_n_corked(i, state);
734 i->corked_internal = FALSE;
736 /* We might need to update the sink's volume if we are in flat volume mode. */
737 if (pa_sink_flat_volume_enabled(i->sink))
738 pa_sink_set_volume(i->sink, NULL, FALSE, i->save_volume);
740 if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
741 pa_assert(pa_cvolume_is_norm(&i->volume));
742 pa_assert(pa_cvolume_is_norm(&i->reference_ratio));
745 set_real_ratio(i, &i->volume);
748 if (pa_sink_input_is_passthrough(i))
749 pa_sink_enter_passthrough(i->sink);
751 i->thread_info.soft_volume = i->soft_volume;
752 i->thread_info.muted = i->muted;
754 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_ADD_INPUT, i, 0, NULL) == 0);
756 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, i->index);
757 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], i);
759 pa_sink_update_status(i->sink);
762 /* Called from main context */
763 void pa_sink_input_kill(pa_sink_input*i) {
764 pa_sink_input_assert_ref(i);
765 pa_assert_ctl_context();
766 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
771 /* Called from main context */
772 pa_usec_t pa_sink_input_get_latency(pa_sink_input *i, pa_usec_t *sink_latency) {
773 pa_usec_t r[2] = { 0, 0 };
775 pa_sink_input_assert_ref(i);
776 pa_assert_ctl_context();
777 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
779 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_LATENCY, r, 0, NULL) == 0);
782 r[0] += i->get_latency(i);
785 *sink_latency = r[1];
790 /* Called from thread context */
791 void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, pa_memchunk *chunk, pa_cvolume *volume) {
792 pa_bool_t do_volume_adj_here, need_volume_factor_sink;
793 pa_bool_t volume_is_norm;
794 size_t block_size_max_sink, block_size_max_sink_input;
797 pa_sink_input_assert_ref(i);
798 pa_sink_input_assert_io_context(i);
799 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
800 pa_assert(pa_frame_aligned(slength, &i->sink->sample_spec));
804 #ifdef SINK_INPUT_DEBUG
805 pa_log_debug("peek");
808 block_size_max_sink_input = i->thread_info.resampler ?
809 pa_resampler_max_block_size(i->thread_info.resampler) :
810 pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sample_spec);
812 block_size_max_sink = pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sink->sample_spec);
814 /* Default buffer size */
816 slength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sink->sample_spec);
818 if (slength > block_size_max_sink)
819 slength = block_size_max_sink;
821 if (i->thread_info.resampler) {
822 ilength = pa_resampler_request(i->thread_info.resampler, slength);
825 ilength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sample_spec);
829 if (ilength > block_size_max_sink_input)
830 ilength = block_size_max_sink_input;
832 /* If the channel maps of the sink and this stream differ, we need
833 * to adjust the volume *before* we resample. Otherwise we can do
834 * it after and leave it for the sink code */
836 do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map);
837 volume_is_norm = pa_cvolume_is_norm(&i->thread_info.soft_volume) && !i->thread_info.muted;
838 need_volume_factor_sink = !pa_cvolume_is_norm(&i->volume_factor_sink);
840 while (!pa_memblockq_is_readable(i->thread_info.render_memblockq)) {
843 /* There's nothing in our render queue. We need to fill it up
844 * with data from the implementor. */
846 if (i->thread_info.state == PA_SINK_INPUT_CORKED ||
847 i->pop(i, ilength, &tchunk) < 0) {
849 /* OK, we're corked or the implementor didn't give us any
850 * data, so let's just hand out silence */
851 pa_atomic_store(&i->thread_info.drained, 1);
853 pa_memblockq_seek(i->thread_info.render_memblockq, (int64_t) slength, PA_SEEK_RELATIVE, TRUE);
854 i->thread_info.playing_for = 0;
855 if (i->thread_info.underrun_for != (uint64_t) -1)
856 i->thread_info.underrun_for += ilength;
860 pa_atomic_store(&i->thread_info.drained, 0);
862 pa_assert(tchunk.length > 0);
863 pa_assert(tchunk.memblock);
865 i->thread_info.underrun_for = 0;
866 i->thread_info.playing_for += tchunk.length;
868 while (tchunk.length > 0) {
870 pa_bool_t nvfs = need_volume_factor_sink;
875 pa_memblock_ref(wchunk.memblock);
877 if (wchunk.length > block_size_max_sink_input)
878 wchunk.length = block_size_max_sink_input;
880 /* It might be necessary to adjust the volume here */
881 if (do_volume_adj_here && !volume_is_norm) {
882 pa_memchunk_make_writable(&wchunk, 0);
884 if (i->thread_info.muted) {
885 pa_silence_memchunk(&wchunk, &i->thread_info.sample_spec);
888 } else if (!i->thread_info.resampler && nvfs) {
891 /* If we don't need a resampler we can merge the
892 * post and the pre volume adjustment into one */
894 pa_sw_cvolume_multiply(&v, &i->thread_info.soft_volume, &i->volume_factor_sink);
895 pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &v);
899 pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &i->thread_info.soft_volume);
902 if (!i->thread_info.resampler) {
905 pa_memchunk_make_writable(&wchunk, 0);
906 pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &i->volume_factor_sink);
909 /* check for possible volume ramp */
910 if (pa_cvolume_ramp_active(&i->thread_info.ramp)) {
911 pa_memchunk_make_writable(&wchunk, 0);
912 pa_volume_ramp_memchunk(&wchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
913 } else if ((tmp = pa_cvolume_ramp_target_active(&(i->thread_info.ramp)))) {
914 pa_memchunk_make_writable(&wchunk, 0);
915 pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
916 pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &target);
919 pa_memblockq_push_align(i->thread_info.render_memblockq, &wchunk);
922 pa_resampler_run(i->thread_info.resampler, &wchunk, &rchunk);
924 #ifdef SINK_INPUT_DEBUG
925 pa_log_debug("pushing %lu", (unsigned long) rchunk.length);
928 if (rchunk.memblock) {
931 pa_memchunk_make_writable(&rchunk, 0);
932 pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink);
935 /* check for possible volume ramp */
936 if (pa_cvolume_ramp_active(&(i->thread_info.ramp))) {
937 pa_memchunk_make_writable(&rchunk, 0);
938 pa_volume_ramp_memchunk(&rchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
939 } else if (pa_cvolume_ramp_target_active(&(i->thread_info.ramp))) {
940 pa_memchunk_make_writable(&rchunk, 0);
941 pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
942 pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &target);
945 pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk);
946 pa_memblock_unref(rchunk.memblock);
950 pa_memblock_unref(wchunk.memblock);
952 tchunk.index += wchunk.length;
953 tchunk.length -= wchunk.length;
956 pa_memblock_unref(tchunk.memblock);
959 pa_assert_se(pa_memblockq_peek(i->thread_info.render_memblockq, chunk) >= 0);
961 pa_assert(chunk->length > 0);
962 pa_assert(chunk->memblock);
964 #ifdef SINK_INPUT_DEBUG
965 pa_log_debug("peeking %lu", (unsigned long) chunk->length);
968 if (chunk->length > block_size_max_sink)
969 chunk->length = block_size_max_sink;
971 /* Let's see if we had to apply the volume adjustment ourselves,
972 * or if this can be done by the sink for us */
974 if (do_volume_adj_here)
975 /* We had different channel maps, so we already did the adjustment */
976 pa_cvolume_reset(volume, i->sink->sample_spec.channels);
977 else if (i->thread_info.muted)
978 /* We've both the same channel map, so let's have the sink do the adjustment for us*/
979 pa_cvolume_mute(volume, i->sink->sample_spec.channels);
981 *volume = i->thread_info.soft_volume;
984 /* Called from thread context */
985 void pa_sink_input_drop(pa_sink_input *i, size_t nbytes /* in sink sample spec */) {
987 pa_sink_input_assert_ref(i);
988 pa_sink_input_assert_io_context(i);
989 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
990 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
991 pa_assert(nbytes > 0);
993 #ifdef SINK_INPUT_DEBUG
994 pa_log_debug("dropping %lu", (unsigned long) nbytes);
997 pa_memblockq_drop(i->thread_info.render_memblockq, nbytes);
1000 /* Called from thread context */
1001 void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sample spec */) {
1003 pa_bool_t called = FALSE;
1005 pa_sink_input_assert_ref(i);
1006 pa_sink_input_assert_io_context(i);
1007 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1008 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1010 #ifdef SINK_INPUT_DEBUG
1011 pa_log_debug("rewind(%lu, %lu)", (unsigned long) nbytes, (unsigned long) i->thread_info.rewrite_nbytes);
1014 lbq = pa_memblockq_get_length(i->thread_info.render_memblockq);
1016 if (nbytes > 0 && !i->thread_info.dont_rewind_render) {
1017 pa_log_debug("Have to rewind %lu bytes on render memblockq.", (unsigned long) nbytes);
1018 pa_memblockq_rewind(i->thread_info.render_memblockq, nbytes);
1021 if (i->thread_info.rewrite_nbytes == (size_t) -1) {
1023 /* We were asked to drop all buffered data, and rerequest new
1024 * data from implementor the next time push() is called */
1026 pa_memblockq_flush_write(i->thread_info.render_memblockq, TRUE);
1028 } else if (i->thread_info.rewrite_nbytes > 0) {
1029 size_t max_rewrite, amount;
1031 /* Calculate how much make sense to rewrite at most */
1032 max_rewrite = nbytes + lbq;
1034 /* Transform into local domain */
1035 if (i->thread_info.resampler)
1036 max_rewrite = pa_resampler_request(i->thread_info.resampler, max_rewrite);
1038 /* Calculate how much of the rewinded data should actually be rewritten */
1039 amount = PA_MIN(i->thread_info.rewrite_nbytes, max_rewrite);
1042 pa_log_debug("Have to rewind %lu bytes on implementor.", (unsigned long) amount);
1044 /* Tell the implementor */
1045 if (i->process_rewind)
1046 i->process_rewind(i, amount);
1049 /* Convert back to to sink domain */
1050 if (i->thread_info.resampler)
1051 amount = pa_resampler_result(i->thread_info.resampler, amount);
1054 /* Ok, now update the write pointer */
1055 pa_memblockq_seek(i->thread_info.render_memblockq, - ((int64_t) amount), PA_SEEK_RELATIVE, TRUE);
1057 if (i->thread_info.rewrite_flush)
1058 pa_memblockq_silence(i->thread_info.render_memblockq);
1060 /* And reset the resampler */
1061 if (i->thread_info.resampler)
1062 pa_resampler_reset(i->thread_info.resampler);
1067 if (i->process_rewind)
1068 i->process_rewind(i, 0);
1070 i->thread_info.rewrite_nbytes = 0;
1071 i->thread_info.rewrite_flush = FALSE;
1072 i->thread_info.dont_rewind_render = FALSE;
1075 /* Called from thread context */
1076 size_t pa_sink_input_get_max_rewind(pa_sink_input *i) {
1077 pa_sink_input_assert_ref(i);
1078 pa_sink_input_assert_io_context(i);
1080 return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_info.max_rewind) : i->sink->thread_info.max_rewind;
1083 /* Called from thread context */
1084 size_t pa_sink_input_get_max_request(pa_sink_input *i) {
1085 pa_sink_input_assert_ref(i);
1086 pa_sink_input_assert_io_context(i);
1088 /* We're not verifying the status here, to allow this to be called
1089 * in the state change handler between _INIT and _RUNNING */
1091 return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_info.max_request) : i->sink->thread_info.max_request;
1094 /* Called from thread context */
1095 void pa_sink_input_update_max_rewind(pa_sink_input *i, size_t nbytes /* in the sink's sample spec */) {
1096 pa_sink_input_assert_ref(i);
1097 pa_sink_input_assert_io_context(i);
1098 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1099 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1101 pa_memblockq_set_maxrewind(i->thread_info.render_memblockq, nbytes);
1103 if (i->update_max_rewind)
1104 i->update_max_rewind(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, nbytes) : nbytes);
1107 /* Called from thread context */
1108 void pa_sink_input_update_max_request(pa_sink_input *i, size_t nbytes /* in the sink's sample spec */) {
1109 pa_sink_input_assert_ref(i);
1110 pa_sink_input_assert_io_context(i);
1111 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state));
1112 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec));
1114 if (i->update_max_request)
1115 i->update_max_request(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, nbytes) : nbytes);
1118 /* Called from thread context */
1119 pa_usec_t pa_sink_input_set_requested_latency_within_thread(pa_sink_input *i, pa_usec_t usec) {
1120 pa_sink_input_assert_ref(i);
1121 pa_sink_input_assert_io_context(i);
1123 if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY))
1124 usec = i->sink->thread_info.fixed_latency;
1126 if (usec != (pa_usec_t) -1)
1127 usec = PA_CLAMP(usec, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
1129 i->thread_info.requested_sink_latency = usec;
1130 pa_sink_invalidate_requested_latency(i->sink, TRUE);
1135 /* Called from main context */
1136 pa_usec_t pa_sink_input_set_requested_latency(pa_sink_input *i, pa_usec_t usec) {
1137 pa_sink_input_assert_ref(i);
1138 pa_assert_ctl_context();
1140 if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) {
1141 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
1145 /* If this sink input is not realized yet or we are being moved,
1146 * we have to touch the thread info data directly */
1149 if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY))
1150 usec = pa_sink_get_fixed_latency(i->sink);
1152 if (usec != (pa_usec_t) -1) {
1153 pa_usec_t min_latency, max_latency;
1154 pa_sink_get_latency_range(i->sink, &min_latency, &max_latency);
1155 usec = PA_CLAMP(usec, min_latency, max_latency);
1159 i->thread_info.requested_sink_latency = usec;
1164 /* Called from main context */
1165 pa_usec_t pa_sink_input_get_requested_latency(pa_sink_input *i) {
1166 pa_sink_input_assert_ref(i);
1167 pa_assert_ctl_context();
1169 if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) {
1171 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
1175 /* If this sink input is not realized yet or we are being moved,
1176 * we have to touch the thread info data directly */
1178 return i->thread_info.requested_sink_latency;
1181 /* Called from main context */
1182 void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute) {
1185 pa_sink_input_assert_ref(i);
1186 pa_assert_ctl_context();
1187 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1189 pa_assert(pa_cvolume_valid(volume));
1190 pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &i->sample_spec));
1191 pa_assert(i->volume_writable);
1193 if (!absolute && pa_sink_flat_volume_enabled(i->sink)) {
1194 v = i->sink->reference_volume;
1195 pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
1197 if (pa_cvolume_compatible(volume, &i->sample_spec))
1198 volume = pa_sw_cvolume_multiply(&v, &v, volume);
1200 volume = pa_sw_cvolume_multiply_scalar(&v, &v, pa_cvolume_max(volume));
1202 if (!pa_cvolume_compatible(volume, &i->sample_spec)) {
1204 volume = pa_cvolume_scale(&v, pa_cvolume_max(volume));
1208 if (pa_cvolume_equal(volume, &i->volume)) {
1209 i->save_volume = i->save_volume || save;
1213 i->volume = *volume;
1214 i->save_volume = save;
1216 if (pa_sink_flat_volume_enabled(i->sink)) {
1217 /* We are in flat volume mode, so let's update all sink input
1218 * volumes and update the flat volume of the sink */
1220 pa_sink_set_volume(i->sink, NULL, TRUE, save);
1223 /* OK, we are in normal volume mode. The volume only affects
1225 set_real_ratio(i, volume);
1227 /* Copy the new soft_volume to the thread_info struct */
1228 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
1231 /* The volume changed, let's tell people so */
1232 if (i->volume_changed)
1233 i->volume_changed(i);
1235 /* The virtual volume changed, let's tell people so */
1236 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1239 /* Called from main thread */
1240 void pa_sink_input_set_volume_ramp(
1242 const pa_cvolume_ramp *ramp,
1246 pa_sink_input_assert_ref(i);
1247 pa_assert_ctl_context();
1248 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1251 pa_cvolume_ramp_convert(ramp, &i->ramp, i->sample_spec.rate);
1253 pa_log_debug("setting volume ramp with target vol:%d and length:%ld",
1254 i->ramp.ramps[0].target,
1255 i->ramp.ramps[0].length);
1258 /* This tells the sink that volume ramp changed */
1260 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP,
1261 NULL, 0, NULL) == 0);
1264 /* Called from main context */
1265 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v) {
1266 pa_sink_input_assert_ref(i);
1267 pa_assert_ctl_context();
1268 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1269 pa_assert(!v || pa_cvolume_compatible(v, &i->sample_spec));
1271 /* This basically calculates:
1273 * i->real_ratio := v
1274 * i->soft_volume := i->real_ratio * i->volume_factor */
1279 pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels);
1281 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1282 /* We don't copy the data to the thread_info data. That's left for someone else to do */
1285 /* Called from main or I/O context */
1286 pa_bool_t pa_sink_input_is_passthrough(pa_sink_input *i) {
1287 pa_sink_input_assert_ref(i);
1289 if (PA_UNLIKELY(!pa_format_info_is_pcm(i->format)))
1292 if (PA_UNLIKELY(i->flags & PA_SINK_INPUT_PASSTHROUGH))
1298 /* Called from main context */
1299 pa_bool_t pa_sink_input_is_volume_readable(pa_sink_input *i) {
1300 pa_sink_input_assert_ref(i);
1301 pa_assert_ctl_context();
1303 return !pa_sink_input_is_passthrough(i);
1306 /* Called from main context */
1307 pa_cvolume *pa_sink_input_get_volume(pa_sink_input *i, pa_cvolume *volume, pa_bool_t absolute) {
1308 pa_sink_input_assert_ref(i);
1309 pa_assert_ctl_context();
1310 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1311 pa_assert(pa_sink_input_is_volume_readable(i));
1313 if (absolute || !pa_sink_flat_volume_enabled(i->sink))
1314 *volume = i->volume;
1316 *volume = i->reference_ratio;
1321 /* Called from main context */
1322 void pa_sink_input_set_mute(pa_sink_input *i, pa_bool_t mute, pa_bool_t save) {
1323 pa_sink_input_assert_ref(i);
1324 pa_assert_ctl_context();
1325 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1327 if (!i->muted == !mute) {
1328 i->save_muted = i->save_muted || mute;
1333 i->save_muted = save;
1335 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE, NULL, 0, NULL) == 0);
1337 /* The mute status changed, let's tell people so */
1338 if (i->mute_changed)
1341 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1344 /* Called from main context */
1345 pa_bool_t pa_sink_input_get_mute(pa_sink_input *i) {
1346 pa_sink_input_assert_ref(i);
1347 pa_assert_ctl_context();
1348 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1353 /* Called from main thread */
1354 void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p) {
1355 pa_sink_input_assert_ref(i);
1356 pa_assert_ctl_context();
1359 pa_proplist_update(i->proplist, mode, p);
1361 if (PA_SINK_INPUT_IS_LINKED(i->state)) {
1362 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
1363 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1367 static void pa_sink_input_cork_really(pa_sink_input *i, pa_bool_t b) {
1368 pa_sink_input_assert_ref(i);
1369 pa_assert_ctl_context();
1370 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1372 if (i->corked_internal == FALSE && i->corked == FALSE)
1377 sink_input_set_state(i, b ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING);
1380 /* Called from main context */
1381 void pa_sink_input_cork(pa_sink_input *i, pa_bool_t b) {
1382 pa_sink_input_assert_ref(i);
1383 pa_assert_ctl_context();
1384 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1388 pa_sink_input_cork_really(i, b);
1391 void pa_sink_input_cork_internal(pa_sink_input *i, pa_bool_t b) {
1392 pa_sink_input_assert_ref(i);
1393 pa_assert_ctl_context();
1394 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1396 i->corked_internal = b;
1398 pa_sink_input_cork_really(i, b);
1401 /* Called from main context */
1402 int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate) {
1403 pa_sink_input_assert_ref(i);
1404 pa_assert_ctl_context();
1405 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1406 pa_return_val_if_fail(i->thread_info.resampler, -PA_ERR_BADSTATE);
1408 if (i->sample_spec.rate == rate)
1411 i->sample_spec.rate = rate;
1413 pa_asyncmsgq_post(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), 0, NULL, NULL);
1415 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1419 /* Called from main context */
1420 void pa_sink_input_set_name(pa_sink_input *i, const char *name) {
1422 pa_sink_input_assert_ref(i);
1423 pa_assert_ctl_context();
1425 if (!name && !pa_proplist_contains(i->proplist, PA_PROP_MEDIA_NAME))
1428 old = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME);
1430 if (old && name && pa_streq(old, name))
1434 pa_proplist_sets(i->proplist, PA_PROP_MEDIA_NAME, name);
1436 pa_proplist_unset(i->proplist, PA_PROP_MEDIA_NAME);
1438 if (PA_SINK_INPUT_IS_LINKED(i->state)) {
1439 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
1440 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1444 /* Called from main context */
1445 pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i) {
1446 pa_sink_input_assert_ref(i);
1447 pa_assert_ctl_context();
1449 return i->actual_resample_method;
1452 /* Called from main context */
1453 pa_bool_t pa_sink_input_may_move(pa_sink_input *i) {
1454 pa_sink_input_assert_ref(i);
1455 pa_assert_ctl_context();
1456 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1458 if (i->flags & PA_SINK_INPUT_DONT_MOVE)
1461 if (i->sync_next || i->sync_prev) {
1462 pa_log_warn("Moving synchronized streams not supported.");
1469 static pa_bool_t find_filter_sink_input(pa_sink_input *target, pa_sink *s) {
1471 while (s && s->input_to_master) {
1472 if (s->input_to_master == target)
1474 s = s->input_to_master->sink;
1475 pa_assert(i++ < 100);
1480 /* Called from main context */
1481 pa_bool_t pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest) {
1482 pa_sink_input_assert_ref(i);
1483 pa_assert_ctl_context();
1484 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1485 pa_sink_assert_ref(dest);
1487 if (dest == i->sink)
1490 if (!pa_sink_input_may_move(i))
1493 /* Make sure we're not creating a filter sink cycle */
1494 if (find_filter_sink_input(i, dest)) {
1495 pa_log_debug("Can't connect input to %s, as that would create a cycle.", dest->name);
1499 if (pa_idxset_size(dest->inputs) >= PA_MAX_INPUTS_PER_SINK) {
1500 pa_log_warn("Failed to move sink input: too many inputs per sink.");
1504 if (check_passthrough_connection(pa_sink_input_is_passthrough(i), dest) < 0)
1508 if (!i->may_move_to(i, dest))
1514 /* Called from main context */
1515 int pa_sink_input_start_move(pa_sink_input *i) {
1516 pa_source_output *o, *p = NULL;
1519 pa_sink_input_assert_ref(i);
1520 pa_assert_ctl_context();
1521 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1524 if (!pa_sink_input_may_move(i))
1525 return -PA_ERR_NOTSUPPORTED;
1527 if ((r = pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], i)) < 0)
1530 /* Kill directly connected outputs */
1531 while ((o = pa_idxset_first(i->direct_outputs, NULL))) {
1533 pa_source_output_kill(o);
1536 pa_assert(pa_idxset_isempty(i->direct_outputs));
1538 pa_idxset_remove_by_data(i->sink->inputs, i, NULL);
1540 if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
1541 pa_assert_se(i->sink->n_corked-- >= 1);
1543 if (pa_sink_input_is_passthrough(i))
1544 pa_sink_leave_passthrough(i->sink);
1546 if (pa_sink_flat_volume_enabled(i->sink))
1547 /* We might need to update the sink's volume if we are in flat
1549 pa_sink_set_volume(i->sink, NULL, FALSE, FALSE);
1551 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_START_MOVE, i, 0, NULL) == 0);
1553 pa_sink_update_status(i->sink);
1554 pa_cvolume_remap(&i->volume_factor_sink, &i->sink->channel_map, &i->channel_map);
1557 pa_sink_input_unref(i);
1562 /* Called from main context. If i has an origin sink that uses volume sharing,
1563 * then also the origin sink and all streams connected to it need to update
1564 * their volume - this function does all that by using recursion. */
1565 static void update_volume_due_to_moving(pa_sink_input *i, pa_sink *dest) {
1566 pa_cvolume old_volume;
1570 pa_assert(i->sink); /* The destination sink should already be set. */
1572 if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) {
1573 pa_sink *root_sink = pa_sink_get_master(i->sink);
1574 pa_sink_input *origin_sink_input;
1577 if (PA_UNLIKELY(!root_sink))
1580 if (pa_sink_flat_volume_enabled(i->sink)) {
1581 /* Ok, so the origin sink uses volume sharing, and flat volume is
1582 * enabled. The volume will have to be updated as follows:
1584 * i->volume := i->sink->real_volume
1585 * (handled later by pa_sink_set_volume)
1586 * i->reference_ratio := i->volume / i->sink->reference_volume
1587 * (handled later by pa_sink_set_volume)
1588 * i->real_ratio stays unchanged
1589 * (streams whose origin sink uses volume sharing should
1590 * always have real_ratio of 0 dB)
1591 * i->soft_volume stays unchanged
1592 * (streams whose origin sink uses volume sharing should
1593 * always have volume_factor as soft_volume, so no change
1594 * should be needed) */
1596 pa_assert(pa_cvolume_is_norm(&i->real_ratio));
1597 pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor));
1599 /* Notifications will be sent by pa_sink_set_volume(). */
1602 /* Ok, so the origin sink uses volume sharing, and flat volume is
1603 * disabled. The volume will have to be updated as follows:
1606 * i->reference_ratio := 0 dB
1607 * i->real_ratio stays unchanged
1608 * (streams whose origin sink uses volume sharing should
1609 * always have real_ratio of 0 dB)
1610 * i->soft_volume stays unchanged
1611 * (streams whose origin sink uses volume sharing should
1612 * always have volume_factor as soft_volume, so no change
1613 * should be needed) */
1615 old_volume = i->volume;
1616 pa_cvolume_reset(&i->volume, i->volume.channels);
1617 pa_cvolume_reset(&i->reference_ratio, i->reference_ratio.channels);
1618 pa_assert(pa_cvolume_is_norm(&i->real_ratio));
1619 pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor));
1621 /* Notify others about the changed sink input volume. */
1622 if (!pa_cvolume_equal(&i->volume, &old_volume)) {
1623 if (i->volume_changed)
1624 i->volume_changed(i);
1626 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1630 /* Additionally, the origin sink volume needs updating:
1632 * i->origin_sink->reference_volume := root_sink->reference_volume
1633 * i->origin_sink->real_volume := root_sink->real_volume
1634 * i->origin_sink->soft_volume stays unchanged
1635 * (sinks that use volume sharing should always have
1636 * soft_volume of 0 dB) */
1638 old_volume = i->origin_sink->reference_volume;
1640 i->origin_sink->reference_volume = root_sink->reference_volume;
1641 pa_cvolume_remap(&i->origin_sink->reference_volume, &root_sink->channel_map, &i->origin_sink->channel_map);
1643 i->origin_sink->real_volume = root_sink->real_volume;
1644 pa_cvolume_remap(&i->origin_sink->real_volume, &root_sink->channel_map, &i->origin_sink->channel_map);
1646 pa_assert(pa_cvolume_is_norm(&i->origin_sink->soft_volume));
1648 /* Notify others about the changed sink volume. If you wonder whether
1649 * i->origin_sink->set_volume() should be called somewhere, that's not
1650 * the case, because sinks that use volume sharing shouldn't have any
1651 * internal volume that set_volume() would update. If you wonder
1652 * whether the thread_info variables should be synced, yes, they
1653 * should, and it's done by the PA_SINK_MESSAGE_FINISH_MOVE message
1655 if (!pa_cvolume_equal(&i->origin_sink->reference_volume, &old_volume))
1656 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, i->origin_sink->index);
1658 /* Recursively update origin sink inputs. */
1659 PA_IDXSET_FOREACH(origin_sink_input, i->origin_sink->inputs, idx)
1660 update_volume_due_to_moving(origin_sink_input, dest);
1663 old_volume = i->volume;
1665 if (pa_sink_flat_volume_enabled(i->sink)) {
1666 /* Ok, so this is a regular stream, and flat volume is enabled. The
1667 * volume will have to be updated as follows:
1669 * i->volume := i->reference_ratio * i->sink->reference_volume
1670 * i->reference_ratio stays unchanged
1671 * i->real_ratio := i->volume / i->sink->real_volume
1672 * (handled later by pa_sink_set_volume)
1673 * i->soft_volume := i->real_ratio * i->volume_factor
1674 * (handled later by pa_sink_set_volume) */
1676 i->volume = i->sink->reference_volume;
1677 pa_cvolume_remap(&i->volume, &i->sink->channel_map, &i->channel_map);
1678 pa_sw_cvolume_multiply(&i->volume, &i->volume, &i->reference_ratio);
1681 /* Ok, so this is a regular stream, and flat volume is disabled.
1682 * The volume will have to be updated as follows:
1684 * i->volume := i->reference_ratio
1685 * i->reference_ratio stays unchanged
1686 * i->real_ratio := i->reference_ratio
1687 * i->soft_volume := i->real_ratio * i->volume_factor */
1689 i->volume = i->reference_ratio;
1690 i->real_ratio = i->reference_ratio;
1691 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor);
1694 /* Notify others about the changed sink input volume. */
1695 if (!pa_cvolume_equal(&i->volume, &old_volume)) {
1696 /* XXX: In case i->sink has flat volume enabled, then real_ratio
1697 * and soft_volume are not updated yet. Let's hope that the
1698 * callback implementation doesn't care about those variables... */
1699 if (i->volume_changed)
1700 i->volume_changed(i);
1702 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1706 /* If i->sink == dest, then recursion has finished, and we can finally call
1707 * pa_sink_set_volume(), which will do the rest of the updates. */
1708 if ((i->sink == dest) && pa_sink_flat_volume_enabled(i->sink))
1709 pa_sink_set_volume(i->sink, NULL, FALSE, i->save_volume);
1712 /* Called from main context */
1713 int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
1714 pa_sink_input_assert_ref(i);
1715 pa_assert_ctl_context();
1716 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1717 pa_assert(!i->sink);
1718 pa_sink_assert_ref(dest);
1720 if (!pa_sink_input_may_move_to(i, dest))
1721 return -PA_ERR_NOTSUPPORTED;
1723 if (pa_sink_input_is_passthrough(i) && !pa_sink_check_format(dest, i->format)) {
1724 pa_proplist *p = pa_proplist_new();
1725 pa_log_debug("New sink doesn't support stream format, sending format-changed and killing");
1726 /* Tell the client what device we want to be on if it is going to
1728 pa_proplist_sets(p, "device", dest->name);
1729 pa_sink_input_send_event(i, PA_STREAM_EVENT_FORMAT_LOST, p);
1730 pa_proplist_free(p);
1731 return -PA_ERR_NOTSUPPORTED;
1734 if (!(i->flags & PA_SINK_INPUT_VARIABLE_RATE) &&
1735 !pa_sample_spec_equal(&i->sample_spec, &dest->sample_spec)) {
1736 /* try to change dest sink rate if possible without glitches.
1737 module-suspend-on-idle resumes destination sink with
1738 SINK_INPUT_MOVE_FINISH hook */
1740 pa_log_info("Trying to change sample rate");
1741 if (pa_sink_update_rate(dest, i->sample_spec.rate, pa_sink_input_is_passthrough(i)) == TRUE)
1742 pa_log_info("Rate changed to %u Hz",
1743 dest->sample_spec.rate);
1745 pa_log_info("Resampling enabled to %u Hz",
1746 dest->sample_spec.rate);
1753 i->save_sink = save;
1754 pa_idxset_put(dest->inputs, pa_sink_input_ref(i), NULL);
1756 pa_cvolume_remap(&i->volume_factor_sink, &i->channel_map, &i->sink->channel_map);
1758 if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
1759 i->sink->n_corked++;
1761 pa_sink_input_update_rate(i);
1763 pa_sink_update_status(dest);
1765 update_volume_due_to_moving(i, dest);
1767 if (pa_sink_input_is_passthrough(i))
1768 pa_sink_enter_passthrough(i->sink);
1770 pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_FINISH_MOVE, i, 0, NULL) == 0);
1772 pa_log_debug("Successfully moved sink input %i to %s.", i->index, dest->name);
1774 /* Notify everyone */
1775 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], i);
1776 pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
1781 /* Called from main context */
1782 void pa_sink_input_fail_move(pa_sink_input *i) {
1784 pa_sink_input_assert_ref(i);
1785 pa_assert_ctl_context();
1786 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1787 pa_assert(!i->sink);
1789 /* Check if someone wants this sink input? */
1790 if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FAIL], i) == PA_HOOK_STOP)
1796 pa_sink_input_kill(i);
1799 /* Called from main context */
1800 int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
1803 pa_sink_input_assert_ref(i);
1804 pa_assert_ctl_context();
1805 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
1807 pa_sink_assert_ref(dest);
1809 if (dest == i->sink)
1812 if (!pa_sink_input_may_move_to(i, dest))
1813 return -PA_ERR_NOTSUPPORTED;
1815 pa_sink_input_ref(i);
1817 if ((r = pa_sink_input_start_move(i)) < 0) {
1818 pa_sink_input_unref(i);
1822 if ((r = pa_sink_input_finish_move(i, dest, save)) < 0) {
1823 pa_sink_input_fail_move(i);
1824 pa_sink_input_unref(i);
1828 pa_sink_input_unref(i);
1833 /* Called from IO thread context */
1834 void pa_sink_input_set_state_within_thread(pa_sink_input *i, pa_sink_input_state_t state) {
1835 pa_bool_t corking, uncorking;
1837 pa_sink_input_assert_ref(i);
1838 pa_sink_input_assert_io_context(i);
1840 if (state == i->thread_info.state)
1843 if ((state == PA_SINK_INPUT_DRAINED || state == PA_SINK_INPUT_RUNNING) &&
1844 !(i->thread_info.state == PA_SINK_INPUT_DRAINED || i->thread_info.state != PA_SINK_INPUT_RUNNING))
1845 pa_atomic_store(&i->thread_info.drained, 1);
1847 corking = state == PA_SINK_INPUT_CORKED && i->thread_info.state == PA_SINK_INPUT_RUNNING;
1848 uncorking = i->thread_info.state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING;
1850 if (i->state_change)
1851 i->state_change(i, state);
1855 pa_log_debug("Requesting rewind due to corking");
1857 /* This will tell the implementing sink input driver to rewind
1858 * so that the unplayed already mixed data is not lost */
1859 pa_sink_input_request_rewind(i, 0, TRUE, TRUE, FALSE);
1861 /* Set the corked state *after* requesting rewind */
1862 i->thread_info.state = state;
1864 } else if (uncorking) {
1866 pa_log_debug("Requesting rewind due to uncorking");
1868 i->thread_info.underrun_for = (uint64_t) -1;
1869 i->thread_info.playing_for = 0;
1871 /* Set the uncorked state *before* requesting rewind */
1872 i->thread_info.state = state;
1874 /* OK, we're being uncorked. Make sure we're not rewound when
1875 * the hw buffer is remixed and request a remix. */
1876 pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE);
1878 /* We may not be corking or uncorking, but we still need to set the state. */
1879 i->thread_info.state = state;
1882 /* Called from thread context, except when it is not. */
1883 int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
1884 pa_sink_input *i = PA_SINK_INPUT(o);
1885 pa_sink_input_assert_ref(i);
1889 case PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME:
1890 if (!pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume)) {
1891 i->thread_info.soft_volume = i->soft_volume;
1892 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
1896 case PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP:
1897 /* we have ongoing ramp where we take current start values */
1898 pa_cvolume_ramp_start_from(&i->thread_info.ramp, &i->ramp);
1899 i->thread_info.ramp = i->ramp;
1902 case PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE:
1903 if (i->thread_info.muted != i->muted) {
1904 i->thread_info.muted = i->muted;
1905 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
1909 case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
1910 pa_usec_t *r = userdata;
1912 r[0] += pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sample_spec);
1913 r[1] += pa_sink_get_latency_within_thread(i->sink);
1918 case PA_SINK_INPUT_MESSAGE_SET_RATE:
1920 i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
1921 pa_resampler_set_input_rate(i->thread_info.resampler, PA_PTR_TO_UINT(userdata));
1925 case PA_SINK_INPUT_MESSAGE_SET_STATE: {
1926 pa_sink_input *ssync;
1928 pa_sink_input_set_state_within_thread(i, PA_PTR_TO_UINT(userdata));
1930 for (ssync = i->thread_info.sync_prev; ssync; ssync = ssync->thread_info.sync_prev)
1931 pa_sink_input_set_state_within_thread(ssync, PA_PTR_TO_UINT(userdata));
1933 for (ssync = i->thread_info.sync_next; ssync; ssync = ssync->thread_info.sync_next)
1934 pa_sink_input_set_state_within_thread(ssync, PA_PTR_TO_UINT(userdata));
1939 case PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY: {
1940 pa_usec_t *usec = userdata;
1942 *usec = pa_sink_input_set_requested_latency_within_thread(i, *usec);
1946 case PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY: {
1947 pa_usec_t *r = userdata;
1949 *r = i->thread_info.requested_sink_latency;
1954 return -PA_ERR_NOTIMPLEMENTED;
1957 /* Called from main thread */
1958 pa_sink_input_state_t pa_sink_input_get_state(pa_sink_input *i) {
1959 pa_sink_input_assert_ref(i);
1960 pa_assert_ctl_context();
1962 if (i->state == PA_SINK_INPUT_RUNNING || i->state == PA_SINK_INPUT_DRAINED)
1963 return pa_atomic_load(&i->thread_info.drained) ? PA_SINK_INPUT_DRAINED : PA_SINK_INPUT_RUNNING;
1968 /* Called from IO context */
1969 pa_bool_t pa_sink_input_safe_to_remove(pa_sink_input *i) {
1970 pa_sink_input_assert_ref(i);
1971 pa_sink_input_assert_io_context(i);
1973 if (PA_SINK_INPUT_IS_LINKED(i->thread_info.state))
1974 return pa_memblockq_is_empty(i->thread_info.render_memblockq);
1979 /* Called from IO context */
1980 void pa_sink_input_request_rewind(
1982 size_t nbytes /* in our sample spec */,
1985 pa_bool_t dont_rewind_render) {
1989 /* If 'rewrite' is TRUE the sink is rewound as far as requested
1990 * and possible and the exact value of this is passed back the
1991 * implementor via process_rewind(). If 'flush' is also TRUE all
1992 * already rendered data is also dropped.
1994 * If 'rewrite' is FALSE the sink is rewound as far as requested
1995 * and possible and the already rendered data is dropped so that
1996 * in the next iteration we read new data from the
1997 * implementor. This implies 'flush' is TRUE. If
1998 * dont_rewind_render is TRUE then the render memblockq is not
2001 /* nbytes = 0 means maximum rewind request */
2003 pa_sink_input_assert_ref(i);
2004 pa_sink_input_assert_io_context(i);
2005 pa_assert(rewrite || flush);
2006 pa_assert(!dont_rewind_render || !rewrite);
2008 /* We don't take rewind requests while we are corked */
2009 if (i->thread_info.state == PA_SINK_INPUT_CORKED)
2012 nbytes = PA_MAX(i->thread_info.rewrite_nbytes, nbytes);
2014 #ifdef SINK_INPUT_DEBUG
2015 pa_log_debug("request rewrite %zu", nbytes);
2018 /* Calculate how much we can rewind locally without having to
2021 lbq = pa_memblockq_get_length(i->thread_info.render_memblockq);
2025 /* Check if rewinding for the maximum is requested, and if so, fix up */
2028 /* Calculate maximum number of bytes that could be rewound in theory */
2029 nbytes = i->sink->thread_info.max_rewind + lbq;
2031 /* Transform from sink domain */
2032 if (i->thread_info.resampler)
2033 nbytes = pa_resampler_request(i->thread_info.resampler, nbytes);
2036 /* Remember how much we actually want to rewrite */
2037 if (i->thread_info.rewrite_nbytes != (size_t) -1) {
2039 /* Make sure to not overwrite over underruns */
2040 if (nbytes > i->thread_info.playing_for)
2041 nbytes = (size_t) i->thread_info.playing_for;
2043 i->thread_info.rewrite_nbytes = nbytes;
2045 i->thread_info.rewrite_nbytes = (size_t) -1;
2048 i->thread_info.rewrite_flush =
2049 i->thread_info.rewrite_flush ||
2050 (flush && i->thread_info.rewrite_nbytes != 0);
2052 i->thread_info.dont_rewind_render =
2053 i->thread_info.dont_rewind_render ||
2056 if (nbytes != (size_t) -1) {
2058 /* Transform to sink domain */
2059 if (i->thread_info.resampler)
2060 nbytes = pa_resampler_result(i->thread_info.resampler, nbytes);
2063 pa_sink_request_rewind(i->sink, nbytes - lbq);
2065 /* This call will make sure process_rewind() is called later */
2066 pa_sink_request_rewind(i->sink, 0);
2070 /* Called from main context */
2071 pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, pa_memchunk *ret) {
2072 pa_sink_input_assert_ref(i);
2073 pa_assert_ctl_context();
2076 /* FIXME: Shouldn't access resampler object from main context! */
2078 pa_silence_memchunk_get(
2079 &i->core->silence_cache,
2083 i->thread_info.resampler ? pa_resampler_max_block_size(i->thread_info.resampler) : 0);
2088 /* Called from main context */
2089 void pa_sink_input_send_event(pa_sink_input *i, const char *event, pa_proplist *data) {
2090 pa_proplist *pl = NULL;
2091 pa_sink_input_send_event_hook_data hook_data;
2093 pa_sink_input_assert_ref(i);
2094 pa_assert_ctl_context();
2101 data = pl = pa_proplist_new();
2103 hook_data.sink_input = i;
2104 hook_data.data = data;
2105 hook_data.event = event;
2107 if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT], &hook_data) < 0)
2110 i->send_event(i, event, data);
2114 pa_proplist_free(pl);
2117 /* Called from main context */
2118 /* Updates the sink input's resampler with whatever the current sink requires
2119 * -- useful when the underlying sink's rate might have changed */
2120 int pa_sink_input_update_rate(pa_sink_input *i) {
2121 pa_resampler *new_resampler;
2122 char *memblockq_name;
2124 pa_sink_input_assert_ref(i);
2125 pa_assert_ctl_context();
2127 if (i->thread_info.resampler &&
2128 pa_sample_spec_equal(pa_resampler_output_sample_spec(i->thread_info.resampler), &i->sink->sample_spec) &&
2129 pa_channel_map_equal(pa_resampler_output_channel_map(i->thread_info.resampler), &i->sink->channel_map))
2131 new_resampler = i->thread_info.resampler;
2133 else if (!pa_sink_input_is_passthrough(i) &&
2134 ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ||
2135 !pa_sample_spec_equal(&i->sample_spec, &i->sink->sample_spec) ||
2136 !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map))) {
2138 new_resampler = pa_resampler_new(i->core->mempool,
2139 &i->sample_spec, &i->channel_map,
2140 &i->sink->sample_spec, &i->sink->channel_map,
2141 i->requested_resample_method,
2142 ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
2143 ((i->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
2144 (i->core->disable_remixing || (i->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0));
2146 if (!new_resampler) {
2147 pa_log_warn("Unsupported resampling operation.");
2148 return -PA_ERR_NOTSUPPORTED;
2151 new_resampler = NULL;
2153 if (new_resampler == i->thread_info.resampler)
2156 if (i->thread_info.resampler)
2157 pa_resampler_free(i->thread_info.resampler);
2159 i->thread_info.resampler = new_resampler;
2161 pa_memblockq_free(i->thread_info.render_memblockq);
2163 memblockq_name = pa_sprintf_malloc("sink input render_memblockq [%u]", i->index);
2164 i->thread_info.render_memblockq = pa_memblockq_new(
2167 MEMBLOCKQ_MAXLENGTH,
2169 &i->sink->sample_spec,
2174 pa_xfree(memblockq_name);
2176 i->actual_resample_method = new_resampler ? pa_resampler_get_method(new_resampler) : PA_RESAMPLER_INVALID;
2178 pa_log_debug("Updated resampler for sink input %d", i->index);