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/mix.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 struct volume_factor_entry
{
56 static struct volume_factor_entry
*volume_factor_entry_new(const char *key
, const pa_cvolume
*volume
) {
57 struct volume_factor_entry
*entry
;
62 entry
= pa_xnew(struct volume_factor_entry
, 1);
63 entry
->key
= pa_xstrdup(key
);
65 entry
->volume
= *volume
;
70 static void volume_factor_entry_free(struct volume_factor_entry
*volume_entry
) {
71 pa_assert(volume_entry
);
73 pa_xfree(volume_entry
->key
);
74 pa_xfree(volume_entry
);
77 static void volume_factor_from_hashmap(pa_cvolume
*v
, pa_hashmap
*items
, uint8_t channels
) {
78 struct volume_factor_entry
*entry
;
81 pa_cvolume_reset(v
, channels
);
82 PA_HASHMAP_FOREACH(entry
, items
, state
)
83 pa_sw_cvolume_multiply(v
, v
, &entry
->volume
);
86 static void sink_input_free(pa_object
*o
);
87 static void set_real_ratio(pa_sink_input
*i
, const pa_cvolume
*v
);
89 static int check_passthrough_connection(bool passthrough
, pa_sink
*dest
) {
90 if (pa_sink_is_passthrough(dest
)) {
91 pa_log_warn("Sink is already connected to PASSTHROUGH input");
95 /* If current input(s) exist, check new input is not PASSTHROUGH */
96 if (pa_idxset_size(dest
->inputs
) > 0 && passthrough
) {
97 pa_log_warn("Sink is already connected, cannot accept new PASSTHROUGH INPUT");
104 pa_sink_input_new_data
* pa_sink_input_new_data_init(pa_sink_input_new_data
*data
) {
108 data
->resample_method
= PA_RESAMPLER_INVALID
;
109 data
->proplist
= pa_proplist_new();
110 data
->volume_writable
= true;
112 data
->volume_factor_items
= pa_hashmap_new_full(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
, NULL
,
113 (pa_free_cb_t
) volume_factor_entry_free
);
114 data
->volume_factor_sink_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
);
120 void pa_sink_input_new_data_set_sample_spec(pa_sink_input_new_data
*data
, const pa_sample_spec
*spec
) {
123 if ((data
->sample_spec_is_set
= !!spec
))
124 data
->sample_spec
= *spec
;
127 void pa_sink_input_new_data_set_channel_map(pa_sink_input_new_data
*data
, const pa_channel_map
*map
) {
130 if ((data
->channel_map_is_set
= !!map
))
131 data
->channel_map
= *map
;
134 bool pa_sink_input_new_data_is_passthrough(pa_sink_input_new_data
*data
) {
137 if (PA_LIKELY(data
->format
) && PA_UNLIKELY(!pa_format_info_is_pcm(data
->format
)))
140 if (PA_UNLIKELY(data
->flags
& PA_SINK_INPUT_PASSTHROUGH
))
146 void pa_sink_input_new_data_set_volume(pa_sink_input_new_data
*data
, const pa_cvolume
*volume
) {
148 pa_assert(data
->volume_writable
);
150 if ((data
->volume_is_set
= !!volume
))
151 data
->volume
= *volume
;
154 void pa_sink_input_new_data_add_volume_factor(pa_sink_input_new_data
*data
, const char *key
, const pa_cvolume
*volume_factor
) {
155 struct volume_factor_entry
*v
;
159 pa_assert(volume_factor
);
161 v
= volume_factor_entry_new(key
, volume_factor
);
162 pa_assert_se(pa_hashmap_put(data
->volume_factor_items
, v
->key
, v
) >= 0);
165 void pa_sink_input_new_data_add_volume_factor_sink(pa_sink_input_new_data
*data
, const char *key
, const pa_cvolume
*volume_factor
) {
166 struct volume_factor_entry
*v
;
170 pa_assert(volume_factor
);
172 v
= volume_factor_entry_new(key
, volume_factor
);
173 pa_assert_se(pa_hashmap_put(data
->volume_factor_sink_items
, v
->key
, v
) >= 0);
176 void pa_sink_input_new_data_set_muted(pa_sink_input_new_data
*data
, bool mute
) {
179 data
->muted_is_set
= true;
180 data
->muted
= !!mute
;
183 bool pa_sink_input_new_data_set_sink(pa_sink_input_new_data
*data
, pa_sink
*s
, bool save
) {
185 pa_idxset
*formats
= NULL
;
190 if (!data
->req_formats
) {
191 /* We're not working with the extended API */
193 data
->save_sink
= save
;
195 /* Extended API: let's see if this sink supports the formats the client can provide */
196 formats
= pa_sink_check_formats(s
, data
->req_formats
);
198 if (formats
&& !pa_idxset_isempty(formats
)) {
199 /* Sink supports at least one of the requested formats */
201 data
->save_sink
= save
;
202 if (data
->nego_formats
)
203 pa_idxset_free(data
->nego_formats
, (pa_free_cb_t
) pa_format_info_free
);
204 data
->nego_formats
= formats
;
206 /* Sink doesn't support any of the formats requested by the client */
208 pa_idxset_free(formats
, (pa_free_cb_t
) pa_format_info_free
);
216 bool pa_sink_input_new_data_set_formats(pa_sink_input_new_data
*data
, pa_idxset
*formats
) {
220 if (data
->req_formats
)
221 pa_idxset_free(data
->req_formats
, (pa_free_cb_t
) pa_format_info_free
);
223 data
->req_formats
= formats
;
226 /* Trigger format negotiation */
227 return pa_sink_input_new_data_set_sink(data
, data
->sink
, data
->save_sink
);
233 void pa_sink_input_new_data_done(pa_sink_input_new_data
*data
) {
236 if (data
->req_formats
)
237 pa_idxset_free(data
->req_formats
, (pa_free_cb_t
) pa_format_info_free
);
239 if (data
->nego_formats
)
240 pa_idxset_free(data
->nego_formats
, (pa_free_cb_t
) pa_format_info_free
);
243 pa_format_info_free(data
->format
);
245 if (data
->volume_factor_items
)
246 pa_hashmap_free(data
->volume_factor_items
);
248 if (data
->volume_factor_sink_items
)
249 pa_hashmap_free(data
->volume_factor_sink_items
);
251 pa_proplist_free(data
->proplist
);
254 /* Called from main context */
255 static void reset_callbacks(pa_sink_input
*i
) {
259 i
->process_underrun
= NULL
;
260 i
->process_rewind
= NULL
;
261 i
->update_max_rewind
= NULL
;
262 i
->update_max_request
= NULL
;
263 i
->update_sink_requested_latency
= NULL
;
264 i
->update_sink_latency_range
= NULL
;
265 i
->update_sink_fixed_latency
= NULL
;
269 i
->suspend_within_thread
= NULL
;
272 i
->get_latency
= NULL
;
273 i
->state_change
= NULL
;
274 i
->may_move_to
= NULL
;
275 i
->send_event
= NULL
;
276 i
->volume_changed
= NULL
;
277 i
->mute_changed
= NULL
;
280 /* Called from main context */
281 int pa_sink_input_new(
284 pa_sink_input_new_data
*data
) {
287 pa_resampler
*resampler
= NULL
;
288 char st
[PA_SAMPLE_SPEC_SNPRINT_MAX
], cm
[PA_CHANNEL_MAP_SNPRINT_MAX
], fmt
[PA_FORMAT_INFO_SNPRINT_MAX
];
289 pa_channel_map original_cm
;
292 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. */
311 pa_idxset
*tmp
= pa_idxset_new(NULL
, NULL
);
312 pa_format_info
*f
= pa_format_info_from_sample_spec(&data
->sample_spec
,
313 data
->channel_map_is_set
? &data
->channel_map
: NULL
);
314 pa_idxset_put(tmp
, f
, NULL
);
315 pa_sink_input_new_data_set_formats(data
, tmp
);
318 if ((r
= pa_hook_fire(&core
->hooks
[PA_CORE_HOOK_SINK_INPUT_NEW
], data
)) < 0)
321 pa_return_val_if_fail(!data
->driver
|| pa_utf8_valid(data
->driver
), -PA_ERR_INVALID
);
324 pa_sink
*sink
= pa_namereg_get(core
, NULL
, PA_NAMEREG_SINK
);
325 pa_return_val_if_fail(sink
, -PA_ERR_NOENTITY
);
326 pa_sink_input_new_data_set_sink(data
, sink
, false);
329 pa_return_val_if_fail(PA_SINK_IS_LINKED(pa_sink_get_state(data
->sink
)), -PA_ERR_BADSTATE
);
330 pa_return_val_if_fail(!data
->sync_base
|| (data
->sync_base
->sink
== data
->sink
331 && pa_sink_input_get_state(data
->sync_base
) == PA_SINK_INPUT_CORKED
),
334 /* Routing's done, we have a sink. Now let's fix the format. */
336 /* If something didn't pick a format for us, pick the top-most format since
337 * we assume this is sorted in priority order */
338 if (!data
->format
&& data
->nego_formats
&& !pa_idxset_isempty(data
->nego_formats
))
339 data
->format
= pa_format_info_copy(pa_idxset_first(data
->nego_formats
, NULL
));
341 if (PA_LIKELY(data
->format
)) {
342 pa_log_debug("Negotiated format: %s", pa_format_info_snprint(fmt
, sizeof(fmt
), data
->format
));
344 pa_format_info
*format
;
347 pa_log_info("Sink does not support any requested format:");
348 PA_IDXSET_FOREACH(format
, data
->req_formats
, idx
)
349 pa_log_info(" -- %s", pa_format_info_snprint(fmt
, sizeof(fmt
), format
));
351 return -PA_ERR_NOTSUPPORTED
;
354 /* Now populate the sample spec and format according to the final
355 * format that we've negotiated */
356 pa_return_val_if_fail(pa_format_info_to_sample_spec(data
->format
, &ss
, &map
) == 0, -PA_ERR_INVALID
);
357 pa_sink_input_new_data_set_sample_spec(data
, &ss
);
358 if (pa_format_info_is_pcm(data
->format
) && pa_channel_map_valid(&map
))
359 pa_sink_input_new_data_set_channel_map(data
, &map
);
362 r
= check_passthrough_connection(pa_sink_input_new_data_is_passthrough(data
), data
->sink
);
366 if (!data
->sample_spec_is_set
)
367 data
->sample_spec
= data
->sink
->sample_spec
;
369 pa_return_val_if_fail(pa_sample_spec_valid(&data
->sample_spec
), -PA_ERR_INVALID
);
371 if (!data
->channel_map_is_set
) {
372 if (pa_channel_map_compatible(&data
->sink
->channel_map
, &data
->sample_spec
))
373 data
->channel_map
= data
->sink
->channel_map
;
375 pa_channel_map_init_extend(&data
->channel_map
, data
->sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
378 pa_return_val_if_fail(pa_channel_map_compatible(&data
->channel_map
, &data
->sample_spec
), -PA_ERR_INVALID
);
380 /* Don't restore (or save) stream volume for passthrough streams and
381 * prevent attenuation/gain */
382 if (pa_sink_input_new_data_is_passthrough(data
)) {
383 data
->volume_is_set
= true;
384 pa_cvolume_reset(&data
->volume
, data
->sample_spec
.channels
);
385 data
->volume_is_absolute
= true;
386 data
->save_volume
= false;
389 if (!data
->volume_is_set
) {
390 pa_cvolume_reset(&data
->volume
, data
->sample_spec
.channels
);
391 data
->volume_is_absolute
= false;
392 data
->save_volume
= false;
395 if (!data
->volume_writable
)
396 data
->save_volume
= false;
398 pa_return_val_if_fail(pa_cvolume_compatible(&data
->volume
, &data
->sample_spec
), -PA_ERR_INVALID
);
400 if (!data
->muted_is_set
)
403 if (data
->flags
& PA_SINK_INPUT_FIX_FORMAT
) {
404 pa_return_val_if_fail(pa_format_info_is_pcm(data
->format
), -PA_ERR_INVALID
);
405 data
->sample_spec
.format
= data
->sink
->sample_spec
.format
;
406 pa_format_info_set_sample_format(data
->format
, data
->sample_spec
.format
);
409 if (data
->flags
& PA_SINK_INPUT_FIX_RATE
) {
410 pa_return_val_if_fail(pa_format_info_is_pcm(data
->format
), -PA_ERR_INVALID
);
411 data
->sample_spec
.rate
= data
->sink
->sample_spec
.rate
;
412 pa_format_info_set_rate(data
->format
, data
->sample_spec
.rate
);
415 original_cm
= data
->channel_map
;
417 if (data
->flags
& PA_SINK_INPUT_FIX_CHANNELS
) {
418 pa_return_val_if_fail(pa_format_info_is_pcm(data
->format
), -PA_ERR_INVALID
);
419 data
->sample_spec
.channels
= data
->sink
->sample_spec
.channels
;
420 data
->channel_map
= data
->sink
->channel_map
;
421 pa_format_info_set_channels(data
->format
, data
->sample_spec
.channels
);
422 pa_format_info_set_channel_map(data
->format
, &data
->channel_map
);
425 pa_assert(pa_sample_spec_valid(&data
->sample_spec
));
426 pa_assert(pa_channel_map_valid(&data
->channel_map
));
428 if (!(data
->flags
& PA_SINK_INPUT_VARIABLE_RATE
) &&
429 !pa_sample_spec_equal(&data
->sample_spec
, &data
->sink
->sample_spec
)) {
430 /* try to change sink rate. This is done before the FIXATE hook since
431 module-suspend-on-idle can resume a sink */
433 pa_log_info("Trying to change sample rate");
434 if (pa_sink_update_rate(data
->sink
, data
->sample_spec
.rate
, pa_sink_input_new_data_is_passthrough(data
)) >= 0)
435 pa_log_info("Rate changed to %u Hz", data
->sink
->sample_spec
.rate
);
438 if (pa_sink_input_new_data_is_passthrough(data
) &&
439 !pa_sample_spec_equal(&data
->sample_spec
, &data
->sink
->sample_spec
)) {
440 /* rate update failed, or other parts of sample spec didn't match */
442 pa_log_debug("Could not update sink sample spec to match passthrough stream");
443 return -PA_ERR_NOTSUPPORTED
;
446 /* Due to the fixing of the sample spec the volume might not match anymore */
447 pa_cvolume_remap(&data
->volume
, &original_cm
, &data
->channel_map
);
449 if (data
->resample_method
== PA_RESAMPLER_INVALID
)
450 data
->resample_method
= core
->resample_method
;
452 pa_return_val_if_fail(data
->resample_method
< PA_RESAMPLER_MAX
, -PA_ERR_INVALID
);
454 if ((r
= pa_hook_fire(&core
->hooks
[PA_CORE_HOOK_SINK_INPUT_FIXATE
], data
)) < 0)
457 if ((data
->flags
& PA_SINK_INPUT_NO_CREATE_ON_SUSPEND
) &&
458 pa_sink_get_state(data
->sink
) == PA_SINK_SUSPENDED
) {
459 pa_log_warn("Failed to create sink input: sink is suspended.");
460 return -PA_ERR_BADSTATE
;
463 if (pa_idxset_size(data
->sink
->inputs
) >= PA_MAX_INPUTS_PER_SINK
) {
464 pa_log_warn("Failed to create sink input: too many inputs per sink.");
465 return -PA_ERR_TOOLARGE
;
468 if ((data
->flags
& PA_SINK_INPUT_VARIABLE_RATE
) ||
469 !pa_sample_spec_equal(&data
->sample_spec
, &data
->sink
->sample_spec
) ||
470 !pa_channel_map_equal(&data
->channel_map
, &data
->sink
->channel_map
)) {
472 /* Note: for passthrough content we need to adjust the output rate to that of the current sink-input */
473 if (!pa_sink_input_new_data_is_passthrough(data
)) /* no resampler for passthrough content */
474 if (!(resampler
= pa_resampler_new(
476 &data
->sample_spec
, &data
->channel_map
,
477 &data
->sink
->sample_spec
, &data
->sink
->channel_map
,
478 data
->resample_method
,
479 ((data
->flags
& PA_SINK_INPUT_VARIABLE_RATE
) ? PA_RESAMPLER_VARIABLE_RATE
: 0) |
480 ((data
->flags
& PA_SINK_INPUT_NO_REMAP
) ? PA_RESAMPLER_NO_REMAP
: 0) |
481 (core
->disable_remixing
|| (data
->flags
& PA_SINK_INPUT_NO_REMIX
) ? PA_RESAMPLER_NO_REMIX
: 0) |
482 (core
->disable_lfe_remixing
? PA_RESAMPLER_NO_LFE
: 0)))) {
483 pa_log_warn("Unsupported resampling operation.");
484 return -PA_ERR_NOTSUPPORTED
;
488 i
= pa_msgobject_new(pa_sink_input
);
489 i
->parent
.parent
.free
= sink_input_free
;
490 i
->parent
.process_msg
= pa_sink_input_process_msg
;
493 i
->state
= PA_SINK_INPUT_INIT
;
494 i
->flags
= data
->flags
;
495 i
->proplist
= pa_proplist_copy(data
->proplist
);
496 i
->driver
= pa_xstrdup(pa_path_get_filename(data
->driver
));
497 i
->module
= data
->module
;
498 i
->sink
= data
->sink
;
499 i
->origin_sink
= data
->origin_sink
;
500 i
->client
= data
->client
;
502 i
->requested_resample_method
= data
->resample_method
;
503 i
->actual_resample_method
= resampler
? pa_resampler_get_method(resampler
) : PA_RESAMPLER_INVALID
;
504 i
->sample_spec
= data
->sample_spec
;
505 i
->channel_map
= data
->channel_map
;
506 i
->format
= pa_format_info_copy(data
->format
);
508 if (!data
->volume_is_absolute
&& pa_sink_flat_volume_enabled(i
->sink
)) {
511 /* When the 'absolute' bool is not set then we'll treat the volume
512 * as relative to the sink volume even in flat volume mode */
513 remapped
= data
->sink
->reference_volume
;
514 pa_cvolume_remap(&remapped
, &data
->sink
->channel_map
, &data
->channel_map
);
515 pa_sw_cvolume_multiply(&i
->volume
, &data
->volume
, &remapped
);
517 i
->volume
= data
->volume
;
519 i
->volume_factor_items
= data
->volume_factor_items
;
520 data
->volume_factor_items
= NULL
;
521 volume_factor_from_hashmap(&i
->volume_factor
, i
->volume_factor_items
, i
->sample_spec
.channels
);
523 i
->volume_factor_sink_items
= data
->volume_factor_sink_items
;
524 data
->volume_factor_sink_items
= NULL
;
525 volume_factor_from_hashmap(&i
->volume_factor_sink
, i
->volume_factor_sink_items
, i
->sink
->sample_spec
.channels
);
527 i
->real_ratio
= i
->reference_ratio
= data
->volume
;
528 pa_cvolume_reset(&i
->soft_volume
, i
->sample_spec
.channels
);
529 pa_cvolume_reset(&i
->real_ratio
, i
->sample_spec
.channels
);
530 i
->volume_writable
= data
->volume_writable
;
531 i
->save_volume
= data
->save_volume
;
532 i
->save_sink
= data
->save_sink
;
533 i
->save_muted
= data
->save_muted
;
535 i
->muted
= data
->muted
;
537 if (data
->sync_base
) {
538 i
->sync_next
= data
->sync_base
->sync_next
;
539 i
->sync_prev
= data
->sync_base
;
541 if (data
->sync_base
->sync_next
)
542 data
->sync_base
->sync_next
->sync_prev
= i
;
543 data
->sync_base
->sync_next
= i
;
545 i
->sync_next
= i
->sync_prev
= NULL
;
547 i
->direct_outputs
= pa_idxset_new(NULL
, NULL
);
552 i
->thread_info
.state
= i
->state
;
553 i
->thread_info
.attached
= false;
554 pa_atomic_store(&i
->thread_info
.drained
, 1);
555 i
->thread_info
.sample_spec
= i
->sample_spec
;
556 i
->thread_info
.resampler
= resampler
;
557 i
->thread_info
.soft_volume
= i
->soft_volume
;
558 i
->thread_info
.muted
= i
->muted
;
559 i
->thread_info
.requested_sink_latency
= (pa_usec_t
) -1;
560 i
->thread_info
.rewrite_nbytes
= 0;
561 i
->thread_info
.rewrite_flush
= false;
562 i
->thread_info
.dont_rewind_render
= false;
563 i
->thread_info
.underrun_for
= (uint64_t) -1;
564 i
->thread_info
.underrun_for_sink
= 0;
565 i
->thread_info
.playing_for
= 0;
566 i
->thread_info
.direct_outputs
= pa_hashmap_new(pa_idxset_trivial_hash_func
, pa_idxset_trivial_compare_func
);
568 pa_assert_se(pa_idxset_put(core
->sink_inputs
, i
, &i
->index
) == 0);
569 pa_assert_se(pa_idxset_put(i
->sink
->inputs
, pa_sink_input_ref(i
), NULL
) == 0);
572 pa_assert_se(pa_idxset_put(i
->client
->sink_inputs
, i
, NULL
) >= 0);
574 memblockq_name
= pa_sprintf_malloc("sink input render_memblockq [%u]", i
->index
);
575 i
->thread_info
.render_memblockq
= pa_memblockq_new(
580 &i
->sink
->sample_spec
,
585 pa_xfree(memblockq_name
);
587 pt
= pa_proplist_to_string_sep(i
->proplist
, "\n ");
588 pa_log_info("Created input %u \"%s\" on %s with sample spec %s and channel map %s\n %s",
590 pa_strnull(pa_proplist_gets(i
->proplist
, PA_PROP_MEDIA_NAME
)),
592 pa_sample_spec_snprint(st
, sizeof(st
), &i
->sample_spec
),
593 pa_channel_map_snprint(cm
, sizeof(cm
), &i
->channel_map
),
597 /* Don't forget to call pa_sink_input_put! */
603 /* Called from main context */
604 static void update_n_corked(pa_sink_input
*i
, pa_sink_input_state_t state
) {
606 pa_assert_ctl_context();
611 if (i
->state
== PA_SINK_INPUT_CORKED
&& state
!= PA_SINK_INPUT_CORKED
)
612 pa_assert_se(i
->sink
->n_corked
-- >= 1);
613 else if (i
->state
!= PA_SINK_INPUT_CORKED
&& state
== PA_SINK_INPUT_CORKED
)
617 /* Called from main context */
618 static void sink_input_set_state(pa_sink_input
*i
, pa_sink_input_state_t state
) {
619 pa_sink_input
*ssync
;
621 pa_assert_ctl_context();
623 if (state
== PA_SINK_INPUT_DRAINED
)
624 state
= PA_SINK_INPUT_RUNNING
;
626 if (i
->state
== state
)
629 if (i
->state
== PA_SINK_INPUT_CORKED
&& state
== PA_SINK_INPUT_RUNNING
&& pa_sink_used_by(i
->sink
) == 0 &&
630 !pa_sample_spec_equal(&i
->sample_spec
, &i
->sink
->sample_spec
)) {
631 /* We were uncorked and the sink was not playing anything -- let's try
632 * to update the sample rate to avoid resampling */
633 pa_sink_update_rate(i
->sink
, i
->sample_spec
.rate
, pa_sink_input_is_passthrough(i
));
636 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);
638 update_n_corked(i
, state
);
641 for (ssync
= i
->sync_prev
; ssync
; ssync
= ssync
->sync_prev
) {
642 update_n_corked(ssync
, state
);
643 ssync
->state
= state
;
645 for (ssync
= i
->sync_next
; ssync
; ssync
= ssync
->sync_next
) {
646 update_n_corked(ssync
, state
);
647 ssync
->state
= state
;
650 if (state
!= PA_SINK_INPUT_UNLINKED
) {
651 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED
], i
);
653 for (ssync
= i
->sync_prev
; ssync
; ssync
= ssync
->sync_prev
)
654 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED
], ssync
);
656 for (ssync
= i
->sync_next
; ssync
; ssync
= ssync
->sync_next
)
657 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED
], ssync
);
659 if (PA_SINK_INPUT_IS_LINKED(state
))
660 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
663 pa_sink_update_status(i
->sink
);
666 /* Called from main context */
667 void pa_sink_input_unlink(pa_sink_input
*i
) {
669 pa_source_output
*o
, *p
= NULL
;
672 pa_assert_ctl_context();
674 /* See pa_sink_unlink() for a couple of comments how this function
677 pa_sink_input_ref(i
);
679 linked
= PA_SINK_INPUT_IS_LINKED(i
->state
);
682 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_UNLINK
], i
);
685 i
->sync_prev
->sync_next
= i
->sync_next
;
687 i
->sync_next
->sync_prev
= i
->sync_prev
;
689 i
->sync_prev
= i
->sync_next
= NULL
;
691 pa_idxset_remove_by_data(i
->core
->sink_inputs
, i
, NULL
);
694 if (pa_idxset_remove_by_data(i
->sink
->inputs
, i
, NULL
))
695 pa_sink_input_unref(i
);
698 pa_idxset_remove_by_data(i
->client
->sink_inputs
, i
, NULL
);
700 while ((o
= pa_idxset_first(i
->direct_outputs
, NULL
))) {
702 pa_source_output_kill(o
);
706 update_n_corked(i
, PA_SINK_INPUT_UNLINKED
);
707 i
->state
= PA_SINK_INPUT_UNLINKED
;
709 if (linked
&& i
->sink
) {
710 if (pa_sink_input_is_passthrough(i
))
711 pa_sink_leave_passthrough(i
->sink
);
713 /* We might need to update the sink's volume if we are in flat volume mode. */
714 if (pa_sink_flat_volume_enabled(i
->sink
))
715 pa_sink_set_volume(i
->sink
, NULL
, false, false);
717 if (i
->sink
->asyncmsgq
)
718 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
->sink
), PA_SINK_MESSAGE_REMOVE_INPUT
, i
, 0, NULL
) == 0);
724 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_REMOVE
, i
->index
);
725 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST
], i
);
729 if (PA_SINK_IS_LINKED(pa_sink_get_state(i
->sink
)))
730 pa_sink_update_status(i
->sink
);
735 pa_core_maybe_vacuum(i
->core
);
737 pa_sink_input_unref(i
);
740 /* Called from main context */
741 static void sink_input_free(pa_object
*o
) {
742 pa_sink_input
* i
= PA_SINK_INPUT(o
);
745 pa_assert_ctl_context();
746 pa_assert(pa_sink_input_refcnt(i
) == 0);
748 if (PA_SINK_INPUT_IS_LINKED(i
->state
))
749 pa_sink_input_unlink(i
);
751 pa_log_info("Freeing input %u \"%s\"", i
->index
,
752 i
->proplist
? pa_strnull(pa_proplist_gets(i
->proplist
, PA_PROP_MEDIA_NAME
)) : "");
754 /* Side note: this function must be able to destruct properly any
755 * kind of sink input in any state, even those which are
756 * "half-moved" or are connected to sinks that have no asyncmsgq
757 * and are hence half-destructed themselves! */
759 if (i
->thread_info
.render_memblockq
)
760 pa_memblockq_free(i
->thread_info
.render_memblockq
);
762 if (i
->thread_info
.resampler
)
763 pa_resampler_free(i
->thread_info
.resampler
);
766 pa_format_info_free(i
->format
);
769 pa_proplist_free(i
->proplist
);
771 if (i
->direct_outputs
)
772 pa_idxset_free(i
->direct_outputs
, NULL
);
774 if (i
->thread_info
.direct_outputs
)
775 pa_hashmap_free(i
->thread_info
.direct_outputs
);
777 if (i
->volume_factor_items
)
778 pa_hashmap_free(i
->volume_factor_items
);
780 if (i
->volume_factor_sink_items
)
781 pa_hashmap_free(i
->volume_factor_sink_items
);
787 /* Called from main context */
788 void pa_sink_input_put(pa_sink_input
*i
) {
789 pa_sink_input_state_t state
;
791 pa_sink_input_assert_ref(i
);
792 pa_assert_ctl_context();
794 pa_assert(i
->state
== PA_SINK_INPUT_INIT
);
796 /* The following fields must be initialized properly */
798 pa_assert(i
->process_rewind
);
801 state
= i
->flags
& PA_SINK_INPUT_START_CORKED
? PA_SINK_INPUT_CORKED
: PA_SINK_INPUT_RUNNING
;
803 update_n_corked(i
, state
);
806 /* We might need to update the sink's volume if we are in flat volume mode. */
807 if (pa_sink_flat_volume_enabled(i
->sink
))
808 pa_sink_set_volume(i
->sink
, NULL
, false, i
->save_volume
);
810 if (i
->origin_sink
&& (i
->origin_sink
->flags
& PA_SINK_SHARE_VOLUME_WITH_MASTER
)) {
811 pa_assert(pa_cvolume_is_norm(&i
->volume
));
812 pa_assert(pa_cvolume_is_norm(&i
->reference_ratio
));
815 set_real_ratio(i
, &i
->volume
);
818 if (pa_sink_input_is_passthrough(i
))
819 pa_sink_enter_passthrough(i
->sink
);
821 i
->thread_info
.soft_volume
= i
->soft_volume
;
822 i
->thread_info
.muted
= i
->muted
;
824 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
->sink
), PA_SINK_MESSAGE_ADD_INPUT
, i
, 0, NULL
) == 0);
826 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_NEW
, i
->index
);
827 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_PUT
], i
);
829 pa_sink_update_status(i
->sink
);
832 /* Called from main context */
833 void pa_sink_input_kill(pa_sink_input
*i
) {
834 pa_sink_input_assert_ref(i
);
835 pa_assert_ctl_context();
836 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
841 /* Called from main context */
842 pa_usec_t
pa_sink_input_get_latency(pa_sink_input
*i
, pa_usec_t
*sink_latency
) {
843 pa_usec_t r
[2] = { 0, 0 };
845 pa_sink_input_assert_ref(i
);
846 pa_assert_ctl_context();
847 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
849 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_GET_LATENCY
, r
, 0, NULL
) == 0);
852 r
[0] += i
->get_latency(i
);
855 *sink_latency
= r
[1];
860 /* Called from thread context */
861 void pa_sink_input_peek(pa_sink_input
*i
, size_t slength
/* in sink bytes */, pa_memchunk
*chunk
, pa_cvolume
*volume
) {
862 bool do_volume_adj_here
, need_volume_factor_sink
;
864 size_t block_size_max_sink
, block_size_max_sink_input
;
868 pa_sink_input_assert_ref(i
);
869 pa_sink_input_assert_io_context(i
);
870 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->thread_info
.state
));
871 pa_assert(pa_frame_aligned(slength
, &i
->sink
->sample_spec
));
875 #ifdef SINK_INPUT_DEBUG
876 pa_log_debug("peek");
879 block_size_max_sink_input
= i
->thread_info
.resampler
?
880 pa_resampler_max_block_size(i
->thread_info
.resampler
) :
881 pa_frame_align(pa_mempool_block_size_max(i
->core
->mempool
), &i
->sample_spec
);
883 block_size_max_sink
= pa_frame_align(pa_mempool_block_size_max(i
->core
->mempool
), &i
->sink
->sample_spec
);
885 /* Default buffer size */
887 slength
= pa_frame_align(CONVERT_BUFFER_LENGTH
, &i
->sink
->sample_spec
);
889 if (slength
> block_size_max_sink
)
890 slength
= block_size_max_sink
;
892 if (i
->thread_info
.resampler
) {
893 ilength
= pa_resampler_request(i
->thread_info
.resampler
, slength
);
896 ilength
= pa_frame_align(CONVERT_BUFFER_LENGTH
, &i
->sample_spec
);
900 /* Length corresponding to slength (without limiting to
901 * block_size_max_sink_input). */
902 ilength_full
= ilength
;
904 if (ilength
> block_size_max_sink_input
)
905 ilength
= block_size_max_sink_input
;
907 /* If the channel maps of the sink and this stream differ, we need
908 * to adjust the volume *before* we resample. Otherwise we can do
909 * it after and leave it for the sink code */
911 do_volume_adj_here
= !pa_channel_map_equal(&i
->channel_map
, &i
->sink
->channel_map
);
912 volume_is_norm
= pa_cvolume_is_norm(&i
->thread_info
.soft_volume
) && !i
->thread_info
.muted
;
913 need_volume_factor_sink
= !pa_cvolume_is_norm(&i
->volume_factor_sink
);
915 while (!pa_memblockq_is_readable(i
->thread_info
.render_memblockq
)) {
918 /* There's nothing in our render queue. We need to fill it up
919 * with data from the implementor. */
921 if (i
->thread_info
.state
== PA_SINK_INPUT_CORKED
||
922 i
->pop(i
, ilength
, &tchunk
) < 0) {
924 /* OK, we're corked or the implementor didn't give us any
925 * data, so let's just hand out silence */
926 pa_atomic_store(&i
->thread_info
.drained
, 1);
928 pa_memblockq_seek(i
->thread_info
.render_memblockq
, (int64_t) slength
, PA_SEEK_RELATIVE
, true);
929 i
->thread_info
.playing_for
= 0;
930 if (i
->thread_info
.underrun_for
!= (uint64_t) -1) {
931 i
->thread_info
.underrun_for
+= ilength_full
;
932 i
->thread_info
.underrun_for_sink
+= slength
;
937 pa_atomic_store(&i
->thread_info
.drained
, 0);
939 pa_assert(tchunk
.length
> 0);
940 pa_assert(tchunk
.memblock
);
942 i
->thread_info
.underrun_for
= 0;
943 i
->thread_info
.underrun_for_sink
= 0;
944 i
->thread_info
.playing_for
+= tchunk
.length
;
946 while (tchunk
.length
> 0) {
948 bool nvfs
= need_volume_factor_sink
;
951 pa_memblock_ref(wchunk
.memblock
);
953 if (wchunk
.length
> block_size_max_sink_input
)
954 wchunk
.length
= block_size_max_sink_input
;
956 /* It might be necessary to adjust the volume here */
957 if (do_volume_adj_here
&& !volume_is_norm
) {
958 pa_memchunk_make_writable(&wchunk
, 0);
960 if (i
->thread_info
.muted
) {
961 pa_silence_memchunk(&wchunk
, &i
->thread_info
.sample_spec
);
964 } else if (!i
->thread_info
.resampler
&& nvfs
) {
967 /* If we don't need a resampler we can merge the
968 * post and the pre volume adjustment into one */
970 pa_sw_cvolume_multiply(&v
, &i
->thread_info
.soft_volume
, &i
->volume_factor_sink
);
971 pa_volume_memchunk(&wchunk
, &i
->thread_info
.sample_spec
, &v
);
975 pa_volume_memchunk(&wchunk
, &i
->thread_info
.sample_spec
, &i
->thread_info
.soft_volume
);
978 if (!i
->thread_info
.resampler
) {
981 pa_memchunk_make_writable(&wchunk
, 0);
982 pa_volume_memchunk(&wchunk
, &i
->sink
->sample_spec
, &i
->volume_factor_sink
);
985 pa_memblockq_push_align(i
->thread_info
.render_memblockq
, &wchunk
);
988 pa_resampler_run(i
->thread_info
.resampler
, &wchunk
, &rchunk
);
990 #ifdef SINK_INPUT_DEBUG
991 pa_log_debug("pushing %lu", (unsigned long) rchunk
.length
);
994 if (rchunk
.memblock
) {
997 pa_memchunk_make_writable(&rchunk
, 0);
998 pa_volume_memchunk(&rchunk
, &i
->sink
->sample_spec
, &i
->volume_factor_sink
);
1001 pa_memblockq_push_align(i
->thread_info
.render_memblockq
, &rchunk
);
1002 pa_memblock_unref(rchunk
.memblock
);
1006 pa_memblock_unref(wchunk
.memblock
);
1008 tchunk
.index
+= wchunk
.length
;
1009 tchunk
.length
-= wchunk
.length
;
1012 pa_memblock_unref(tchunk
.memblock
);
1015 pa_assert_se(pa_memblockq_peek(i
->thread_info
.render_memblockq
, chunk
) >= 0);
1017 pa_assert(chunk
->length
> 0);
1018 pa_assert(chunk
->memblock
);
1020 #ifdef SINK_INPUT_DEBUG
1021 pa_log_debug("peeking %lu", (unsigned long) chunk
->length
);
1024 if (chunk
->length
> block_size_max_sink
)
1025 chunk
->length
= block_size_max_sink
;
1027 /* Let's see if we had to apply the volume adjustment ourselves,
1028 * or if this can be done by the sink for us */
1030 if (do_volume_adj_here
)
1031 /* We had different channel maps, so we already did the adjustment */
1032 pa_cvolume_reset(volume
, i
->sink
->sample_spec
.channels
);
1033 else if (i
->thread_info
.muted
)
1034 /* We've both the same channel map, so let's have the sink do the adjustment for us*/
1035 pa_cvolume_mute(volume
, i
->sink
->sample_spec
.channels
);
1037 *volume
= i
->thread_info
.soft_volume
;
1040 /* Called from thread context */
1041 void pa_sink_input_drop(pa_sink_input
*i
, size_t nbytes
/* in sink sample spec */) {
1043 pa_sink_input_assert_ref(i
);
1044 pa_sink_input_assert_io_context(i
);
1045 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->thread_info
.state
));
1046 pa_assert(pa_frame_aligned(nbytes
, &i
->sink
->sample_spec
));
1047 pa_assert(nbytes
> 0);
1049 #ifdef SINK_INPUT_DEBUG
1050 pa_log_debug("dropping %lu", (unsigned long) nbytes
);
1053 pa_memblockq_drop(i
->thread_info
.render_memblockq
, nbytes
);
1056 /* Called from thread context */
1057 bool pa_sink_input_process_underrun(pa_sink_input
*i
) {
1058 pa_sink_input_assert_ref(i
);
1059 pa_sink_input_assert_io_context(i
);
1061 if (pa_memblockq_is_readable(i
->thread_info
.render_memblockq
))
1064 if (i
->process_underrun
&& i
->process_underrun(i
)) {
1065 /* All valid data has been played back, so we can empty this queue. */
1066 pa_memblockq_silence(i
->thread_info
.render_memblockq
);
1072 /* Called from thread context */
1073 void pa_sink_input_process_rewind(pa_sink_input
*i
, size_t nbytes
/* in sink sample spec */) {
1075 bool called
= false;
1077 pa_sink_input_assert_ref(i
);
1078 pa_sink_input_assert_io_context(i
);
1079 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->thread_info
.state
));
1080 pa_assert(pa_frame_aligned(nbytes
, &i
->sink
->sample_spec
));
1082 #ifdef SINK_INPUT_DEBUG
1083 pa_log_debug("rewind(%lu, %lu)", (unsigned long) nbytes
, (unsigned long) i
->thread_info
.rewrite_nbytes
);
1086 lbq
= pa_memblockq_get_length(i
->thread_info
.render_memblockq
);
1088 if (nbytes
> 0 && !i
->thread_info
.dont_rewind_render
) {
1089 pa_log_debug("Have to rewind %lu bytes on render memblockq.", (unsigned long) nbytes
);
1090 pa_memblockq_rewind(i
->thread_info
.render_memblockq
, nbytes
);
1093 if (i
->thread_info
.rewrite_nbytes
== (size_t) -1) {
1095 /* We were asked to drop all buffered data, and rerequest new
1096 * data from implementor the next time peek() is called */
1098 pa_memblockq_flush_write(i
->thread_info
.render_memblockq
, true);
1100 } else if (i
->thread_info
.rewrite_nbytes
> 0) {
1101 size_t max_rewrite
, amount
;
1103 /* Calculate how much make sense to rewrite at most */
1104 max_rewrite
= nbytes
+ lbq
;
1106 /* Transform into local domain */
1107 if (i
->thread_info
.resampler
)
1108 max_rewrite
= pa_resampler_request(i
->thread_info
.resampler
, max_rewrite
);
1110 /* Calculate how much of the rewinded data should actually be rewritten */
1111 amount
= PA_MIN(i
->thread_info
.rewrite_nbytes
, max_rewrite
);
1114 pa_log_debug("Have to rewind %lu bytes on implementor.", (unsigned long) amount
);
1116 /* Tell the implementor */
1117 if (i
->process_rewind
)
1118 i
->process_rewind(i
, amount
);
1121 /* Convert back to to sink domain */
1122 if (i
->thread_info
.resampler
)
1123 amount
= pa_resampler_result(i
->thread_info
.resampler
, amount
);
1126 /* Ok, now update the write pointer */
1127 pa_memblockq_seek(i
->thread_info
.render_memblockq
, - ((int64_t) amount
), PA_SEEK_RELATIVE
, true);
1129 if (i
->thread_info
.rewrite_flush
)
1130 pa_memblockq_silence(i
->thread_info
.render_memblockq
);
1132 /* And reset the resampler */
1133 if (i
->thread_info
.resampler
)
1134 pa_resampler_reset(i
->thread_info
.resampler
);
1139 if (i
->process_rewind
)
1140 i
->process_rewind(i
, 0);
1142 i
->thread_info
.rewrite_nbytes
= 0;
1143 i
->thread_info
.rewrite_flush
= false;
1144 i
->thread_info
.dont_rewind_render
= false;
1147 /* Called from thread context */
1148 size_t pa_sink_input_get_max_rewind(pa_sink_input
*i
) {
1149 pa_sink_input_assert_ref(i
);
1150 pa_sink_input_assert_io_context(i
);
1152 return i
->thread_info
.resampler
? pa_resampler_request(i
->thread_info
.resampler
, i
->sink
->thread_info
.max_rewind
) : i
->sink
->thread_info
.max_rewind
;
1155 /* Called from thread context */
1156 size_t pa_sink_input_get_max_request(pa_sink_input
*i
) {
1157 pa_sink_input_assert_ref(i
);
1158 pa_sink_input_assert_io_context(i
);
1160 /* We're not verifying the status here, to allow this to be called
1161 * in the state change handler between _INIT and _RUNNING */
1163 return i
->thread_info
.resampler
? pa_resampler_request(i
->thread_info
.resampler
, i
->sink
->thread_info
.max_request
) : i
->sink
->thread_info
.max_request
;
1166 /* Called from thread context */
1167 void pa_sink_input_update_max_rewind(pa_sink_input
*i
, size_t nbytes
/* in the sink's sample spec */) {
1168 pa_sink_input_assert_ref(i
);
1169 pa_sink_input_assert_io_context(i
);
1170 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->thread_info
.state
));
1171 pa_assert(pa_frame_aligned(nbytes
, &i
->sink
->sample_spec
));
1173 pa_memblockq_set_maxrewind(i
->thread_info
.render_memblockq
, nbytes
);
1175 if (i
->update_max_rewind
)
1176 i
->update_max_rewind(i
, i
->thread_info
.resampler
? pa_resampler_request(i
->thread_info
.resampler
, nbytes
) : nbytes
);
1179 /* Called from thread context */
1180 void pa_sink_input_update_max_request(pa_sink_input
*i
, size_t nbytes
/* in the sink's sample spec */) {
1181 pa_sink_input_assert_ref(i
);
1182 pa_sink_input_assert_io_context(i
);
1183 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->thread_info
.state
));
1184 pa_assert(pa_frame_aligned(nbytes
, &i
->sink
->sample_spec
));
1186 if (i
->update_max_request
)
1187 i
->update_max_request(i
, i
->thread_info
.resampler
? pa_resampler_request(i
->thread_info
.resampler
, nbytes
) : nbytes
);
1190 /* Called from thread context */
1191 pa_usec_t
pa_sink_input_set_requested_latency_within_thread(pa_sink_input
*i
, pa_usec_t usec
) {
1192 pa_sink_input_assert_ref(i
);
1193 pa_sink_input_assert_io_context(i
);
1195 if (!(i
->sink
->flags
& PA_SINK_DYNAMIC_LATENCY
))
1196 usec
= i
->sink
->thread_info
.fixed_latency
;
1198 if (usec
!= (pa_usec_t
) -1)
1199 usec
= PA_CLAMP(usec
, i
->sink
->thread_info
.min_latency
, i
->sink
->thread_info
.max_latency
);
1201 i
->thread_info
.requested_sink_latency
= usec
;
1202 pa_sink_invalidate_requested_latency(i
->sink
, true);
1207 /* Called from main context */
1208 pa_usec_t
pa_sink_input_set_requested_latency(pa_sink_input
*i
, pa_usec_t usec
) {
1209 pa_sink_input_assert_ref(i
);
1210 pa_assert_ctl_context();
1212 if (PA_SINK_INPUT_IS_LINKED(i
->state
) && i
->sink
) {
1213 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY
, &usec
, 0, NULL
) == 0);
1217 /* If this sink input is not realized yet or we are being moved,
1218 * we have to touch the thread info data directly */
1221 if (!(i
->sink
->flags
& PA_SINK_DYNAMIC_LATENCY
))
1222 usec
= pa_sink_get_fixed_latency(i
->sink
);
1224 if (usec
!= (pa_usec_t
) -1) {
1225 pa_usec_t min_latency
, max_latency
;
1226 pa_sink_get_latency_range(i
->sink
, &min_latency
, &max_latency
);
1227 usec
= PA_CLAMP(usec
, min_latency
, max_latency
);
1231 i
->thread_info
.requested_sink_latency
= usec
;
1236 /* Called from main context */
1237 pa_usec_t
pa_sink_input_get_requested_latency(pa_sink_input
*i
) {
1238 pa_sink_input_assert_ref(i
);
1239 pa_assert_ctl_context();
1241 if (PA_SINK_INPUT_IS_LINKED(i
->state
) && i
->sink
) {
1243 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY
, &usec
, 0, NULL
) == 0);
1247 /* If this sink input is not realized yet or we are being moved,
1248 * we have to touch the thread info data directly */
1250 return i
->thread_info
.requested_sink_latency
;
1253 /* Called from main context */
1254 void pa_sink_input_set_volume(pa_sink_input
*i
, const pa_cvolume
*volume
, bool save
, bool absolute
) {
1257 pa_sink_input_assert_ref(i
);
1258 pa_assert_ctl_context();
1259 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1261 pa_assert(pa_cvolume_valid(volume
));
1262 pa_assert(volume
->channels
== 1 || pa_cvolume_compatible(volume
, &i
->sample_spec
));
1263 pa_assert(i
->volume_writable
);
1265 if (!absolute
&& pa_sink_flat_volume_enabled(i
->sink
)) {
1266 v
= i
->sink
->reference_volume
;
1267 pa_cvolume_remap(&v
, &i
->sink
->channel_map
, &i
->channel_map
);
1269 if (pa_cvolume_compatible(volume
, &i
->sample_spec
))
1270 volume
= pa_sw_cvolume_multiply(&v
, &v
, volume
);
1272 volume
= pa_sw_cvolume_multiply_scalar(&v
, &v
, pa_cvolume_max(volume
));
1274 if (!pa_cvolume_compatible(volume
, &i
->sample_spec
)) {
1276 volume
= pa_cvolume_scale(&v
, pa_cvolume_max(volume
));
1280 if (pa_cvolume_equal(volume
, &i
->volume
)) {
1281 i
->save_volume
= i
->save_volume
|| save
;
1285 i
->volume
= *volume
;
1286 i
->save_volume
= save
;
1288 if (pa_sink_flat_volume_enabled(i
->sink
)) {
1289 /* We are in flat volume mode, so let's update all sink input
1290 * volumes and update the flat volume of the sink */
1292 pa_sink_set_volume(i
->sink
, NULL
, true, save
);
1295 /* OK, we are in normal volume mode. The volume only affects
1297 set_real_ratio(i
, volume
);
1298 i
->reference_ratio
= i
->volume
;
1300 /* Copy the new soft_volume to the thread_info struct */
1301 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME
, NULL
, 0, NULL
) == 0);
1304 /* The volume changed, let's tell people so */
1305 if (i
->volume_changed
)
1306 i
->volume_changed(i
);
1308 /* The virtual volume changed, let's tell people so */
1309 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1312 void pa_sink_input_add_volume_factor(pa_sink_input
*i
, const char *key
, const pa_cvolume
*volume_factor
) {
1313 struct volume_factor_entry
*v
;
1315 pa_sink_input_assert_ref(i
);
1316 pa_assert_ctl_context();
1317 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1318 pa_assert(volume_factor
);
1320 pa_assert(pa_cvolume_valid(volume_factor
));
1321 pa_assert(volume_factor
->channels
== 1 || pa_cvolume_compatible(volume_factor
, &i
->sample_spec
));
1323 v
= volume_factor_entry_new(key
, volume_factor
);
1324 if (!pa_cvolume_compatible(volume_factor
, &i
->sample_spec
))
1325 pa_cvolume_set(&v
->volume
, i
->sample_spec
.channels
, volume_factor
->values
[0]);
1327 pa_assert_se(pa_hashmap_put(i
->volume_factor_items
, v
->key
, v
) >= 0);
1328 if (pa_hashmap_size(i
->volume_factor_items
) == 1)
1329 i
->volume_factor
= v
->volume
;
1331 pa_sw_cvolume_multiply(&i
->volume_factor
, &i
->volume_factor
, &v
->volume
);
1333 pa_sw_cvolume_multiply(&i
->soft_volume
, &i
->real_ratio
, &i
->volume_factor
);
1335 /* Copy the new soft_volume to the thread_info struct */
1336 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME
, NULL
, 0, NULL
) == 0);
1339 /* Returns 0 if an entry was removed and -1 if no entry for the given key was
1341 int pa_sink_input_remove_volume_factor(pa_sink_input
*i
, const char *key
) {
1342 struct volume_factor_entry
*v
;
1344 pa_sink_input_assert_ref(i
);
1346 pa_assert_ctl_context();
1347 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1349 v
= pa_hashmap_remove(i
->volume_factor_items
, key
);
1354 volume_factor_entry_free(v
);
1356 switch (pa_hashmap_size(i
->volume_factor_items
)) {
1358 pa_cvolume_reset(&i
->volume_factor
, i
->sample_spec
.channels
);
1361 v
= pa_hashmap_first(i
->volume_factor_items
);
1362 i
->volume_factor
= v
->volume
;
1365 volume_factor_from_hashmap(&i
->volume_factor
, i
->volume_factor_items
, i
->volume_factor
.channels
);
1368 pa_sw_cvolume_multiply(&i
->soft_volume
, &i
->real_ratio
, &i
->volume_factor
);
1370 /* Copy the new soft_volume to the thread_info struct */
1371 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME
, NULL
, 0, NULL
) == 0);
1376 /* Called from main context */
1377 static void set_real_ratio(pa_sink_input
*i
, const pa_cvolume
*v
) {
1378 pa_sink_input_assert_ref(i
);
1379 pa_assert_ctl_context();
1380 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1381 pa_assert(!v
|| pa_cvolume_compatible(v
, &i
->sample_spec
));
1383 /* This basically calculates:
1385 * i->real_ratio := v
1386 * i->soft_volume := i->real_ratio * i->volume_factor */
1391 pa_cvolume_reset(&i
->real_ratio
, i
->sample_spec
.channels
);
1393 pa_sw_cvolume_multiply(&i
->soft_volume
, &i
->real_ratio
, &i
->volume_factor
);
1394 /* We don't copy the data to the thread_info data. That's left for someone else to do */
1397 /* Called from main or I/O context */
1398 bool pa_sink_input_is_passthrough(pa_sink_input
*i
) {
1399 pa_sink_input_assert_ref(i
);
1401 if (PA_UNLIKELY(!pa_format_info_is_pcm(i
->format
)))
1404 if (PA_UNLIKELY(i
->flags
& PA_SINK_INPUT_PASSTHROUGH
))
1410 /* Called from main context */
1411 bool pa_sink_input_is_volume_readable(pa_sink_input
*i
) {
1412 pa_sink_input_assert_ref(i
);
1413 pa_assert_ctl_context();
1415 return !pa_sink_input_is_passthrough(i
);
1418 /* Called from main context */
1419 pa_cvolume
*pa_sink_input_get_volume(pa_sink_input
*i
, pa_cvolume
*volume
, bool absolute
) {
1420 pa_sink_input_assert_ref(i
);
1421 pa_assert_ctl_context();
1422 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1423 pa_assert(pa_sink_input_is_volume_readable(i
));
1425 if (absolute
|| !pa_sink_flat_volume_enabled(i
->sink
))
1426 *volume
= i
->volume
;
1428 *volume
= i
->reference_ratio
;
1433 /* Called from main context */
1434 void pa_sink_input_set_mute(pa_sink_input
*i
, bool mute
, bool save
) {
1435 pa_sink_input_assert_ref(i
);
1436 pa_assert_ctl_context();
1437 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1439 if (!i
->muted
== !mute
) {
1440 i
->save_muted
= i
->save_muted
|| mute
;
1445 i
->save_muted
= save
;
1447 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE
, NULL
, 0, NULL
) == 0);
1449 /* The mute status changed, let's tell people so */
1450 if (i
->mute_changed
)
1453 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1456 /* Called from main context */
1457 bool pa_sink_input_get_mute(pa_sink_input
*i
) {
1458 pa_sink_input_assert_ref(i
);
1459 pa_assert_ctl_context();
1460 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1465 /* Called from main thread */
1466 void pa_sink_input_update_proplist(pa_sink_input
*i
, pa_update_mode_t mode
, pa_proplist
*p
) {
1467 pa_sink_input_assert_ref(i
);
1468 pa_assert_ctl_context();
1471 pa_proplist_update(i
->proplist
, mode
, p
);
1473 if (PA_SINK_INPUT_IS_LINKED(i
->state
)) {
1474 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED
], i
);
1475 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1479 /* Called from main context */
1480 void pa_sink_input_cork(pa_sink_input
*i
, bool b
) {
1481 pa_sink_input_assert_ref(i
);
1482 pa_assert_ctl_context();
1483 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1485 sink_input_set_state(i
, b
? PA_SINK_INPUT_CORKED
: PA_SINK_INPUT_RUNNING
);
1488 /* Called from main context */
1489 int pa_sink_input_set_rate(pa_sink_input
*i
, uint32_t rate
) {
1490 pa_sink_input_assert_ref(i
);
1491 pa_assert_ctl_context();
1492 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1493 pa_return_val_if_fail(i
->thread_info
.resampler
, -PA_ERR_BADSTATE
);
1495 if (i
->sample_spec
.rate
== rate
)
1498 i
->sample_spec
.rate
= rate
;
1500 pa_asyncmsgq_post(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
), PA_SINK_INPUT_MESSAGE_SET_RATE
, PA_UINT_TO_PTR(rate
), 0, NULL
, NULL
);
1502 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1506 /* Called from main context */
1507 void pa_sink_input_set_name(pa_sink_input
*i
, const char *name
) {
1509 pa_sink_input_assert_ref(i
);
1510 pa_assert_ctl_context();
1512 if (!name
&& !pa_proplist_contains(i
->proplist
, PA_PROP_MEDIA_NAME
))
1515 old
= pa_proplist_gets(i
->proplist
, PA_PROP_MEDIA_NAME
);
1517 if (old
&& name
&& pa_streq(old
, name
))
1521 pa_proplist_sets(i
->proplist
, PA_PROP_MEDIA_NAME
, name
);
1523 pa_proplist_unset(i
->proplist
, PA_PROP_MEDIA_NAME
);
1525 if (PA_SINK_INPUT_IS_LINKED(i
->state
)) {
1526 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED
], i
);
1527 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1531 /* Called from main context */
1532 pa_resample_method_t
pa_sink_input_get_resample_method(pa_sink_input
*i
) {
1533 pa_sink_input_assert_ref(i
);
1534 pa_assert_ctl_context();
1536 return i
->actual_resample_method
;
1539 /* Called from main context */
1540 bool pa_sink_input_may_move(pa_sink_input
*i
) {
1541 pa_sink_input_assert_ref(i
);
1542 pa_assert_ctl_context();
1543 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1545 if (i
->flags
& PA_SINK_INPUT_DONT_MOVE
)
1548 if (i
->sync_next
|| i
->sync_prev
) {
1549 pa_log_warn("Moving synchronized streams not supported.");
1556 static bool find_filter_sink_input(pa_sink_input
*target
, pa_sink
*s
) {
1558 while (s
&& s
->input_to_master
) {
1559 if (s
->input_to_master
== target
)
1561 s
= s
->input_to_master
->sink
;
1562 pa_assert(i
++ < 100);
1567 /* Called from main context */
1568 bool pa_sink_input_may_move_to(pa_sink_input
*i
, pa_sink
*dest
) {
1569 pa_sink_input_assert_ref(i
);
1570 pa_assert_ctl_context();
1571 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1572 pa_sink_assert_ref(dest
);
1574 if (dest
== i
->sink
)
1577 if (!pa_sink_input_may_move(i
))
1580 /* Make sure we're not creating a filter sink cycle */
1581 if (find_filter_sink_input(i
, dest
)) {
1582 pa_log_debug("Can't connect input to %s, as that would create a cycle.", dest
->name
);
1586 if (pa_idxset_size(dest
->inputs
) >= PA_MAX_INPUTS_PER_SINK
) {
1587 pa_log_warn("Failed to move sink input: too many inputs per sink.");
1591 if (check_passthrough_connection(pa_sink_input_is_passthrough(i
), dest
) < 0)
1595 if (!i
->may_move_to(i
, dest
))
1601 /* Called from main context */
1602 int pa_sink_input_start_move(pa_sink_input
*i
) {
1603 pa_source_output
*o
, *p
= NULL
;
1604 struct volume_factor_entry
*v
;
1608 pa_sink_input_assert_ref(i
);
1609 pa_assert_ctl_context();
1610 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1613 if (!pa_sink_input_may_move(i
))
1614 return -PA_ERR_NOTSUPPORTED
;
1616 if ((r
= pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_MOVE_START
], i
)) < 0)
1619 /* Kill directly connected outputs */
1620 while ((o
= pa_idxset_first(i
->direct_outputs
, NULL
))) {
1622 pa_source_output_kill(o
);
1625 pa_assert(pa_idxset_isempty(i
->direct_outputs
));
1627 pa_idxset_remove_by_data(i
->sink
->inputs
, i
, NULL
);
1629 if (pa_sink_input_get_state(i
) == PA_SINK_INPUT_CORKED
)
1630 pa_assert_se(i
->sink
->n_corked
-- >= 1);
1632 if (pa_sink_input_is_passthrough(i
))
1633 pa_sink_leave_passthrough(i
->sink
);
1635 if (pa_sink_flat_volume_enabled(i
->sink
))
1636 /* We might need to update the sink's volume if we are in flat
1638 pa_sink_set_volume(i
->sink
, NULL
, false, false);
1640 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
->sink
), PA_SINK_MESSAGE_START_MOVE
, i
, 0, NULL
) == 0);
1642 pa_sink_update_status(i
->sink
);
1644 PA_HASHMAP_FOREACH(v
, i
->volume_factor_sink_items
, state
)
1645 pa_cvolume_remap(&v
->volume
, &i
->sink
->channel_map
, &i
->channel_map
);
1647 pa_cvolume_remap(&i
->volume_factor_sink
, &i
->sink
->channel_map
, &i
->channel_map
);
1651 pa_sink_input_unref(i
);
1656 /* Called from main context. If i has an origin sink that uses volume sharing,
1657 * then also the origin sink and all streams connected to it need to update
1658 * their volume - this function does all that by using recursion. */
1659 static void update_volume_due_to_moving(pa_sink_input
*i
, pa_sink
*dest
) {
1660 pa_cvolume old_volume
;
1664 pa_assert(i
->sink
); /* The destination sink should already be set. */
1666 if (i
->origin_sink
&& (i
->origin_sink
->flags
& PA_SINK_SHARE_VOLUME_WITH_MASTER
)) {
1667 pa_sink
*root_sink
= pa_sink_get_master(i
->sink
);
1668 pa_sink_input
*origin_sink_input
;
1671 if (PA_UNLIKELY(!root_sink
))
1674 if (pa_sink_flat_volume_enabled(i
->sink
)) {
1675 /* Ok, so the origin sink uses volume sharing, and flat volume is
1676 * enabled. The volume will have to be updated as follows:
1678 * i->volume := i->sink->real_volume
1679 * (handled later by pa_sink_set_volume)
1680 * i->reference_ratio := i->volume / i->sink->reference_volume
1681 * (handled later by pa_sink_set_volume)
1682 * i->real_ratio stays unchanged
1683 * (streams whose origin sink uses volume sharing should
1684 * always have real_ratio of 0 dB)
1685 * i->soft_volume stays unchanged
1686 * (streams whose origin sink uses volume sharing should
1687 * always have volume_factor as soft_volume, so no change
1688 * should be needed) */
1690 pa_assert(pa_cvolume_is_norm(&i
->real_ratio
));
1691 pa_assert(pa_cvolume_equal(&i
->soft_volume
, &i
->volume_factor
));
1693 /* Notifications will be sent by pa_sink_set_volume(). */
1696 /* Ok, so the origin sink uses volume sharing, and flat volume is
1697 * disabled. The volume will have to be updated as follows:
1700 * i->reference_ratio := 0 dB
1701 * i->real_ratio stays unchanged
1702 * (streams whose origin sink uses volume sharing should
1703 * always have real_ratio of 0 dB)
1704 * i->soft_volume stays unchanged
1705 * (streams whose origin sink uses volume sharing should
1706 * always have volume_factor as soft_volume, so no change
1707 * should be needed) */
1709 old_volume
= i
->volume
;
1710 pa_cvolume_reset(&i
->volume
, i
->volume
.channels
);
1711 pa_cvolume_reset(&i
->reference_ratio
, i
->reference_ratio
.channels
);
1712 pa_assert(pa_cvolume_is_norm(&i
->real_ratio
));
1713 pa_assert(pa_cvolume_equal(&i
->soft_volume
, &i
->volume_factor
));
1715 /* Notify others about the changed sink input volume. */
1716 if (!pa_cvolume_equal(&i
->volume
, &old_volume
)) {
1717 if (i
->volume_changed
)
1718 i
->volume_changed(i
);
1720 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1724 /* Additionally, the origin sink volume needs updating:
1726 * i->origin_sink->reference_volume := root_sink->reference_volume
1727 * i->origin_sink->real_volume := root_sink->real_volume
1728 * i->origin_sink->soft_volume stays unchanged
1729 * (sinks that use volume sharing should always have
1730 * soft_volume of 0 dB) */
1732 old_volume
= i
->origin_sink
->reference_volume
;
1734 i
->origin_sink
->reference_volume
= root_sink
->reference_volume
;
1735 pa_cvolume_remap(&i
->origin_sink
->reference_volume
, &root_sink
->channel_map
, &i
->origin_sink
->channel_map
);
1737 i
->origin_sink
->real_volume
= root_sink
->real_volume
;
1738 pa_cvolume_remap(&i
->origin_sink
->real_volume
, &root_sink
->channel_map
, &i
->origin_sink
->channel_map
);
1740 pa_assert(pa_cvolume_is_norm(&i
->origin_sink
->soft_volume
));
1742 /* Notify others about the changed sink volume. If you wonder whether
1743 * i->origin_sink->set_volume() should be called somewhere, that's not
1744 * the case, because sinks that use volume sharing shouldn't have any
1745 * internal volume that set_volume() would update. If you wonder
1746 * whether the thread_info variables should be synced, yes, they
1747 * should, and it's done by the PA_SINK_MESSAGE_FINISH_MOVE message
1749 if (!pa_cvolume_equal(&i
->origin_sink
->reference_volume
, &old_volume
))
1750 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->origin_sink
->index
);
1752 /* Recursively update origin sink inputs. */
1753 PA_IDXSET_FOREACH(origin_sink_input
, i
->origin_sink
->inputs
, idx
)
1754 update_volume_due_to_moving(origin_sink_input
, dest
);
1757 old_volume
= i
->volume
;
1759 if (pa_sink_flat_volume_enabled(i
->sink
)) {
1760 /* Ok, so this is a regular stream, and flat volume is enabled. The
1761 * volume will have to be updated as follows:
1763 * i->volume := i->reference_ratio * i->sink->reference_volume
1764 * i->reference_ratio stays unchanged
1765 * i->real_ratio := i->volume / i->sink->real_volume
1766 * (handled later by pa_sink_set_volume)
1767 * i->soft_volume := i->real_ratio * i->volume_factor
1768 * (handled later by pa_sink_set_volume) */
1770 i
->volume
= i
->sink
->reference_volume
;
1771 pa_cvolume_remap(&i
->volume
, &i
->sink
->channel_map
, &i
->channel_map
);
1772 pa_sw_cvolume_multiply(&i
->volume
, &i
->volume
, &i
->reference_ratio
);
1775 /* Ok, so this is a regular stream, and flat volume is disabled.
1776 * The volume will have to be updated as follows:
1778 * i->volume := i->reference_ratio
1779 * i->reference_ratio stays unchanged
1780 * i->real_ratio := i->reference_ratio
1781 * i->soft_volume := i->real_ratio * i->volume_factor */
1783 i
->volume
= i
->reference_ratio
;
1784 i
->real_ratio
= i
->reference_ratio
;
1785 pa_sw_cvolume_multiply(&i
->soft_volume
, &i
->real_ratio
, &i
->volume_factor
);
1788 /* Notify others about the changed sink input volume. */
1789 if (!pa_cvolume_equal(&i
->volume
, &old_volume
)) {
1790 /* XXX: In case i->sink has flat volume enabled, then real_ratio
1791 * and soft_volume are not updated yet. Let's hope that the
1792 * callback implementation doesn't care about those variables... */
1793 if (i
->volume_changed
)
1794 i
->volume_changed(i
);
1796 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1800 /* If i->sink == dest, then recursion has finished, and we can finally call
1801 * pa_sink_set_volume(), which will do the rest of the updates. */
1802 if ((i
->sink
== dest
) && pa_sink_flat_volume_enabled(i
->sink
))
1803 pa_sink_set_volume(i
->sink
, NULL
, false, i
->save_volume
);
1806 /* Called from main context */
1807 int pa_sink_input_finish_move(pa_sink_input
*i
, pa_sink
*dest
, bool save
) {
1808 struct volume_factor_entry
*v
;
1811 pa_sink_input_assert_ref(i
);
1812 pa_assert_ctl_context();
1813 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1814 pa_assert(!i
->sink
);
1815 pa_sink_assert_ref(dest
);
1817 if (!pa_sink_input_may_move_to(i
, dest
))
1818 return -PA_ERR_NOTSUPPORTED
;
1820 if (pa_sink_input_is_passthrough(i
) && !pa_sink_check_format(dest
, i
->format
)) {
1821 pa_proplist
*p
= pa_proplist_new();
1822 pa_log_debug("New sink doesn't support stream format, sending format-changed and killing");
1823 /* Tell the client what device we want to be on if it is going to
1825 pa_proplist_sets(p
, "device", dest
->name
);
1826 pa_sink_input_send_event(i
, PA_STREAM_EVENT_FORMAT_LOST
, p
);
1827 pa_proplist_free(p
);
1828 return -PA_ERR_NOTSUPPORTED
;
1831 if (!(i
->flags
& PA_SINK_INPUT_VARIABLE_RATE
) &&
1832 !pa_sample_spec_equal(&i
->sample_spec
, &dest
->sample_spec
)) {
1833 /* try to change dest sink rate if possible without glitches.
1834 module-suspend-on-idle resumes destination sink with
1835 SINK_INPUT_MOVE_FINISH hook */
1837 pa_log_info("Trying to change sample rate");
1838 if (pa_sink_update_rate(dest
, i
->sample_spec
.rate
, pa_sink_input_is_passthrough(i
)) >= 0)
1839 pa_log_info("Rate changed to %u Hz", dest
->sample_spec
.rate
);
1846 i
->save_sink
= save
;
1847 pa_idxset_put(dest
->inputs
, pa_sink_input_ref(i
), NULL
);
1849 PA_HASHMAP_FOREACH(v
, i
->volume_factor_sink_items
, state
)
1850 pa_cvolume_remap(&v
->volume
, &i
->channel_map
, &i
->sink
->channel_map
);
1852 pa_cvolume_remap(&i
->volume_factor_sink
, &i
->channel_map
, &i
->sink
->channel_map
);
1854 if (pa_sink_input_get_state(i
) == PA_SINK_INPUT_CORKED
)
1855 i
->sink
->n_corked
++;
1857 pa_sink_input_update_rate(i
);
1859 pa_sink_update_status(dest
);
1861 update_volume_due_to_moving(i
, dest
);
1863 if (pa_sink_input_is_passthrough(i
))
1864 pa_sink_enter_passthrough(i
->sink
);
1866 pa_assert_se(pa_asyncmsgq_send(i
->sink
->asyncmsgq
, PA_MSGOBJECT(i
->sink
), PA_SINK_MESSAGE_FINISH_MOVE
, i
, 0, NULL
) == 0);
1868 pa_log_debug("Successfully moved sink input %i to %s.", i
->index
, dest
->name
);
1870 /* Notify everyone */
1871 pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH
], i
);
1872 pa_subscription_post(i
->core
, PA_SUBSCRIPTION_EVENT_SINK_INPUT
|PA_SUBSCRIPTION_EVENT_CHANGE
, i
->index
);
1877 /* Called from main context */
1878 void pa_sink_input_fail_move(pa_sink_input
*i
) {
1880 pa_sink_input_assert_ref(i
);
1881 pa_assert_ctl_context();
1882 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1883 pa_assert(!i
->sink
);
1885 /* Check if someone wants this sink input? */
1886 if (pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_MOVE_FAIL
], i
) == PA_HOOK_STOP
)
1892 pa_sink_input_kill(i
);
1895 /* Called from main context */
1896 int pa_sink_input_move_to(pa_sink_input
*i
, pa_sink
*dest
, bool save
) {
1899 pa_sink_input_assert_ref(i
);
1900 pa_assert_ctl_context();
1901 pa_assert(PA_SINK_INPUT_IS_LINKED(i
->state
));
1903 pa_sink_assert_ref(dest
);
1905 if (dest
== i
->sink
)
1908 if (!pa_sink_input_may_move_to(i
, dest
))
1909 return -PA_ERR_NOTSUPPORTED
;
1911 pa_sink_input_ref(i
);
1913 if ((r
= pa_sink_input_start_move(i
)) < 0) {
1914 pa_sink_input_unref(i
);
1918 if ((r
= pa_sink_input_finish_move(i
, dest
, save
)) < 0) {
1919 pa_sink_input_fail_move(i
);
1920 pa_sink_input_unref(i
);
1924 pa_sink_input_unref(i
);
1929 /* Called from IO thread context */
1930 void pa_sink_input_set_state_within_thread(pa_sink_input
*i
, pa_sink_input_state_t state
) {
1931 bool corking
, uncorking
;
1933 pa_sink_input_assert_ref(i
);
1934 pa_sink_input_assert_io_context(i
);
1936 if (state
== i
->thread_info
.state
)
1939 if ((state
== PA_SINK_INPUT_DRAINED
|| state
== PA_SINK_INPUT_RUNNING
) &&
1940 !(i
->thread_info
.state
== PA_SINK_INPUT_DRAINED
|| i
->thread_info
.state
!= PA_SINK_INPUT_RUNNING
))
1941 pa_atomic_store(&i
->thread_info
.drained
, 1);
1943 corking
= state
== PA_SINK_INPUT_CORKED
&& i
->thread_info
.state
== PA_SINK_INPUT_RUNNING
;
1944 uncorking
= i
->thread_info
.state
== PA_SINK_INPUT_CORKED
&& state
== PA_SINK_INPUT_RUNNING
;
1946 if (i
->state_change
)
1947 i
->state_change(i
, state
);
1951 pa_log_debug("Requesting rewind due to corking");
1953 /* This will tell the implementing sink input driver to rewind
1954 * so that the unplayed already mixed data is not lost */
1955 pa_sink_input_request_rewind(i
, 0, true, true, false);
1957 /* Set the corked state *after* requesting rewind */
1958 i
->thread_info
.state
= state
;
1960 } else if (uncorking
) {
1962 pa_log_debug("Requesting rewind due to uncorking");
1964 i
->thread_info
.underrun_for
= (uint64_t) -1;
1965 i
->thread_info
.underrun_for_sink
= 0;
1966 i
->thread_info
.playing_for
= 0;
1968 /* Set the uncorked state *before* requesting rewind */
1969 i
->thread_info
.state
= state
;
1971 /* OK, we're being uncorked. Make sure we're not rewound when
1972 * the hw buffer is remixed and request a remix. */
1973 pa_sink_input_request_rewind(i
, 0, false, true, true);
1975 /* We may not be corking or uncorking, but we still need to set the state. */
1976 i
->thread_info
.state
= state
;
1979 /* Called from thread context, except when it is not. */
1980 int pa_sink_input_process_msg(pa_msgobject
*o
, int code
, void *userdata
, int64_t offset
, pa_memchunk
*chunk
) {
1981 pa_sink_input
*i
= PA_SINK_INPUT(o
);
1982 pa_sink_input_assert_ref(i
);
1986 case PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME
:
1987 if (!pa_cvolume_equal(&i
->thread_info
.soft_volume
, &i
->soft_volume
)) {
1988 i
->thread_info
.soft_volume
= i
->soft_volume
;
1989 pa_sink_input_request_rewind(i
, 0, true, false, false);
1993 case PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE
:
1994 if (i
->thread_info
.muted
!= i
->muted
) {
1995 i
->thread_info
.muted
= i
->muted
;
1996 pa_sink_input_request_rewind(i
, 0, true, false, false);
2000 case PA_SINK_INPUT_MESSAGE_GET_LATENCY
: {
2001 pa_usec_t
*r
= userdata
;
2003 r
[0] += pa_bytes_to_usec(pa_memblockq_get_length(i
->thread_info
.render_memblockq
), &i
->sink
->sample_spec
);
2004 r
[1] += pa_sink_get_latency_within_thread(i
->sink
);
2009 case PA_SINK_INPUT_MESSAGE_SET_RATE
:
2011 i
->thread_info
.sample_spec
.rate
= PA_PTR_TO_UINT(userdata
);
2012 pa_resampler_set_input_rate(i
->thread_info
.resampler
, PA_PTR_TO_UINT(userdata
));
2016 case PA_SINK_INPUT_MESSAGE_SET_STATE
: {
2017 pa_sink_input
*ssync
;
2019 pa_sink_input_set_state_within_thread(i
, PA_PTR_TO_UINT(userdata
));
2021 for (ssync
= i
->thread_info
.sync_prev
; ssync
; ssync
= ssync
->thread_info
.sync_prev
)
2022 pa_sink_input_set_state_within_thread(ssync
, PA_PTR_TO_UINT(userdata
));
2024 for (ssync
= i
->thread_info
.sync_next
; ssync
; ssync
= ssync
->thread_info
.sync_next
)
2025 pa_sink_input_set_state_within_thread(ssync
, PA_PTR_TO_UINT(userdata
));
2030 case PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY
: {
2031 pa_usec_t
*usec
= userdata
;
2033 *usec
= pa_sink_input_set_requested_latency_within_thread(i
, *usec
);
2037 case PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY
: {
2038 pa_usec_t
*r
= userdata
;
2040 *r
= i
->thread_info
.requested_sink_latency
;
2045 return -PA_ERR_NOTIMPLEMENTED
;
2048 /* Called from main thread */
2049 pa_sink_input_state_t
pa_sink_input_get_state(pa_sink_input
*i
) {
2050 pa_sink_input_assert_ref(i
);
2051 pa_assert_ctl_context();
2053 if (i
->state
== PA_SINK_INPUT_RUNNING
|| i
->state
== PA_SINK_INPUT_DRAINED
)
2054 return pa_atomic_load(&i
->thread_info
.drained
) ? PA_SINK_INPUT_DRAINED
: PA_SINK_INPUT_RUNNING
;
2059 /* Called from IO context */
2060 bool pa_sink_input_safe_to_remove(pa_sink_input
*i
) {
2061 pa_sink_input_assert_ref(i
);
2062 pa_sink_input_assert_io_context(i
);
2064 if (PA_SINK_INPUT_IS_LINKED(i
->thread_info
.state
))
2065 return pa_memblockq_is_empty(i
->thread_info
.render_memblockq
);
2070 /* Called from IO context */
2071 void pa_sink_input_request_rewind(
2073 size_t nbytes
/* in our sample spec */,
2076 bool dont_rewind_render
) {
2080 /* If 'rewrite' is true the sink is rewound as far as requested
2081 * and possible and the exact value of this is passed back the
2082 * implementor via process_rewind(). If 'flush' is also true all
2083 * already rendered data is also dropped.
2085 * If 'rewrite' is false the sink is rewound as far as requested
2086 * and possible and the already rendered data is dropped so that
2087 * in the next iteration we read new data from the
2088 * implementor. This implies 'flush' is true. If
2089 * dont_rewind_render is true then the render memblockq is not
2092 /* nbytes = 0 means maximum rewind request */
2094 pa_sink_input_assert_ref(i
);
2095 pa_sink_input_assert_io_context(i
);
2096 pa_assert(rewrite
|| flush
);
2097 pa_assert(!dont_rewind_render
|| !rewrite
);
2099 /* We don't take rewind requests while we are corked */
2100 if (i
->thread_info
.state
== PA_SINK_INPUT_CORKED
)
2103 nbytes
= PA_MAX(i
->thread_info
.rewrite_nbytes
, nbytes
);
2105 #ifdef SINK_INPUT_DEBUG
2106 pa_log_debug("request rewrite %zu", nbytes
);
2109 /* Calculate how much we can rewind locally without having to
2112 lbq
= pa_memblockq_get_length(i
->thread_info
.render_memblockq
);
2116 /* Check if rewinding for the maximum is requested, and if so, fix up */
2119 /* Calculate maximum number of bytes that could be rewound in theory */
2120 nbytes
= i
->sink
->thread_info
.max_rewind
+ lbq
;
2122 /* Transform from sink domain */
2123 if (i
->thread_info
.resampler
)
2124 nbytes
= pa_resampler_request(i
->thread_info
.resampler
, nbytes
);
2127 /* Remember how much we actually want to rewrite */
2128 if (i
->thread_info
.rewrite_nbytes
!= (size_t) -1) {
2130 /* Make sure to not overwrite over underruns */
2131 if (nbytes
> i
->thread_info
.playing_for
)
2132 nbytes
= (size_t) i
->thread_info
.playing_for
;
2134 i
->thread_info
.rewrite_nbytes
= nbytes
;
2136 i
->thread_info
.rewrite_nbytes
= (size_t) -1;
2139 i
->thread_info
.rewrite_flush
=
2140 i
->thread_info
.rewrite_flush
|| flush
;
2142 i
->thread_info
.dont_rewind_render
=
2143 i
->thread_info
.dont_rewind_render
||
2146 /* nbytes is -1 if some earlier rewind request had rewrite == false. */
2147 if (nbytes
!= (size_t) -1) {
2149 /* Transform to sink domain */
2150 if (i
->thread_info
.resampler
)
2151 nbytes
= pa_resampler_result(i
->thread_info
.resampler
, nbytes
);
2154 pa_sink_request_rewind(i
->sink
, nbytes
- lbq
);
2156 /* This call will make sure process_rewind() is called later */
2157 pa_sink_request_rewind(i
->sink
, 0);
2161 /* Called from main context */
2162 pa_memchunk
* pa_sink_input_get_silence(pa_sink_input
*i
, pa_memchunk
*ret
) {
2163 pa_sink_input_assert_ref(i
);
2164 pa_assert_ctl_context();
2167 /* FIXME: Shouldn't access resampler object from main context! */
2169 pa_silence_memchunk_get(
2170 &i
->core
->silence_cache
,
2174 i
->thread_info
.resampler
? pa_resampler_max_block_size(i
->thread_info
.resampler
) : 0);
2179 /* Called from main context */
2180 void pa_sink_input_send_event(pa_sink_input
*i
, const char *event
, pa_proplist
*data
) {
2181 pa_proplist
*pl
= NULL
;
2182 pa_sink_input_send_event_hook_data hook_data
;
2184 pa_sink_input_assert_ref(i
);
2185 pa_assert_ctl_context();
2192 data
= pl
= pa_proplist_new();
2194 hook_data
.sink_input
= i
;
2195 hook_data
.data
= data
;
2196 hook_data
.event
= event
;
2198 if (pa_hook_fire(&i
->core
->hooks
[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT
], &hook_data
) < 0)
2201 i
->send_event(i
, event
, data
);
2205 pa_proplist_free(pl
);
2208 /* Called from main context */
2209 /* Updates the sink input's resampler with whatever the current sink requires
2210 * -- useful when the underlying sink's rate might have changed */
2211 int pa_sink_input_update_rate(pa_sink_input
*i
) {
2212 pa_resampler
*new_resampler
;
2213 char *memblockq_name
;
2215 pa_sink_input_assert_ref(i
);
2216 pa_assert_ctl_context();
2218 if (i
->thread_info
.resampler
&&
2219 pa_sample_spec_equal(pa_resampler_output_sample_spec(i
->thread_info
.resampler
), &i
->sink
->sample_spec
) &&
2220 pa_channel_map_equal(pa_resampler_output_channel_map(i
->thread_info
.resampler
), &i
->sink
->channel_map
))
2222 new_resampler
= i
->thread_info
.resampler
;
2224 else if (!pa_sink_input_is_passthrough(i
) &&
2225 ((i
->flags
& PA_SINK_INPUT_VARIABLE_RATE
) ||
2226 !pa_sample_spec_equal(&i
->sample_spec
, &i
->sink
->sample_spec
) ||
2227 !pa_channel_map_equal(&i
->channel_map
, &i
->sink
->channel_map
))) {
2229 new_resampler
= pa_resampler_new(i
->core
->mempool
,
2230 &i
->sample_spec
, &i
->channel_map
,
2231 &i
->sink
->sample_spec
, &i
->sink
->channel_map
,
2232 i
->requested_resample_method
,
2233 ((i
->flags
& PA_SINK_INPUT_VARIABLE_RATE
) ? PA_RESAMPLER_VARIABLE_RATE
: 0) |
2234 ((i
->flags
& PA_SINK_INPUT_NO_REMAP
) ? PA_RESAMPLER_NO_REMAP
: 0) |
2235 (i
->core
->disable_remixing
|| (i
->flags
& PA_SINK_INPUT_NO_REMIX
) ? PA_RESAMPLER_NO_REMIX
: 0));
2237 if (!new_resampler
) {
2238 pa_log_warn("Unsupported resampling operation.");
2239 return -PA_ERR_NOTSUPPORTED
;
2242 new_resampler
= NULL
;
2244 if (new_resampler
== i
->thread_info
.resampler
)
2247 if (i
->thread_info
.resampler
)
2248 pa_resampler_free(i
->thread_info
.resampler
);
2250 i
->thread_info
.resampler
= new_resampler
;
2252 pa_memblockq_free(i
->thread_info
.render_memblockq
);
2254 memblockq_name
= pa_sprintf_malloc("sink input render_memblockq [%u]", i
->index
);
2255 i
->thread_info
.render_memblockq
= pa_memblockq_new(
2258 MEMBLOCKQ_MAXLENGTH
,
2260 &i
->sink
->sample_spec
,
2265 pa_xfree(memblockq_name
);
2267 i
->actual_resample_method
= new_resampler
? pa_resampler_get_method(new_resampler
) : PA_RESAMPLER_INVALID
;
2269 pa_log_debug("Updated resampler for sink input %d", i
->index
);