Replace test renderer with spatialized binaural renderer

This commit is contained in:
Ken Cooke 2016-12-06 10:12:36 -08:00
parent e93e1a7c4f
commit 975cbd8e44
2 changed files with 22 additions and 3 deletions

View file

@ -1098,6 +1098,8 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) {
for (AudioInjector* injector : getActiveLocalAudioInjectors()) {
if (injector->getLocalBuffer()) {
static const int HRTF_DATASET_INDEX = 1;
int numChannels = injector->isAmbisonic() ? 4 : (injector->isStereo() ? 2 : 1);
qint64 bytesToRead = numChannels * AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL;
@ -1109,9 +1111,12 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) {
float gain = injector->getVolume();
// injector orientation can be used to align a recording to our world coordinates
//
// Calculate the soundfield orientation relative to the listener.
// Injector orientation can be used to align a recording to our world coordinates.
//
glm::quat relativeOrientation = injector->getOrientation() * glm::inverse(_orientationGetter());
#if 0
////////////// debug //////////////////
{
float x = relativeOrientation.x;
@ -1194,7 +1199,17 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) {
mixBuffer[2*i+0] += wCoef * buffer[0][i] + yCoef * buffer[2][i];
mixBuffer[2*i+1] += wCoef * buffer[0][i] - yCoef * buffer[2][i];
}
#else
// convert from Y-up (OpenGL) to Z-up (Ambisonic) coordinate system
float qw = relativeOrientation.w;
float qx = -relativeOrientation.z;
float qy = -relativeOrientation.x;
float qz = relativeOrientation.y;
// Ambisonic gets spatialized into mixBuffer
injector->getLocalFOA().render(_scratchBuffer, mixBuffer, HRTF_DATASET_INDEX,
qw, qx, qy, qz, gain, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL);
#endif
} else if (injector->isStereo()) {
// stereo gets directly mixed into mixBuffer
@ -1211,7 +1226,8 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) {
float azimuth = azimuthForSource(relativePosition);
// mono gets spatialized into mixBuffer
injector->getLocalHRTF().render(_scratchBuffer, mixBuffer, 1, azimuth, distance, gain, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL);
injector->getLocalHRTF().render(_scratchBuffer, mixBuffer, HRTF_DATASET_INDEX,
azimuth, distance, gain, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL);
}
} else {

View file

@ -27,6 +27,7 @@
#include "AudioInjectorLocalBuffer.h"
#include "AudioInjectorOptions.h"
#include "AudioHRTF.h"
#include "AudioFOA.h"
#include "Sound.h"
class AbstractAudioInterface;
@ -59,6 +60,7 @@ public:
AudioInjectorLocalBuffer* getLocalBuffer() const { return _localBuffer; }
AudioHRTF& getLocalHRTF() { return _localHRTF; }
AudioFOA& getLocalFOA() { return _localFOA; }
bool isLocalOnly() const { return _options.localOnly; }
float getVolume() const { return _options.volume; }
@ -115,6 +117,7 @@ private:
// when the injector is local, we need this
AudioHRTF _localHRTF;
AudioFOA _localFOA;
friend class AudioInjectorManager;
};