bugfixes and prepare for dithering impl

adpcm
Dimitri Diakopoulos 11 years ago
parent 5900e1c546
commit 2893e8f2b0

@ -98,7 +98,7 @@ int main()
} }
// Test wav file encoder // Test wav file encoder
encoder.WriteFile({2, 44100, 32, PCM_FLT}, fileData->samples, "encoded.wav"); encoder.WriteFile({2, 44100, 32, PCM_FLT, DITHER_NONE}, fileData, "encoded.wav");
return 0; return 0;
} }

@ -35,6 +35,7 @@ namespace nqr
enum DitherType enum DitherType
{ {
DITHER_NONE,
DITHER_ONE, DITHER_ONE,
DITHER_TWO DITHER_TWO
}; };

@ -55,12 +55,12 @@ WaveChunkHeader nqr::MakeWaveHeader(const EncoderParams param)
header.fmt_id = GenerateChunkCode('f', 'm', 't', ' '); header.fmt_id = GenerateChunkCode('f', 'm', 't', ' ');
header.chunk_size = 16; header.chunk_size = 16;
header.format = (param.fmt <= PCMFormat::PCM_32) ? WaveFormatCode::FORMAT_PCM : WaveFormatCode::FORMAT_IEEE; header.format = (param.targetFormat <= PCMFormat::PCM_32) ? WaveFormatCode::FORMAT_PCM : WaveFormatCode::FORMAT_IEEE;
header.channel_count = param.channels; header.channel_count = param.channelCount;
header.sample_rate = param.samplerate; header.sample_rate = param.sampleRate;
header.data_rate = param.samplerate * param.channels * (param.bit_depth / 8); header.data_rate = param.sampleRate * param.channelCount * (param.bitDepth / 8);
header.frame_size = param.channels * (param.bit_depth / 8); header.frame_size = param.channelCount * (param.bitDepth / 8);
header.bit_depth = param.bit_depth; header.bit_depth = param.bitDepth;
return header; return header;
} }

@ -48,7 +48,6 @@ WavEncoder::~WavEncoder()
int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std::string & path) int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std::string & path)
{ {
if (d->samples.size() <= 32) if (d->samples.size() <= 32)
{ {
return EncoderError::InsufficientSampleData; return EncoderError::InsufficientSampleData;
@ -86,28 +85,37 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std:
// Initial size // Initial size
toBytes(36, chunkSizeBuff); toBytes(36, chunkSizeBuff);
// RIFF File Header // RIFF file header
fout.write(GenerateChunkCodeChar('R', 'I', 'F', 'F'), 4); fout.write(GenerateChunkCodeChar('R', 'I', 'F', 'F'), 4);
fout.write(chunkSizeBuff, 4); fout.write(chunkSizeBuff, 4);
fout.write(GenerateChunkCodeChar('W', 'A', 'V', 'E'), 4); fout.write(GenerateChunkCodeChar('W', 'A', 'V', 'E'), 4);
// Fmt Header // Fmt header
auto header = MakeWaveHeader(p); auto header = MakeWaveHeader(p);
fout.write(reinterpret_cast<char*>(&header), sizeof(WaveChunkHeader)); fout.write(reinterpret_cast<char*>(&header), sizeof(WaveChunkHeader));
// Data Header // Data header
fout.write(GenerateChunkCodeChar('d', 'a', 't', 'a'), 4); fout.write(GenerateChunkCodeChar('d', 'a', 't', 'a'), 4);
// + data chunk size // + data chunk size
auto numSamplesBytes = d->samples.size() * sizeof(float); auto numSamplesBytes = d->samples.size() * sizeof(float);
toBytes(numSamplesBytes, chunkSizeBuff); toBytes(samplesSizeInBytes, chunkSizeBuff);
fout.write(chunkSizeBuff, 4); fout.write(chunkSizeBuff, 4);
// Debugging -- assume IEEE_Float // Debugging -- assume IEEE_Float
auto sourceBits = GetFormatBitsPerSample(d->sourceFormat);
auto what = GetFormatBitsPerSample(d->sourceFmt); auto targetBits = GetFormatBitsPerSample(p.targetFormat);
fout.write(reinterpret_cast<const char*>(d->samples.data()), numSamplesBytes);
// Apply dithering
if (sourceBits != targetBits && p.dither != DITHER_NONE)
{
}
else
{
fout.write(reinterpret_cast<const char*>(d->samples.data()), samplesSizeInBytes);
}
// Find size // Find size
long totalSize = fout.tellp(); long totalSize = fout.tellp();
@ -115,7 +123,7 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std:
// Modify RIFF header // Modify RIFF header
fout.seekp(4); fout.seekp(4);
// Total size of the file, less 8 for the RIFF header // Total size of the file, less 8 bytes for the RIFF header
toBytes(totalSize - 8 , chunkSizeBuff); toBytes(totalSize - 8 , chunkSizeBuff);
fout.write(chunkSizeBuff, 4); fout.write(chunkSizeBuff, 4);

Loading…
Cancel
Save