mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-28 19:10:20 +02:00
add AudioMixerClientData to hold vector of PositionalAudioRingBuffer
This commit is contained in:
parent
76197712d7
commit
7da1f5a235
8 changed files with 127 additions and 10 deletions
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
76
assignment-client/src/audio/AudioMixerClientData.cpp
Normal file
76
assignment-client/src/audio/AudioMixerClientData.cpp
Normal 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;
|
||||||
|
}
|
30
assignment-client/src/audio/AudioMixerClientData.h
Normal file
30
assignment-client/src/audio/AudioMixerClientData.h
Normal 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__) */
|
|
@ -11,6 +11,7 @@
|
||||||
#include "AvatarAudioRingBuffer.h"
|
#include "AvatarAudioRingBuffer.h"
|
||||||
|
|
||||||
AvatarAudioRingBuffer::AvatarAudioRingBuffer() :
|
AvatarAudioRingBuffer::AvatarAudioRingBuffer() :
|
||||||
|
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone),
|
||||||
_twoPoles(),
|
_twoPoles(),
|
||||||
_shouldLoopbackForNode(false) {
|
_shouldLoopbackForNode(false) {
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue