Improve audio duration api

This commit is contained in:
Nikita Lisitsa 2023-10-10 12:49:07 +03:00
parent 5fa8e4a3a3
commit f1c0959fba
3 changed files with 51 additions and 20 deletions

View file

@ -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::int64_t>(std::round(seconds * frequency));
}
inline std::int64_t seconds_to_samples(float seconds)
{
return static_cast<std::int64_t>(2 * std::round(seconds * frequency));
return 2 * seconds_to_frames(seconds);
}
inline float frames_to_seconds(std::int64_t frames)
{
return static_cast<float>(frames) * inv_frequency;
}
inline float samples_to_seconds(std::int64_t samples)
{
return static_cast<float>(samples) * 0.5f * inv_frequency;
return frames_to_seconds(samples / 2);
}
inline float to_db(float amplitude)

View file

@ -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)
{}
};
}

View file

@ -38,7 +38,7 @@ namespace psemek::audio
if (result <= start_.samples())
{
start_ -= result;
start_ -= duration::from_samples(result);
}
else
{