2#include <Process/TimeValue.hpp>
18inline std::optional<TimeVal> parseDuration(
const QString& text)
20 const QString s = text.trimmed();
25 const auto fromFlicks = [](
double flicks) -> std::optional<TimeVal> {
26 if(!(flicks >= 0. && flicks < 0x1p63))
28 return TimeVal{int64_t(std::llround(flicks))};
30 const auto fromSeconds = [&](
double sec) {
31 return fromFlicks(sec * ossia::flicks_per_second<double>);
35 if(
const double flicks = s.toDouble(&ok); ok)
36 return fromFlicks(flicks);
38 static constexpr struct
42 } units[] = {{
"ms", 1e-3}, {
"min", 60.}, {
"s", 1.}, {
"h", 3600.}};
43 for(
const auto& u : units)
45 if(s.endsWith(QLatin1String(u.suffix), Qt::CaseInsensitive))
47 const double v = s.chopped(qsizetype(strlen(u.suffix))).trimmed().toDouble(&ok);
48 return ok ? fromSeconds(v * u.seconds) :
std::nullopt;
52 const QStringList parts = s.split(QLatin1Char(
':'));
53 if(parts.size() < 2 || parts.size() > 3)
56 for(qsizetype i = 0; i < parts.size(); ++i)
58 const bool last = i == parts.size() - 1;
59 const double v = last ? parts[i].toDouble(&ok) : double(parts[i].toUInt(&ok));
60 if(!ok || v < 0. || (i > 0 && v >= 60.))
64 return fromSeconds(sec);
Definition TimeValue.hpp:21