Commit 27cc7b35 authored by Max Kellermann's avatar Max Kellermann

config/Data: cast to std::chrono::steady_clock::duration properly

Oh no, 3413d1bf was broken! Instead of passing a number as "seconds" to the duration constructor, it just abused the duration constructor as cast operator, which caused custom state_file_interval settings to be extremely short.
parent d6472906
......@@ -4,6 +4,7 @@ ver 0.22.1 (not yet released)
- jack, pulse: reduce the delay when stopping or pausing playback
* playlist
- cue: fix two crash bugs
* state_file: fix the state_file_interval setting
ver 0.22 (2020/09/23)
* protocol
......
......@@ -101,6 +101,38 @@ ConfigData::GetPositive(ConfigOption option, unsigned default_value) const
});
}
std::chrono::steady_clock::duration
ConfigData::GetUnsigned(ConfigOption option,
std::chrono::steady_clock::duration default_value) const
{
return With(option, [default_value](const char *s){
if (s == nullptr)
return default_value;
auto value = ParseDuration(s);
if (value < std::chrono::steady_clock::duration{})
throw std::runtime_error("Value must not be negative");
return value;
});
}
std::chrono::steady_clock::duration
ConfigData::GetPositive(ConfigOption option,
std::chrono::steady_clock::duration default_value) const
{
return With(option, [default_value](const char *s){
if (s == nullptr)
return default_value;
auto value = ParseDuration(s);
if (value <= std::chrono::steady_clock::duration{})
throw std::runtime_error("Value must be positive");
return value;
});
}
bool
ConfigData::GetBool(ConfigOption option, bool default_value) const
{
......
......@@ -78,22 +78,14 @@ struct ConfigData {
std::chrono::steady_clock::duration
GetUnsigned(ConfigOption option,
std::chrono::steady_clock::duration default_value) const {
// TODO: allow unit suffixes
auto u = GetUnsigned(option, default_value.count());
return std::chrono::steady_clock::duration(u);
}
std::chrono::steady_clock::duration default_value) const;
unsigned GetPositive(ConfigOption option,
unsigned default_value) const;
std::chrono::steady_clock::duration
GetPositive(ConfigOption option,
std::chrono::steady_clock::duration default_value) const {
// TODO: allow unit suffixes
auto u = GetPositive(option, default_value.count());
return std::chrono::steady_clock::duration(u);
}
std::chrono::steady_clock::duration default_value) const;
bool GetBool(ConfigOption option, bool default_value) const;
......
......@@ -135,3 +135,11 @@ ParseSize(const char *s, std::size_t default_factor)
return value;
}
std::chrono::steady_clock::duration
ParseDuration(const char *s)
{
// TODO: allow unit suffixes
const std::chrono::seconds seconds(ParseLong(s));
return std::chrono::duration_cast<std::chrono::steady_clock::duration>(seconds);
}
......@@ -20,6 +20,7 @@
#ifndef MPD_CONFIG_PARSER_HXX
#define MPD_CONFIG_PARSER_HXX
#include <chrono>
#include <cstddef>
/**
......@@ -54,4 +55,10 @@ ParsePositive(const char *s);
std::size_t
ParseSize(const char *s, std::size_t default_factor=1);
/**
* Throws on error.
*/
std::chrono::steady_clock::duration
ParseDuration(const char *s);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment