X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/4d62f159a74c6e5b46be5823483a7dedd5691b45..56e578c310c120da016051a9af2d01caf4f0a90f:/src/modules/module-remap-sink.c diff --git a/src/modules/module-remap-sink.c b/src/modules/module-remap-sink.c index 43748bd0..274f9f2f 100644 --- a/src/modules/module-remap-sink.c +++ b/src/modules/module-remap-sink.c @@ -25,15 +25,12 @@ #include -#include #include #include #include #include #include #include -#include -#include #include #include "module-remap-sink-symdef.h" @@ -41,7 +38,7 @@ PA_MODULE_AUTHOR("Lennart Poettering"); PA_MODULE_DESCRIPTION("Virtual channel remapping sink"); PA_MODULE_VERSION(PACKAGE_VERSION); -PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_LOAD_ONCE(false); PA_MODULE_USAGE( "sink_name= " "sink_properties= " @@ -51,6 +48,7 @@ PA_MODULE_USAGE( "rate= " "channels= " "channel_map= " + "resample_method= " "remix="); struct userdata { @@ -59,7 +57,7 @@ struct userdata { pa_sink *sink; pa_sink_input *sink_input; - pa_bool_t auto_desc; + bool auto_desc; }; static const char* const valid_modargs[] = { @@ -71,6 +69,7 @@ static const char* const valid_modargs[] = { "rate", "channels", "channel_map", + "resample_method", "remix", NULL }; @@ -130,7 +129,7 @@ static void sink_request_rewind(pa_sink *s) { !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) return; - pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes, TRUE, FALSE, FALSE); + pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes, true, false, false); } /* Called from I/O thread context */ @@ -188,6 +187,8 @@ static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { pa_sink_input_assert_ref(i); pa_assert_se(u = i->userdata); + /* FIXME: Too small max_rewind: + * https://bugs.freedesktop.org/show_bug.cgi?id=53709 */ pa_sink_set_max_rewind_within_thread(u->sink, nbytes); } @@ -244,6 +245,9 @@ static void sink_input_attach_cb(pa_sink_input *i) { pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i)); + + /* FIXME: Too small max_rewind: + * https://bugs.freedesktop.org/show_bug.cgi?id=53709 */ pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i)); pa_sink_attach_within_thread(u->sink); @@ -268,7 +272,7 @@ static void sink_input_kill_cb(pa_sink_input *i) { pa_sink_unref(u->sink); u->sink = NULL; - pa_module_unload_request(u->module, TRUE); + pa_module_unload_request(u->module, true); } /* Called from IO thread context */ @@ -283,20 +287,10 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s if (PA_SINK_INPUT_IS_LINKED(state) && i->thread_info.state == PA_SINK_INPUT_INIT) { pa_log_debug("Requesting rewind due to state change."); - pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE); + pa_sink_input_request_rewind(i, 0, false, true, true); } } -/* Called from main context */ -static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { - struct userdata *u; - - pa_sink_input_assert_ref(i); - pa_assert_se(u = i->userdata); - - return u->sink != dest; -} - /* Called from main context */ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { struct userdata *u; @@ -326,12 +320,13 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { int pa__init(pa_module*m) { struct userdata *u; pa_sample_spec ss; + pa_resample_method_t resample_method = PA_RESAMPLER_INVALID; pa_channel_map sink_map, stream_map; pa_modargs *ma; pa_sink *master; pa_sink_input_new_data sink_input_data; pa_sink_new_data sink_data; - pa_bool_t remix = TRUE; + bool remix = true; pa_assert(m); @@ -371,6 +366,11 @@ int pa__init(pa_module*m) { goto fail; } + if (pa_modargs_get_resample_method(ma, &resample_method) < 0) { + pa_log("Invalid resampling method"); + goto fail; + } + u = pa_xnew0(struct userdata, 1); u->module = m; m->userdata = u; @@ -419,12 +419,14 @@ int pa__init(pa_module*m) { pa_sink_input_new_data_init(&sink_input_data); sink_input_data.driver = __FILE__; sink_input_data.module = m; - sink_input_data.sink = master; + pa_sink_input_new_data_set_sink(&sink_input_data, master, false); + sink_input_data.origin_sink = u->sink; pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Remapped Stream"); pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss); pa_sink_input_new_data_set_channel_map(&sink_input_data, &stream_map); sink_input_data.flags = (remix ? 0 : PA_SINK_INPUT_NO_REMIX); + sink_input_data.resample_method = resample_method; pa_sink_input_new(&u->sink_input, m->core, &sink_input_data); pa_sink_input_new_data_done(&sink_input_data); @@ -442,10 +444,11 @@ int pa__init(pa_module*m) { u->sink_input->detach = sink_input_detach_cb; u->sink_input->kill = sink_input_kill_cb; u->sink_input->state_change = sink_input_state_change_cb; - u->sink_input->may_move_to = sink_input_may_move_to_cb; u->sink_input->moving = sink_input_moving_cb; u->sink_input->userdata = u; + u->sink->input_to_master = u->sink_input; + pa_sink_put(u->sink); pa_sink_input_put(u->sink_input);