diff --git a/libs/audio/include/psemek/audio/constants.hpp b/libs/audio/include/psemek/audio/constants.hpp index d8b6bb27..3cb01848 100644 --- a/libs/audio/include/psemek/audio/constants.hpp +++ b/libs/audio/include/psemek/audio/constants.hpp @@ -9,14 +9,24 @@ namespace psemek::audio constexpr int frequency = 44100; constexpr float inv_frequency = 1.f / frequency; + inline std::int64_t seconds_to_frames(float seconds) + { + return static_cast(std::round(seconds * frequency)); + } + inline std::int64_t seconds_to_samples(float seconds) { - return static_cast(2 * std::round(seconds * frequency)); + return 2 * seconds_to_frames(seconds); + } + + inline float frames_to_seconds(std::int64_t frames) + { + return static_cast(frames) * inv_frequency; } inline float samples_to_seconds(std::int64_t samples) { - return static_cast(samples) * 0.5f * inv_frequency; + return frames_to_seconds(samples / 2); } inline float to_db(float amplitude) diff --git a/libs/audio/include/psemek/audio/duration.hpp b/libs/audio/include/psemek/audio/duration.hpp index 36687149..946c902c 100644 --- a/libs/audio/include/psemek/audio/duration.hpp +++ b/libs/audio/include/psemek/audio/duration.hpp @@ -10,66 +10,87 @@ namespace psemek::audio struct duration { + private: + struct samples_tag{}; + struct frames_tag{}; + + public: + duration() - : samples_{0} + : frames_{0} {} - duration(std::int64_t samples) - : samples_{samples} - {} + static duration from_samples(std::int64_t samples) + { + return duration(samples_tag{}, samples); + } - duration(std::size_t samples) - : samples_{samples} - {} + static duration from_frames(std::int64_t samples) + { + return duration(frames_tag{}, samples); + } duration(float seconds) - : samples_{seconds_to_samples(seconds)} + : frames_{seconds_to_frames(seconds)} {} duration(duration const & other) - : samples_{other.samples_} + : frames_{other.frames_} {} float seconds() const { - return samples_to_seconds(samples_); + return frames_to_seconds(frames_); + } + + std::int64_t frames() const + { + return frames_; } std::int64_t samples() const { - return samples_; + return frames_ * 2; } duration & operator = (duration const & other) { - samples_ = other.samples_; + frames_ = other.frames_; return *this; } duration & operator += (duration const & other) { - samples_ += other.samples_; + frames_ += other.frames_; return *this; } duration & operator -= (duration const & other) { - samples_ -= other.samples_; + frames_ -= other.frames_; return *this; } friend duration operator + (duration const & d1, duration const & d2) { - return duration{d1.samples() + d2.samples()}; + return duration{d1.frames() + d2.frames()}; } friend duration operator - (duration const & d1, duration const & d2) { - return duration{d1.samples() - d2.samples()}; + return duration{d1.frames() - d2.frames()}; } private: - std::int64_t samples_; + std::int64_t frames_; + + duration(samples_tag, std::int64_t samples) + : frames_(samples / 2) + {} + + duration(frames_tag, std::int64_t frames) + : frames_(frames) + {} }; } diff --git a/libs/audio/source/effect/fade_out.cpp b/libs/audio/source/effect/fade_out.cpp index 3137080d..80b9465e 100644 --- a/libs/audio/source/effect/fade_out.cpp +++ b/libs/audio/source/effect/fade_out.cpp @@ -38,7 +38,7 @@ namespace psemek::audio if (result <= start_.samples()) { - start_ -= result; + start_ -= duration::from_samples(result); } else {