diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index aab11b1317..a35a8c9c04 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -42,7 +42,7 @@ #include #include "AudioRingBuffer.h" - +#include "AudioMixerClientData.h" #include "AvatarAudioRingBuffer.h" #include "InjectedAudioRingBuffer.h" @@ -62,11 +62,7 @@ const char AUDIO_MIXER_LOGGING_TARGET_NAME[] = "audio-mixer"; void attachNewBufferToNode(Node *newNode) { if (!newNode->getLinkedData()) { - if (newNode->getType() == NODE_TYPE_AGENT) { - newNode->setLinkedData(new AvatarAudioRingBuffer()); - } else { - newNode->setLinkedData(new InjectedAudioRingBuffer()); - } + newNode->setLinkedData(new AudioMixerClientData()); } } diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp new file mode 100644 index 0000000000..c26d7129ec --- /dev/null +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -0,0 +1,76 @@ +// +// AudioMixerClientData.cpp +// hifi +// +// Created by Stephen Birarda on 10/18/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include +#include + +#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; +} diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h new file mode 100644 index 0000000000..acc788296f --- /dev/null +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -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 + +#include +#include + +#include "AvatarAudioRingBuffer.h" + +class AudioMixerClientData : public NodeData { +public: + ~AudioMixerClientData(); + + int parseData(unsigned char* packetData, int numBytes); + + AvatarAudioRingBuffer* getAvatarAudioRingBuffer() const; +private: + std::vector _ringBuffers; +}; + +#endif /* defined(__hifi__AudioMixerClientData__) */ diff --git a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp index 42092cff3a..9c03c1ae44 100644 --- a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp +++ b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp @@ -11,6 +11,7 @@ #include "AvatarAudioRingBuffer.h" AvatarAudioRingBuffer::AvatarAudioRingBuffer() : + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone), _twoPoles(), _shouldLoopbackForNode(false) { diff --git a/libraries/audio/src/InjectedAudioRingBuffer.cpp b/libraries/audio/src/InjectedAudioRingBuffer.cpp index fc5479fa88..323bdaf2de 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.cpp +++ b/libraries/audio/src/InjectedAudioRingBuffer.cpp @@ -13,7 +13,9 @@ #include "InjectedAudioRingBuffer.h" -InjectedAudioRingBuffer::InjectedAudioRingBuffer() : +InjectedAudioRingBuffer::InjectedAudioRingBuffer(const QUuid& streamIdentifier) : + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone), + _streamIdentifier(streamIdentifier), _radius(0.0f), _attenuationRatio(0) { diff --git a/libraries/audio/src/InjectedAudioRingBuffer.h b/libraries/audio/src/InjectedAudioRingBuffer.h index 28284cf404..bab540919d 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.h +++ b/libraries/audio/src/InjectedAudioRingBuffer.h @@ -9,16 +9,19 @@ #ifndef __hifi__InjectedAudioRingBuffer__ #define __hifi__InjectedAudioRingBuffer__ +#include + #include "AudioInjector.h" #include "PositionalAudioRingBuffer.h" class InjectedAudioRingBuffer : public PositionalAudioRingBuffer { public: - InjectedAudioRingBuffer(); + InjectedAudioRingBuffer(const QUuid& streamIdentifier = QUuid()); int parseData(unsigned char* sourceBuffer, int numBytes); + const QUuid& getStreamIdentifier() const { return _streamIdentifier; } float getRadius() const { return _radius; } float getAttenuationRatio() const { return _attenuationRatio; } private: @@ -26,6 +29,7 @@ private: InjectedAudioRingBuffer(const InjectedAudioRingBuffer&); InjectedAudioRingBuffer& operator= (const InjectedAudioRingBuffer&); + QUuid _streamIdentifier; float _radius; float _attenuationRatio; }; diff --git a/libraries/audio/src/PositionalAudioRingBuffer.cpp b/libraries/audio/src/PositionalAudioRingBuffer.cpp index 3cb4acbf94..264fbb2db9 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.cpp +++ b/libraries/audio/src/PositionalAudioRingBuffer.cpp @@ -14,8 +14,9 @@ #include "PositionalAudioRingBuffer.h" -PositionalAudioRingBuffer::PositionalAudioRingBuffer() : +PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type) : AudioRingBuffer(false), + _type(type), _position(0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f), _willBeAddedToMix(false) diff --git a/libraries/audio/src/PositionalAudioRingBuffer.h b/libraries/audio/src/PositionalAudioRingBuffer.h index 1cd0751e9b..f4ccdc59bb 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.h +++ b/libraries/audio/src/PositionalAudioRingBuffer.h @@ -16,7 +16,12 @@ class PositionalAudioRingBuffer : public AudioRingBuffer { public: - PositionalAudioRingBuffer(); + enum Type { + Microphone, + Injector + }; + + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type); ~PositionalAudioRingBuffer(); int parseData(unsigned char* sourceBuffer, int numBytes); @@ -28,6 +33,7 @@ public: bool willBeAddedToMix() const { return _willBeAddedToMix; } void setWillBeAddedToMix(bool willBeAddedToMix) { _willBeAddedToMix = willBeAddedToMix; } + PositionalAudioRingBuffer::Type getType() const { return _type; } const glm::vec3& getPosition() const { return _position; } const glm::quat& getOrientation() const { return _orientation; } @@ -36,6 +42,7 @@ protected: PositionalAudioRingBuffer(const PositionalAudioRingBuffer&); PositionalAudioRingBuffer& operator= (const PositionalAudioRingBuffer&); + PositionalAudioRingBuffer::Type _type; glm::vec3 _position; glm::quat _orientation; bool _willBeAddedToMix;