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()) { for (AudioInjector* injector : getActiveLocalAudioInjectors()) {
if (injector->getLocalBuffer()) { if (injector->getLocalBuffer()) {
static const int HRTF_DATASET_INDEX = 1;
int numChannels = injector->isAmbisonic() ? 4 : (injector->isStereo() ? 2 : 1); int numChannels = injector->isAmbisonic() ? 4 : (injector->isStereo() ? 2 : 1);
qint64 bytesToRead = numChannels * AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL; qint64 bytesToRead = numChannels * AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL;
@ -1109,9 +1111,12 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) {
float gain = injector->getVolume(); 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()); glm::quat relativeOrientation = injector->getOrientation() * glm::inverse(_orientationGetter());
#if 0
////////////// debug ////////////////// ////////////// debug //////////////////
{ {
float x = relativeOrientation.x; 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+0] += wCoef * buffer[0][i] + yCoef * buffer[2][i];
mixBuffer[2*i+1] += 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()) { } else if (injector->isStereo()) {
// stereo gets directly mixed into mixBuffer // stereo gets directly mixed into mixBuffer
@ -1211,7 +1226,8 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) {
float azimuth = azimuthForSource(relativePosition); float azimuth = azimuthForSource(relativePosition);
// mono gets spatialized into mixBuffer // 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 { } else {

View file

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