summaryrefslogtreecommitdiff
path: root/src/ReplayGainConfig.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/ReplayGainConfig.cxx')
-rw-r--r--src/ReplayGainConfig.cxx70
1 files changed, 31 insertions, 39 deletions
diff --git a/src/ReplayGainConfig.cxx b/src/ReplayGainConfig.cxx
index 04b639f45..9f7841632 100644
--- a/src/ReplayGainConfig.cxx
+++ b/src/ReplayGainConfig.cxx
@@ -21,7 +21,6 @@
#include "ReplayGainConfig.hxx"
#include "config/Param.hxx"
#include "config/ConfigGlobal.hxx"
-#include "system/FatalError.hxx"
#include "util/RuntimeError.hxx"
#include <assert.h>
@@ -36,6 +35,33 @@ float replay_gain_preamp = 1.0;
float replay_gain_missing_preamp = 1.0;
bool replay_gain_limit = DEFAULT_REPLAYGAIN_LIMIT;
+static float
+ParsePreamp(const char *s)
+{
+ assert(s != nullptr);
+
+ char *endptr;
+ float f = strtod(s, &endptr);
+ if (endptr == s || *endptr != '\0')
+ throw std::invalid_argument("Not a numeric value");
+
+ if (f < -15 || f > 15)
+ throw std::invalid_argument("Number must be between -15 and 15");
+
+ return pow(10, f / 20.0);
+}
+
+static float
+ParsePreamp(const ConfigParam &p)
+{
+ try {
+ return ParsePreamp(p.value.c_str());
+ } catch (...) {
+ std::throw_with_nested(FormatRuntimeError("Failed to parse line %i",
+ p.line));
+ }
+}
+
void replay_gain_global_init(void)
{
const auto *param = config_get_param(ConfigOption::REPLAYGAIN);
@@ -49,46 +75,12 @@ void replay_gain_global_init(void)
}
param = config_get_param(ConfigOption::REPLAYGAIN_PREAMP);
-
- if (param) {
- char *test;
- float f = strtod(param->value.c_str(), &test);
-
- if (*test != '\0') {
- FormatFatalError("Replaygain preamp \"%s\" is not a number at "
- "line %i\n",
- param->value.c_str(), param->line);
- }
-
- if (f < -15 || f > 15) {
- FormatFatalError("Replaygain preamp \"%s\" is not between -15 and"
- "15 at line %i\n",
- param->value.c_str(), param->line);
- }
-
- replay_gain_preamp = pow(10, f / 20.0);
- }
+ if (param)
+ replay_gain_preamp = ParsePreamp(*param);
param = config_get_param(ConfigOption::REPLAYGAIN_MISSING_PREAMP);
-
- if (param) {
- char *test;
- float f = strtod(param->value.c_str(), &test);
-
- if (*test != '\0') {
- FormatFatalError("Replaygain missing preamp \"%s\" is not a number at "
- "line %i\n",
- param->value.c_str(), param->line);
- }
-
- if (f < -15 || f > 15) {
- FormatFatalError("Replaygain missing preamp \"%s\" is not between -15 and"
- "15 at line %i\n",
- param->value.c_str(), param->line);
- }
-
- replay_gain_missing_preamp = pow(10, f / 20.0);
- }
+ if (param)
+ replay_gain_missing_preamp = ParsePreamp(*param);
replay_gain_limit = config_get_bool(ConfigOption::REPLAYGAIN_LIMIT,
DEFAULT_REPLAYGAIN_LIMIT);