From a0334d1d94a5cbdc13a18b3b60a1690d49ea2275 Mon Sep 17 00:00:00 2001 From: GrimReaperFloof Date: Fri, 7 May 2021 18:48:55 +0200 Subject: [PATCH] Add resampling mode setting to modplug decoder --- doc/plugins.rst | 2 ++ src/decoder/plugins/ModplugDecoderPlugin.cxx | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/plugins.rst b/doc/plugins.rst index 95e42158a..ff8a16f4d 100644 --- a/doc/plugins.rst +++ b/doc/plugins.rst @@ -484,6 +484,8 @@ Module player based on MODPlug. * - Setting - Description + * - **resampling_mode nearest|linear|spline|fir** + - Sets the resampling mode. "nearest" disables interpolation (good for chiptunes). "linear" makes modplug use linear interpolation (fast, good quality). "spline" makes modplug use cubic spline interpolation (high quality). "fir" makes modplug use 8-tap fir filter (extremely high quality). Defaults to "fir". * - **loop_count** - Number of times to loop the module if it uses backward loops. Default is 0 which prevents looping. -1 loops forever. diff --git a/src/decoder/plugins/ModplugDecoderPlugin.cxx b/src/decoder/plugins/ModplugDecoderPlugin.cxx index 0c51814b3..fd1217e8f 100644 --- a/src/decoder/plugins/ModplugDecoderPlugin.cxx +++ b/src/decoder/plugins/ModplugDecoderPlugin.cxx @@ -44,10 +44,25 @@ static constexpr size_t MODPLUG_PREALLOC_BLOCK = 256 * 1024; static constexpr offset_type MODPLUG_FILE_LIMIT = 100 * 1024 * 1024; static int modplug_loop_count; +static unsigned char modplug_resampling_mode; static bool modplug_decoder_init(const ConfigBlock &block) { + const char* modplug_resampling_mode_value = block.GetBlockValue("resampling_mode", "fir"); + if (strcmp(modplug_resampling_mode_value, "nearest") == 0) { + modplug_resampling_mode = MODPLUG_RESAMPLE_NEAREST; + } else if (strcmp(modplug_resampling_mode_value, "linear") == 0) { + modplug_resampling_mode = MODPLUG_RESAMPLE_LINEAR; + } else if (strcmp(modplug_resampling_mode_value, "spline") == 0) { + modplug_resampling_mode = MODPLUG_RESAMPLE_SPLINE; + } else if (strcmp(modplug_resampling_mode_value, "fir") == 0) { + modplug_resampling_mode = MODPLUG_RESAMPLE_FIR; + } else { + throw FormatRuntimeError("Invalid resampling mode in line %d: %s", + block.line, modplug_resampling_mode_value); + } + modplug_loop_count = block.GetBlockValue("loop_count", 0); if (modplug_loop_count < -1) throw FormatRuntimeError("Invalid loop count in line %d: %i", @@ -139,7 +154,7 @@ mod_decode(DecoderClient &client, InputStream &is) ModPlug_GetSettings(&settings); /* alter setting */ - settings.mResamplingMode = MODPLUG_RESAMPLE_FIR; /* RESAMP */ + settings.mResamplingMode = modplug_resampling_mode; settings.mChannels = 2; settings.mBits = 16; settings.mFrequency = 44100;