support fact chunk for wav encoder

adpcm
Dimitri Diakopoulos 11 years ago
parent e4784182c5
commit 301f7c7e4a

@ -77,7 +77,7 @@ auto chunk = GenerateChunkCode(a, b, c, d);
ChunkHeaderInfo ScanForChunk(const std::vector<uint8_t> & fileData, uint32_t chunkMarker);
WaveChunkHeader MakeWaveHeader(const EncoderParams param);
WaveChunkHeader MakeWaveHeader(const EncoderParams param, const int sampleRate);
} // end namespace nqr

@ -49,7 +49,7 @@ ChunkHeaderInfo nqr::ScanForChunk(const std::vector<uint8_t> & 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;

@ -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<char*>(&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<const char *>(&four), sizeof(four));
fout.write(reinterpret_cast<const char *>(&dataSz), sizeof(dataSz)); // Number of samples (per channel)
}
// Data header

Loading…
Cancel
Save