AudioFormat: add TimeToSize(), SizeToTime()

This commit is contained in:
Max Kellermann 2018-09-21 19:32:35 +02:00
parent 1a2012a97e
commit d3d1d37782
5 changed files with 28 additions and 6 deletions

View File

@ -23,6 +23,8 @@
#include "pcm/SampleFormat.hxx"
#include "util/Compiler.h"
#include <chrono>
#include <stdint.h>
#include <stddef.h>
@ -152,6 +154,28 @@ struct AudioFormat {
* span to a storage size in bytes.
*/
double GetTimeToSize() const;
template<typename D>
constexpr auto TimeToFrames(D t) const noexcept {
using Period = typename D::period;
return ((t.count() * sample_rate) / Period::den) * Period::num;
}
template<typename D>
constexpr size_t TimeToSize(D t) const noexcept {
return size_t(size_t(TimeToFrames(t)) * GetFrameSize());
}
template<typename D>
constexpr D FramesToTime(std::uintmax_t size) const noexcept {
using Period = typename D::period;
return D(((size / Period::num) * Period::den) / sample_rate);
}
template<typename D>
constexpr D SizeToTime(std::uintmax_t size) const noexcept {
return FramesToTime<D>(size / GetFrameSize());
}
};
/**

View File

@ -532,8 +532,7 @@ DecoderBridge::SubmitData(InputStream *is,
data = (const uint8_t *)data + nbytes;
length -= nbytes;
timestamp += FloatDuration((double)nbytes /
dc.out_audio_format.GetTimeToSize());
timestamp += dc.out_audio_format.SizeToTime<FloatDuration>(nbytes);
}
absolute_frame += data_frames;

View File

@ -183,7 +183,7 @@ HybridDsdDecode(DecoderClient &client, InputStream &input)
try {
auto result = FindHybridDsdData(client, input);
auto duration = SignedSongTime::FromS(result.second / result.first.GetTimeToSize());
auto duration = result.first.SizeToTime<SignedSongTime>(result.second);
client.Ready(result.first, true, duration);
frame_size = result.first.GetFrameSize();
kbit_rate = frame_size * result.first.sample_rate /

View File

@ -264,8 +264,7 @@ mpd_mpg123_file_decode(DecoderClient &client, Path path_fs)
client.SeekError();
else {
client.CommandFinished();
client.SubmitTimestamp(FloatDuration(c)
/ audio_format.sample_rate);
client.SubmitTimestamp(audio_format.FramesToTime<FloatDuration>(c));
}
cmd = DecoderCommand::NONE;

View File

@ -766,7 +766,7 @@ PlayerControl::PlayChunk(DetachedSong &song, MusicChunkPtr chunk,
const double chunk_length(chunk->length);
outputs.Play(std::move(chunk));
total_play_time += FloatDuration(chunk_length / format.GetTimeToSize());
total_play_time += format.SizeToTime<decltype(total_play_time)>(chunk_length);
}
inline bool