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/AudioDecoder.h"
#include "libnyquist/WavEncoder.h"
#include "libnyquist/PostProcess.h"
#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/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<float> 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;

@ -46,13 +46,13 @@ inline void DeinterleaveStereo(T * c1, T * c2, T const * src, size_t count)
}
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++)
{
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,13 +61,13 @@ void InterleaveArbitrary(const T * src, T * dest, size_t numFramesPerChannel, si
}
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++)
{
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;
@ -75,9 +75,28 @@ void DeinterleaveArbitrary(const T * src, T * dest, size_t numFramesPerChannel,
}
}
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)
{
//@todo implement me
//@todo implement me!
}
} // 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);
}
// Padding byte
if (isOdd(samplesSizeInBytes))
{
fout.write(reinterpret_cast<const char *>(1), 1);
const char * zero = "";
fout.write(zero, 1);
}
// Find size

Loading…
Cancel
Save