fix passing of unattenuated zones to buffers

This commit is contained in:
Stephen Birarda 2014-06-18 13:46:03 -07:00
parent 5878b4af59
commit db1031144b
6 changed files with 34 additions and 21 deletions

View file

@ -75,12 +75,17 @@ AudioMixer::AudioMixer(const QByteArray& packet) :
_numStatFrames(0), _numStatFrames(0),
_sumListeners(0), _sumListeners(0),
_sumMixes(0), _sumMixes(0),
_sourceUnattenuatedZone(), _sourceUnattenuatedZone(NULL),
_listenerUnattenuatedZone() _listenerUnattenuatedZone(NULL)
{ {
} }
AudioMixer::~AudioMixer() {
delete _sourceUnattenuatedZone;
delete _listenerUnattenuatedZone;
}
void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuffer* bufferToAdd, void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuffer* bufferToAdd,
AvatarAudioRingBuffer* listeningNodeBuffer) { AvatarAudioRingBuffer* listeningNodeBuffer) {
float bearingRelativeAngleToSource = 0.0f; float bearingRelativeAngleToSource = 0.0f;
@ -432,8 +437,16 @@ void AudioMixer::run() {
glm::vec3 listenerCorner(zoneStringList[6].toFloat(), zoneStringList[7].toFloat(), zoneStringList[8].toFloat()); glm::vec3 listenerCorner(zoneStringList[6].toFloat(), zoneStringList[7].toFloat(), zoneStringList[8].toFloat());
glm::vec3 listenerDimensions(zoneStringList[9].toFloat(), zoneStringList[10].toFloat(), zoneStringList[11].toFloat()); glm::vec3 listenerDimensions(zoneStringList[9].toFloat(), zoneStringList[10].toFloat(), zoneStringList[11].toFloat());
_sourceUnattenuatedZone = AABox(sourceCorner, sourceDimensions); _sourceUnattenuatedZone = new AABox(sourceCorner, sourceDimensions);
_listenerUnattenuatedZone = AABox(listenerCorner, listenerDimensions); _listenerUnattenuatedZone = new AABox(listenerCorner, listenerDimensions);
glm::vec3 sourceCenter = _sourceUnattenuatedZone->calcCenter();
glm::vec3 destinationCenter = _listenerUnattenuatedZone->calcCenter();
qDebug() << "There is an unattenuated zone with source center at"
<< QString("%1, %2, %3").arg(sourceCenter.x).arg(sourceCenter.y).arg(sourceCenter.z);
qDebug() << "Buffers inside this zone will not be attenuated inside a box with center at"
<< QString("%1, %2, %3").arg(destinationCenter.x).arg(destinationCenter.y).arg(destinationCenter.z);
} }
int nextFrame = 0; int nextFrame = 0;
@ -452,7 +465,9 @@ void AudioMixer::run() {
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getLinkedData()) { if (node->getLinkedData()) {
((AudioMixerClientData*) node->getLinkedData())->checkBuffersBeforeFrameSend(JITTER_BUFFER_SAMPLES); ((AudioMixerClientData*) node->getLinkedData())->checkBuffersBeforeFrameSend(JITTER_BUFFER_SAMPLES,
_sourceUnattenuatedZone,
_listenerUnattenuatedZone);
} }
} }

View file

@ -26,6 +26,7 @@ class AudioMixer : public ThreadedAssignment {
Q_OBJECT Q_OBJECT
public: public:
AudioMixer(const QByteArray& packet); AudioMixer(const QByteArray& packet);
~AudioMixer();
public slots: public slots:
/// threaded run of assignment /// threaded run of assignment
void run(); void run();
@ -51,8 +52,8 @@ private:
int _numStatFrames; int _numStatFrames;
int _sumListeners; int _sumListeners;
int _sumMixes; int _sumMixes;
AABox _sourceUnattenuatedZone; AABox* _sourceUnattenuatedZone;
AABox _listenerUnattenuatedZone; AABox* _listenerUnattenuatedZone;
}; };
#endif // hifi_AudioMixer_h #endif // hifi_AudioMixer_h

View file

@ -19,8 +19,7 @@
#include "AudioMixerClientData.h" #include "AudioMixerClientData.h"
AudioMixerClientData::AudioMixerClientData() : AudioMixerClientData::AudioMixerClientData() :
_ringBuffers(), _ringBuffers()
_listenerUnattenuatedZone(NULL)
{ {
} }
@ -112,9 +111,9 @@ void AudioMixerClientData::checkBuffersBeforeFrameSend(int jitterBufferLengthSam
_ringBuffers[i]->updateNextOutputTrailingLoudness(); _ringBuffers[i]->updateNextOutputTrailingLoudness();
if (checkSourceZone && checkSourceZone->contains(_ringBuffers[i]->getPosition())) { if (checkSourceZone && checkSourceZone->contains(_ringBuffers[i]->getPosition())) {
_listenerUnattenuatedZone = listenerZone; _ringBuffers[i]->setListenerUnattenuatedZone(listenerZone);
} else { } else {
_listenerUnattenuatedZone = NULL; _ringBuffers[i]->setListenerUnattenuatedZone(NULL);
} }
} }
} }

View file

@ -30,12 +30,8 @@ public:
void checkBuffersBeforeFrameSend(int jitterBufferLengthSamples, void checkBuffersBeforeFrameSend(int jitterBufferLengthSamples,
AABox* checkSourceZone = NULL, AABox* listenerZone = NULL); AABox* checkSourceZone = NULL, AABox* listenerZone = NULL);
void pushBuffersAfterFrameSend(); void pushBuffersAfterFrameSend();
AABox* getListenerUnattenuatedZone() const { return _listenerUnattenuatedZone; }
void setListenerUnattenuatedZone(AABox* listenerUnattenuatedZone) { _listenerUnattenuatedZone = listenerUnattenuatedZone; }
private: private:
QList<PositionalAudioRingBuffer*> _ringBuffers; QList<PositionalAudioRingBuffer*> _ringBuffers;
AABox* _listenerUnattenuatedZone;
}; };
#endif // hifi_AudioMixerClientData_h #endif // hifi_AudioMixerClientData_h

View file

@ -28,14 +28,12 @@ PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::
_willBeAddedToMix(false), _willBeAddedToMix(false),
_shouldLoopbackForNode(false), _shouldLoopbackForNode(false),
_shouldOutputStarveDebug(true), _shouldOutputStarveDebug(true),
_isStereo(isStereo) _isStereo(isStereo),
_listenerUnattenuatedZone(NULL)
{ {
} }
PositionalAudioRingBuffer::~PositionalAudioRingBuffer() {
}
int PositionalAudioRingBuffer::parseData(const QByteArray& packet) { int PositionalAudioRingBuffer::parseData(const QByteArray& packet) {
// skip the packet header (includes the source UUID) // skip the packet header (includes the source UUID)

View file

@ -12,9 +12,10 @@
#ifndef hifi_PositionalAudioRingBuffer_h #ifndef hifi_PositionalAudioRingBuffer_h
#define hifi_PositionalAudioRingBuffer_h #define hifi_PositionalAudioRingBuffer_h
#include <vector>
#include <glm/gtx/quaternion.hpp> #include <glm/gtx/quaternion.hpp>
#include <AABox.h>
#include "AudioRingBuffer.h" #include "AudioRingBuffer.h"
class PositionalAudioRingBuffer : public AudioRingBuffer { class PositionalAudioRingBuffer : public AudioRingBuffer {
@ -25,7 +26,6 @@ public:
}; };
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo = false); PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo = false);
~PositionalAudioRingBuffer();
int parseData(const QByteArray& packet); int parseData(const QByteArray& packet);
int parsePositionalData(const QByteArray& positionalByteArray); int parsePositionalData(const QByteArray& positionalByteArray);
@ -47,6 +47,9 @@ public:
const glm::vec3& getPosition() const { return _position; } const glm::vec3& getPosition() const { return _position; }
const glm::quat& getOrientation() const { return _orientation; } const glm::quat& getOrientation() const { return _orientation; }
AABox* getListenerUnattenuatedZone() const { return _listenerUnattenuatedZone; }
void setListenerUnattenuatedZone(AABox* listenerUnattenuatedZone) { _listenerUnattenuatedZone = listenerUnattenuatedZone; }
protected: protected:
// disallow copying of PositionalAudioRingBuffer objects // disallow copying of PositionalAudioRingBuffer objects
PositionalAudioRingBuffer(const PositionalAudioRingBuffer&); PositionalAudioRingBuffer(const PositionalAudioRingBuffer&);
@ -61,6 +64,7 @@ protected:
bool _isStereo; bool _isStereo;
float _nextOutputTrailingLoudness; float _nextOutputTrailingLoudness;
AABox* _listenerUnattenuatedZone;
}; };
#endif // hifi_PositionalAudioRingBuffer_h #endif // hifi_PositionalAudioRingBuffer_h