summaryrefslogtreecommitdiff
path: root/src/audio/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/player.c')
-rw-r--r--src/audio/player.c15
1 files changed, 14 insertions, 1 deletions
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)
146struct Impl_ContentSpec { 146struct Impl_ContentSpec {
147 SDL_AudioFormat inputFormat; 147 SDL_AudioFormat inputFormat;
148 SDL_AudioSpec output; 148 SDL_AudioSpec output;
149 size_t totalInputSize;
149 uint64_t totalSamples; 150 uint64_t totalSamples;
150 iRanges wavData; 151 iRanges wavData;
151}; 152};
@@ -167,6 +168,7 @@ struct Impl_Decoder {
167 SDL_AudioFormat inputFormat; 168 SDL_AudioFormat inputFormat;
168 iInputBuf * input; 169 iInputBuf * input;
169 size_t inputPos; 170 size_t inputPos;
171 size_t totalInputSize;
170 iSampleBuf output; 172 iSampleBuf output;
171 iMutex outputMutex; 173 iMutex outputMutex;
172 uint64_t currentSample; 174 uint64_t currentSample;
@@ -305,6 +307,7 @@ void init_Decoder(iDecoder *d, iInputBuf *input, const iContentSpec *spec) {
305 d->input = input; 307 d->input = input;
306 d->inputPos = spec->wavData.start; 308 d->inputPos = spec->wavData.start;
307 d->inputFormat = spec->inputFormat; 309 d->inputFormat = spec->inputFormat;
310 d->totalInputSize = spec->totalInputSize;
308 init_SampleBuf(&d->output, 311 init_SampleBuf(&d->output,
309 spec->output.format, 312 spec->output.format,
310 spec->output.channels, 313 spec->output.channels,
@@ -365,7 +368,7 @@ static iContentSpec contentSpec_Player_(const iPlayer *d) {
365 /* Not WAV. */ 368 /* Not WAV. */
366 return content; 369 return content;
367 } 370 }
368 readU32_Stream(is); /* file size */ 371 content.totalInputSize = readU32_Stream(is); /* file size */
369 readData_Buffer(buf, 4, magic); 372 readData_Buffer(buf, 4, magic);
370 if (memcmp(magic, "WAVE", 4)) { 373 if (memcmp(magic, "WAVE", 4)) {
371 /* Not WAV. */ 374 /* Not WAV. */
@@ -550,3 +553,13 @@ float duration_Player(const iPlayer *d) {
550 if (!d->decoder) return 0; 553 if (!d->decoder) return 0;
551 return (float) ((double) d->decoder->totalSamples / (double) d->spec.freq); 554 return (float) ((double) d->decoder->totalSamples / (double) d->spec.freq);
552} 555}
556
557float streamProgress_Player(const iPlayer *d) {
558 if (d->decoder->totalInputSize) {
559 lock_Mutex(&d->data->mtx);
560 const double inputSize = size_InputBuf(d->data);
561 unlock_Mutex(&d->data->mtx);
562 return (float) iMin(1.0, (double) inputSize / (double) d->decoder->totalInputSize);
563 }
564 return 0;
565}