Lines Matching refs:i
87 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v);
266 static void reset_callbacks(pa_sink_input *i) { in reset_callbacks() argument
267 pa_assert(i); in reset_callbacks()
269 i->pop = NULL; in reset_callbacks()
270 i->process_underrun = NULL; in reset_callbacks()
271 i->process_rewind = NULL; in reset_callbacks()
272 i->update_max_rewind = NULL; in reset_callbacks()
273 i->update_max_request = NULL; in reset_callbacks()
274 i->update_sink_requested_latency = NULL; in reset_callbacks()
275 i->update_sink_latency_range = NULL; in reset_callbacks()
276 i->update_sink_fixed_latency = NULL; in reset_callbacks()
277 i->attach = NULL; in reset_callbacks()
278 i->detach = NULL; in reset_callbacks()
279 i->suspend = NULL; in reset_callbacks()
280 i->suspend_within_thread = NULL; in reset_callbacks()
281 i->moving = NULL; in reset_callbacks()
282 i->kill = NULL; in reset_callbacks()
283 i->get_latency = NULL; in reset_callbacks()
284 i->state_change = NULL; in reset_callbacks()
285 i->may_move_to = NULL; in reset_callbacks()
286 i->send_event = NULL; in reset_callbacks()
287 i->volume_changed = NULL; in reset_callbacks()
288 i->mute_changed = NULL; in reset_callbacks()
297 pa_sink_input *i; in pa_sink_input_new() local
486 i = pa_msgobject_new(pa_sink_input); in pa_sink_input_new()
487 i->parent.parent.free = sink_input_free; in pa_sink_input_new()
488 i->parent.process_msg = pa_sink_input_process_msg; in pa_sink_input_new()
490 i->core = core; in pa_sink_input_new()
491 i->state = PA_SINK_INPUT_INIT; in pa_sink_input_new()
492 i->flags = data->flags; in pa_sink_input_new()
493 i->proplist = pa_proplist_copy(data->proplist); in pa_sink_input_new()
494 i->driver = pa_xstrdup(pa_path_get_filename(data->driver)); in pa_sink_input_new()
495 i->module = data->module; in pa_sink_input_new()
496 i->sink = data->sink; in pa_sink_input_new()
497 i->sink_requested_by_application = data->sink_requested_by_application; in pa_sink_input_new()
498 i->origin_sink = data->origin_sink; in pa_sink_input_new()
499 i->client = data->client; in pa_sink_input_new()
501 i->requested_resample_method = data->resample_method; in pa_sink_input_new()
502 … i->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID; in pa_sink_input_new()
503 i->sample_spec = data->sample_spec; in pa_sink_input_new()
504 i->channel_map = data->channel_map; in pa_sink_input_new()
505 i->format = pa_format_info_copy(data->format); in pa_sink_input_new()
507 if (!data->volume_is_absolute && pa_sink_flat_volume_enabled(i->sink)) { in pa_sink_input_new()
514 pa_sw_cvolume_multiply(&i->volume, &data->volume, &remapped); in pa_sink_input_new()
516 i->volume = data->volume; in pa_sink_input_new()
518 i->volume_factor_items = data->volume_factor_items; in pa_sink_input_new()
520 volume_factor_from_hashmap(&i->volume_factor, i->volume_factor_items, i->sample_spec.channels); in pa_sink_input_new()
522 i->volume_factor_sink_items = data->volume_factor_sink_items; in pa_sink_input_new()
524 …volume_factor_from_hashmap(&i->volume_factor_sink, i->volume_factor_sink_items, i->sink->sample_sp… in pa_sink_input_new()
526 i->real_ratio = i->reference_ratio = data->volume; in pa_sink_input_new()
527 pa_cvolume_reset(&i->soft_volume, i->sample_spec.channels); in pa_sink_input_new()
528 pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels); in pa_sink_input_new()
529 i->volume_writable = data->volume_writable; in pa_sink_input_new()
530 i->save_volume = data->save_volume; in pa_sink_input_new()
531 i->preferred_sink = pa_xstrdup(data->preferred_sink); in pa_sink_input_new()
532 i->save_muted = data->save_muted; in pa_sink_input_new()
534 i->muted = data->muted; in pa_sink_input_new()
537 i->sync_next = data->sync_base->sync_next; in pa_sink_input_new()
538 i->sync_prev = data->sync_base; in pa_sink_input_new()
541 data->sync_base->sync_next->sync_prev = i; in pa_sink_input_new()
542 data->sync_base->sync_next = i; in pa_sink_input_new()
544 i->sync_next = i->sync_prev = NULL; in pa_sink_input_new()
546 i->direct_outputs = pa_idxset_new(NULL, NULL); in pa_sink_input_new()
548 reset_callbacks(i); in pa_sink_input_new()
549 i->userdata = NULL; in pa_sink_input_new()
551 i->thread_info.state = i->state; in pa_sink_input_new()
552 i->thread_info.attached = false; in pa_sink_input_new()
553 i->thread_info.sample_spec = i->sample_spec; in pa_sink_input_new()
554 i->thread_info.resampler = resampler; in pa_sink_input_new()
555 i->thread_info.soft_volume = i->soft_volume; in pa_sink_input_new()
556 i->thread_info.muted = i->muted; in pa_sink_input_new()
557 i->thread_info.requested_sink_latency = (pa_usec_t) -1; in pa_sink_input_new()
558 i->thread_info.rewrite_nbytes = 0; in pa_sink_input_new()
559 i->thread_info.rewrite_flush = false; in pa_sink_input_new()
560 i->thread_info.dont_rewind_render = false; in pa_sink_input_new()
561 i->thread_info.underrun_for = (uint64_t) -1; in pa_sink_input_new()
562 i->thread_info.underrun_for_sink = 0; in pa_sink_input_new()
563 i->thread_info.playing_for = 0; in pa_sink_input_new()
564 …i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_comp… in pa_sink_input_new()
566 pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0); in pa_sink_input_new()
567 pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0); in pa_sink_input_new()
569 if (i->client) in pa_sink_input_new()
570 pa_assert_se(pa_idxset_put(i->client->sink_inputs, i, NULL) >= 0); in pa_sink_input_new()
572 memblockq_name = pa_sprintf_malloc("sink input render_memblockq [%u]", i->index); in pa_sink_input_new()
573 i->thread_info.render_memblockq = pa_memblockq_new( in pa_sink_input_new()
578 &i->sink->sample_spec, in pa_sink_input_new()
582 &i->sink->silence); in pa_sink_input_new()
585 pt = pa_proplist_to_string_sep(i->proplist, "\n "); in pa_sink_input_new()
587 i->index, in pa_sink_input_new()
588 pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)), in pa_sink_input_new()
589 i->sink->name, in pa_sink_input_new()
590 pa_sample_spec_snprint(st, sizeof(st), &i->sample_spec), in pa_sink_input_new()
591 pa_channel_map_snprint(cm, sizeof(cm), &i->channel_map), in pa_sink_input_new()
597 *_i = i; in pa_sink_input_new()
602 static void update_n_corked(pa_sink_input *i, pa_sink_input_state_t state) { in update_n_corked() argument
603 pa_assert(i); in update_n_corked()
606 if (!i->sink) in update_n_corked()
609 if (i->state == PA_SINK_INPUT_CORKED && state != PA_SINK_INPUT_CORKED) in update_n_corked()
610 pa_assert_se(i->sink->n_corked -- >= 1); in update_n_corked()
611 else if (i->state != PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_CORKED) in update_n_corked()
612 i->sink->n_corked++; in update_n_corked()
616 static void sink_input_set_state(pa_sink_input *i, pa_sink_input_state_t state) { in sink_input_set_state() argument
618 pa_assert(i); in sink_input_set_state()
621 if (i->state == state) in sink_input_set_state()
624 if (i->sink) { in sink_input_set_state()
625 …if (i->state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING && pa_sink_used_by(i->sink)… in sink_input_set_state()
626 !pa_sample_spec_equal(&i->sample_spec, &i->sink->sample_spec)) { in sink_input_set_state()
629 pa_sink_reconfigure(i->sink, &i->sample_spec, pa_sink_input_is_passthrough(i)); in sink_input_set_state()
632 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_STAT… in sink_input_set_state()
636 pa_sink_input_set_state_within_thread(i, state); in sink_input_set_state()
638 for (ssync = i->thread_info.sync_prev; ssync; ssync = ssync->thread_info.sync_prev) in sink_input_set_state()
641 for (ssync = i->thread_info.sync_next; ssync; ssync = ssync->thread_info.sync_next) in sink_input_set_state()
645 update_n_corked(i, state); in sink_input_set_state()
646 i->state = state; in sink_input_set_state()
648 for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev) { in sink_input_set_state()
652 for (ssync = i->sync_next; ssync; ssync = ssync->sync_next) { in sink_input_set_state()
658 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], i); in sink_input_set_state()
660 for (ssync = i->sync_prev; ssync; ssync = ssync->sync_prev) in sink_input_set_state()
661 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync); in sink_input_set_state()
663 for (ssync = i->sync_next; ssync; ssync = ssync->sync_next) in sink_input_set_state()
664 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], ssync); in sink_input_set_state()
667 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->in… in sink_input_set_state()
670 if (i->sink) in sink_input_set_state()
671 pa_sink_update_status(i->sink); in sink_input_set_state()
675 void pa_sink_input_unlink(pa_sink_input *i) { in pa_sink_input_unlink() argument
679 pa_sink_input_assert_ref(i); in pa_sink_input_unlink()
685 pa_sink_input_ref(i); in pa_sink_input_unlink()
687 linked = PA_SINK_INPUT_IS_LINKED(i->state); in pa_sink_input_unlink()
690 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], i); in pa_sink_input_unlink()
692 if (i->sync_prev) in pa_sink_input_unlink()
693 i->sync_prev->sync_next = i->sync_next; in pa_sink_input_unlink()
694 if (i->sync_next) in pa_sink_input_unlink()
695 i->sync_next->sync_prev = i->sync_prev; in pa_sink_input_unlink()
697 i->sync_prev = i->sync_next = NULL; in pa_sink_input_unlink()
699 pa_idxset_remove_by_data(i->core->sink_inputs, i, NULL); in pa_sink_input_unlink()
701 if (i->sink) in pa_sink_input_unlink()
702 if (pa_idxset_remove_by_data(i->sink->inputs, i, NULL)) in pa_sink_input_unlink()
703 pa_sink_input_unref(i); in pa_sink_input_unlink()
705 if (i->client) in pa_sink_input_unlink()
706 pa_idxset_remove_by_data(i->client->sink_inputs, i, NULL); in pa_sink_input_unlink()
708 while ((o = pa_idxset_first(i->direct_outputs, NULL))) { in pa_sink_input_unlink()
714 update_n_corked(i, PA_SINK_INPUT_UNLINKED); in pa_sink_input_unlink()
715 i->state = PA_SINK_INPUT_UNLINKED; in pa_sink_input_unlink()
717 if (linked && i->sink) { in pa_sink_input_unlink()
718 if (pa_sink_input_is_passthrough(i)) in pa_sink_input_unlink()
719 pa_sink_leave_passthrough(i->sink); in pa_sink_input_unlink()
722 if (pa_sink_flat_volume_enabled(i->sink)) in pa_sink_input_unlink()
723 pa_sink_set_volume(i->sink, NULL, false, false); in pa_sink_input_unlink()
725 if (i->sink->asyncmsgq) in pa_sink_input_unlink()
726 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_REMOVE_I… in pa_sink_input_unlink()
729 reset_callbacks(i); in pa_sink_input_unlink()
731 if (i->sink) { in pa_sink_input_unlink()
732 if (PA_SINK_IS_LINKED(i->sink->state)) in pa_sink_input_unlink()
733 pa_sink_update_status(i->sink); in pa_sink_input_unlink()
735 i->sink = NULL; in pa_sink_input_unlink()
739 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_REMOVE, i->in… in pa_sink_input_unlink()
740 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST], i); in pa_sink_input_unlink()
743 pa_core_maybe_vacuum(i->core); in pa_sink_input_unlink()
745 pa_sink_input_unref(i); in pa_sink_input_unlink()
750 pa_sink_input* i = PA_SINK_INPUT(o); in sink_input_free() local
752 pa_assert(i); in sink_input_free()
754 pa_assert(pa_sink_input_refcnt(i) == 0); in sink_input_free()
755 pa_assert(!PA_SINK_INPUT_IS_LINKED(i->state)); in sink_input_free()
757 pa_log_info("Freeing input %u \"%s\"", i->index, in sink_input_free()
758 i->proplist ? pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)) : ""); in sink_input_free()
765 if (i->thread_info.render_memblockq) in sink_input_free()
766 pa_memblockq_free(i->thread_info.render_memblockq); in sink_input_free()
768 if (i->thread_info.resampler) in sink_input_free()
769 pa_resampler_free(i->thread_info.resampler); in sink_input_free()
771 if (i->format) in sink_input_free()
772 pa_format_info_free(i->format); in sink_input_free()
774 if (i->proplist) in sink_input_free()
775 pa_proplist_free(i->proplist); in sink_input_free()
777 if (i->direct_outputs) in sink_input_free()
778 pa_idxset_free(i->direct_outputs, NULL); in sink_input_free()
780 if (i->thread_info.direct_outputs) in sink_input_free()
781 pa_hashmap_free(i->thread_info.direct_outputs); in sink_input_free()
783 if (i->volume_factor_items) in sink_input_free()
784 pa_hashmap_free(i->volume_factor_items); in sink_input_free()
786 if (i->volume_factor_sink_items) in sink_input_free()
787 pa_hashmap_free(i->volume_factor_sink_items); in sink_input_free()
789 if (i->preferred_sink) in sink_input_free()
790 pa_xfree(i->preferred_sink); in sink_input_free()
792 pa_xfree(i->driver); in sink_input_free()
793 pa_xfree(i); in sink_input_free()
797 void pa_sink_input_put(pa_sink_input *i) { in pa_sink_input_put() argument
800 pa_sink_input_assert_ref(i); in pa_sink_input_put()
803 pa_assert(i->state == PA_SINK_INPUT_INIT); in pa_sink_input_put()
806 pa_assert(i->pop); in pa_sink_input_put()
807 pa_assert(i->process_rewind); in pa_sink_input_put()
808 pa_assert(i->kill); in pa_sink_input_put()
810 state = i->flags & PA_SINK_INPUT_START_CORKED ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING; in pa_sink_input_put()
812 update_n_corked(i, state); in pa_sink_input_put()
813 i->state = state; in pa_sink_input_put()
816 if (pa_sink_flat_volume_enabled(i->sink)) in pa_sink_input_put()
817 pa_sink_set_volume(i->sink, NULL, false, i->save_volume); in pa_sink_input_put()
819 if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) { in pa_sink_input_put()
820 pa_assert(pa_cvolume_is_norm(&i->volume)); in pa_sink_input_put()
821 pa_assert(pa_cvolume_is_norm(&i->reference_ratio)); in pa_sink_input_put()
824 set_real_ratio(i, &i->volume); in pa_sink_input_put()
827 if (pa_sink_input_is_passthrough(i)) in pa_sink_input_put()
828 pa_sink_enter_passthrough(i->sink); in pa_sink_input_put()
830 i->thread_info.soft_volume = i->soft_volume; in pa_sink_input_put()
831 i->thread_info.muted = i->muted; in pa_sink_input_put()
833 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_ADD_INPU… in pa_sink_input_put()
835 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, i->index… in pa_sink_input_put()
836 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], i); in pa_sink_input_put()
838 pa_sink_update_status(i->sink); in pa_sink_input_put()
842 void pa_sink_input_kill(pa_sink_input*i) { in pa_sink_input_kill() argument
843 pa_sink_input_assert_ref(i); in pa_sink_input_kill()
845 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_kill()
847 i->kill(i); in pa_sink_input_kill()
851 pa_usec_t pa_sink_input_get_latency(pa_sink_input *i, pa_usec_t *sink_latency) { in pa_sink_input_get_latency() argument
854 pa_sink_input_assert_ref(i); in pa_sink_input_get_latency()
856 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_get_latency()
858 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_LATE… in pa_sink_input_get_latency()
860 if (i->get_latency) in pa_sink_input_get_latency()
861 r[0] += i->get_latency(i); in pa_sink_input_get_latency()
870 void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa_memchunk *chunk, p… in pa_sink_input_peek() argument
877 pa_sink_input_assert_ref(i); in pa_sink_input_peek()
878 pa_sink_input_assert_io_context(i); in pa_sink_input_peek()
879 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state)); in pa_sink_input_peek()
880 pa_assert(pa_frame_aligned(slength, &i->sink->sample_spec)); in pa_sink_input_peek()
888 block_size_max_sink_input = i->thread_info.resampler ? in pa_sink_input_peek()
889 pa_resampler_max_block_size(i->thread_info.resampler) : in pa_sink_input_peek()
890 pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sample_spec); in pa_sink_input_peek()
892 …block_size_max_sink = pa_frame_align(pa_mempool_block_size_max(i->core->mempool), &i->sink->sample… in pa_sink_input_peek()
896 slength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sink->sample_spec); in pa_sink_input_peek()
901 if (i->thread_info.resampler) { in pa_sink_input_peek()
902 ilength = pa_resampler_request(i->thread_info.resampler, slength); in pa_sink_input_peek()
905 ilength = pa_frame_align(CONVERT_BUFFER_LENGTH, &i->sample_spec); in pa_sink_input_peek()
920 do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map); in pa_sink_input_peek()
921 volume_is_norm = pa_cvolume_is_norm(&i->thread_info.soft_volume) && !i->thread_info.muted; in pa_sink_input_peek()
922 need_volume_factor_sink = !pa_cvolume_is_norm(&i->volume_factor_sink); in pa_sink_input_peek()
924 while (!pa_memblockq_is_readable(i->thread_info.render_memblockq)) { in pa_sink_input_peek()
930 if (i->thread_info.state == PA_SINK_INPUT_CORKED || in pa_sink_input_peek()
931 i->pop(i, ilength, &tchunk) < 0) { in pa_sink_input_peek()
936 … pa_memblockq_seek(i->thread_info.render_memblockq, (int64_t) slength, PA_SEEK_RELATIVE, true); in pa_sink_input_peek()
937 i->thread_info.playing_for = 0; in pa_sink_input_peek()
938 if (i->thread_info.underrun_for != (uint64_t) -1) { in pa_sink_input_peek()
939 i->thread_info.underrun_for += ilength_full; in pa_sink_input_peek()
940 i->thread_info.underrun_for_sink += slength; in pa_sink_input_peek()
948 i->thread_info.underrun_for = 0; in pa_sink_input_peek()
949 i->thread_info.underrun_for_sink = 0; in pa_sink_input_peek()
950 i->thread_info.playing_for += tchunk.length; in pa_sink_input_peek()
966 if (i->thread_info.muted) { in pa_sink_input_peek()
967 pa_silence_memchunk(&wchunk, &i->thread_info.sample_spec); in pa_sink_input_peek()
970 } else if (!i->thread_info.resampler && nvfs) { in pa_sink_input_peek()
976 pa_sw_cvolume_multiply(&v, &i->thread_info.soft_volume, &i->volume_factor_sink); in pa_sink_input_peek()
977 pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &v); in pa_sink_input_peek()
981 … pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &i->thread_info.soft_volume); in pa_sink_input_peek()
984 if (!i->thread_info.resampler) { in pa_sink_input_peek()
988 pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &i->volume_factor_sink); in pa_sink_input_peek()
991 pa_memblockq_push_align(i->thread_info.render_memblockq, &wchunk); in pa_sink_input_peek()
994 pa_resampler_run(i->thread_info.resampler, &wchunk, &rchunk); in pa_sink_input_peek()
1004 pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink); in pa_sink_input_peek()
1007 pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk); in pa_sink_input_peek()
1021 pa_assert_se(pa_memblockq_peek(i->thread_info.render_memblockq, chunk) >= 0); in pa_sink_input_peek()
1038 pa_cvolume_reset(volume, i->sink->sample_spec.channels); in pa_sink_input_peek()
1039 else if (i->thread_info.muted) in pa_sink_input_peek()
1041 pa_cvolume_mute(volume, i->sink->sample_spec.channels); in pa_sink_input_peek()
1043 *volume = i->thread_info.soft_volume; in pa_sink_input_peek()
1047 void pa_sink_input_drop(pa_sink_input *i, size_t nbytes /* in sink sample spec */) { in pa_sink_input_drop() argument
1049 pa_sink_input_assert_ref(i); in pa_sink_input_drop()
1050 pa_sink_input_assert_io_context(i); in pa_sink_input_drop()
1051 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state)); in pa_sink_input_drop()
1052 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec)); in pa_sink_input_drop()
1059 pa_memblockq_drop(i->thread_info.render_memblockq, nbytes); in pa_sink_input_drop()
1063 bool pa_sink_input_process_underrun(pa_sink_input *i) { in pa_sink_input_process_underrun() argument
1064 pa_sink_input_assert_ref(i); in pa_sink_input_process_underrun()
1065 pa_sink_input_assert_io_context(i); in pa_sink_input_process_underrun()
1067 if (pa_memblockq_is_readable(i->thread_info.render_memblockq)) in pa_sink_input_process_underrun()
1070 if (i->process_underrun && i->process_underrun(i)) { in pa_sink_input_process_underrun()
1072 pa_memblockq_silence(i->thread_info.render_memblockq); in pa_sink_input_process_underrun()
1079 void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sample spec */) { in pa_sink_input_process_rewind() argument
1083 pa_sink_input_assert_ref(i); in pa_sink_input_process_rewind()
1084 pa_sink_input_assert_io_context(i); in pa_sink_input_process_rewind()
1085 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state)); in pa_sink_input_process_rewind()
1086 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec)); in pa_sink_input_process_rewind()
1089 …pa_log_debug("rewind(%lu, %lu)", (unsigned long) nbytes, (unsigned long) i->thread_info.rewrite_nb… in pa_sink_input_process_rewind()
1092 lbq = pa_memblockq_get_length(i->thread_info.render_memblockq); in pa_sink_input_process_rewind()
1094 if (nbytes > 0 && !i->thread_info.dont_rewind_render) { in pa_sink_input_process_rewind()
1096 pa_memblockq_rewind(i->thread_info.render_memblockq, nbytes); in pa_sink_input_process_rewind()
1099 if (i->thread_info.rewrite_nbytes == (size_t) -1) { in pa_sink_input_process_rewind()
1104 pa_memblockq_flush_write(i->thread_info.render_memblockq, true); in pa_sink_input_process_rewind()
1106 } else if (i->thread_info.rewrite_nbytes > 0) { in pa_sink_input_process_rewind()
1115 if (i->thread_info.resampler) in pa_sink_input_process_rewind()
1116 max_rewrite = pa_resampler_request(i->thread_info.resampler, max_rewrite); in pa_sink_input_process_rewind()
1119 amount = PA_MIN(i->thread_info.rewrite_nbytes, max_rewrite); in pa_sink_input_process_rewind()
1125 if (i->process_rewind) in pa_sink_input_process_rewind()
1126 i->process_rewind(i, amount); in pa_sink_input_process_rewind()
1130 if (i->thread_info.resampler) in pa_sink_input_process_rewind()
1131 amount = pa_resampler_result(i->thread_info.resampler, amount); in pa_sink_input_process_rewind()
1135 … pa_memblockq_seek(i->thread_info.render_memblockq, - ((int64_t) amount), PA_SEEK_RELATIVE, true); in pa_sink_input_process_rewind()
1137 if (i->thread_info.rewrite_flush) in pa_sink_input_process_rewind()
1138 pa_memblockq_silence(i->thread_info.render_memblockq); in pa_sink_input_process_rewind()
1141 if (i->thread_info.resampler) in pa_sink_input_process_rewind()
1142 pa_resampler_rewind(i->thread_info.resampler, amount); in pa_sink_input_process_rewind()
1147 if (i->process_rewind) in pa_sink_input_process_rewind()
1148 i->process_rewind(i, 0); in pa_sink_input_process_rewind()
1150 i->thread_info.rewrite_nbytes = 0; in pa_sink_input_process_rewind()
1151 i->thread_info.rewrite_flush = false; in pa_sink_input_process_rewind()
1152 i->thread_info.dont_rewind_render = false; in pa_sink_input_process_rewind()
1156 size_t pa_sink_input_get_max_rewind(pa_sink_input *i) { in pa_sink_input_get_max_rewind() argument
1157 pa_sink_input_assert_ref(i); in pa_sink_input_get_max_rewind()
1158 pa_sink_input_assert_io_context(i); in pa_sink_input_get_max_rewind()
1160 …return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_i… in pa_sink_input_get_max_rewind()
1164 size_t pa_sink_input_get_max_request(pa_sink_input *i) { in pa_sink_input_get_max_request() argument
1165 pa_sink_input_assert_ref(i); in pa_sink_input_get_max_request()
1166 pa_sink_input_assert_io_context(i); in pa_sink_input_get_max_request()
1171 …return i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, i->sink->thread_i… in pa_sink_input_get_max_request()
1175 void pa_sink_input_update_max_rewind(pa_sink_input *i, size_t nbytes /* in the sink's sample spec … in pa_sink_input_update_max_rewind() argument
1176 pa_sink_input_assert_ref(i); in pa_sink_input_update_max_rewind()
1177 pa_sink_input_assert_io_context(i); in pa_sink_input_update_max_rewind()
1178 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state)); in pa_sink_input_update_max_rewind()
1179 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec)); in pa_sink_input_update_max_rewind()
1181 pa_memblockq_set_maxrewind(i->thread_info.render_memblockq, nbytes); in pa_sink_input_update_max_rewind()
1183 if (i->update_max_rewind) in pa_sink_input_update_max_rewind()
1184 …i->update_max_rewind(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler, … in pa_sink_input_update_max_rewind()
1188 void pa_sink_input_update_max_request(pa_sink_input *i, size_t nbytes /* in the sink's sample spec… in pa_sink_input_update_max_request() argument
1189 pa_sink_input_assert_ref(i); in pa_sink_input_update_max_request()
1190 pa_sink_input_assert_io_context(i); in pa_sink_input_update_max_request()
1191 pa_assert(PA_SINK_INPUT_IS_LINKED(i->thread_info.state)); in pa_sink_input_update_max_request()
1192 pa_assert(pa_frame_aligned(nbytes, &i->sink->sample_spec)); in pa_sink_input_update_max_request()
1194 if (i->update_max_request) in pa_sink_input_update_max_request()
1195 …i->update_max_request(i, i->thread_info.resampler ? pa_resampler_request(i->thread_info.resampler,… in pa_sink_input_update_max_request()
1199 pa_usec_t pa_sink_input_set_requested_latency_within_thread(pa_sink_input *i, pa_usec_t usec) { in pa_sink_input_set_requested_latency_within_thread() argument
1200 pa_sink_input_assert_ref(i); in pa_sink_input_set_requested_latency_within_thread()
1201 pa_sink_input_assert_io_context(i); in pa_sink_input_set_requested_latency_within_thread()
1203 if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY)) in pa_sink_input_set_requested_latency_within_thread()
1204 usec = i->sink->thread_info.fixed_latency; in pa_sink_input_set_requested_latency_within_thread()
1207 usec = PA_CLAMP(usec, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); in pa_sink_input_set_requested_latency_within_thread()
1209 i->thread_info.requested_sink_latency = usec; in pa_sink_input_set_requested_latency_within_thread()
1210 pa_sink_invalidate_requested_latency(i->sink, true); in pa_sink_input_set_requested_latency_within_thread()
1216 pa_usec_t pa_sink_input_set_requested_latency(pa_sink_input *i, pa_usec_t usec) { in pa_sink_input_set_requested_latency() argument
1217 pa_sink_input_assert_ref(i); in pa_sink_input_set_requested_latency()
1220 if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) { in pa_sink_input_set_requested_latency()
1221 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_REQU… in pa_sink_input_set_requested_latency()
1228 if (i->sink) { in pa_sink_input_set_requested_latency()
1229 if (!(i->sink->flags & PA_SINK_DYNAMIC_LATENCY)) in pa_sink_input_set_requested_latency()
1230 usec = pa_sink_get_fixed_latency(i->sink); in pa_sink_input_set_requested_latency()
1234 pa_sink_get_latency_range(i->sink, &min_latency, &max_latency); in pa_sink_input_set_requested_latency()
1239 i->thread_info.requested_sink_latency = usec; in pa_sink_input_set_requested_latency()
1245 pa_usec_t pa_sink_input_get_requested_latency(pa_sink_input *i) { in pa_sink_input_get_requested_latency() argument
1246 pa_sink_input_assert_ref(i); in pa_sink_input_get_requested_latency()
1249 if (PA_SINK_INPUT_IS_LINKED(i->state) && i->sink) { in pa_sink_input_get_requested_latency()
1251 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_GET_REQU… in pa_sink_input_get_requested_latency()
1258 return i->thread_info.requested_sink_latency; in pa_sink_input_get_requested_latency()
1262 void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, bool save, bool absolute)… in pa_sink_input_set_volume() argument
1265 pa_sink_input_assert_ref(i); in pa_sink_input_set_volume()
1267 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_set_volume()
1270 pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &i->sample_spec)); in pa_sink_input_set_volume()
1271 pa_assert(i->volume_writable); in pa_sink_input_set_volume()
1273 if (!absolute && pa_sink_flat_volume_enabled(i->sink)) { in pa_sink_input_set_volume()
1274 v = i->sink->reference_volume; in pa_sink_input_set_volume()
1275 pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map); in pa_sink_input_set_volume()
1277 if (pa_cvolume_compatible(volume, &i->sample_spec)) in pa_sink_input_set_volume()
1282 if (!pa_cvolume_compatible(volume, &i->sample_spec)) { in pa_sink_input_set_volume()
1283 v = i->volume; in pa_sink_input_set_volume()
1288 if (pa_cvolume_equal(volume, &i->volume)) { in pa_sink_input_set_volume()
1289 i->save_volume = i->save_volume || save; in pa_sink_input_set_volume()
1293 pa_sink_input_set_volume_direct(i, volume); in pa_sink_input_set_volume()
1294 i->save_volume = save; in pa_sink_input_set_volume()
1296 if (pa_sink_flat_volume_enabled(i->sink)) { in pa_sink_input_set_volume()
1300 pa_sink_set_volume(i->sink, NULL, true, save); in pa_sink_input_set_volume()
1305 set_real_ratio(i, volume); in pa_sink_input_set_volume()
1306 pa_sink_input_set_reference_ratio(i, &i->volume); in pa_sink_input_set_volume()
1309 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT… in pa_sink_input_set_volume()
1313 void pa_sink_input_add_volume_factor(pa_sink_input *i, const char *key, const pa_cvolume *volume_fa… in pa_sink_input_add_volume_factor() argument
1316 pa_sink_input_assert_ref(i); in pa_sink_input_add_volume_factor()
1318 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_add_volume_factor()
1322 … pa_assert(volume_factor->channels == 1 || pa_cvolume_compatible(volume_factor, &i->sample_spec)); in pa_sink_input_add_volume_factor()
1325 if (!pa_cvolume_compatible(volume_factor, &i->sample_spec)) in pa_sink_input_add_volume_factor()
1326 pa_cvolume_set(&v->volume, i->sample_spec.channels, volume_factor->values[0]); in pa_sink_input_add_volume_factor()
1328 pa_assert_se(pa_hashmap_put(i->volume_factor_items, v->key, v) >= 0); in pa_sink_input_add_volume_factor()
1329 if (pa_hashmap_size(i->volume_factor_items) == 1) in pa_sink_input_add_volume_factor()
1330 i->volume_factor = v->volume; in pa_sink_input_add_volume_factor()
1332 pa_sw_cvolume_multiply(&i->volume_factor, &i->volume_factor, &v->volume); in pa_sink_input_add_volume_factor()
1334 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor); in pa_sink_input_add_volume_factor()
1337 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT… in pa_sink_input_add_volume_factor()
1342 int pa_sink_input_remove_volume_factor(pa_sink_input *i, const char *key) { in pa_sink_input_remove_volume_factor() argument
1345 pa_sink_input_assert_ref(i); in pa_sink_input_remove_volume_factor()
1348 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_remove_volume_factor()
1350 if (pa_hashmap_remove_and_free(i->volume_factor_items, key) < 0) in pa_sink_input_remove_volume_factor()
1353 switch (pa_hashmap_size(i->volume_factor_items)) { in pa_sink_input_remove_volume_factor()
1355 pa_cvolume_reset(&i->volume_factor, i->sample_spec.channels); in pa_sink_input_remove_volume_factor()
1358 v = pa_hashmap_first(i->volume_factor_items); in pa_sink_input_remove_volume_factor()
1359 i->volume_factor = v->volume; in pa_sink_input_remove_volume_factor()
1362 … volume_factor_from_hashmap(&i->volume_factor, i->volume_factor_items, i->volume_factor.channels); in pa_sink_input_remove_volume_factor()
1365 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor); in pa_sink_input_remove_volume_factor()
1368 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT… in pa_sink_input_remove_volume_factor()
1374 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v) { in set_real_ratio() argument
1375 pa_sink_input_assert_ref(i); in set_real_ratio()
1377 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in set_real_ratio()
1378 pa_assert(!v || pa_cvolume_compatible(v, &i->sample_spec)); in set_real_ratio()
1386 i->real_ratio = *v; in set_real_ratio()
1388 pa_cvolume_reset(&i->real_ratio, i->sample_spec.channels); in set_real_ratio()
1390 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor); in set_real_ratio()
1395 bool pa_sink_input_is_passthrough(pa_sink_input *i) { in pa_sink_input_is_passthrough() argument
1396 pa_sink_input_assert_ref(i); in pa_sink_input_is_passthrough()
1398 if (PA_UNLIKELY(!pa_format_info_is_pcm(i->format))) in pa_sink_input_is_passthrough()
1401 if (PA_UNLIKELY(i->flags & PA_SINK_INPUT_PASSTHROUGH)) in pa_sink_input_is_passthrough()
1408 bool pa_sink_input_is_volume_readable(pa_sink_input *i) { in pa_sink_input_is_volume_readable() argument
1409 pa_sink_input_assert_ref(i); in pa_sink_input_is_volume_readable()
1412 return !pa_sink_input_is_passthrough(i); in pa_sink_input_is_volume_readable()
1416 pa_cvolume *pa_sink_input_get_volume(pa_sink_input *i, pa_cvolume *volume, bool absolute) { in pa_sink_input_get_volume() argument
1417 pa_sink_input_assert_ref(i); in pa_sink_input_get_volume()
1419 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_get_volume()
1420 pa_assert(pa_sink_input_is_volume_readable(i)); in pa_sink_input_get_volume()
1422 if (absolute || !pa_sink_flat_volume_enabled(i->sink)) in pa_sink_input_get_volume()
1423 *volume = i->volume; in pa_sink_input_get_volume()
1425 *volume = i->reference_ratio; in pa_sink_input_get_volume()
1431 void pa_sink_input_set_mute(pa_sink_input *i, bool mute, bool save) { in pa_sink_input_set_mute() argument
1434 pa_sink_input_assert_ref(i); in pa_sink_input_set_mute()
1436 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_set_mute()
1438 old_mute = i->muted; in pa_sink_input_set_mute()
1441 i->save_muted |= save; in pa_sink_input_set_mute()
1445 i->muted = mute; in pa_sink_input_set_mute()
1446 …pa_log_debug("The mute of sink input %u changed from %s to %s.", i->index, pa_yes_no(old_mute), pa… in pa_sink_input_set_mute()
1448 i->save_muted = save; in pa_sink_input_set_mute()
1450 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT… in pa_sink_input_set_mute()
1453 if (i->mute_changed) in pa_sink_input_set_mute()
1454 i->mute_changed(i); in pa_sink_input_set_mute()
1456 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->in… in pa_sink_input_set_mute()
1457 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MUTE_CHANGED], i); in pa_sink_input_set_mute()
1460 void pa_sink_input_set_property(pa_sink_input *i, const char *key, const char *value) { in pa_sink_input_set_property() argument
1464 pa_assert(i); in pa_sink_input_set_property()
1467 if (pa_proplist_contains(i->proplist, key)) { in pa_sink_input_set_property()
1468 old_value = pa_xstrdup(pa_proplist_gets(i->proplist, key)); in pa_sink_input_set_property()
1482 pa_proplist_sets(i->proplist, key, value); in pa_sink_input_set_property()
1485 pa_proplist_unset(i->proplist, key); in pa_sink_input_set_property()
1489 if (PA_SINK_INPUT_IS_LINKED(i->state)) { in pa_sink_input_set_property()
1490 pa_log_debug("Sink input %u: proplist[%s]: %s -> %s", i->index, key, old_value, new_value); in pa_sink_input_set_property()
1491 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i); in pa_sink_input_set_property()
1492 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE, i->… in pa_sink_input_set_property()
1499 void pa_sink_input_set_property_arbitrary(pa_sink_input *i, const char *key, const uint8_t *value, … in pa_sink_input_set_property_arbitrary() argument
1505 pa_assert(i); in pa_sink_input_set_property_arbitrary()
1508 if (pa_proplist_get(i->proplist, key, (const void **) &old_value, &old_nbytes) >= 0) { in pa_sink_input_set_property_arbitrary()
1522 pa_proplist_set(i->proplist, key, value, nbytes); in pa_sink_input_set_property_arbitrary()
1525 pa_proplist_unset(i->proplist, key); in pa_sink_input_set_property_arbitrary()
1529 if (PA_SINK_INPUT_IS_LINKED(i->state)) { in pa_sink_input_set_property_arbitrary()
1530 …pa_log_debug("Sink input %u: proplist[%s]: %s -> %s", i->index, key, old_value_str, new_value_str); in pa_sink_input_set_property_arbitrary()
1531 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i); in pa_sink_input_set_property_arbitrary()
1532 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE, i->… in pa_sink_input_set_property_arbitrary()
1537 void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p) { in pa_sink_input_update_proplist() argument
1543 pa_sink_input_assert_ref(i); in pa_sink_input_update_proplist()
1550 for (state = NULL; (key = pa_proplist_iterate(i->proplist, &state));) { in pa_sink_input_update_proplist()
1552 pa_sink_input_set_property(i, key, NULL); in pa_sink_input_update_proplist()
1559 pa_sink_input_set_property_arbitrary(i, key, value, nbytes); in pa_sink_input_update_proplist()
1565 if (pa_proplist_contains(i->proplist, key)) in pa_sink_input_update_proplist()
1569 pa_sink_input_set_property_arbitrary(i, key, value, nbytes); in pa_sink_input_update_proplist()
1577 void pa_sink_input_cork(pa_sink_input *i, bool b) { in pa_sink_input_cork() argument
1578 pa_sink_input_assert_ref(i); in pa_sink_input_cork()
1580 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_cork()
1582 sink_input_set_state(i, b ? PA_SINK_INPUT_CORKED : PA_SINK_INPUT_RUNNING); in pa_sink_input_cork()
1586 int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate) { in pa_sink_input_set_rate() argument
1587 pa_sink_input_assert_ref(i); in pa_sink_input_set_rate()
1589 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_set_rate()
1590 pa_return_val_if_fail(i->thread_info.resampler, -PA_ERR_BADSTATE); in pa_sink_input_set_rate()
1592 if (i->sample_spec.rate == rate) in pa_sink_input_set_rate()
1595 i->sample_spec.rate = rate; in pa_sink_input_set_rate()
1597 if (i->sink) in pa_sink_input_set_rate()
1598 …pa_asyncmsgq_post(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_RATE, PA_UINT_TO_… in pa_sink_input_set_rate()
1600 i->thread_info.sample_spec.rate = rate; in pa_sink_input_set_rate()
1601 pa_resampler_set_input_rate(i->thread_info.resampler, rate); in pa_sink_input_set_rate()
1604 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->in… in pa_sink_input_set_rate()
1609 pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i) { in pa_sink_input_get_resample_method() argument
1610 pa_sink_input_assert_ref(i); in pa_sink_input_get_resample_method()
1613 return i->actual_resample_method; in pa_sink_input_get_resample_method()
1617 bool pa_sink_input_may_move(pa_sink_input *i) { in pa_sink_input_may_move() argument
1618 pa_sink_input_assert_ref(i); in pa_sink_input_may_move()
1620 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_may_move()
1622 if (i->flags & PA_SINK_INPUT_DONT_MOVE) in pa_sink_input_may_move()
1625 if (i->sync_next || i->sync_prev) { in pa_sink_input_may_move()
1634 unsigned PA_UNUSED i = 0; in find_filter_sink_input() local
1639 pa_assert(i++ < 100); in find_filter_sink_input()
1644 static bool is_filter_sink_moving(pa_sink_input *i) { in is_filter_sink_moving() argument
1645 pa_sink *sink = i->sink; in is_filter_sink_moving()
1661 bool pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest) { in pa_sink_input_may_move_to() argument
1662 pa_sink_input_assert_ref(i); in pa_sink_input_may_move_to()
1664 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_may_move_to()
1667 if (dest == i->sink) in pa_sink_input_may_move_to()
1673 if (!pa_sink_input_may_move(i)) in pa_sink_input_may_move_to()
1677 if (find_filter_sink_input(i, dest)) { in pa_sink_input_may_move_to()
1686 if (is_filter_sink_moving(i)) { in pa_sink_input_may_move_to()
1688 i->sink->name); in pa_sink_input_may_move_to()
1697 if (check_passthrough_connection(pa_sink_input_is_passthrough(i), dest) < 0) in pa_sink_input_may_move_to()
1700 if (i->may_move_to) in pa_sink_input_may_move_to()
1701 if (!i->may_move_to(i, dest)) in pa_sink_input_may_move_to()
1708 int pa_sink_input_start_move(pa_sink_input *i) { in pa_sink_input_start_move() argument
1714 pa_sink_input_assert_ref(i); in pa_sink_input_start_move()
1716 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_start_move()
1717 pa_assert(i->sink); in pa_sink_input_start_move()
1719 if (!pa_sink_input_may_move(i)) in pa_sink_input_start_move()
1722 if ((r = pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], i)) < 0) in pa_sink_input_start_move()
1725 pa_log_debug("Starting to move sink input %u from '%s'", (unsigned) i->index, i->sink->name); in pa_sink_input_start_move()
1728 while ((o = pa_idxset_first(i->direct_outputs, NULL))) { in pa_sink_input_start_move()
1733 pa_assert(pa_idxset_isempty(i->direct_outputs)); in pa_sink_input_start_move()
1735 pa_idxset_remove_by_data(i->sink->inputs, i, NULL); in pa_sink_input_start_move()
1737 if (i->state == PA_SINK_INPUT_CORKED) in pa_sink_input_start_move()
1738 pa_assert_se(i->sink->n_corked-- >= 1); in pa_sink_input_start_move()
1740 if (pa_sink_input_is_passthrough(i)) in pa_sink_input_start_move()
1741 pa_sink_leave_passthrough(i->sink); in pa_sink_input_start_move()
1743 if (pa_sink_flat_volume_enabled(i->sink)) in pa_sink_input_start_move()
1746 pa_sink_set_volume(i->sink, NULL, false, false); in pa_sink_input_start_move()
1748 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_START_MO… in pa_sink_input_start_move()
1750 pa_sink_update_status(i->sink); in pa_sink_input_start_move()
1752 PA_HASHMAP_FOREACH(v, i->volume_factor_sink_items, state) in pa_sink_input_start_move()
1753 pa_cvolume_remap(&v->volume, &i->sink->channel_map, &i->channel_map); in pa_sink_input_start_move()
1755 pa_cvolume_remap(&i->volume_factor_sink, &i->sink->channel_map, &i->channel_map); in pa_sink_input_start_move()
1757 i->sink = NULL; in pa_sink_input_start_move()
1758 i->sink_requested_by_application = false; in pa_sink_input_start_move()
1760 pa_sink_input_unref(i); in pa_sink_input_start_move()
1768 static void update_volume_due_to_moving(pa_sink_input *i, pa_sink *dest) { in update_volume_due_to_moving() argument
1771 pa_assert(i); in update_volume_due_to_moving()
1773 pa_assert(i->sink); /* The destination sink should already be set. */ in update_volume_due_to_moving()
1775 if (i->origin_sink && (i->origin_sink->flags & PA_SINK_SHARE_VOLUME_WITH_MASTER)) { in update_volume_due_to_moving()
1776 pa_sink *root_sink = pa_sink_get_master(i->sink); in update_volume_due_to_moving()
1783 if (pa_sink_flat_volume_enabled(i->sink)) { in update_volume_due_to_moving()
1799 pa_assert(pa_cvolume_is_norm(&i->real_ratio)); in update_volume_due_to_moving()
1800 pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor)); in update_volume_due_to_moving()
1818 pa_cvolume_reset(&new_volume, i->volume.channels); in update_volume_due_to_moving()
1819 pa_sink_input_set_volume_direct(i, &new_volume); in update_volume_due_to_moving()
1820 pa_sink_input_set_reference_ratio(i, &new_volume); in update_volume_due_to_moving()
1821 pa_assert(pa_cvolume_is_norm(&i->real_ratio)); in update_volume_due_to_moving()
1822 pa_assert(pa_cvolume_equal(&i->soft_volume, &i->volume_factor)); in update_volume_due_to_moving()
1834 pa_cvolume_remap(&new_volume, &root_sink->channel_map, &i->origin_sink->channel_map); in update_volume_due_to_moving()
1835 pa_sink_set_reference_volume_direct(i->origin_sink, &new_volume); in update_volume_due_to_moving()
1837 i->origin_sink->real_volume = root_sink->real_volume; in update_volume_due_to_moving()
1838 …pa_cvolume_remap(&i->origin_sink->real_volume, &root_sink->channel_map, &i->origin_sink->channel_m… in update_volume_due_to_moving()
1840 pa_assert(pa_cvolume_is_norm(&i->origin_sink->soft_volume)); in update_volume_due_to_moving()
1850 PA_IDXSET_FOREACH(origin_sink_input, i->origin_sink->inputs, idx) in update_volume_due_to_moving()
1854 if (pa_sink_flat_volume_enabled(i->sink)) { in update_volume_due_to_moving()
1865 new_volume = i->sink->reference_volume; in update_volume_due_to_moving()
1866 pa_cvolume_remap(&new_volume, &i->sink->channel_map, &i->channel_map); in update_volume_due_to_moving()
1867 pa_sw_cvolume_multiply(&new_volume, &new_volume, &i->reference_ratio); in update_volume_due_to_moving()
1868 pa_sink_input_set_volume_direct(i, &new_volume); in update_volume_due_to_moving()
1879 pa_sink_input_set_volume_direct(i, &i->reference_ratio); in update_volume_due_to_moving()
1880 i->real_ratio = i->reference_ratio; in update_volume_due_to_moving()
1881 pa_sw_cvolume_multiply(&i->soft_volume, &i->real_ratio, &i->volume_factor); in update_volume_due_to_moving()
1887 if ((i->sink == dest) && pa_sink_flat_volume_enabled(i->sink)) in update_volume_due_to_moving()
1888 pa_sink_set_volume(i->sink, NULL, false, i->save_volume); in update_volume_due_to_moving()
1892 int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, bool save) { in pa_sink_input_finish_move() argument
1896 pa_sink_input_assert_ref(i); in pa_sink_input_finish_move()
1898 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_finish_move()
1899 pa_assert(!i->sink); in pa_sink_input_finish_move()
1902 if (!pa_sink_input_may_move_to(i, dest)) in pa_sink_input_finish_move()
1905 if (pa_sink_input_is_passthrough(i) && !pa_sink_check_format(dest, i->format)) { in pa_sink_input_finish_move()
1911 pa_sink_input_send_event(i, PA_STREAM_EVENT_FORMAT_LOST, p); in pa_sink_input_finish_move()
1916 if (!(i->flags & PA_SINK_INPUT_VARIABLE_RATE) && in pa_sink_input_finish_move()
1917 !pa_sample_spec_equal(&i->sample_spec, &dest->sample_spec)) { in pa_sink_input_finish_move()
1923 pa_sink_reconfigure(dest, &i->sample_spec, pa_sink_input_is_passthrough(i)); in pa_sink_input_finish_move()
1926 if (i->moving) in pa_sink_input_finish_move()
1927 i->moving(i, dest); in pa_sink_input_finish_move()
1929 i->sink = dest; in pa_sink_input_finish_move()
1933 pa_xfree(i->preferred_sink); in pa_sink_input_finish_move()
1935 i->preferred_sink = NULL; in pa_sink_input_finish_move()
1937 i->preferred_sink = pa_xstrdup(dest->name); in pa_sink_input_finish_move()
1940 pa_idxset_put(dest->inputs, pa_sink_input_ref(i), NULL); in pa_sink_input_finish_move()
1942 PA_HASHMAP_FOREACH(v, i->volume_factor_sink_items, state) in pa_sink_input_finish_move()
1943 pa_cvolume_remap(&v->volume, &i->channel_map, &i->sink->channel_map); in pa_sink_input_finish_move()
1945 pa_cvolume_remap(&i->volume_factor_sink, &i->channel_map, &i->sink->channel_map); in pa_sink_input_finish_move()
1947 if (i->state == PA_SINK_INPUT_CORKED) in pa_sink_input_finish_move()
1948 i->sink->n_corked++; in pa_sink_input_finish_move()
1950 pa_sink_input_update_resampler(i); in pa_sink_input_finish_move()
1954 update_volume_due_to_moving(i, dest); in pa_sink_input_finish_move()
1956 if (pa_sink_input_is_passthrough(i)) in pa_sink_input_finish_move()
1957 pa_sink_enter_passthrough(i->sink); in pa_sink_input_finish_move()
1959 …pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i->sink), PA_SINK_MESSAGE_FINISH_M… in pa_sink_input_finish_move()
1961 pa_log_debug("Successfully moved sink input %i to %s.", i->index, dest->name); in pa_sink_input_finish_move()
1964 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], i); in pa_sink_input_finish_move()
1965 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->in… in pa_sink_input_finish_move()
1971 void pa_sink_input_fail_move(pa_sink_input *i) { in pa_sink_input_fail_move() argument
1973 pa_sink_input_assert_ref(i); in pa_sink_input_fail_move()
1975 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_fail_move()
1976 pa_assert(!i->sink); in pa_sink_input_fail_move()
1979 if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FAIL], i) == PA_HOOK_STOP) in pa_sink_input_fail_move()
1983 if (i->core->rescue_streams && pa_sink_input_may_move_to(i, i->core->default_sink)) { in pa_sink_input_fail_move()
1984 if (pa_sink_input_finish_move(i, i->core->default_sink, false) >= 0) in pa_sink_input_fail_move()
1988 if (i->moving) in pa_sink_input_fail_move()
1989 i->moving(i, NULL); in pa_sink_input_fail_move()
1991 pa_sink_input_kill(i); in pa_sink_input_fail_move()
1995 int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, bool save) { in pa_sink_input_move_to() argument
1998 pa_sink_input_assert_ref(i); in pa_sink_input_move_to()
2000 pa_assert(PA_SINK_INPUT_IS_LINKED(i->state)); in pa_sink_input_move_to()
2001 pa_assert(i->sink); in pa_sink_input_move_to()
2004 if (dest == i->sink) in pa_sink_input_move_to()
2007 if (!pa_sink_input_may_move_to(i, dest)) in pa_sink_input_move_to()
2010 pa_sink_input_ref(i); in pa_sink_input_move_to()
2012 if ((r = pa_sink_input_start_move(i)) < 0) { in pa_sink_input_move_to()
2013 pa_sink_input_unref(i); in pa_sink_input_move_to()
2017 if ((r = pa_sink_input_finish_move(i, dest, save)) < 0) { in pa_sink_input_move_to()
2018 pa_sink_input_fail_move(i); in pa_sink_input_move_to()
2019 pa_sink_input_unref(i); in pa_sink_input_move_to()
2023 pa_sink_input_unref(i); in pa_sink_input_move_to()
2029 void pa_sink_input_set_state_within_thread(pa_sink_input *i, pa_sink_input_state_t state) { in pa_sink_input_set_state_within_thread() argument
2032 pa_sink_input_assert_ref(i); in pa_sink_input_set_state_within_thread()
2034 if (state == i->thread_info.state) in pa_sink_input_set_state_within_thread()
2037 corking = state == PA_SINK_INPUT_CORKED && i->thread_info.state == PA_SINK_INPUT_RUNNING; in pa_sink_input_set_state_within_thread()
2038 uncorking = i->thread_info.state == PA_SINK_INPUT_CORKED && state == PA_SINK_INPUT_RUNNING; in pa_sink_input_set_state_within_thread()
2040 if (i->state_change) in pa_sink_input_set_state_within_thread()
2041 i->state_change(i, state); in pa_sink_input_set_state_within_thread()
2049 if (i->sink) in pa_sink_input_set_state_within_thread()
2050 pa_sink_input_request_rewind(i, 0, true, true, false); in pa_sink_input_set_state_within_thread()
2053 i->thread_info.state = state; in pa_sink_input_set_state_within_thread()
2059 i->thread_info.underrun_for = (uint64_t) -1; in pa_sink_input_set_state_within_thread()
2060 i->thread_info.underrun_for_sink = 0; in pa_sink_input_set_state_within_thread()
2061 i->thread_info.playing_for = 0; in pa_sink_input_set_state_within_thread()
2064 i->thread_info.state = state; in pa_sink_input_set_state_within_thread()
2068 if (i->sink) in pa_sink_input_set_state_within_thread()
2069 pa_sink_input_request_rewind(i, 0, false, true, true); in pa_sink_input_set_state_within_thread()
2072 i->thread_info.state = state; in pa_sink_input_set_state_within_thread()
2077 pa_sink_input *i = PA_SINK_INPUT(o); in pa_sink_input_process_msg() local
2078 pa_sink_input_assert_ref(i); in pa_sink_input_process_msg()
2083 if (!pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume)) { in pa_sink_input_process_msg()
2084 i->thread_info.soft_volume = i->soft_volume; in pa_sink_input_process_msg()
2085 pa_sink_input_request_rewind(i, 0, true, false, false); in pa_sink_input_process_msg()
2090 if (i->thread_info.muted != i->muted) { in pa_sink_input_process_msg()
2091 i->thread_info.muted = i->muted; in pa_sink_input_process_msg()
2092 pa_sink_input_request_rewind(i, 0, true, false, false); in pa_sink_input_process_msg()
2099 …r[0] += pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sampl… in pa_sink_input_process_msg()
2100 r[1] += pa_sink_get_latency_within_thread(i->sink, false); in pa_sink_input_process_msg()
2107 i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata); in pa_sink_input_process_msg()
2108 pa_resampler_set_input_rate(i->thread_info.resampler, PA_PTR_TO_UINT(userdata)); in pa_sink_input_process_msg()
2115 pa_sink_input_set_state_within_thread(i, PA_PTR_TO_UINT(userdata)); in pa_sink_input_process_msg()
2117 for (ssync = i->thread_info.sync_prev; ssync; ssync = ssync->thread_info.sync_prev) in pa_sink_input_process_msg()
2120 for (ssync = i->thread_info.sync_next; ssync; ssync = ssync->thread_info.sync_next) in pa_sink_input_process_msg()
2129 *usec = pa_sink_input_set_requested_latency_within_thread(i, *usec); in pa_sink_input_process_msg()
2136 *r = i->thread_info.requested_sink_latency; in pa_sink_input_process_msg()
2145 bool pa_sink_input_safe_to_remove(pa_sink_input *i) { in pa_sink_input_safe_to_remove() argument
2146 pa_sink_input_assert_ref(i); in pa_sink_input_safe_to_remove()
2147 pa_sink_input_assert_io_context(i); in pa_sink_input_safe_to_remove()
2149 if (PA_SINK_INPUT_IS_LINKED(i->thread_info.state)) in pa_sink_input_safe_to_remove()
2150 return pa_memblockq_is_empty(i->thread_info.render_memblockq); in pa_sink_input_safe_to_remove()
2157 pa_sink_input *i, in pa_sink_input_request_rewind() argument
2179 pa_sink_input_assert_ref(i); in pa_sink_input_request_rewind()
2180 pa_sink_input_assert_io_context(i); in pa_sink_input_request_rewind()
2185 if (i->thread_info.state == PA_SINK_INPUT_CORKED) in pa_sink_input_request_rewind()
2188 nbytes = PA_MAX(i->thread_info.rewrite_nbytes, nbytes); in pa_sink_input_request_rewind()
2197 lbq = pa_memblockq_get_length(i->thread_info.render_memblockq); in pa_sink_input_request_rewind()
2205 nbytes = i->sink->thread_info.max_rewind + lbq; in pa_sink_input_request_rewind()
2208 if (i->thread_info.resampler) in pa_sink_input_request_rewind()
2209 nbytes = pa_resampler_request(i->thread_info.resampler, nbytes); in pa_sink_input_request_rewind()
2213 if (i->thread_info.rewrite_nbytes != (size_t) -1) { in pa_sink_input_request_rewind()
2216 if (nbytes > i->thread_info.playing_for) in pa_sink_input_request_rewind()
2217 nbytes = (size_t) i->thread_info.playing_for; in pa_sink_input_request_rewind()
2219 i->thread_info.rewrite_nbytes = nbytes; in pa_sink_input_request_rewind()
2221 i->thread_info.rewrite_nbytes = (size_t) -1; in pa_sink_input_request_rewind()
2224 i->thread_info.rewrite_flush = in pa_sink_input_request_rewind()
2225 i->thread_info.rewrite_flush || flush; in pa_sink_input_request_rewind()
2227 i->thread_info.dont_rewind_render = in pa_sink_input_request_rewind()
2228 i->thread_info.dont_rewind_render || in pa_sink_input_request_rewind()
2235 if (i->thread_info.resampler) in pa_sink_input_request_rewind()
2236 nbytes = pa_resampler_result(i->thread_info.resampler, nbytes); in pa_sink_input_request_rewind()
2239 pa_sink_request_rewind(i->sink, nbytes - lbq); in pa_sink_input_request_rewind()
2242 pa_sink_request_rewind(i->sink, 0); in pa_sink_input_request_rewind()
2247 pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, pa_memchunk *ret) { in pa_sink_input_get_silence() argument
2248 pa_sink_input_assert_ref(i); in pa_sink_input_get_silence()
2255 &i->core->silence_cache, in pa_sink_input_get_silence()
2256 i->core->mempool, in pa_sink_input_get_silence()
2258 &i->sample_spec, in pa_sink_input_get_silence()
2259 … i->thread_info.resampler ? pa_resampler_max_block_size(i->thread_info.resampler) : 0); in pa_sink_input_get_silence()
2265 void pa_sink_input_send_event(pa_sink_input *i, const char *event, pa_proplist *data) { in pa_sink_input_send_event() argument
2269 pa_sink_input_assert_ref(i); in pa_sink_input_send_event()
2273 if (!i->send_event) in pa_sink_input_send_event()
2279 hook_data.sink_input = i; in pa_sink_input_send_event()
2283 if (pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT], &hook_data) < 0) in pa_sink_input_send_event()
2286 i->send_event(i, event, data); in pa_sink_input_send_event()
2296 int pa_sink_input_update_resampler(pa_sink_input *i) { in pa_sink_input_update_resampler() argument
2300 pa_sink_input_assert_ref(i); in pa_sink_input_update_resampler()
2303 if (i->thread_info.resampler && in pa_sink_input_update_resampler()
2304 …pa_sample_spec_equal(pa_resampler_output_sample_spec(i->thread_info.resampler), &i->sink->sample_s… in pa_sink_input_update_resampler()
2305 …pa_channel_map_equal(pa_resampler_output_channel_map(i->thread_info.resampler), &i->sink->channel_… in pa_sink_input_update_resampler()
2307 new_resampler = i->thread_info.resampler; in pa_sink_input_update_resampler()
2309 else if (!pa_sink_input_is_passthrough(i) && in pa_sink_input_update_resampler()
2310 ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) || in pa_sink_input_update_resampler()
2311 !pa_sample_spec_equal(&i->sample_spec, &i->sink->sample_spec) || in pa_sink_input_update_resampler()
2312 !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map))) { in pa_sink_input_update_resampler()
2314 new_resampler = pa_resampler_new(i->core->mempool, in pa_sink_input_update_resampler()
2315 &i->sample_spec, &i->channel_map, in pa_sink_input_update_resampler()
2316 &i->sink->sample_spec, &i->sink->channel_map, in pa_sink_input_update_resampler()
2317 i->core->lfe_crossover_freq, in pa_sink_input_update_resampler()
2318 i->requested_resample_method, in pa_sink_input_update_resampler()
2319 … ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) | in pa_sink_input_update_resampler()
2320 … ((i->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) | in pa_sink_input_update_resampler()
2321 … (i->core->disable_remixing || (i->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) | in pa_sink_input_update_resampler()
2322 … (i->core->remixing_use_all_sink_channels ? 0 : PA_RESAMPLER_NO_FILL_SINK) | in pa_sink_input_update_resampler()
2323 … (i->core->remixing_produce_lfe ? PA_RESAMPLER_PRODUCE_LFE : 0) | in pa_sink_input_update_resampler()
2324 … (i->core->remixing_consume_lfe ? PA_RESAMPLER_CONSUME_LFE : 0)); in pa_sink_input_update_resampler()
2333 if (new_resampler == i->thread_info.resampler) in pa_sink_input_update_resampler()
2336 if (i->thread_info.resampler) in pa_sink_input_update_resampler()
2337 pa_resampler_free(i->thread_info.resampler); in pa_sink_input_update_resampler()
2339 i->thread_info.resampler = new_resampler; in pa_sink_input_update_resampler()
2341 pa_memblockq_free(i->thread_info.render_memblockq); in pa_sink_input_update_resampler()
2343 memblockq_name = pa_sprintf_malloc("sink input render_memblockq [%u]", i->index); in pa_sink_input_update_resampler()
2344 i->thread_info.render_memblockq = pa_memblockq_new( in pa_sink_input_update_resampler()
2349 &i->sink->sample_spec, in pa_sink_input_update_resampler()
2353 &i->sink->silence); in pa_sink_input_update_resampler()
2356 …i->actual_resample_method = new_resampler ? pa_resampler_get_method(new_resampler) : PA_RESAMPLER_… in pa_sink_input_update_resampler()
2358 pa_log_debug("Updated resampler for sink input %d", i->index); in pa_sink_input_update_resampler()
2364 void pa_sink_input_attach(pa_sink_input *i) { in pa_sink_input_attach() argument
2365 pa_assert(i); in pa_sink_input_attach()
2366 pa_assert(!i->thread_info.attached); in pa_sink_input_attach()
2368 i->thread_info.attached = true; in pa_sink_input_attach()
2370 if (i->attach) in pa_sink_input_attach()
2371 i->attach(i); in pa_sink_input_attach()
2375 void pa_sink_input_detach(pa_sink_input *i) { in pa_sink_input_detach() argument
2376 pa_assert(i); in pa_sink_input_detach()
2378 if (!i->thread_info.attached) in pa_sink_input_detach()
2381 i->thread_info.attached = false; in pa_sink_input_detach()
2383 if (i->detach) in pa_sink_input_detach()
2384 i->detach(i); in pa_sink_input_detach()
2388 void pa_sink_input_set_volume_direct(pa_sink_input *i, const pa_cvolume *volume) { in pa_sink_input_set_volume_direct() argument
2393 pa_assert(i); in pa_sink_input_set_volume_direct()
2396 old_volume = i->volume; in pa_sink_input_set_volume_direct()
2401 i->volume = *volume; in pa_sink_input_set_volume_direct()
2402 pa_log_debug("The volume of sink input %u changed from %s to %s.", i->index, in pa_sink_input_set_volume_direct()
2403 …pa_cvolume_snprint_verbose(old_volume_str, sizeof(old_volume_str), &old_volume, &i->channel_map, t… in pa_sink_input_set_volume_direct()
2404 …pa_cvolume_snprint_verbose(new_volume_str, sizeof(new_volume_str), volume, &i->channel_map, true)); in pa_sink_input_set_volume_direct()
2406 if (i->volume_changed) in pa_sink_input_set_volume_direct()
2407 i->volume_changed(i); in pa_sink_input_set_volume_direct()
2409 …pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->in… in pa_sink_input_set_volume_direct()
2410 pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_VOLUME_CHANGED], i); in pa_sink_input_set_volume_direct()
2414 void pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume *ratio) { in pa_sink_input_set_reference_ratio() argument
2419 pa_assert(i); in pa_sink_input_set_reference_ratio()
2422 old_ratio = i->reference_ratio; in pa_sink_input_set_reference_ratio()
2427 i->reference_ratio = *ratio; in pa_sink_input_set_reference_ratio()
2429 if (!PA_SINK_INPUT_IS_LINKED(i->state)) in pa_sink_input_set_reference_ratio()
2432 pa_log_debug("Sink input %u reference ratio changed from %s to %s.", i->index, in pa_sink_input_set_reference_ratio()
2433 …pa_cvolume_snprint_verbose(old_ratio_str, sizeof(old_ratio_str), &old_ratio, &i->channel_map, true… in pa_sink_input_set_reference_ratio()
2434 … pa_cvolume_snprint_verbose(new_ratio_str, sizeof(new_ratio_str), ratio, &i->channel_map, true)); in pa_sink_input_set_reference_ratio()
2438 void pa_sink_input_set_preferred_sink(pa_sink_input *i, pa_sink *s) { in pa_sink_input_set_preferred_sink() argument
2439 pa_assert(i); in pa_sink_input_set_preferred_sink()
2441 pa_xfree(i->preferred_sink); in pa_sink_input_set_preferred_sink()
2443 i->preferred_sink = pa_xstrdup(s->name); in pa_sink_input_set_preferred_sink()
2444 pa_sink_input_move_to(i, s, false); in pa_sink_input_set_preferred_sink()
2446 i->preferred_sink = NULL; in pa_sink_input_set_preferred_sink()
2447 pa_sink_input_move_to(i, i->core->default_sink, false); in pa_sink_input_set_preferred_sink()