add AudioMixerClientData to hold vector of PositionalAudioRingBuffer

This commit is contained in:
Stephen Birarda 2013-10-18 17:32:53 -07:00
parent 76197712d7
commit 7da1f5a235
8 changed files with 127 additions and 10 deletions

View file

@ -42,7 +42,7 @@
#include <UUID.h> #include <UUID.h>
#include "AudioRingBuffer.h" #include "AudioRingBuffer.h"
#include "AudioMixerClientData.h"
#include "AvatarAudioRingBuffer.h" #include "AvatarAudioRingBuffer.h"
#include "InjectedAudioRingBuffer.h" #include "InjectedAudioRingBuffer.h"
@ -62,11 +62,7 @@ const char AUDIO_MIXER_LOGGING_TARGET_NAME[] = "audio-mixer";
void attachNewBufferToNode(Node *newNode) { void attachNewBufferToNode(Node *newNode) {
if (!newNode->getLinkedData()) { if (!newNode->getLinkedData()) {
if (newNode->getType() == NODE_TYPE_AGENT) { newNode->setLinkedData(new AudioMixerClientData());
newNode->setLinkedData(new AvatarAudioRingBuffer());
} else {
newNode->setLinkedData(new InjectedAudioRingBuffer());
}
} }
} }

View file

@ -0,0 +1,76 @@
//
// AudioMixerClientData.cpp
// hifi
//
// Created by Stephen Birarda on 10/18/13.
// Copyright (c) 2013 HighFidelity, Inc. All rights reserved.
//
#include <PacketHeaders.h>
#include <UUID.h>
#include "InjectedAudioRingBuffer.h"
#include "AudioMixerClientData.h"
AudioMixerClientData::~AudioMixerClientData() {
for (int i = 0; i < _ringBuffers.size(); i++) {
// delete this attached PositionalAudioRingBuffer
delete _ringBuffers[i];
}
}
AvatarAudioRingBuffer* AudioMixerClientData::getAvatarAudioRingBuffer() const {
for (int i = 0; i < _ringBuffers.size(); i++) {
if (_ringBuffers[i]->getType() == PositionalAudioRingBuffer::Microphone) {
return (AvatarAudioRingBuffer*) _ringBuffers[i];
}
}
// no AvatarAudioRingBuffer found - return NULL
return NULL;
}
int AudioMixerClientData::parseData(unsigned char* packetData, int numBytes) {
if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO
|| packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO) {
// grab the AvatarAudioRingBuffer from the vector (or create it if it doesn't exist)
AvatarAudioRingBuffer* avatarRingBuffer = getAvatarAudioRingBuffer();
if (!avatarRingBuffer) {
// we don't have an AvatarAudioRingBuffer yet, so add it
avatarRingBuffer = new AvatarAudioRingBuffer();
_ringBuffers.push_back(avatarRingBuffer);
}
// ask the AvatarAudioRingBuffer instance to parse the data
avatarRingBuffer->parseData(packetData, numBytes);
} else {
// this is injected audio
// grab the stream identifier for this injected audio
QByteArray rfcUUID = QByteArray((char*) packetData + numBytesForPacketHeader(packetData) + NUM_BYTES_RFC4122_UUID,
NUM_BYTES_RFC4122_UUID);
QUuid streamIdentifier = QUuid::fromRfc4122(rfcUUID);
InjectedAudioRingBuffer* matchingInjectedRingBuffer = NULL;
for (int i = 0; i < _ringBuffers.size(); i++) {
if (_ringBuffers[i]->getType() == PositionalAudioRingBuffer::Injector
&& ((InjectedAudioRingBuffer*) _ringBuffers[i])->getStreamIdentifier() == streamIdentifier) {
}
}
if (!matchingInjectedRingBuffer) {
// we don't have a matching injected audio ring buffer, so add it
matchingInjectedRingBuffer = new InjectedAudioRingBuffer(streamIdentifier);
_ringBuffers.push_back(matchingInjectedRingBuffer);
}
matchingInjectedRingBuffer->parseData(packetData, numBytes);
}
return 0;
}

View file

@ -0,0 +1,30 @@
//
// AudioMixerClientData.h
// hifi
//
// Created by Stephen Birarda on 10/18/13.
// Copyright (c) 2013 HighFidelity, Inc. All rights reserved.
//
#ifndef __hifi__AudioMixerClientData__
#define __hifi__AudioMixerClientData__
#include <vector>
#include <NodeData.h>
#include <PositionalAudioRingBuffer.h>
#include "AvatarAudioRingBuffer.h"
class AudioMixerClientData : public NodeData {
public:
~AudioMixerClientData();
int parseData(unsigned char* packetData, int numBytes);
AvatarAudioRingBuffer* getAvatarAudioRingBuffer() const;
private:
std::vector<PositionalAudioRingBuffer*> _ringBuffers;
};
#endif /* defined(__hifi__AudioMixerClientData__) */

View file

@ -11,6 +11,7 @@
#include "AvatarAudioRingBuffer.h" #include "AvatarAudioRingBuffer.h"
AvatarAudioRingBuffer::AvatarAudioRingBuffer() : AvatarAudioRingBuffer::AvatarAudioRingBuffer() :
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone),
_twoPoles(), _twoPoles(),
_shouldLoopbackForNode(false) { _shouldLoopbackForNode(false) {

View file

@ -13,7 +13,9 @@
#include "InjectedAudioRingBuffer.h" #include "InjectedAudioRingBuffer.h"
InjectedAudioRingBuffer::InjectedAudioRingBuffer() : InjectedAudioRingBuffer::InjectedAudioRingBuffer(const QUuid& streamIdentifier) :
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone),
_streamIdentifier(streamIdentifier),
_radius(0.0f), _radius(0.0f),
_attenuationRatio(0) _attenuationRatio(0)
{ {

View file

@ -9,16 +9,19 @@
#ifndef __hifi__InjectedAudioRingBuffer__ #ifndef __hifi__InjectedAudioRingBuffer__
#define __hifi__InjectedAudioRingBuffer__ #define __hifi__InjectedAudioRingBuffer__
#include <QtCore/QUuid>
#include "AudioInjector.h" #include "AudioInjector.h"
#include "PositionalAudioRingBuffer.h" #include "PositionalAudioRingBuffer.h"
class InjectedAudioRingBuffer : public PositionalAudioRingBuffer { class InjectedAudioRingBuffer : public PositionalAudioRingBuffer {
public: public:
InjectedAudioRingBuffer(); InjectedAudioRingBuffer(const QUuid& streamIdentifier = QUuid());
int parseData(unsigned char* sourceBuffer, int numBytes); int parseData(unsigned char* sourceBuffer, int numBytes);
const QUuid& getStreamIdentifier() const { return _streamIdentifier; }
float getRadius() const { return _radius; } float getRadius() const { return _radius; }
float getAttenuationRatio() const { return _attenuationRatio; } float getAttenuationRatio() const { return _attenuationRatio; }
private: private:
@ -26,6 +29,7 @@ private:
InjectedAudioRingBuffer(const InjectedAudioRingBuffer&); InjectedAudioRingBuffer(const InjectedAudioRingBuffer&);
InjectedAudioRingBuffer& operator= (const InjectedAudioRingBuffer&); InjectedAudioRingBuffer& operator= (const InjectedAudioRingBuffer&);
QUuid _streamIdentifier;
float _radius; float _radius;
float _attenuationRatio; float _attenuationRatio;
}; };

View file

@ -14,8 +14,9 @@
#include "PositionalAudioRingBuffer.h" #include "PositionalAudioRingBuffer.h"
PositionalAudioRingBuffer::PositionalAudioRingBuffer() : PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type) :
AudioRingBuffer(false), AudioRingBuffer(false),
_type(type),
_position(0.0f, 0.0f, 0.0f), _position(0.0f, 0.0f, 0.0f),
_orientation(0.0f, 0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f),
_willBeAddedToMix(false) _willBeAddedToMix(false)

View file

@ -16,7 +16,12 @@
class PositionalAudioRingBuffer : public AudioRingBuffer { class PositionalAudioRingBuffer : public AudioRingBuffer {
public: public:
PositionalAudioRingBuffer(); enum Type {
Microphone,
Injector
};
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type);
~PositionalAudioRingBuffer(); ~PositionalAudioRingBuffer();
int parseData(unsigned char* sourceBuffer, int numBytes); int parseData(unsigned char* sourceBuffer, int numBytes);
@ -28,6 +33,7 @@ public:
bool willBeAddedToMix() const { return _willBeAddedToMix; } bool willBeAddedToMix() const { return _willBeAddedToMix; }
void setWillBeAddedToMix(bool willBeAddedToMix) { _willBeAddedToMix = willBeAddedToMix; } void setWillBeAddedToMix(bool willBeAddedToMix) { _willBeAddedToMix = willBeAddedToMix; }
PositionalAudioRingBuffer::Type getType() const { return _type; }
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; }
@ -36,6 +42,7 @@ protected:
PositionalAudioRingBuffer(const PositionalAudioRingBuffer&); PositionalAudioRingBuffer(const PositionalAudioRingBuffer&);
PositionalAudioRingBuffer& operator= (const PositionalAudioRingBuffer&); PositionalAudioRingBuffer& operator= (const PositionalAudioRingBuffer&);
PositionalAudioRingBuffer::Type _type;
glm::vec3 _position; glm::vec3 _position;
glm::quat _orientation; glm::quat _orientation;
bool _willBeAddedToMix; bool _willBeAddedToMix;