implement mixing routines for basic cases

adpcm
Dimitri Diakopoulos 11 years ago
parent a76b2fe90b
commit 091c799f76

@ -5,6 +5,7 @@
#include "libnyquist/AudioDevice.h" #include "libnyquist/AudioDevice.h"
#include "libnyquist/AudioDecoder.h" #include "libnyquist/AudioDecoder.h"
#include "libnyquist/WavEncoder.h" #include "libnyquist/WavEncoder.h"
#include "libnyquist/PostProcess.h"
#include <thread> #include <thread>
@ -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/8/test.wav");
//auto result = loader.Load(fileData, "test_data/1ch/44100/16/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/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/1ch/44100/64/test.wav");
//auto result = loader.Load(fileData, "test_data/2ch/44100/8/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/TestLaugh_44k.ogg");
//auto result = loader.Load(fileData, "test_data/ad_hoc/TestBeat.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/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/KittyPurr8_Stereo_Dithered.flac");
//auto result = loader.Load(fileData, "test_data/ad_hoc/KittyPurr16_Stereo.flac"); //auto result = loader.Load(fileData, "test_data/ad_hoc/KittyPurr16_Stereo.flac");
@ -81,14 +82,7 @@ int main()
if (fileData->channelCount == 1) if (fileData->channelCount == 1)
{ {
std::vector<float> stereoCopy(fileData->samples.size() * 2); std::vector<float> stereoCopy(fileData->samples.size() * 2);
MonoToStereo(fileData->samples.data(), stereoCopy.data(), fileData->samples.size());
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++;
}
myDevice.Play(stereoCopy); myDevice.Play(stereoCopy);
} }
else else
@ -98,7 +92,7 @@ int main()
} }
// Test wav file encoder // 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; std::cout << "Encoder Status: " << encoderStatus << std::endl;
return 0; return 0;

@ -46,13 +46,13 @@ inline void DeinterleaveStereo(T * c1, T * c2, T const * src, size_t count)
} }
template<typename T> template<typename T>
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++) for (size_t ch = 0; ch < numChannels; ch++)
{ {
size_t x = ch; size_t x = ch;
const T * srcChannel = &src[ch * numFramesPerChannel]; 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]; dest[x] = srcChannel[i];
x += numChannels; x += numChannels;
@ -61,23 +61,42 @@ void InterleaveArbitrary(const T * src, T * dest, size_t numFramesPerChannel, si
} }
template<typename T> template<typename T>
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++) for(size_t ch = 0; ch < numChannels; ch++)
{ {
size_t x = ch; size_t x = ch;
T *destChannel = &dest[ch * numFramesPerChannel]; 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]; destChannel[i] = (T) src[x];
x += numChannels; x += numChannels;
} }
} }
} }
template <typename T>
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 <typename T>
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<float> & buffer, float v, bool fromFront, bool fromEnd) inline void TrimSilenceInterleaved(std::vector<float> & buffer, float v, bool fromFront, bool fromEnd)
{ {
//@todo implement me //@todo implement me!
} }
} // end namespace nqr } // end namespace nqr

@ -127,10 +127,12 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std:
fout.write(reinterpret_cast<const char*>(d->samples.data()), samplesSizeInBytes); fout.write(reinterpret_cast<const char*>(d->samples.data()), samplesSizeInBytes);
} }
// Padding byte // Padding byte
if (isOdd(samplesSizeInBytes)) if (isOdd(samplesSizeInBytes))
{ {
fout.write(reinterpret_cast<const char *>(1), 1); const char * zero = "";
fout.write(zero, 1);
} }
// Find size // Find size

Loading…
Cancel
Save