diff options
author | Uwe Klotz <uklotz@mixxx.org> | 2020-03-30 20:59:43 +0200 |
---|---|---|
committer | Uwe Klotz <uklotz@mixxx.org> | 2020-03-30 21:07:02 +0200 |
commit | 32ef6c87cf460577f331eff7a8fea9c61fa10225 (patch) | |
tree | 024814591f56e92a50a28ecd77ba78316aecd725 /src/audio | |
parent | c598edd274a09302562f5638d7bb3e91ea96cdff (diff) |
Add samples/frames/seconds/milliseconds conversion functions
Diffstat (limited to 'src/audio')
-rw-r--r-- | src/audio/signalinfo.h | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/src/audio/signalinfo.h b/src/audio/signalinfo.h index d2e8ffeddf..df08b1eb6c 100644 --- a/src/audio/signalinfo.h +++ b/src/audio/signalinfo.h @@ -44,8 +44,9 @@ class SignalInfo final { SignalInfo& operator=(const SignalInfo&) = default; // Conversion: #samples / sample offset -> #frames / frame offset + // Only works for sample offsets on frame boundaries! template<typename T> - inline T samples2frames(T samples) const { + T samples2frames(T samples) const { DEBUG_ASSERT(getChannelCount().isValid()); DEBUG_ASSERT(0 == (samples % getChannelCount())); return samples / getChannelCount(); @@ -53,10 +54,61 @@ class SignalInfo final { // Conversion: #frames / frame offset -> #samples / sample offset template<typename T> - inline T frames2samples(T frames) const { + T frames2samples(T frames) const { DEBUG_ASSERT(getChannelCount().isValid()); return frames * getChannelCount(); } + + // Conversion: #frames / frame offset -> second offset + template<typename T> + double frames2secs(T frames) const { + DEBUG_ASSERT(getSampleRate().isValid()); + return static_cast<double>(frames) / getSampleRate(); + } + + // Conversion: second offset -> #frames / frame offset + double secs2frames(double seconds) const { + DEBUG_ASSERT(getSampleRate().isValid()); + return seconds * getSampleRate(); + } + + // Conversion: #frames / frame offset -> millisecond offset + template<typename T> + double frames2millis(T frames) const { + return frames2secs(frames) * 1000; + } + + // Conversion: millisecond offset -> #frames / frame offset + double millis2frames(double milliseconds) const { + return secs2frames(milliseconds / 1000); + } + + // Conversion: #samples / sample offset -> second offset + // Only works for sample offsets on frame boundaries! + template<typename T> + double samples2secs(T samples) const { + return frames2secs(samples2frames(samples)); + } + + // Conversion: second offset -> #samples / sample offset + // May return sample offsets that are not on frame boundaries! + template<typename T> + double secs2samples(double seconds) const { + return frames2samples(secs2frames(seconds)); + } + + // Conversion: #samples / sample offset -> millisecond offset + // Only works for sample offsets on frame boundaries! + template<typename T> + double samples2millis(T samples) const { + return frames2millis(samples2frames(samples)); + } + + // Conversion: millisecond offset -> #samples / sample offset + // May return sample offsets that are not on frame boundaries! + double millis2samples(double milliseconds) const { + return frames2samples(millis2frames(milliseconds)); + } }; bool operator==( |