diff --git a/libs/audio/include/psemek/audio/detail/resampler.hpp b/libs/audio/include/psemek/audio/detail/resampler.hpp index b5eaa124..92e34990 100644 --- a/libs/audio/include/psemek/audio/detail/resampler.hpp +++ b/libs/audio/include/psemek/audio/detail/resampler.hpp @@ -26,6 +26,8 @@ namespace psemek::audio return result_; } + std::vector grab_result(); + private: std::vector result_; int position_{0}; diff --git a/libs/audio/source/detail/resampler.cpp b/libs/audio/source/detail/resampler.cpp index 27f76b16..628b687a 100644 --- a/libs/audio/source/detail/resampler.cpp +++ b/libs/audio/source/detail/resampler.cpp @@ -67,6 +67,15 @@ namespace psemek::audio last_sample_[1] = samples[samples.size() - 1]; } + std::vector resampler::grab_result() + { + position_ = 0; + position_frac_ = 0.f; + last_sample_[0] = 0.f; + last_sample_[1] = 0.f; + return std::move(result_); + } + void resampler::advance(float delta) { position_frac_ += delta; diff --git a/libs/audio/source/track_wav.cpp b/libs/audio/source/track_wav.cpp index c0ccefee..7b157d03 100644 --- a/libs/audio/source/track_wav.cpp +++ b/libs/audio/source/track_wav.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -17,9 +18,6 @@ namespace psemek::audio if (spec.channels > 2) throw std::runtime_error(util::to_string("Can't convert audio with ", static_cast(spec.channels), " channels")); - if (spec.freq != audio::frequency) - throw std::runtime_error(util::to_string("Can't convert audio with frequency ", spec.freq)); - if (spec.format != AUDIO_S16SYS) throw std::runtime_error(util::to_string("Can't convert audio with format ", spec.format)); @@ -44,6 +42,13 @@ namespace psemek::audio result[i] = (p[i] * 2.f + 1.f) / 65536.f; } + if (spec.freq != audio::frequency) + { + audio::resampler resampler(audio::frequency * 1.f / spec.freq); + resampler.feed(result); + result = resampler.grab_result(); + } + return result; }