diff --git a/include/libnyquist/RiffUtils.h b/include/libnyquist/RiffUtils.h index ece940e..95bda8c 100644 --- a/include/libnyquist/RiffUtils.h +++ b/include/libnyquist/RiffUtils.h @@ -77,7 +77,7 @@ auto chunk = GenerateChunkCode(a, b, c, d); ChunkHeaderInfo ScanForChunk(const std::vector & fileData, uint32_t chunkMarker); -WaveChunkHeader MakeWaveHeader(const EncoderParams param); +WaveChunkHeader MakeWaveHeader(const EncoderParams param, const int sampleRate); } // end namespace nqr diff --git a/src/RiffUtils.cpp b/src/RiffUtils.cpp index 67c60f0..f8ea6e9 100644 --- a/src/RiffUtils.cpp +++ b/src/RiffUtils.cpp @@ -49,7 +49,7 @@ ChunkHeaderInfo nqr::ScanForChunk(const std::vector & fileData, uint32_ -WaveChunkHeader nqr::MakeWaveHeader(const EncoderParams param) +WaveChunkHeader nqr::MakeWaveHeader(const EncoderParams param, const int sampleRate) { WaveChunkHeader header; @@ -59,8 +59,8 @@ WaveChunkHeader nqr::MakeWaveHeader(const EncoderParams param) header.chunk_size = 16; header.format = (param.targetFormat <= PCMFormat::PCM_32) ? WaveFormatCode::FORMAT_PCM : WaveFormatCode::FORMAT_IEEE; header.channel_count = param.channelCount; - header.sample_rate = param.sampleRate; - header.data_rate = param.sampleRate * param.channelCount * (bitdepth / 8); + header.sample_rate = sampleRate; + header.data_rate = sampleRate * param.channelCount * (bitdepth / 8); header.frame_size = param.channelCount * (bitdepth/ 8); header.bit_depth = bitdepth; diff --git a/src/WavEncoder.cpp b/src/WavEncoder.cpp index 2c19775..cca2d2d 100644 --- a/src/WavEncoder.cpp +++ b/src/WavEncoder.cpp @@ -67,12 +67,6 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std: return EncoderError::BufferTooBig; } - // No resampling - if (d->sampleRate != p.sampleRate) - { - return EncoderError::UnsupportedSamplerate; - } - // Don't support PCM_64 or PCM_DBL if (GetFormatBitsPerSample(p.targetFormat) > 32) { @@ -98,15 +92,20 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std: fout.write(GenerateChunkCodeChar('W', 'A', 'V', 'E'), 4); // Fmt header - auto header = MakeWaveHeader(p); + auto header = MakeWaveHeader(p, d->sampleRate); fout.write(reinterpret_cast(&header), sizeof(WaveChunkHeader)); auto sourceBits = GetFormatBitsPerSample(d->sourceFormat); auto targetBits = GetFormatBitsPerSample(p.targetFormat); - if (p.targetFormat == PCM_FLT || p.targetFormat == PCM_DBL) + // Write out fact chunk + if (p.targetFormat == PCM_FLT) { - + uint32_t four = 4; + uint32_t dataSz = int(d->samples.size() / d->channelCount); + fout.write(GenerateChunkCodeChar('f', 'a', 'c', 't'), 4); + fout.write(reinterpret_cast(&four), sizeof(four)); + fout.write(reinterpret_cast(&dataSz), sizeof(dataSz)); // Number of samples (per channel) } // Data header