glue in processSpatialAudio()

This commit is contained in:
ZappoMan 2014-04-02 18:18:17 -07:00
parent 033e233d40
commit 42efb0db65
6 changed files with 46 additions and 31 deletions

View file

@ -1603,7 +1603,7 @@ void Application::init() {
_audioReflector.setMyAvatar(getAvatar()); _audioReflector.setMyAvatar(getAvatar());
_audioReflector.setVoxels(_voxels.getTree()); _audioReflector.setVoxels(_voxels.getTree());
_audioReflector.setAudio(getAudio()); _audioReflector.setAudio(getAudio());
connect(getAudio(), &Audio::audioBufferWrittenToDevice, &_audioReflector, &AudioReflector::addSamples); connect(getAudio(), &Audio::processSpatialAudio, &_audioReflector, &AudioReflector::processSpatialAudio);
} }
void Application::closeMirrorView() { void Application::closeMirrorView() {

View file

@ -100,7 +100,7 @@ public slots:
signals: signals:
bool muteToggled(); bool muteToggled();
void processSpatialAudio(unsigned int sampleTime, const AudioRingBuffer& ringBuffer, const QAudioFormat& format); void processSpatialAudio(unsigned int sampleTime, AudioRingBuffer& ringBuffer, const QAudioFormat& format);
private: private:

View file

@ -33,8 +33,8 @@ void AudioReflector::render() {
// BOUNCE_ATTENUATION_FACTOR [0.5] * (1/(1+distance)) // BOUNCE_ATTENUATION_FACTOR [0.5] * (1/(1+distance))
int getDelayFromDistance(float distance) { int getDelayFromDistance(float distance) {
const int DELAY_PER_METER = 3; const int MS_DELAY_PER_METER = 3;
return DELAY_PER_METER * distance; return MS_DELAY_PER_METER * distance;
} }
const float BOUNCE_ATTENUATION_FACTOR = 0.5f; const float BOUNCE_ATTENUATION_FACTOR = 0.5f;
@ -99,8 +99,10 @@ void AudioReflector::drawReflections(const glm::vec3& origin, const glm::vec3& o
} }
} }
void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::vec3& originalDirection, void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::vec3& originalDirection,
int bounces, const AudioRingBuffer& samplesRingBuffer) { int bounces, const AudioRingBuffer& samplesRingBuffer,
unsigned int sampleTime, int sampleRate) {
int samplesTouched = 0; int samplesTouched = 0;
@ -114,11 +116,11 @@ void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::ve
const float SLIGHTLY_SHORT = 0.999f; // slightly inside the distance so we're on the inside of the reflection point const float SLIGHTLY_SHORT = 0.999f; // slightly inside the distance so we're on the inside of the reflection point
// set up our buffers for our attenuated and delayed samples // set up our buffers for our attenuated and delayed samples
AudioRingBuffer attenuatedLeftSamples(samplesRingBuffer.getSampleCapacity());
AudioRingBuffer attenuatedRightSamples(samplesRingBuffer.getSampleCapacity());
const int NUMBER_OF_CHANNELS = 2; const int NUMBER_OF_CHANNELS = 2;
int totalNumberOfSamples = samplesByteArray.size() / (sizeof(int16_t) * NUMBER_OF_CHANNELS); AudioRingBuffer attenuatedLeftSamples(samplesRingBuffer.samplesAvailable());
AudioRingBuffer attenuatedRightSamples(samplesRingBuffer.samplesAvailable());
int totalNumberOfSamples = samplesRingBuffer.samplesAvailable();
for (int bounceNumber = 1; bounceNumber <= bounces; bounceNumber++) { for (int bounceNumber = 1; bounceNumber <= bounces; bounceNumber++) {
if (_voxels->findRayIntersection(start, direction, elementHit, distance, face)) { if (_voxels->findRayIntersection(start, direction, elementHit, distance, face)) {
@ -131,8 +133,11 @@ void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::ve
// calculate the distance to the ears // calculate the distance to the ears
float rightEarDistance = glm::distance(end, rightEarPosition); float rightEarDistance = glm::distance(end, rightEarPosition);
float leftEarDistance = glm::distance(end, leftEarPosition); float leftEarDistance = glm::distance(end, leftEarPosition);
int rightEarDelay = getDelayFromDistance(rightEarDistance); int rightEarDelayMsecs = getDelayFromDistance(rightEarDistance);
int leftEarDelay = getDelayFromDistance(leftEarDistance); int leftEarDelayMsecs = getDelayFromDistance(leftEarDistance);
int rightEarDelay = rightEarDelayMsecs / MSECS_PER_SECOND * sampleRate;
int leftEarDelay = leftEarDelayMsecs / MSECS_PER_SECOND * sampleRate;
float rightEarAttenuation = getDistanceAttenuationCoefficient(rightEarDistance) * float rightEarAttenuation = getDistanceAttenuationCoefficient(rightEarDistance) *
(bounceNumber * BOUNCE_ATTENUATION_FACTOR); (bounceNumber * BOUNCE_ATTENUATION_FACTOR);
float leftEarAttenuation = getDistanceAttenuationCoefficient(leftEarDistance) * float leftEarAttenuation = getDistanceAttenuationCoefficient(leftEarDistance) *
@ -153,13 +158,17 @@ void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::ve
} }
// now inject the attenuated array with the appropriate delay // now inject the attenuated array with the appropriate delay
_audio->addDelayedAudio(attenuatedLeftSamples, leftEarDelay);
_audio->addDelayedAudio(attenuatedRightSamples, rightEarDelay); unsigned int sampleTimeLeft = sampleTime + leftEarDelay;
unsigned int sampleTimeRight = sampleTime + rightEarDelay;
_audio->addSpatialAudioToBuffer(sampleTimeLeft, attenuatedLeftSamples);
_audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightSamples);
} }
} }
} }
void AudioReflector::addSamples(AudioRingBuffer samples) { void AudioReflector::processSpatialAudio(unsigned int sampleTime, AudioRingBuffer& ringBuffer, const QAudioFormat& format) {
quint64 start = usecTimestampNow(); quint64 start = usecTimestampNow();
glm::vec3 origin = _myAvatar->getHead()->getPosition(); glm::vec3 origin = _myAvatar->getHead()->getPosition();
@ -182,24 +191,24 @@ void AudioReflector::addSamples(AudioRingBuffer samples) {
const int BOUNCE_COUNT = 5; const int BOUNCE_COUNT = 5;
calculateReflections(origin, frontRightUp, BOUNCE_COUNT, samples); calculateReflections(origin, frontRightUp, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, frontLeftUp, BOUNCE_COUNT, samples); calculateReflections(origin, frontLeftUp, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, backRightUp, BOUNCE_COUNT, samples); calculateReflections(origin, backRightUp, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, backLeftUp, BOUNCE_COUNT, samples); calculateReflections(origin, backLeftUp, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, frontRightDown, BOUNCE_COUNT, samples); calculateReflections(origin, frontRightDown, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, frontLeftDown, BOUNCE_COUNT, samples); calculateReflections(origin, frontLeftDown, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, backRightDown, BOUNCE_COUNT, samples); calculateReflections(origin, backRightDown, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, backLeftDown, BOUNCE_COUNT, samples); calculateReflections(origin, backLeftDown, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, front, BOUNCE_COUNT, samples); calculateReflections(origin, front, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, back, BOUNCE_COUNT, samples); calculateReflections(origin, back, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, left, BOUNCE_COUNT, samples); calculateReflections(origin, left, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, right, BOUNCE_COUNT, samples); calculateReflections(origin, right, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, up, BOUNCE_COUNT, samples); calculateReflections(origin, up, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
calculateReflections(origin, down, BOUNCE_COUNT, samples); calculateReflections(origin, down, BOUNCE_COUNT, ringBuffer, sampleTime, format.sampleRate());
quint64 end = usecTimestampNow(); quint64 end = usecTimestampNow();
qDebug() << "AudioReflector::addSamples()... samples.size()=" << samples.size() << " elapsed=" << (end - start); //qDebug() << "AudioReflector::addSamples()... samples.size()=" << samples.size() << " elapsed=" << (end - start);
} }

View file

@ -26,7 +26,7 @@ public:
void render(); void render();
public slots: public slots:
void addSamples(AudioRingBuffer samples); void processSpatialAudio(unsigned int sampleTime, AudioRingBuffer& ringBuffer, const QAudioFormat& format);
signals: signals:
@ -40,7 +40,8 @@ private:
void drawReflections(const glm::vec3& origin, const glm::vec3& direction, int bounces, const glm::vec3& color); void drawReflections(const glm::vec3& origin, const glm::vec3& direction, int bounces, const glm::vec3& color);
void calculateReflections(const glm::vec3& origin, const glm::vec3& originalDirection, void calculateReflections(const glm::vec3& origin, const glm::vec3& originalDirection,
int bounces, const AudioRingBuffer& samplesRingBuffer); int bounces, const AudioRingBuffer& samplesRingBuffer,
unsigned int sampleTime, int sampleRate);
}; };

View file

@ -125,6 +125,10 @@ int16_t& AudioRingBuffer::operator[](const int index) {
return *shiftedPositionAccomodatingWrap(_nextOutput, index); return *shiftedPositionAccomodatingWrap(_nextOutput, index);
} }
const int16_t& AudioRingBuffer::operator[] (const int index) const {
return *shiftedPositionAccomodatingWrap(_nextOutput, index);
}
void AudioRingBuffer::shiftReadPosition(unsigned int numSamples) { void AudioRingBuffer::shiftReadPosition(unsigned int numSamples) {
_nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, numSamples); _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, numSamples);
} }

View file

@ -57,6 +57,7 @@ public:
qint64 writeData(const char* data, qint64 maxSize); qint64 writeData(const char* data, qint64 maxSize);
int16_t& operator[](const int index); int16_t& operator[](const int index);
const int16_t& operator[] (const int index) const;
void shiftReadPosition(unsigned int numSamples); void shiftReadPosition(unsigned int numSamples);