From 613e9623d8c9243a33402bf8845f914860b1dcdf Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Thu, 8 Oct 2020 06:01:29 +0300 Subject: Player: Total input size --- src/audio/player.c | 15 ++++++++++++++- src/audio/player.h | 17 +++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) (limited to 'src/audio') diff --git a/src/audio/player.c b/src/audio/player.c index 2d6767ea..5b9d0103 100644 --- a/src/audio/player.c +++ b/src/audio/player.c @@ -146,6 +146,7 @@ iDeclareType(ContentSpec) struct Impl_ContentSpec { SDL_AudioFormat inputFormat; SDL_AudioSpec output; + size_t totalInputSize; uint64_t totalSamples; iRanges wavData; }; @@ -167,6 +168,7 @@ struct Impl_Decoder { SDL_AudioFormat inputFormat; iInputBuf * input; size_t inputPos; + size_t totalInputSize; iSampleBuf output; iMutex outputMutex; uint64_t currentSample; @@ -305,6 +307,7 @@ void init_Decoder(iDecoder *d, iInputBuf *input, const iContentSpec *spec) { d->input = input; d->inputPos = spec->wavData.start; d->inputFormat = spec->inputFormat; + d->totalInputSize = spec->totalInputSize; init_SampleBuf(&d->output, spec->output.format, spec->output.channels, @@ -365,7 +368,7 @@ static iContentSpec contentSpec_Player_(const iPlayer *d) { /* Not WAV. */ return content; } - readU32_Stream(is); /* file size */ + content.totalInputSize = readU32_Stream(is); /* file size */ readData_Buffer(buf, 4, magic); if (memcmp(magic, "WAVE", 4)) { /* Not WAV. */ @@ -550,3 +553,13 @@ float duration_Player(const iPlayer *d) { if (!d->decoder) return 0; return (float) ((double) d->decoder->totalSamples / (double) d->spec.freq); } + +float streamProgress_Player(const iPlayer *d) { + if (d->decoder->totalInputSize) { + lock_Mutex(&d->data->mtx); + const double inputSize = size_InputBuf(d->data); + unlock_Mutex(&d->data->mtx); + return (float) iMin(1.0, (double) inputSize / (double) d->decoder->totalInputSize); + } + return 0; +} diff --git a/src/audio/player.h b/src/audio/player.h index 5c17ef6c..c3552640 100644 --- a/src/audio/player.h +++ b/src/audio/player.h @@ -36,11 +36,12 @@ enum iPlayerUpdate { void setFormatHint_Player (iPlayer *, const char *hint); void updateSourceData_Player (iPlayer *, const iBlock *data, enum iPlayerUpdate update); -iBool start_Player (iPlayer *); -void setPaused_Player (iPlayer *, iBool isPaused); -void stop_Player (iPlayer *); - -iBool isStarted_Player (const iPlayer *); -iBool isPaused_Player (const iPlayer *); -float time_Player (const iPlayer *); -float duration_Player (const iPlayer *); +iBool start_Player (iPlayer *); +void setPaused_Player (iPlayer *, iBool isPaused); +void stop_Player (iPlayer *); + +iBool isStarted_Player (const iPlayer *); +iBool isPaused_Player (const iPlayer *); +float time_Player (const iPlayer *); +float duration_Player (const iPlayer *); +float streamProgress_Player (const iPlayer *); /* normalized 0...1 */ -- cgit v1.2.3