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;