From 091c799f7691acc92bc6548624b267b73f45c9b9 Mon Sep 17 00:00:00 2001 From: Dimitri Diakopoulos Date: Sun, 17 May 2015 22:46:20 -0700 Subject: [PATCH] implement mixing routines for basic cases --- examples/src/Main.cpp | 16 +++++----------- include/libnyquist/PostProcess.h | 29 ++++++++++++++++++++++++----- src/WavEncoder.cpp | 4 +++- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/examples/src/Main.cpp b/examples/src/Main.cpp index fb17f0d..b085480 100644 --- a/examples/src/Main.cpp +++ b/examples/src/Main.cpp @@ -5,6 +5,7 @@ #include "libnyquist/AudioDevice.h" #include "libnyquist/AudioDecoder.h" #include "libnyquist/WavEncoder.h" +#include "libnyquist/PostProcess.h" #include @@ -32,7 +33,7 @@ int main() //auto result = loader.Load(fileData, "test_data/1ch/44100/8/test.wav"); //auto result = loader.Load(fileData, "test_data/1ch/44100/16/test.wav"); //auto result = loader.Load(fileData, "test_data/1ch/44100/24/test.wav"); - //auto result = loader.Load(fileData, "test_data/1ch/44100/32/test.wav"); + auto result = loader.Load(fileData, "test_data/1ch/44100/32/test.wav"); //auto result = loader.Load(fileData, "test_data/1ch/44100/64/test.wav"); //auto result = loader.Load(fileData, "test_data/2ch/44100/8/test.wav"); @@ -47,7 +48,7 @@ int main() //auto result = loader.Load(fileData, "test_data/ad_hoc/TestLaugh_44k.ogg"); //auto result = loader.Load(fileData, "test_data/ad_hoc/TestBeat.ogg"); //auto result = loader.Load(fileData, "test_data/ad_hoc/TestBeatMono.ogg"); - auto result = loader.Load(fileData, "test_data/ad_hoc/BlockWoosh_Stereo.ogg"); + //auto result = loader.Load(fileData, "test_data/ad_hoc/BlockWoosh_Stereo.ogg"); //auto result = loader.Load(fileData, "test_data/ad_hoc/KittyPurr8_Stereo_Dithered.flac"); //auto result = loader.Load(fileData, "test_data/ad_hoc/KittyPurr16_Stereo.flac"); @@ -81,14 +82,7 @@ int main() if (fileData->channelCount == 1) { std::vector stereoCopy(fileData->samples.size() * 2); - - int m = 0; - for (size_t i = 0; i < stereoCopy.size(); i+=2) - { - stereoCopy[i] = fileData->samples[m]; - stereoCopy[i+1] = fileData->samples[m]; - m++; - } + MonoToStereo(fileData->samples.data(), stereoCopy.data(), fileData->samples.size()); myDevice.Play(stereoCopy); } else @@ -98,7 +92,7 @@ int main() } // Test wav file encoder - int encoderStatus = encoder.WriteFile({2, PCM_24, DITHER_NONE}, fileData, "encoded.wav"); + int encoderStatus = encoder.WriteFile({1, PCM_24, DITHER_NONE}, fileData, "encoded.wav"); std::cout << "Encoder Status: " << encoderStatus << std::endl; return 0; diff --git a/include/libnyquist/PostProcess.h b/include/libnyquist/PostProcess.h index bf36d5a..8d3d3cd 100644 --- a/include/libnyquist/PostProcess.h +++ b/include/libnyquist/PostProcess.h @@ -46,13 +46,13 @@ inline void DeinterleaveStereo(T * c1, T * c2, T const * src, size_t count) } template -void InterleaveArbitrary(const T * src, T * dest, size_t numFramesPerChannel, size_t numChannels, size_t numCopyFrames) +void InterleaveChannels(const T * src, T * dest, size_t numFramesPerChannel, size_t numChannels, size_t N) { for (size_t ch = 0; ch < numChannels; ch++) { size_t x = ch; const T * srcChannel = &src[ch * numFramesPerChannel]; - for(size_t i = 0; i < numCopyFrames; i++) + for(size_t i = 0; i < N; i++) { dest[x] = srcChannel[i]; x += numChannels; @@ -61,23 +61,42 @@ void InterleaveArbitrary(const T * src, T * dest, size_t numFramesPerChannel, si } template -void DeinterleaveArbitrary(const T * src, T * dest, size_t numFramesPerChannel, size_t numChannels, size_t numCopyFrames) +void DeinterleaveChannels(const T * src, T * dest, size_t numFramesPerChannel, size_t numChannels, size_t N) { for(size_t ch = 0; ch < numChannels; ch++) { size_t x = ch; T *destChannel = &dest[ch * numFramesPerChannel]; - for (size_t i = 0; i < numCopyFrames; i++) + for (size_t i = 0; i < N; i++) { destChannel[i] = (T) src[x]; x += numChannels; } } } + +template +void StereoToMono(const T * src, T * dest, size_t N) +{ + for (size_t i = 0, j = 0; i < N; i += 2, ++j) + { + dest[j] = (src[i] + src[i + 1]) / 2.0f; + } +} + +template +void MonoToStereo(const T * src, T * dest, size_t N) +{ + for(int i = 0, j = 0; i < N; ++i, j += 2) + { + dest[j] = src[i]; + dest[j + 1] = src[i]; + } +} inline void TrimSilenceInterleaved(std::vector & buffer, float v, bool fromFront, bool fromEnd) { - //@todo implement me + //@todo implement me! } } // end namespace nqr diff --git a/src/WavEncoder.cpp b/src/WavEncoder.cpp index 78f8de0..3eec46f 100644 --- a/src/WavEncoder.cpp +++ b/src/WavEncoder.cpp @@ -127,10 +127,12 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std: fout.write(reinterpret_cast(d->samples.data()), samplesSizeInBytes); } + // Padding byte if (isOdd(samplesSizeInBytes)) { - fout.write(reinterpret_cast(1), 1); + const char * zero = ""; + fout.write(zero, 1); } // Find size