HART  0.2.0
High level Audio Regression and Testing
Loading...
Searching...
No Matches
hart_units.hpp
Go to the documentation of this file.
1#pragma once
2
3// Define this macro if those literals clash with existing ones in your codebase
4#ifndef HART_DO_NOT_ADD_UNITS
5
6#include "hart_utils.hpp" // pi, decibelsToRatio(), ratioToDecibels()
7
8/// @defgroup Units Units
9/// @brief Better readability
10/// @{
11
12namespace hart
13{
14
15/// @brief Represents a physical unit
16/// @details You might want to use those without namespace, like `someMetric (...).as (dB)`.
17/// If you're on C++17 or earlier, you can use the `HART_DECLARE_ALIASES_FOR_UNITS` macro.
18/// For C++20 an on, you can just use `using enum Unit`.
19/// @note New units may be introduced here, whenever necessary
20enum class Unit
21{
22 native, ///< Default (native) unit of whatever returns some value
23 linear, ///< Value of a sample (voltage) in a linear domain
24 dB, ///< Value of something in decibels. Can represent voltage, power, or a domain-specific unit like "LUFS" or "dB TP"
25 frames, ///< Value of something in frames (samples)
26 seconds, ///< Time stamps, intervals, durations
27 Hz, ///< Hertz
28 ratio, ///< Generic ratio
29 none ///< Unitless value
30};
31
32} // namespace hart
33
34/// @brief Pre-C++20 macro to use units without namespace
35/// @details For C++20 and later, you can just use `using enum Unit`
36#define HART_DECLARE_ALIASES_FOR_UNITS
37 constexpr hart::Unit native = hart::Unit::native;
38 constexpr hart::Unit linear = hart::Unit::linear;
39 constexpr hart::Unit dB = hart::Unit::dB;
40 constexpr hart::Unit frames = hart::Unit::frames;
41 constexpr hart::Unit seconds = hart::Unit::seconds;
42 constexpr hart::Unit Hz = hart::Unit::Hz;
43 constexpr hart::Unit ratio = hart::Unit::ratio;
44 constexpr hart::Unit none = hart::Unit::none;
45
46constexpr double inf_dB = hart::inf;
47constexpr double oo_dB = hart::inf;
48constexpr double pi_rad = hart::pi;
49constexpr double twoPi_rad = hart::twoPi;
50constexpr double halfPi_rad = hart::halfPi;
51
52constexpr double operator"" _s (long double val) { return static_cast<double> (val); }
53constexpr double operator"" _s (unsigned long long int val) { return static_cast<double> (val); }
54constexpr double operator"" _ms (long double val) { return static_cast<double> (1e-3 * val); }
55constexpr double operator"" _ms (unsigned long long int val) { return static_cast<double> (1e-3 * val); }
56constexpr double operator"" _us (long double val) { return static_cast<double> (1e-6 * val); }
57constexpr double operator"" _us (unsigned long long int val) { return static_cast<double> (1e-6 * val); }
58constexpr double operator"" _ns (long double val) { return static_cast<double> (1e-9 * val); }
59constexpr double operator"" _ns (unsigned long long int val) { return static_cast<double> (1e-9 * val); }
60constexpr double operator"" _dB (long double val) { return static_cast<double> (val); }
61constexpr double operator"" _dB (unsigned long long int val) { return static_cast<double> (val); }
62constexpr double operator"" _dBTP (long double val) { return static_cast<double> (val); }
63constexpr double operator"" _dBTP (unsigned long long int val) { return static_cast<double> (val); }
64constexpr double operator"" _Hz (long double val) { return static_cast<double> (val); }
65constexpr double operator"" _Hz (unsigned long long int val) { return static_cast<double> (val); }
66constexpr double operator"" _kHz (long double val) { return static_cast<double> (1e3 * val); }
67constexpr double operator"" _kHz (unsigned long long val) { return static_cast<double> (1e3 * val); }
68constexpr double operator"" _rad (long double val) { return static_cast<double> (val); }
69constexpr double operator"" _rad (unsigned long long val) { return static_cast<double>(val); }
70constexpr double operator"" _deg (long double val) { return static_cast<double> (val * hart::pi / 180.0); }
71constexpr double operator"" _deg (unsigned long long val) { return static_cast<double>(val) * hart::pi / 180.0; }
72constexpr double operator"" _cents (long double val) { return static_cast<double> (val); }
73constexpr double operator"" _cents (unsigned long long val) { return static_cast<double>(val); }
74
75inline double operator"" _dB_as_ratio (long double val) { return hart::decibelsToRatio (static_cast<double> (val)); }
76inline double operator"" _dB_as_ratio (unsigned long long int val) { return hart::decibelsToRatio (static_cast<double> (val)); }
77inline double operator"" _ratio_as_dB (long double val) { return hart::ratioToDecibels (static_cast<double> (val)); }
78inline double operator"" _ratio_as_dB (unsigned long long int val) { return hart::ratioToDecibels (static_cast<double> (val)); }
79
80// TODO: percent <-> ratio conversions
81
82/// @}
83
84#endif // HART_DO_NOT_ADD_UNITS
double operator""_dB_as_ratio(long double val)
constexpr double oo_dB
constexpr double operator""_dBTP(long double val)
constexpr double operator""_us(unsigned long long int val)
constexpr double operator""_kHz(unsigned long long val)
constexpr double halfPi_rad
constexpr double twoPi_rad
constexpr double operator""_cents(unsigned long long val)
constexpr double operator""_Hz(unsigned long long int val)
constexpr double operator""_s(long double val)
constexpr double operator""_dB(unsigned long long int val)
constexpr double operator""_rad(long double val)
constexpr double operator""_s(unsigned long long int val)
constexpr double operator""_ns(unsigned long long int val)
double operator""_dB_as_ratio(unsigned long long int val)
constexpr double operator""_ms(unsigned long long int val)
constexpr double operator""_dB(long double val)
double operator""_ratio_as_dB(unsigned long long int val)
double operator""_ratio_as_dB(long double val)
constexpr double pi_rad
constexpr double operator""_deg(long double val)
constexpr double operator""_cents(long double val)
constexpr double operator""_kHz(long double val)
constexpr double operator""_deg(unsigned long long val)
constexpr double operator""_us(long double val)
constexpr double operator""_rad(unsigned long long val)
constexpr double operator""_Hz(long double val)
constexpr double operator""_dBTP(unsigned long long int val)
constexpr double operator""_ms(long double val)
constexpr double operator""_ns(long double val)
constexpr double inf_dB
constexpr double twoPi
2 * pi
constexpr double halfPi
pi / 2
constexpr double inf
Infinity.
static SampleType ratioToDecibels(SampleType valueLinear)
Converts linear value (ratio) to dB.
static SampleType decibelsToRatio(SampleType valueDb)
Converts dB to linear value (ratio)
constexpr double pi
pi
Unit
Represents a physical unit.
@ none
Unitless value.
@ dB
Value of something in decibels. Can represent voltage, power, or a domain-specific unit like "LUFS" o...
@ seconds
Time stamps, intervals, durations.
@ ratio
Generic ratio.
@ native
Default (native) unit of whatever returns some value.
@ linear
Value of a sample (voltage) in a linear domain.
@ Hz
Hertz.
@ frames
Value of something in frames (samples)