• Home
  • Raw
  • Download

Lines Matching full:o

49 static void set_real_ratio(pa_source_output *o, const pa_cvolume *v);
206 static void reset_callbacks(pa_source_output *o) { in reset_callbacks() argument
207 pa_assert(o); in reset_callbacks()
209 o->push = NULL; in reset_callbacks()
210 o->process_rewind = NULL; in reset_callbacks()
211 o->update_max_rewind = NULL; in reset_callbacks()
212 o->update_source_requested_latency = NULL; in reset_callbacks()
213 o->update_source_latency_range = NULL; in reset_callbacks()
214 o->update_source_fixed_latency = NULL; in reset_callbacks()
215 o->attach = NULL; in reset_callbacks()
216 o->detach = NULL; in reset_callbacks()
217 o->suspend = NULL; in reset_callbacks()
218 o->suspend_within_thread = NULL; in reset_callbacks()
219 o->moving = NULL; in reset_callbacks()
220 o->kill = NULL; in reset_callbacks()
221 o->get_latency = NULL; in reset_callbacks()
222 o->state_change = NULL; in reset_callbacks()
223 o->may_move_to = NULL; in reset_callbacks()
224 o->send_event = NULL; in reset_callbacks()
225 o->volume_changed = NULL; in reset_callbacks()
226 o->mute_changed = NULL; in reset_callbacks()
235 pa_source_output *o; in pa_source_output_new() local
435 o = pa_msgobject_new(pa_source_output); in pa_source_output_new()
436 o->parent.parent.free = source_output_free; in pa_source_output_new()
437 o->parent.process_msg = pa_source_output_process_msg; in pa_source_output_new()
439 o->core = core; in pa_source_output_new()
440 o->state = PA_SOURCE_OUTPUT_INIT; in pa_source_output_new()
441 o->flags = data->flags; in pa_source_output_new()
442 o->proplist = pa_proplist_copy(data->proplist); in pa_source_output_new()
443 o->driver = pa_xstrdup(pa_path_get_filename(data->driver)); in pa_source_output_new()
444 o->module = data->module; in pa_source_output_new()
445 o->source = data->source; in pa_source_output_new()
446 o->source_requested_by_application = data->source_requested_by_application; in pa_source_output_new()
447 o->destination_source = data->destination_source; in pa_source_output_new()
448 o->client = data->client; in pa_source_output_new()
450 o->requested_resample_method = data->resample_method; in pa_source_output_new()
451o->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID; in pa_source_output_new()
452 o->sample_spec = data->sample_spec; in pa_source_output_new()
453 o->channel_map = data->channel_map; in pa_source_output_new()
454 o->format = pa_format_info_copy(data->format); in pa_source_output_new()
456 if (!data->volume_is_absolute && pa_source_flat_volume_enabled(o->source)) { in pa_source_output_new()
463 pa_sw_cvolume_multiply(&o->volume, &data->volume, &remapped); in pa_source_output_new()
465 o->volume = data->volume; in pa_source_output_new()
467 o->volume_factor = data->volume_factor; in pa_source_output_new()
468 o->volume_factor_source = data->volume_factor_source; in pa_source_output_new()
469 o->real_ratio = o->reference_ratio = data->volume; in pa_source_output_new()
470 pa_cvolume_reset(&o->soft_volume, o->sample_spec.channels); in pa_source_output_new()
471 pa_cvolume_reset(&o->real_ratio, o->sample_spec.channels); in pa_source_output_new()
472 o->volume_writable = data->volume_writable; in pa_source_output_new()
473 o->save_volume = data->save_volume; in pa_source_output_new()
474 o->preferred_source = pa_xstrdup(data->preferred_source); in pa_source_output_new()
475 o->save_muted = data->save_muted; in pa_source_output_new()
477 o->muted = data->muted; in pa_source_output_new()
479 o->direct_on_input = data->direct_on_input; in pa_source_output_new()
481 reset_callbacks(o); in pa_source_output_new()
482 o->userdata = NULL; in pa_source_output_new()
484 o->thread_info.state = o->state; in pa_source_output_new()
485 o->thread_info.attached = false; in pa_source_output_new()
486 o->thread_info.sample_spec = o->sample_spec; in pa_source_output_new()
487 o->thread_info.resampler = resampler; in pa_source_output_new()
488 o->thread_info.soft_volume = o->soft_volume; in pa_source_output_new()
489 o->thread_info.muted = o->muted; in pa_source_output_new()
490 o->thread_info.requested_source_latency = (pa_usec_t) -1; in pa_source_output_new()
491 o->thread_info.direct_on_input = o->direct_on_input; in pa_source_output_new()
493 o->thread_info.delay_memblockq = pa_memblockq_new( in pa_source_output_new()
498 &o->source->sample_spec, in pa_source_output_new()
502 &o->source->silence); in pa_source_output_new()
504 …resampler_history = (uint64_t) PA_RESAMPLER_MAX_DELAY_USEC * o->source->sample_spec.rate / PA_USEC… in pa_source_output_new()
505 resampler_history *= pa_frame_size(&o->source->sample_spec); in pa_source_output_new()
507 …pa_memblockq_set_maxrewind(o->thread_info.delay_memblockq, resampler_history + pa_source_get_max_r… in pa_source_output_new()
509 pa_assert_se(pa_idxset_put(core->source_outputs, o, &o->index) == 0); in pa_source_output_new()
510 pa_assert_se(pa_idxset_put(o->source->outputs, pa_source_output_ref(o), NULL) == 0); in pa_source_output_new()
512 if (o->client) in pa_source_output_new()
513 pa_assert_se(pa_idxset_put(o->client->source_outputs, o, NULL) >= 0); in pa_source_output_new()
515 if (o->direct_on_input) in pa_source_output_new()
516 pa_assert_se(pa_idxset_put(o->direct_on_input->direct_outputs, o, NULL) == 0); in pa_source_output_new()
518 pt = pa_proplist_to_string_sep(o->proplist, "\n "); in pa_source_output_new()
520 o->index, in pa_source_output_new()
521 pa_strnull(pa_proplist_gets(o->proplist, PA_PROP_MEDIA_NAME)), in pa_source_output_new()
522 o->source->name, in pa_source_output_new()
523 pa_sample_spec_snprint(st, sizeof(st), &o->sample_spec), in pa_source_output_new()
524 pa_channel_map_snprint(cm, sizeof(cm), &o->channel_map), in pa_source_output_new()
530 *_o = o; in pa_source_output_new()
535 static void update_n_corked(pa_source_output *o, pa_source_output_state_t state) { in update_n_corked() argument
536 pa_assert(o); in update_n_corked()
539 if (!o->source) in update_n_corked()
542 if (o->state == PA_SOURCE_OUTPUT_CORKED && state != PA_SOURCE_OUTPUT_CORKED) in update_n_corked()
543 pa_assert_se(o->source->n_corked -- >= 1); in update_n_corked()
544 else if (o->state != PA_SOURCE_OUTPUT_CORKED && state == PA_SOURCE_OUTPUT_CORKED) in update_n_corked()
545 o->source->n_corked++; in update_n_corked()
549 static void source_output_set_state(pa_source_output *o, pa_source_output_state_t state) { in source_output_set_state() argument
551 pa_assert(o); in source_output_set_state()
554 if (o->state == state) in source_output_set_state()
557 if (o->source) { in source_output_set_state()
558 …if (o->state == PA_SOURCE_OUTPUT_CORKED && state == PA_SOURCE_OUTPUT_RUNNING && pa_source_used_by( in source_output_set_state()
559 !pa_sample_spec_equal(&o->sample_spec, &o->source->sample_spec)) { in source_output_set_state()
562 pa_source_reconfigure(o->source, &o->sample_spec, pa_source_output_is_passthrough(o)); in source_output_set_state()
565 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET… in source_output_set_state()
568 pa_source_output_set_state_within_thread(o, state); in source_output_set_state()
570 update_n_corked(o, state); in source_output_set_state()
571 o->state = state; in source_output_set_state()
574 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_STATE_CHANGED], o); in source_output_set_state()
577 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o-… in source_output_set_state()
580 if (o->source) in source_output_set_state()
581 pa_source_update_status(o->source); in source_output_set_state()
585 void pa_source_output_unlink(pa_source_output*o) { in pa_source_output_unlink() argument
588 pa_source_output_assert_ref(o); in pa_source_output_unlink()
594 pa_source_output_ref(o); in pa_source_output_unlink()
596 linked = PA_SOURCE_OUTPUT_IS_LINKED(o->state); in pa_source_output_unlink()
599 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], o); in pa_source_output_unlink()
601 if (o->direct_on_input) in pa_source_output_unlink()
602 pa_idxset_remove_by_data(o->direct_on_input->direct_outputs, o, NULL); in pa_source_output_unlink()
604 pa_idxset_remove_by_data(o->core->source_outputs, o, NULL); in pa_source_output_unlink()
606 if (o->source) in pa_source_output_unlink()
607 if (pa_idxset_remove_by_data(o->source->outputs, o, NULL)) in pa_source_output_unlink()
608 pa_source_output_unref(o); in pa_source_output_unlink()
610 if (o->client) in pa_source_output_unlink()
611 pa_idxset_remove_by_data(o->client->source_outputs, o, NULL); in pa_source_output_unlink()
613 update_n_corked(o, PA_SOURCE_OUTPUT_UNLINKED); in pa_source_output_unlink()
614 o->state = PA_SOURCE_OUTPUT_UNLINKED; in pa_source_output_unlink()
616 if (linked && o->source) { in pa_source_output_unlink()
617 if (pa_source_output_is_passthrough(o)) in pa_source_output_unlink()
618 pa_source_leave_passthrough(o->source); in pa_source_output_unlink()
621 if (pa_source_flat_volume_enabled(o->source)) in pa_source_output_unlink()
622 pa_source_set_volume(o->source, NULL, false, false); in pa_source_output_unlink()
624 if (o->source->asyncmsgq) in pa_source_output_unlink()
625 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_RE… in pa_source_output_unlink()
628 reset_callbacks(o); in pa_source_output_unlink()
630 if (o->source) { in pa_source_output_unlink()
631 if (PA_SOURCE_IS_LINKED(o->source->state)) in pa_source_output_unlink()
632 pa_source_update_status(o->source); in pa_source_output_unlink()
634 o->source = NULL; in pa_source_output_unlink()
638 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_REMOVE, o-… in pa_source_output_unlink()
639 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK_POST], o); in pa_source_output_unlink()
642 pa_core_maybe_vacuum(o->core); in pa_source_output_unlink()
644 pa_source_output_unref(o); in pa_source_output_unlink()
649 pa_source_output *o = PA_SOURCE_OUTPUT(mo); in source_output_free() local
651 pa_assert(o); in source_output_free()
653 pa_assert(pa_source_output_refcnt(o) == 0); in source_output_free()
654 pa_assert(!PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in source_output_free()
656 pa_log_info("Freeing output %u \"%s\"", o->index, in source_output_free()
657 o->proplist ? pa_strnull(pa_proplist_gets(o->proplist, PA_PROP_MEDIA_NAME)) : ""); in source_output_free()
659 if (o->thread_info.delay_memblockq) in source_output_free()
660 pa_memblockq_free(o->thread_info.delay_memblockq); in source_output_free()
662 if (o->thread_info.resampler) in source_output_free()
663 pa_resampler_free(o->thread_info.resampler); in source_output_free()
665 if (o->format) in source_output_free()
666 pa_format_info_free(o->format); in source_output_free()
668 if (o->proplist) in source_output_free()
669 pa_proplist_free(o->proplist); in source_output_free()
671 if (o->preferred_source) in source_output_free()
672 pa_xfree(o->preferred_source); in source_output_free()
674 pa_xfree(o->driver); in source_output_free()
675 pa_xfree(o); in source_output_free()
679 void pa_source_output_put(pa_source_output *o) { in pa_source_output_put() argument
682 pa_source_output_assert_ref(o); in pa_source_output_put()
685 pa_assert(o->state == PA_SOURCE_OUTPUT_INIT); in pa_source_output_put()
688 pa_assert(o->push); in pa_source_output_put()
689 pa_assert(o->kill); in pa_source_output_put()
691 …state = o->flags & PA_SOURCE_OUTPUT_START_CORKED ? PA_SOURCE_OUTPUT_CORKED : PA_SOURCE_OUTPUT_RUNN… in pa_source_output_put()
693 update_n_corked(o, state); in pa_source_output_put()
694 o->state = state; in pa_source_output_put()
697 if (pa_source_flat_volume_enabled(o->source)) in pa_source_output_put()
698 pa_source_set_volume(o->source, NULL, false, o->save_volume); in pa_source_output_put()
700 …if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) { in pa_source_output_put()
701 pa_assert(pa_cvolume_is_norm(&o->volume)); in pa_source_output_put()
702 pa_assert(pa_cvolume_is_norm(&o->reference_ratio)); in pa_source_output_put()
705 set_real_ratio(o, &o->volume); in pa_source_output_put()
708 if (pa_source_output_is_passthrough(o)) in pa_source_output_put()
709 pa_source_enter_passthrough(o->source); in pa_source_output_put()
711 o->thread_info.soft_volume = o->soft_volume; in pa_source_output_put()
712 o->thread_info.muted = o->muted; in pa_source_output_put()
714 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_AD… in pa_source_output_put()
716 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_NEW, o->in… in pa_source_output_put()
717 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], o); in pa_source_output_put()
719 pa_source_update_status(o->source); in pa_source_output_put()
723 void pa_source_output_kill(pa_source_output*o) { in pa_source_output_kill() argument
724 pa_source_output_assert_ref(o); in pa_source_output_kill()
726 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_kill()
728 o->kill(o); in pa_source_output_kill()
732 pa_usec_t pa_source_output_get_latency(pa_source_output *o, pa_usec_t *source_latency) { in pa_source_output_get_latency() argument
735 pa_source_output_assert_ref(o); in pa_source_output_get_latency()
737 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_get_latency()
739 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_GET… in pa_source_output_get_latency()
741 if (o->get_latency) in pa_source_output_get_latency()
742 r[0] += o->get_latency(o); in pa_source_output_get_latency()
751 void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk) { in pa_source_output_push() argument
757 pa_source_output_assert_ref(o); in pa_source_output_push()
758 pa_source_output_assert_io_context(o); in pa_source_output_push()
759 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->thread_info.state)); in pa_source_output_push()
761 pa_assert(pa_frame_aligned(chunk->length, &o->source->sample_spec)); in pa_source_output_push()
763 if (!o->push || o->thread_info.state == PA_SOURCE_OUTPUT_CORKED) in pa_source_output_push()
766 pa_assert(o->thread_info.state == PA_SOURCE_OUTPUT_RUNNING); in pa_source_output_push()
768 if (pa_memblockq_push(o->thread_info.delay_memblockq, chunk) < 0) { in pa_source_output_push()
770 …pa_memblockq_seek(o->thread_info.delay_memblockq, (int64_t) chunk->length, PA_SEEK_RELATIVE, true); in pa_source_output_push()
773 limit = o->process_rewind ? 0 : o->source->thread_info.max_rewind; in pa_source_output_push()
775 volume_is_norm = pa_cvolume_is_norm(&o->thread_info.soft_volume) && !o->thread_info.muted; in pa_source_output_push()
776 need_volume_factor_source = !pa_cvolume_is_norm(&o->volume_factor_source); in pa_source_output_push()
778 if (limit > 0 && o->source->monitor_of) { in pa_source_output_push()
789 latency = pa_sink_get_latency_within_thread(o->source->monitor_of, false); in pa_source_output_push()
791 n = pa_usec_to_bytes(latency, &o->source->sample_spec); in pa_source_output_push()
798 while ((length = pa_memblockq_get_length(o->thread_info.delay_memblockq)) > limit) { in pa_source_output_push()
804 pa_assert_se(pa_memblockq_peek(o->thread_info.delay_memblockq, &qchunk) >= 0); in pa_source_output_push()
815 if (o->thread_info.muted) { in pa_source_output_push()
816 pa_silence_memchunk(&qchunk, &o->source->sample_spec); in pa_source_output_push()
819 } else if (!o->thread_info.resampler && nvfs) { in pa_source_output_push()
825 pa_sw_cvolume_multiply(&v, &o->thread_info.soft_volume, &o->volume_factor_source); in pa_source_output_push()
826 pa_volume_memchunk(&qchunk, &o->source->sample_spec, &v); in pa_source_output_push()
830 pa_volume_memchunk(&qchunk, &o->source->sample_spec, &o->thread_info.soft_volume); in pa_source_output_push()
835 pa_volume_memchunk(&qchunk, &o->source->sample_spec, &o->volume_factor_source); in pa_source_output_push()
838 if (!o->thread_info.resampler) in pa_source_output_push()
839 o->push(o, &qchunk); in pa_source_output_push()
844 mbs = pa_resampler_max_block_size(o->thread_info.resampler); in pa_source_output_push()
849 pa_resampler_run(o->thread_info.resampler, &qchunk, &rchunk); in pa_source_output_push()
852 o->push(o, &rchunk); in pa_source_output_push()
859 pa_memblockq_drop(o->thread_info.delay_memblockq, qchunk.length); in pa_source_output_push()
864 void pa_source_output_process_rewind(pa_source_output *o, size_t nbytes /* in source sample spec */… in pa_source_output_process_rewind() argument
866 pa_source_output_assert_ref(o); in pa_source_output_process_rewind()
867 pa_source_output_assert_io_context(o); in pa_source_output_process_rewind()
868 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->thread_info.state)); in pa_source_output_process_rewind()
869 pa_assert(pa_frame_aligned(nbytes, &o->source->sample_spec)); in pa_source_output_process_rewind()
874 if (o->process_rewind) { in pa_source_output_process_rewind()
881 length = pa_memblockq_get_length(o->thread_info.delay_memblockq); in pa_source_output_process_rewind()
883 pa_memblockq_rewind(o->thread_info.delay_memblockq, nbytes); in pa_source_output_process_rewind()
885 source_output_nbytes = pa_resampler_result(o->thread_info.resampler, nbytes); in pa_source_output_process_rewind()
890 o->process_rewind(o, source_output_nbytes); in pa_source_output_process_rewind()
892 if (o->thread_info.resampler && length == 0) { in pa_source_output_process_rewind()
896 …resampler_bytes = (size_t) pa_resampler_get_delay(o->thread_info.resampler, false) * pa_frame_size… in pa_source_output_process_rewind()
898 pa_memblockq_rewind(o->thread_info.delay_memblockq, resampler_bytes); in pa_source_output_process_rewind()
900 pa_resampler_rewind(o->thread_info.resampler, source_output_nbytes, NULL, 0); in pa_source_output_process_rewind()
904 pa_memblockq_seek(o->thread_info.delay_memblockq, - ((int64_t) nbytes), PA_SEEK_RELATIVE, true); in pa_source_output_process_rewind()
908 size_t pa_source_output_get_max_rewind(pa_source_output *o) { in pa_source_output_get_max_rewind() argument
909 pa_source_output_assert_ref(o); in pa_source_output_get_max_rewind()
910 pa_source_output_assert_io_context(o); in pa_source_output_get_max_rewind()
912 return pa_resampler_result(o->thread_info.resampler, o->source->thread_info.max_rewind); in pa_source_output_get_max_rewind()
916 void pa_source_output_update_max_rewind(pa_source_output *o, size_t nbytes /* in the source's samp… in pa_source_output_update_max_rewind() argument
919 pa_source_output_assert_ref(o); in pa_source_output_update_max_rewind()
920 pa_source_output_assert_io_context(o); in pa_source_output_update_max_rewind()
921 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->thread_info.state)); in pa_source_output_update_max_rewind()
922 pa_assert(pa_frame_aligned(nbytes, &o->source->sample_spec)); in pa_source_output_update_max_rewind()
924 …resampler_history = (uint64_t) PA_RESAMPLER_MAX_DELAY_USEC * o->source->sample_spec.rate / PA_USEC… in pa_source_output_update_max_rewind()
925 resampler_history *= pa_frame_size(&o->source->sample_spec); in pa_source_output_update_max_rewind()
927 pa_memblockq_set_maxrewind(o->thread_info.delay_memblockq, resampler_history + nbytes); in pa_source_output_update_max_rewind()
929 if (o->update_max_rewind) in pa_source_output_update_max_rewind()
930 o->update_max_rewind(o, pa_resampler_result(o->thread_info.resampler, nbytes)); in pa_source_output_update_max_rewind()
934 pa_usec_t pa_source_output_set_requested_latency_within_thread(pa_source_output *o, pa_usec_t usec)… in pa_source_output_set_requested_latency_within_thread() argument
935 pa_source_output_assert_ref(o); in pa_source_output_set_requested_latency_within_thread()
936 pa_source_output_assert_io_context(o); in pa_source_output_set_requested_latency_within_thread()
938 if (!(o->source->flags & PA_SOURCE_DYNAMIC_LATENCY)) in pa_source_output_set_requested_latency_within_thread()
939 usec = o->source->thread_info.fixed_latency; in pa_source_output_set_requested_latency_within_thread()
942 … usec = PA_CLAMP(usec, o->source->thread_info.min_latency, o->source->thread_info.max_latency); in pa_source_output_set_requested_latency_within_thread()
944 o->thread_info.requested_source_latency = usec; in pa_source_output_set_requested_latency_within_thread()
945 pa_source_invalidate_requested_latency(o->source, true); in pa_source_output_set_requested_latency_within_thread()
951 pa_usec_t pa_source_output_set_requested_latency(pa_source_output *o, pa_usec_t usec) { in pa_source_output_set_requested_latency() argument
952 pa_source_output_assert_ref(o); in pa_source_output_set_requested_latency()
955 if (PA_SOURCE_OUTPUT_IS_LINKED(o->state) && o->source) { in pa_source_output_set_requested_latency()
956 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET… in pa_source_output_set_requested_latency()
963 if (o->source) { in pa_source_output_set_requested_latency()
964 if (!(o->source->flags & PA_SOURCE_DYNAMIC_LATENCY)) in pa_source_output_set_requested_latency()
965 usec = pa_source_get_fixed_latency(o->source); in pa_source_output_set_requested_latency()
969 pa_source_get_latency_range(o->source, &min_latency, &max_latency); in pa_source_output_set_requested_latency()
974 o->thread_info.requested_source_latency = usec; in pa_source_output_set_requested_latency()
980 pa_usec_t pa_source_output_get_requested_latency(pa_source_output *o) { in pa_source_output_get_requested_latency() argument
981 pa_source_output_assert_ref(o); in pa_source_output_get_requested_latency()
984 if (PA_SOURCE_OUTPUT_IS_LINKED(o->state) && o->source) { in pa_source_output_get_requested_latency()
986 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_GET… in pa_source_output_get_requested_latency()
993 return o->thread_info.requested_source_latency; in pa_source_output_get_requested_latency()
997 void pa_source_output_set_volume(pa_source_output *o, const pa_cvolume *volume, bool save, bool abs… in pa_source_output_set_volume() argument
1000 pa_source_output_assert_ref(o); in pa_source_output_set_volume()
1002 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_set_volume()
1005 pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &o->sample_spec)); in pa_source_output_set_volume()
1006 pa_assert(o->volume_writable); in pa_source_output_set_volume()
1008 if (!absolute && pa_source_flat_volume_enabled(o->source)) { in pa_source_output_set_volume()
1009 v = o->source->reference_volume; in pa_source_output_set_volume()
1010 pa_cvolume_remap(&v, &o->source->channel_map, &o->channel_map); in pa_source_output_set_volume()
1012 if (pa_cvolume_compatible(volume, &o->sample_spec)) in pa_source_output_set_volume()
1017 if (!pa_cvolume_compatible(volume, &o->sample_spec)) { in pa_source_output_set_volume()
1018 v = o->volume; in pa_source_output_set_volume()
1023 if (pa_cvolume_equal(volume, &o->volume)) { in pa_source_output_set_volume()
1024 o->save_volume = o->save_volume || save; in pa_source_output_set_volume()
1028 pa_source_output_set_volume_direct(o, volume); in pa_source_output_set_volume()
1029 o->save_volume = save; in pa_source_output_set_volume()
1031 if (pa_source_flat_volume_enabled(o->source)) { in pa_source_output_set_volume()
1035 pa_source_set_volume(o->source, NULL, true, save); in pa_source_output_set_volume()
1040 set_real_ratio(o, volume); in pa_source_output_set_volume()
1043 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET… in pa_source_output_set_volume()
1047 if (o->volume_changed) in pa_source_output_set_volume()
1048 o->volume_changed(o); in pa_source_output_set_volume()
1051 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o-… in pa_source_output_set_volume()
1055 static void set_real_ratio(pa_source_output *o, const pa_cvolume *v) { in set_real_ratio() argument
1056 pa_source_output_assert_ref(o); in set_real_ratio()
1058 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in set_real_ratio()
1059 pa_assert(!v || pa_cvolume_compatible(v, &o->sample_spec)); in set_real_ratio()
1063 * o->real_ratio := v in set_real_ratio()
1064 * o->soft_volume := o->real_ratio * o->volume_factor */ in set_real_ratio()
1067 o->real_ratio = *v; in set_real_ratio()
1069 pa_cvolume_reset(&o->real_ratio, o->sample_spec.channels); in set_real_ratio()
1071 pa_sw_cvolume_multiply(&o->soft_volume, &o->real_ratio, &o->volume_factor); in set_real_ratio()
1075 /* Called from main or I/O context */
1076 bool pa_source_output_is_passthrough(pa_source_output *o) { in pa_source_output_is_passthrough() argument
1077 pa_source_output_assert_ref(o); in pa_source_output_is_passthrough()
1079 if (PA_UNLIKELY(!pa_format_info_is_pcm(o->format))) in pa_source_output_is_passthrough()
1082 if (PA_UNLIKELY(o->flags & PA_SOURCE_OUTPUT_PASSTHROUGH)) in pa_source_output_is_passthrough()
1089 bool pa_source_output_is_volume_readable(pa_source_output *o) { in pa_source_output_is_volume_readable() argument
1090 pa_source_output_assert_ref(o); in pa_source_output_is_volume_readable()
1093 return !pa_source_output_is_passthrough(o); in pa_source_output_is_volume_readable()
1097 pa_cvolume *pa_source_output_get_volume(pa_source_output *o, pa_cvolume *volume, bool absolute) { in pa_source_output_get_volume() argument
1098 pa_source_output_assert_ref(o); in pa_source_output_get_volume()
1100 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_get_volume()
1101 pa_assert(pa_source_output_is_volume_readable(o)); in pa_source_output_get_volume()
1103 if (absolute || !pa_source_flat_volume_enabled(o->source)) in pa_source_output_get_volume()
1104 *volume = o->volume; in pa_source_output_get_volume()
1106 *volume = o->reference_ratio; in pa_source_output_get_volume()
1112 void pa_source_output_set_mute(pa_source_output *o, bool mute, bool save) { in pa_source_output_set_mute() argument
1115 pa_source_output_assert_ref(o); in pa_source_output_set_mute()
1117 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_set_mute()
1119 old_mute = o->muted; in pa_source_output_set_mute()
1122 o->save_muted |= save; in pa_source_output_set_mute()
1126 o->muted = mute; in pa_source_output_set_mute()
1127 …pa_log_debug("The mute of source output %u changed from %s to %s.", o->index, pa_yes_no(old_mute),… in pa_source_output_set_mute()
1129 o->save_muted = save; in pa_source_output_set_mute()
1131 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET… in pa_source_output_set_mute()
1134 if (o->mute_changed) in pa_source_output_set_mute()
1135 o->mute_changed(o); in pa_source_output_set_mute()
1137 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o-… in pa_source_output_set_mute()
1138 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MUTE_CHANGED], o); in pa_source_output_set_mute()
1141 void pa_source_output_set_property(pa_source_output *o, const char *key, const char *value) { in pa_source_output_set_property() argument
1145 pa_assert(o); in pa_source_output_set_property()
1148 if (pa_proplist_contains(o->proplist, key)) { in pa_source_output_set_property()
1149 old_value = pa_xstrdup(pa_proplist_gets(o->proplist, key)); in pa_source_output_set_property()
1163 pa_proplist_sets(o->proplist, key, value); in pa_source_output_set_property()
1166 pa_proplist_unset(o->proplist, key); in pa_source_output_set_property()
1170 if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) { in pa_source_output_set_property()
1171 … pa_log_debug("Source output %u: proplist[%s]: %s -> %s", o->index, key, old_value, new_value); in pa_source_output_set_property()
1172 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], o); in pa_source_output_set_property()
1173 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE, in pa_source_output_set_property()
1180 void pa_source_output_set_property_arbitrary(pa_source_output *o, const char *key, const uint8_t *v… in pa_source_output_set_property_arbitrary() argument
1186 pa_assert(o); in pa_source_output_set_property_arbitrary()
1189 if (pa_proplist_get(o->proplist, key, (const void **) &old_value, &old_nbytes) >= 0) { in pa_source_output_set_property_arbitrary()
1203 pa_proplist_set(o->proplist, key, value, nbytes); in pa_source_output_set_property_arbitrary()
1206 pa_proplist_unset(o->proplist, key); in pa_source_output_set_property_arbitrary()
1210 if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) { in pa_source_output_set_property_arbitrary()
1211 …pa_log_debug("Source output %u: proplist[%s]: %s -> %s", o->index, key, old_value_str, new_value_s… in pa_source_output_set_property_arbitrary()
1212 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], o); in pa_source_output_set_property_arbitrary()
1213 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE, in pa_source_output_set_property_arbitrary()
1218 void pa_source_output_update_proplist(pa_source_output *o, pa_update_mode_t mode, pa_proplist *p) { in pa_source_output_update_proplist() argument
1224 pa_source_output_assert_ref(o); in pa_source_output_update_proplist()
1231 for (state = NULL; (key = pa_proplist_iterate(o->proplist, &state));) { in pa_source_output_update_proplist()
1233 pa_source_output_set_property(o, key, NULL); in pa_source_output_update_proplist()
1240 pa_source_output_set_property_arbitrary(o, key, value, nbytes); in pa_source_output_update_proplist()
1246 if (pa_proplist_contains(o->proplist, key)) in pa_source_output_update_proplist()
1250 pa_source_output_set_property_arbitrary(o, key, value, nbytes); in pa_source_output_update_proplist()
1258 void pa_source_output_cork(pa_source_output *o, bool b) { in pa_source_output_cork() argument
1259 pa_source_output_assert_ref(o); in pa_source_output_cork()
1261 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_cork()
1263 source_output_set_state(o, b ? PA_SOURCE_OUTPUT_CORKED : PA_SOURCE_OUTPUT_RUNNING); in pa_source_output_cork()
1267 int pa_source_output_set_rate(pa_source_output *o, uint32_t rate) { in pa_source_output_set_rate() argument
1268 pa_source_output_assert_ref(o); in pa_source_output_set_rate()
1270 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_set_rate()
1271 pa_return_val_if_fail(o->thread_info.resampler, -PA_ERR_BADSTATE); in pa_source_output_set_rate()
1273 if (o->sample_spec.rate == rate) in pa_source_output_set_rate()
1276 o->sample_spec.rate = rate; in pa_source_output_set_rate()
1278 …pa_asyncmsgq_post(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET_RATE, PA_UIN… in pa_source_output_set_rate()
1280 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o-… in pa_source_output_set_rate()
1285 pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o) { in pa_source_output_get_resample_method() argument
1286 pa_source_output_assert_ref(o); in pa_source_output_get_resample_method()
1289 return o->actual_resample_method; in pa_source_output_get_resample_method()
1293 bool pa_source_output_may_move(pa_source_output *o) { in pa_source_output_may_move() argument
1294 pa_source_output_assert_ref(o); in pa_source_output_may_move()
1296 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_may_move()
1298 if (o->flags & PA_SOURCE_OUTPUT_DONT_MOVE) { in pa_source_output_may_move()
1302 if (o->direct_on_input) in pa_source_output_may_move()
1319 static bool is_filter_source_moving(pa_source_output *o) { in is_filter_source_moving() argument
1320 pa_source *source = o->source; in is_filter_source_moving()
1336 bool pa_source_output_may_move_to(pa_source_output *o, pa_source *dest) { in pa_source_output_may_move_to() argument
1337 pa_source_output_assert_ref(o); in pa_source_output_may_move_to()
1338 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_may_move_to()
1341 if (dest == o->source) in pa_source_output_may_move_to()
1347 if (!pa_source_output_may_move(o)) in pa_source_output_may_move_to()
1351 if (find_filter_source_output(o, dest)) { in pa_source_output_may_move_to()
1361 if (is_filter_source_moving(o)) { in pa_source_output_may_move_to()
1363 o->source->name); in pa_source_output_may_move_to()
1372 if (o->may_move_to) in pa_source_output_may_move_to()
1373 if (!o->may_move_to(o, dest)) in pa_source_output_may_move_to()
1380 int pa_source_output_start_move(pa_source_output *o) { in pa_source_output_start_move() argument
1384 pa_source_output_assert_ref(o); in pa_source_output_start_move()
1386 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_start_move()
1387 pa_assert(o->source); in pa_source_output_start_move()
1389 if (!pa_source_output_may_move(o)) in pa_source_output_start_move()
1392 if ((r = pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_START], o)) < 0) in pa_source_output_start_move()
1395 … pa_log_debug("Starting to move source output %u from '%s'", (unsigned) o->index, o->source->name); in pa_source_output_start_move()
1396 if (o->source) { in pa_source_output_start_move()
1398 o->index, o->source->index, o->source->name); in pa_source_output_start_move()
1401 origin = o->source; in pa_source_output_start_move()
1403 pa_idxset_remove_by_data(o->source->outputs, o, NULL); in pa_source_output_start_move()
1405 if (o->state == PA_SOURCE_OUTPUT_CORKED) in pa_source_output_start_move()
1408 if (pa_source_output_is_passthrough(o)) in pa_source_output_start_move()
1409 pa_source_leave_passthrough(o->source); in pa_source_output_start_move()
1411 if (pa_source_flat_volume_enabled(o->source)) in pa_source_output_start_move()
1414 pa_source_set_volume(o->source, NULL, false, false); in pa_source_output_start_move()
1416 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_RE… in pa_source_output_start_move()
1418 pa_source_update_status(o->source); in pa_source_output_start_move()
1420 pa_cvolume_remap(&o->volume_factor_source, &o->source->channel_map, &o->channel_map); in pa_source_output_start_move()
1422 o->source = NULL; in pa_source_output_start_move()
1423 o->source_requested_by_application = false; in pa_source_output_start_move()
1425 pa_source_output_unref(o); in pa_source_output_start_move()
1433 static void update_volume_due_to_moving(pa_source_output *o, pa_source *dest) { in update_volume_due_to_moving() argument
1436 pa_assert(o); in update_volume_due_to_moving()
1438 pa_assert(o->source); /* The destination source should already be set. */ in update_volume_due_to_moving()
1440 …if (o->destination_source && (o->destination_source->flags & PA_SOURCE_SHARE_VOLUME_WITH_MASTER)) { in update_volume_due_to_moving()
1445 root_source = pa_source_get_master(o->source); in update_volume_due_to_moving()
1450 if (pa_source_flat_volume_enabled(o->source)) { in update_volume_due_to_moving()
1454 * o->volume := o->source->real_volume in update_volume_due_to_moving()
1456 * o->reference_ratio := o->volume / o->source->reference_volume in update_volume_due_to_moving()
1458 * o->real_ratio stays unchanged in update_volume_due_to_moving()
1461 * o->soft_volume stays unchanged in update_volume_due_to_moving()
1466 pa_assert(pa_cvolume_is_norm(&o->real_ratio)); in update_volume_due_to_moving()
1467 pa_assert(pa_cvolume_equal(&o->soft_volume, &o->volume_factor)); in update_volume_due_to_moving()
1475 * o->volume := 0 dB in update_volume_due_to_moving()
1476 * o->reference_ratio := 0 dB in update_volume_due_to_moving()
1477 * o->real_ratio stays unchanged in update_volume_due_to_moving()
1480 * o->soft_volume stays unchanged in update_volume_due_to_moving()
1485 pa_cvolume_reset(&new_volume, o->volume.channels); in update_volume_due_to_moving()
1486 pa_source_output_set_volume_direct(o, &new_volume); in update_volume_due_to_moving()
1487 pa_source_output_set_reference_ratio(o, &new_volume); in update_volume_due_to_moving()
1488 pa_assert(pa_cvolume_is_norm(&o->real_ratio)); in update_volume_due_to_moving()
1489 pa_assert(pa_cvolume_equal(&o->soft_volume, &o->volume_factor)); in update_volume_due_to_moving()
1494 * o->destination_source->reference_volume := root_source->reference_volume in update_volume_due_to_moving()
1495 * o->destination_source->real_volume := root_source->real_volume in update_volume_due_to_moving()
1496 * o->destination_source->soft_volume stays unchanged in update_volume_due_to_moving()
1501 … pa_cvolume_remap(&new_volume, &root_source->channel_map, &o->destination_source->channel_map); in update_volume_due_to_moving()
1502 pa_source_set_reference_volume_direct(o->destination_source, &new_volume); in update_volume_due_to_moving()
1504 o->destination_source->real_volume = root_source->real_volume; in update_volume_due_to_moving()
1505 …pa_cvolume_remap(&o->destination_source->real_volume, &root_source->channel_map, &o->destination_s… in update_volume_due_to_moving()
1507 pa_assert(pa_cvolume_is_norm(&o->destination_source->soft_volume)); in update_volume_due_to_moving()
1509 /* If you wonder whether o->destination_source->set_volume() should be in update_volume_due_to_moving()
1517 PA_IDXSET_FOREACH(destination_source_output, o->destination_source->outputs, idx) in update_volume_due_to_moving()
1521 if (pa_source_flat_volume_enabled(o->source)) { in update_volume_due_to_moving()
1525 * o->volume := o->reference_ratio * o->source->reference_volume in update_volume_due_to_moving()
1526 * o->reference_ratio stays unchanged in update_volume_due_to_moving()
1527 * o->real_ratio := o->volume / o->source->real_volume in update_volume_due_to_moving()
1529 * o->soft_volume := o->real_ratio * o->volume_factor in update_volume_due_to_moving()
1532 new_volume = o->source->reference_volume; in update_volume_due_to_moving()
1533 pa_cvolume_remap(&new_volume, &o->source->channel_map, &o->channel_map); in update_volume_due_to_moving()
1534 pa_sw_cvolume_multiply(&new_volume, &new_volume, &o->reference_ratio); in update_volume_due_to_moving()
1535 pa_source_output_set_volume_direct(o, &new_volume); in update_volume_due_to_moving()
1541 * o->volume := o->reference_ratio in update_volume_due_to_moving()
1542 * o->reference_ratio stays unchanged in update_volume_due_to_moving()
1543 * o->real_ratio := o->reference_ratio in update_volume_due_to_moving()
1544 * o->soft_volume := o->real_ratio * o->volume_factor */ in update_volume_due_to_moving()
1546 pa_source_output_set_volume_direct(o, &o->reference_ratio); in update_volume_due_to_moving()
1547 o->real_ratio = o->reference_ratio; in update_volume_due_to_moving()
1548 pa_sw_cvolume_multiply(&o->soft_volume, &o->real_ratio, &o->volume_factor); in update_volume_due_to_moving()
1552 if (o->destination_source) { in update_volume_due_to_moving()
1555 vol = o->destination_source->real_volume; in update_volume_due_to_moving()
1556 pa_cvolume_remap(&vol, &o->destination_source->channel_map, &o->channel_map); in update_volume_due_to_moving()
1557 pa_source_output_set_volume(o, &vol, o->destination_source->save_volume, true); in update_volume_due_to_moving()
1562 /* If o->source == dest, then recursion has finished, and we can finally call in update_volume_due_to_moving()
1564 if ((o->source == dest) && pa_source_flat_volume_enabled(o->source)) in update_volume_due_to_moving()
1565 pa_source_set_volume(o->source, NULL, false, o->save_volume); in update_volume_due_to_moving()
1569 static void set_preferred_source(pa_source_output *o, const char *source_name) { in set_preferred_source() argument
1570 pa_assert(o); in set_preferred_source()
1572 if (pa_safe_streq(o->preferred_source, source_name)) in set_preferred_source()
1576o->index, o->preferred_source ? o->preferred_source : "(unset)", source_name ? source_name : "(uns… in set_preferred_source()
1577 pa_xfree(o->preferred_source); in set_preferred_source()
1578 o->preferred_source = pa_xstrdup(source_name); in set_preferred_source()
1580 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE, in set_preferred_source()
1581 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PREFERRED_SOURCE_CHANGED], o); in set_preferred_source()
1585 int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, bool save) { in pa_source_output_finish_move() argument
1586 pa_source_output_assert_ref(o); in pa_source_output_finish_move()
1588 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_finish_move()
1589 pa_assert(!o->source); in pa_source_output_finish_move()
1592 if (!pa_source_output_may_move_to(o, dest)) in pa_source_output_finish_move()
1595 if (pa_source_output_is_passthrough(o) && !pa_source_check_format(dest, o->format)) { in pa_source_output_finish_move()
1601 pa_source_output_send_event(o, PA_STREAM_EVENT_FORMAT_LOST, p); in pa_source_output_finish_move()
1606 if (!(o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) && in pa_source_output_finish_move()
1607 !pa_sample_spec_equal(&o->sample_spec, &dest->sample_spec)) { in pa_source_output_finish_move()
1613 pa_source_reconfigure(dest, &o->sample_spec, pa_source_output_is_passthrough(o)); in pa_source_output_finish_move()
1616 if (o->moving) in pa_source_output_finish_move()
1617 o->moving(o, dest); in pa_source_output_finish_move()
1619 o->source = dest; in pa_source_output_finish_move()
1622 o->index, dest->index, dest->name); in pa_source_output_finish_move()
1629 set_preferred_source(o, NULL); in pa_source_output_finish_move()
1631 set_preferred_source(o, dest->name); in pa_source_output_finish_move()
1634 pa_idxset_put(o->source->outputs, pa_source_output_ref(o), NULL); in pa_source_output_finish_move()
1636 pa_cvolume_remap(&o->volume_factor_source, &o->channel_map, &o->source->channel_map); in pa_source_output_finish_move()
1638 if (o->state == PA_SOURCE_OUTPUT_CORKED) in pa_source_output_finish_move()
1639 o->source->n_corked++; in pa_source_output_finish_move()
1641 pa_source_output_update_resampler(o); in pa_source_output_finish_move()
1645 update_volume_due_to_moving(o, dest); in pa_source_output_finish_move()
1647 if (pa_source_output_is_passthrough(o)) in pa_source_output_finish_move()
1648 pa_source_enter_passthrough(o->source); in pa_source_output_finish_move()
1650 …pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_AD… in pa_source_output_finish_move()
1652 pa_log_debug("Successfully moved source output %i to %s.", o->index, dest->name); in pa_source_output_finish_move()
1655 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_FINISH], o); in pa_source_output_finish_move()
1656 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o-… in pa_source_output_finish_move()
1662 void pa_source_output_fail_move(pa_source_output *o) { in pa_source_output_fail_move() argument
1664 pa_source_output_assert_ref(o); in pa_source_output_fail_move()
1666 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_fail_move()
1667 pa_assert(!o->source); in pa_source_output_fail_move()
1670 if (pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_FAIL], o) == PA_HOOK_STOP) in pa_source_output_fail_move()
1674 if (o->core->rescue_streams && pa_source_output_may_move_to(o, o->core->default_source)) { in pa_source_output_fail_move()
1675 if (pa_source_output_finish_move(o, o->core->default_source, false) >= 0) in pa_source_output_fail_move()
1679 AUDIO_WARNING_LOG("[FailMove]: SourceOutput[%{public}u] moving FAILED.", o->index); in pa_source_output_fail_move()
1680 if (o->moving) in pa_source_output_fail_move()
1681 o->moving(o, NULL); in pa_source_output_fail_move()
1683 pa_source_output_kill(o); in pa_source_output_fail_move()
1687 int pa_source_output_move_to(pa_source_output *o, pa_source *dest, bool save) { in pa_source_output_move_to() argument
1690 pa_source_output_assert_ref(o); in pa_source_output_move_to()
1692 pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->state)); in pa_source_output_move_to()
1693 pa_assert(o->source); in pa_source_output_move_to()
1696 if (dest == o->source) in pa_source_output_move_to()
1699 if (!pa_source_output_may_move_to(o, dest)) in pa_source_output_move_to()
1702 pa_source_output_ref(o); in pa_source_output_move_to()
1704 if ((r = pa_source_output_start_move(o)) < 0) { in pa_source_output_move_to()
1705 pa_source_output_unref(o); in pa_source_output_move_to()
1709 if ((r = pa_source_output_finish_move(o, dest, save)) < 0) { in pa_source_output_move_to()
1710 pa_source_output_fail_move(o); in pa_source_output_move_to()
1711 pa_source_output_unref(o); in pa_source_output_move_to()
1715 pa_source_output_unref(o); in pa_source_output_move_to()
1721 void pa_source_output_set_state_within_thread(pa_source_output *o, pa_source_output_state_t state) { in pa_source_output_set_state_within_thread() argument
1722 pa_source_output_assert_ref(o); in pa_source_output_set_state_within_thread()
1724 if (state == o->thread_info.state) in pa_source_output_set_state_within_thread()
1727 if (o->state_change) in pa_source_output_set_state_within_thread()
1728 o->state_change(o, state); in pa_source_output_set_state_within_thread()
1730 o->thread_info.state = state; in pa_source_output_set_state_within_thread()
1735 pa_source_output *o = PA_SOURCE_OUTPUT(mo); in pa_source_output_process_msg() local
1736 pa_source_output_assert_ref(o); in pa_source_output_process_msg()
1743 …r[0] += pa_bytes_to_usec(pa_memblockq_get_length(o->thread_info.delay_memblockq), &o->source->samp… in pa_source_output_process_msg()
1744 r[0] += pa_resampler_get_delay_usec(o->thread_info.resampler); in pa_source_output_process_msg()
1745 r[1] += pa_source_get_latency_within_thread(o->source, false); in pa_source_output_process_msg()
1752 o->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata); in pa_source_output_process_msg()
1753 pa_resampler_set_output_rate(o->thread_info.resampler, PA_PTR_TO_UINT(userdata)); in pa_source_output_process_msg()
1758 pa_source_output_set_state_within_thread(o, PA_PTR_TO_UINT(userdata)); in pa_source_output_process_msg()
1765 *usec = pa_source_output_set_requested_latency_within_thread(o, *usec); in pa_source_output_process_msg()
1773 *r = o->thread_info.requested_source_latency; in pa_source_output_process_msg()
1778 if (!pa_cvolume_equal(&o->thread_info.soft_volume, &o->soft_volume)) { in pa_source_output_process_msg()
1779 o->thread_info.soft_volume = o->soft_volume; in pa_source_output_process_msg()
1784 if (o->thread_info.muted != o->muted) { in pa_source_output_process_msg()
1785 o->thread_info.muted = o->muted; in pa_source_output_process_msg()
1794 void pa_source_output_send_event(pa_source_output *o, const char *event, pa_proplist *data) { in pa_source_output_send_event() argument
1798 pa_source_output_assert_ref(o); in pa_source_output_send_event()
1802 if (!o->send_event) in pa_source_output_send_event()
1808 hook_data.source_output = o; in pa_source_output_send_event()
1812 if (pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_SEND_EVENT], &hook_data) < 0) in pa_source_output_send_event()
1815 o->send_event(o, event, data); in pa_source_output_send_event()
1825 int pa_source_output_update_resampler(pa_source_output *o) { in pa_source_output_update_resampler() argument
1830 pa_source_output_assert_ref(o); in pa_source_output_update_resampler()
1833 if (o->thread_info.resampler && in pa_source_output_update_resampler()
1834 …pa_sample_spec_equal(pa_resampler_input_sample_spec(o->thread_info.resampler), &o->source->sample_… in pa_source_output_update_resampler()
1835 …pa_channel_map_equal(pa_resampler_input_channel_map(o->thread_info.resampler), &o->source->channel… in pa_source_output_update_resampler()
1837 new_resampler = o->thread_info.resampler; in pa_source_output_update_resampler()
1839 else if (!pa_source_output_is_passthrough(o) && in pa_source_output_update_resampler()
1840 ((o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) || in pa_source_output_update_resampler()
1841 !pa_sample_spec_equal(&o->sample_spec, &o->source->sample_spec) || in pa_source_output_update_resampler()
1842 !pa_channel_map_equal(&o->channel_map, &o->source->channel_map))) { in pa_source_output_update_resampler()
1844 new_resampler = pa_resampler_new(o->core->mempool, in pa_source_output_update_resampler()
1845 &o->source->sample_spec, &o->source->channel_map, in pa_source_output_update_resampler()
1846 &o->sample_spec, &o->channel_map, in pa_source_output_update_resampler()
1847 o->core->lfe_crossover_freq, in pa_source_output_update_resampler()
1848 o->requested_resample_method, in pa_source_output_update_resampler()
1849 … ((o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) | in pa_source_output_update_resampler()
1850 … ((o->flags & PA_SOURCE_OUTPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) | in pa_source_output_update_resampler()
1851 …(o->core->disable_remixing || (o->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) | in pa_source_output_update_resampler()
1852 … (o->core->remixing_use_all_sink_channels ? 0 : PA_RESAMPLER_NO_FILL_SINK) | in pa_source_output_update_resampler()
1853 … (o->core->remixing_produce_lfe ? PA_RESAMPLER_PRODUCE_LFE : 0) | in pa_source_output_update_resampler()
1854 … (o->core->remixing_consume_lfe ? PA_RESAMPLER_CONSUME_LFE : 0)); in pa_source_output_update_resampler()
1863 if (new_resampler == o->thread_info.resampler) in pa_source_output_update_resampler()
1866 if (o->thread_info.resampler) in pa_source_output_update_resampler()
1867 pa_resampler_free(o->thread_info.resampler); in pa_source_output_update_resampler()
1869 o->thread_info.resampler = new_resampler; in pa_source_output_update_resampler()
1871 pa_memblockq_free(o->thread_info.delay_memblockq); in pa_source_output_update_resampler()
1873 memblockq_name = pa_sprintf_malloc("source output delay_memblockq [%u]", o->index); in pa_source_output_update_resampler()
1874 o->thread_info.delay_memblockq = pa_memblockq_new( in pa_source_output_update_resampler()
1879 &o->source->sample_spec, in pa_source_output_update_resampler()
1883 &o->source->silence); in pa_source_output_update_resampler()
1886 …resampler_history = (uint64_t) PA_RESAMPLER_MAX_DELAY_USEC * o->source->sample_spec.rate / PA_USEC… in pa_source_output_update_resampler()
1887 resampler_history *= pa_frame_size(&o->source->sample_spec); in pa_source_output_update_resampler()
1889 …pa_memblockq_set_maxrewind(o->thread_info.delay_memblockq, resampler_history + pa_source_get_max_r… in pa_source_output_update_resampler()
1891o->actual_resample_method = new_resampler ? pa_resampler_get_method(new_resampler) : PA_RESAMPLER_… in pa_source_output_update_resampler()
1893 pa_log_debug("Updated resampler for source output %d", o->index); in pa_source_output_update_resampler()
1899 void pa_source_output_attach(pa_source_output *o) { in pa_source_output_attach() argument
1900 pa_assert(o); in pa_source_output_attach()
1901 pa_assert(!o->thread_info.attached); in pa_source_output_attach()
1903 o->thread_info.attached = true; in pa_source_output_attach()
1905 if (o->attach) in pa_source_output_attach()
1906 o->attach(o); in pa_source_output_attach()
1910 void pa_source_output_detach(pa_source_output *o) { in pa_source_output_detach() argument
1911 pa_assert(o); in pa_source_output_detach()
1913 if (!o->thread_info.attached) in pa_source_output_detach()
1916 o->thread_info.attached = false; in pa_source_output_detach()
1918 if (o->detach) in pa_source_output_detach()
1919 o->detach(o); in pa_source_output_detach()
1923 void pa_source_output_set_volume_direct(pa_source_output *o, const pa_cvolume *volume) { in pa_source_output_set_volume_direct() argument
1928 pa_assert(o); in pa_source_output_set_volume_direct()
1931 old_volume = o->volume; in pa_source_output_set_volume_direct()
1936 o->volume = *volume; in pa_source_output_set_volume_direct()
1937 pa_log_debug("The volume of source output %u changed from %s to %s.", o->index, in pa_source_output_set_volume_direct()
1938 …pa_cvolume_snprint_verbose(old_volume_str, sizeof(old_volume_str), &old_volume, &o->channel_map, t… in pa_source_output_set_volume_direct()
1939 …pa_cvolume_snprint_verbose(new_volume_str, sizeof(new_volume_str), volume, &o->channel_map, true)); in pa_source_output_set_volume_direct()
1941 if (o->volume_changed) in pa_source_output_set_volume_direct()
1942 o->volume_changed(o); in pa_source_output_set_volume_direct()
1944 …pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o-… in pa_source_output_set_volume_direct()
1945 pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_VOLUME_CHANGED], o); in pa_source_output_set_volume_direct()
1949 void pa_source_output_set_reference_ratio(pa_source_output *o, const pa_cvolume *ratio) { in pa_source_output_set_reference_ratio() argument
1954 pa_assert(o); in pa_source_output_set_reference_ratio()
1957 old_ratio = o->reference_ratio; in pa_source_output_set_reference_ratio()
1962 o->reference_ratio = *ratio; in pa_source_output_set_reference_ratio()
1964 if (!PA_SOURCE_OUTPUT_IS_LINKED(o->state)) in pa_source_output_set_reference_ratio()
1967 pa_log_debug("Source output %u reference ratio changed from %s to %s.", o->index, in pa_source_output_set_reference_ratio()
1968 …pa_cvolume_snprint_verbose(old_ratio_str, sizeof(old_ratio_str), &old_ratio, &o->channel_map, true… in pa_source_output_set_reference_ratio()
1969 … pa_cvolume_snprint_verbose(new_ratio_str, sizeof(new_ratio_str), ratio, &o->channel_map, true)); in pa_source_output_set_reference_ratio()
1987 void pa_source_output_set_preferred_source(pa_source_output *o, pa_source *s) { in pa_source_output_set_preferred_source() argument
1988 pa_assert(o); in pa_source_output_set_preferred_source()
1991 set_preferred_source(o, s->name); in pa_source_output_set_preferred_source()
1992 pa_source_output_move_to(o, s, false); in pa_source_output_set_preferred_source()
1994 set_preferred_source(o, NULL); in pa_source_output_set_preferred_source()
1995 pa_source_output_move_to(o, o->core->default_source, false); in pa_source_output_set_preferred_source()