--- src/pulsecore/resampler.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c index 0a3a678..7e92e6e 100644 --- a/src/pulsecore/resampler.c +++ b/src/pulsecore/resampler.c @@ -203,6 +203,9 @@ pa_resampler* pa_resampler_new( pa_resample_flags_t flags) { pa_resampler *r = NULL; + unsigned c; + bool input_is_mono_only; + bool output_is_mono_only; pa_assert(pool); pa_assert(a); @@ -269,6 +272,28 @@ pa_resampler* pa_resampler_new( else if (!pa_channel_map_init_auto(&r->o_cm, r->o_ss.channels, PA_CHANNEL_MAP_DEFAULT)) goto fail; + /* If the input or output is mono-only, we ignore the NO_REMIX flag, + * because even if remixing is otherwise disabled, it's probably still + * desirable to be able to play mono inputs to non-mono outputs and + * non-mono inputs to mono outputs. */ + + for (c = 0; c < r->i_ss.channels; c++) { + if (r->i_cm.map[c] != PA_CHANNEL_POSITION_MONO) { + input_is_mono_only = false; + break; + } + } + + for (c = 0; c < r->o_ss.channels; c++) { + if (r->o_cm.map[c] != PA_CHANNEL_POSITION_MONO) { + output_is_mono_only = false; + break; + } + } + + if (input_is_mono_only || output_is_mono_only) + r->flags &= ~PA_RESAMPLER_NO_REMIX; + r->i_fz = pa_frame_size(a); r->o_fz = pa_frame_size(b); -- 1.7.10.4