mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-13 23:26:16 +00:00
Initial audio interface classes
This commit is contained in:
73
lib/audiodev/AudioMatrix.cpp
Normal file
73
lib/audiodev/AudioMatrix.cpp
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "boo/audiodev/AudioMatrix.hpp"
|
||||
#include <string.h>
|
||||
|
||||
namespace boo
|
||||
{
|
||||
|
||||
void AudioMatrixMono::setDefaultMatrixCoefficients()
|
||||
{
|
||||
memset(m_coefs, 0, sizeof(m_coefs));
|
||||
switch (m_setOut)
|
||||
{
|
||||
case AudioChannelSet::Mono:
|
||||
case AudioChannelSet::Stereo:
|
||||
case AudioChannelSet::Quad:
|
||||
m_coefs[AudioChannel::FrontLeft] = 1.0;
|
||||
m_coefs[AudioChannel::FrontRight] = 1.0;
|
||||
break;
|
||||
case AudioChannelSet::Surround51:
|
||||
case AudioChannelSet::Surround71:
|
||||
m_coefs[AudioChannel::FrontCenter] = 1.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioMatrixMono::bufferMonoSampleData(IAudioVoice& voice, const int16_t* data, size_t samples)
|
||||
{
|
||||
const ChannelMap& chmap = voice.channelMap();
|
||||
m_interleaveBuf.clear();
|
||||
m_interleaveBuf.reserve(samples * chmap.m_channelCount);
|
||||
for (size_t s=0 ; s<samples ; ++s, ++data)
|
||||
for (int c=0 ; c<chmap.m_channelCount ; ++c)
|
||||
m_interleaveBuf.push_back(data[0] * m_coefs[chmap.m_channels[c]]);
|
||||
voice.bufferSampleData(m_interleaveBuf.data(), samples);
|
||||
}
|
||||
|
||||
void AudioMatrixStereo::setDefaultMatrixCoefficients()
|
||||
{
|
||||
memset(m_coefs, 0, sizeof(m_coefs));
|
||||
switch (m_setOut)
|
||||
{
|
||||
case AudioChannelSet::Mono:
|
||||
m_coefs[AudioChannel::FrontLeft][0] = 0.5;
|
||||
m_coefs[AudioChannel::FrontLeft][1] = 0.5;
|
||||
m_coefs[AudioChannel::FrontRight][0] = 0.5;
|
||||
m_coefs[AudioChannel::FrontRight][1] = 0.5;
|
||||
break;
|
||||
case AudioChannelSet::Stereo:
|
||||
case AudioChannelSet::Quad:
|
||||
m_coefs[AudioChannel::FrontLeft][0] = 1.0;
|
||||
m_coefs[AudioChannel::FrontRight][1] = 1.0;
|
||||
break;
|
||||
case AudioChannelSet::Surround51:
|
||||
case AudioChannelSet::Surround71:
|
||||
m_coefs[AudioChannel::FrontLeft][0] = 1.0;
|
||||
m_coefs[AudioChannel::FrontRight][1] = 1.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioMatrixStereo::bufferStereoSampleData(IAudioVoice& voice, const int16_t* data, size_t frames)
|
||||
{
|
||||
const ChannelMap& chmap = voice.channelMap();
|
||||
m_interleaveBuf.clear();
|
||||
m_interleaveBuf.reserve(frames * chmap.m_channelCount);
|
||||
for (size_t f=0 ; f<frames ; ++f, data += 2)
|
||||
for (int c=0 ; c<chmap.m_channelCount ; ++c)
|
||||
m_interleaveBuf.push_back(data[0] * m_coefs[chmap.m_channels[c][0]] +
|
||||
data[1] * m_coefs[chmap.m_channels[c][1]]);
|
||||
voice.bufferSampleData(m_interleaveBuf.data(), frames);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user