Fix duration calculation for float-encoded WAVs.

e4813f4996
This commit is contained in:
casey langen 2022-01-02 22:12:45 -08:00
parent f38ab09ec6
commit 332e8c25d1

View File

@ -35,7 +35,8 @@ namespace
enum WaveFormat enum WaveFormat
{ {
FORMAT_UNKNOWN = 0x0000, FORMAT_UNKNOWN = 0x0000,
FORMAT_PCM = 0x0001 FORMAT_PCM = 0x0001,
FORMAT_IEEE_FLOAT = 0x0003
}; };
} }
@ -183,7 +184,7 @@ void RIFF::WAV::Properties::read(File *file)
} }
d->format = data.toShort(0, false); d->format = data.toShort(0, false);
if(d->format != FORMAT_PCM && totalSamples == 0) { if(d->format != FORMAT_PCM && d->format != FORMAT_IEEE_FLOAT && totalSamples == 0) {
debug("RIFF::WAV::Properties::read() - Non-PCM format, but 'fact' chunk not found."); debug("RIFF::WAV::Properties::read() - Non-PCM format, but 'fact' chunk not found.");
return; return;
} }
@ -192,7 +193,7 @@ void RIFF::WAV::Properties::read(File *file)
d->sampleRate = data.toUInt(4, false); d->sampleRate = data.toUInt(4, false);
d->bitsPerSample = data.toShort(14, false); d->bitsPerSample = data.toShort(14, false);
if(d->format != FORMAT_PCM) if (d->format != FORMAT_PCM && !(d->format == FORMAT_IEEE_FLOAT && totalSamples == 0))
d->sampleFrames = totalSamples; d->sampleFrames = totalSamples;
else if(d->channels > 0 && d->bitsPerSample > 0) else if(d->channels > 0 && d->bitsPerSample > 0)
d->sampleFrames = streamLength / (d->channels * ((d->bitsPerSample + 7) / 8)); d->sampleFrames = streamLength / (d->channels * ((d->bitsPerSample + 7) / 8));