AudioFormat: add TimeToSize(), SizeToTime()
This commit is contained in:
parent
1a2012a97e
commit
d3d1d37782
|
@ -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());
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 /
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue