[pulseaudio-discuss] [PATCH] loopback: use source sample spec and channel map by default
Georg Chini
georg at chini.tk
Tue Feb 20 20:40:21 UTC 2018
On 19.02.2018 21:49, Raman Shyshniou wrote:
> Currently the loopback module uses sample spec and channel map of the
> sink by default. It leads to double resample if source and sink sample
> specs are different and no rate/format specified in arguments. This
> patch causes the source sample spec and channel map to be used by
> default.
> ---
> src/modules/module-loopback.c | 140 +++++++++++++++++++++---------------------
> 1 file changed, 70 insertions(+), 70 deletions(-)
>
> diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
> index aecac0a..a72f395 100644
> --- a/src/modules/module-loopback.c
> +++ b/src/modules/module-loopback.c
> @@ -1286,15 +1286,15 @@ int pa__init(pa_module *m) {
> goto fail;
> }
>
> - if (sink) {
> - ss = sink->sample_spec;
> - map = sink->channel_map;
> + if (source) {
> + ss = source->sample_spec;
> + map = source->channel_map;
> format_set = true;
> rate_set = true;
> channels_set = true;
> - } else if (source) {
> - ss = source->sample_spec;
> - map = source->channel_map;
> + } else if (sink) {
> + ss = sink->sample_spec;
> + map = sink->channel_map;
> format_set = true;
> rate_set = true;
> channels_set = true;
> @@ -1363,6 +1363,70 @@ int pa__init(pa_module *m) {
>
> u->real_adjust_time = u->adjust_time;
>
> + pa_source_output_new_data_init(&source_output_data);
> + source_output_data.driver = __FILE__;
> + source_output_data.module = m;
> + if (source)
> + pa_source_output_new_data_set_source(&source_output_data, source, false, true);
> +
> + if (pa_modargs_get_proplist(ma, "source_output_properties", source_output_data.proplist, PA_UPDATE_REPLACE) < 0) {
> + pa_log("Failed to parse the source_output_properties value.");
> + pa_source_output_new_data_done(&source_output_data);
> + goto fail;
> + }
> +
> + if (!pa_proplist_contains(source_output_data.proplist, PA_PROP_MEDIA_ROLE))
> + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ROLE, "abstract");
> +
> + pa_source_output_new_data_set_sample_spec(&source_output_data, &ss);
> + pa_source_output_new_data_set_channel_map(&source_output_data, &map);
> + source_output_data.flags = PA_SOURCE_OUTPUT_START_CORKED;
> +
> + if (!remix)
> + source_output_data.flags |= PA_SOURCE_OUTPUT_NO_REMIX;
> +
> + if (!format_set)
> + source_output_data.flags |= PA_SOURCE_OUTPUT_FIX_FORMAT;
> +
> + if (!rate_set)
> + source_output_data.flags |= PA_SOURCE_OUTPUT_FIX_RATE;
> +
> + if (!channels_set)
> + source_output_data.flags |= PA_SOURCE_OUTPUT_FIX_CHANNELS;
> +
> + source_dont_move = false;
> + if (pa_modargs_get_value_boolean(ma, "source_dont_move", &source_dont_move) < 0) {
> + pa_log("source_dont_move= expects a boolean argument.");
> + goto fail;
> + }
> +
> + if (source_dont_move)
> + source_output_data.flags |= PA_SOURCE_OUTPUT_DONT_MOVE;
> +
> + pa_source_output_new(&u->source_output, m->core, &source_output_data);
> + pa_source_output_new_data_done(&source_output_data);
> +
> + if (!u->source_output)
> + goto fail;
> +
> + u->source_output->parent.process_msg = source_output_process_msg_cb;
> + u->source_output->push = source_output_push_cb;
> + u->source_output->process_rewind = source_output_process_rewind_cb;
> + u->source_output->kill = source_output_kill_cb;
> + u->source_output->attach = source_output_attach_cb;
> + u->source_output->detach = source_output_detach_cb;
> + u->source_output->may_move_to = source_output_may_move_to_cb;
> + u->source_output->moving = source_output_moving_cb;
> + u->source_output->suspend = source_output_suspend_cb;
> + u->source_output->update_source_latency_range = update_source_latency_range_cb;
> + u->source_output->update_source_fixed_latency = update_source_latency_range_cb;
> + u->source_output->userdata = u;
> +
> + /* If format, rate or channels were originally unset, they are set now
> + * after the pa_source_output_new() call. */
> + ss = u->source_output->sample_spec;
> + map = u->source_output->channel_map;
> +
> pa_sink_input_new_data_init(&sink_input_data);
> sink_input_data.driver = __FILE__;
> sink_input_data.module = m;
> @@ -1386,15 +1450,6 @@ int pa__init(pa_module *m) {
> if (!remix)
> sink_input_data.flags |= PA_SINK_INPUT_NO_REMIX;
>
> - if (!format_set)
> - sink_input_data.flags |= PA_SINK_INPUT_FIX_FORMAT;
> -
> - if (!rate_set)
> - sink_input_data.flags |= PA_SINK_INPUT_FIX_RATE;
> -
> - if (!channels_set)
> - sink_input_data.flags |= PA_SINK_INPUT_FIX_CHANNELS;
> -
> sink_dont_move = false;
> if (pa_modargs_get_value_boolean(ma, "sink_dont_move", &sink_dont_move) < 0) {
> pa_log("sink_dont_move= expects a boolean argument.");
> @@ -1410,11 +1465,6 @@ int pa__init(pa_module *m) {
> if (!u->sink_input)
> goto fail;
>
> - /* If format, rate or channels were originally unset, they are set now
> - * after the pa_sink_input_new() call. */
> - ss = u->sink_input->sample_spec;
> - map = u->sink_input->channel_map;
> -
> u->sink_input->parent.process_msg = sink_input_process_msg_cb;
> u->sink_input->pop = sink_input_pop_cb;
> u->sink_input->process_rewind = sink_input_process_rewind_cb;
> @@ -1431,56 +1481,6 @@ int pa__init(pa_module *m) {
> u->sink_input->update_sink_fixed_latency = update_sink_latency_range_cb;
> u->sink_input->userdata = u;
>
> - pa_source_output_new_data_init(&source_output_data);
> - source_output_data.driver = __FILE__;
> - source_output_data.module = m;
> - if (source)
> - pa_source_output_new_data_set_source(&source_output_data, source, false, true);
> -
> - if (pa_modargs_get_proplist(ma, "source_output_properties", source_output_data.proplist, PA_UPDATE_REPLACE) < 0) {
> - pa_log("Failed to parse the source_output_properties value.");
> - pa_source_output_new_data_done(&source_output_data);
> - goto fail;
> - }
> -
> - if (!pa_proplist_contains(source_output_data.proplist, PA_PROP_MEDIA_ROLE))
> - pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ROLE, "abstract");
> -
> - pa_source_output_new_data_set_sample_spec(&source_output_data, &ss);
> - pa_source_output_new_data_set_channel_map(&source_output_data, &map);
> - source_output_data.flags = PA_SOURCE_OUTPUT_START_CORKED;
> -
> - if (!remix)
> - source_output_data.flags |= PA_SOURCE_OUTPUT_NO_REMIX;
> -
> - source_dont_move = false;
> - if (pa_modargs_get_value_boolean(ma, "source_dont_move", &source_dont_move) < 0) {
> - pa_log("source_dont_move= expects a boolean argument.");
> - goto fail;
> - }
> -
> - if (source_dont_move)
> - source_output_data.flags |= PA_SOURCE_OUTPUT_DONT_MOVE;
> -
> - pa_source_output_new(&u->source_output, m->core, &source_output_data);
> - pa_source_output_new_data_done(&source_output_data);
> -
> - if (!u->source_output)
> - goto fail;
> -
> - u->source_output->parent.process_msg = source_output_process_msg_cb;
> - u->source_output->push = source_output_push_cb;
> - u->source_output->process_rewind = source_output_process_rewind_cb;
> - u->source_output->kill = source_output_kill_cb;
> - u->source_output->attach = source_output_attach_cb;
> - u->source_output->detach = source_output_detach_cb;
> - u->source_output->may_move_to = source_output_may_move_to_cb;
> - u->source_output->moving = source_output_moving_cb;
> - u->source_output->suspend = source_output_suspend_cb;
> - u->source_output->update_source_latency_range = update_source_latency_range_cb;
> - u->source_output->update_source_fixed_latency = update_source_latency_range_cb;
> - u->source_output->userdata = u;
> -
> update_latency_boundaries(u, u->source_output->source, u->sink_input->sink);
> set_sink_input_latency(u, u->sink_input->sink);
> set_source_output_latency(u, u->source_output->source);
Thanks again. Also pushed to next.
More information about the pulseaudio-discuss
mailing list