Skip to content

Commit

Permalink
AudioFormat: add TimeToSize(), SizeToTime()
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxKellermann committed Sep 21, 2018
1 parent 1a2012a commit d3d1d37
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 6 deletions.
24 changes: 24 additions & 0 deletions src/AudioFormat.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#include "pcm/SampleFormat.hxx"
#include "util/Compiler.h"

#include <chrono>

#include <stdint.h>
#include <stddef.h>

Expand Down Expand Up @@ -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());
}
};

/**
Expand Down
3 changes: 1 addition & 2 deletions src/decoder/Bridge.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/decoder/plugins/HybridDsdDecoderPlugin.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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 /
Expand Down
3 changes: 1 addition & 2 deletions src/decoder/plugins/Mpg123DecoderPlugin.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/player/Thread.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d3d1d37

Please sign in to comment.