made AudioRingBuffer frames capacity variable

This commit is contained in:
wangyix 2014-07-01 16:24:31 -07:00
parent 3730be9804
commit a5943e3608
14 changed files with 37 additions and 27 deletions

View file

@ -31,12 +31,14 @@
#include "Agent.h" #include "Agent.h"
static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 10;
Agent::Agent(const QByteArray& packet) : Agent::Agent(const QByteArray& packet) :
ThreadedAssignment(packet), ThreadedAssignment(packet),
_voxelEditSender(), _voxelEditSender(),
_particleEditSender(), _particleEditSender(),
_modelEditSender(), _modelEditSender(),
_receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO), _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES),
_avatarHashMap() _avatarHashMap()
{ {
// be the parent of the script engine so it gets moved when we do // be the parent of the script engine so it gets moved when we do

View file

@ -19,6 +19,8 @@
#include "AudioMixer.h" #include "AudioMixer.h"
#include "AudioMixerClientData.h" #include "AudioMixerClientData.h"
static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 100;
AudioMixerClientData::AudioMixerClientData() : AudioMixerClientData::AudioMixerClientData() :
_ringBuffers(), _ringBuffers(),
_outgoingMixedAudioSequenceNumber(0), _outgoingMixedAudioSequenceNumber(0),
@ -76,7 +78,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) {
if (!avatarRingBuffer) { if (!avatarRingBuffer) {
// we don't have an AvatarAudioRingBuffer yet, so add it // we don't have an AvatarAudioRingBuffer yet, so add it
avatarRingBuffer = new AvatarAudioRingBuffer(isStereo, AudioMixer::getUseDynamicJitterBuffers()); avatarRingBuffer = new AvatarAudioRingBuffer(AUDIO_RING_BUFFER_CAPACITY_FRAMES, isStereo, AudioMixer::getUseDynamicJitterBuffers());
_ringBuffers.push_back(avatarRingBuffer); _ringBuffers.push_back(avatarRingBuffer);
} }
@ -101,7 +103,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) {
if (!matchingInjectedRingBuffer) { if (!matchingInjectedRingBuffer) {
// we don't have a matching injected audio ring buffer, so add it // we don't have a matching injected audio ring buffer, so add it
matchingInjectedRingBuffer = new InjectedAudioRingBuffer(streamIdentifier, matchingInjectedRingBuffer = new InjectedAudioRingBuffer(AUDIO_RING_BUFFER_CAPACITY_FRAMES, streamIdentifier,
AudioMixer::getUseDynamicJitterBuffers()); AudioMixer::getUseDynamicJitterBuffers());
_ringBuffers.push_back(matchingInjectedRingBuffer); _ringBuffers.push_back(matchingInjectedRingBuffer);
} }

View file

@ -13,8 +13,8 @@
#include "AvatarAudioRingBuffer.h" #include "AvatarAudioRingBuffer.h"
AvatarAudioRingBuffer::AvatarAudioRingBuffer(bool isStereo, bool dynamicJitterBuffer) : AvatarAudioRingBuffer::AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo, bool dynamicJitterBuffer) :
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, isStereo, dynamicJitterBuffer) { PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, numFramesCapacity, isStereo, dynamicJitterBuffer) {
} }

View file

@ -18,7 +18,7 @@
class AvatarAudioRingBuffer : public PositionalAudioRingBuffer { class AvatarAudioRingBuffer : public PositionalAudioRingBuffer {
public: public:
AvatarAudioRingBuffer(bool isStereo = false, bool dynamicJitterBuffer = false); AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo = false, bool dynamicJitterBuffer = false);
int parseData(const QByteArray& packet); int parseData(const QByteArray& packet);
private: private:

View file

@ -48,6 +48,8 @@ static const float AUDIO_CALLBACK_MSECS = (float) NETWORK_BUFFER_LENGTH_SAMPLES_
static const int NUMBER_OF_NOISE_SAMPLE_FRAMES = 300; static const int NUMBER_OF_NOISE_SAMPLE_FRAMES = 300;
static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 10;
// Mute icon configration // Mute icon configration
static const int MUTE_ICON_SIZE = 24; static const int MUTE_ICON_SIZE = 24;
@ -66,8 +68,8 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) :
_loopbackOutputDevice(NULL), _loopbackOutputDevice(NULL),
_proceduralAudioOutput(NULL), _proceduralAudioOutput(NULL),
_proceduralOutputDevice(NULL), _proceduralOutputDevice(NULL),
_inputRingBuffer(0), _inputRingBuffer(0, AUDIO_RING_BUFFER_CAPACITY_FRAMES),
_ringBuffer(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL), _ringBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES),
_isStereoInput(false), _isStereoInput(false),
_averagedLatency(0.0), _averagedLatency(0.0),
_measuredJitter(0), _measuredJitter(0),

View file

@ -19,10 +19,11 @@
#include "AudioRingBuffer.h" #include "AudioRingBuffer.h"
AudioRingBuffer::AudioRingBuffer(int numFrameSamples, bool randomAccessMode) : AudioRingBuffer::AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode) :
NodeData(), NodeData(),
_overflowCount(0), _overflowCount(0),
_sampleCapacity(numFrameSamples * RING_BUFFER_LENGTH_FRAMES), _frameCapacity(numFramesCapacity),
_sampleCapacity(numFrameSamples * numFramesCapacity),
_isFull(false), _isFull(false),
_numFrameSamples(numFrameSamples), _numFrameSamples(numFrameSamples),
_isStarved(true), _isStarved(true),
@ -48,6 +49,8 @@ AudioRingBuffer::~AudioRingBuffer() {
} }
void AudioRingBuffer::reset() { void AudioRingBuffer::reset() {
_overflowCount = 0;
_isFull = false;
_endOfLastWrite = _buffer; _endOfLastWrite = _buffer;
_nextOutput = _buffer; _nextOutput = _buffer;
_isStarved = true; _isStarved = true;
@ -55,13 +58,13 @@ void AudioRingBuffer::reset() {
void AudioRingBuffer::resizeForFrameSize(qint64 numFrameSamples) { void AudioRingBuffer::resizeForFrameSize(qint64 numFrameSamples) {
delete[] _buffer; delete[] _buffer;
_sampleCapacity = numFrameSamples * RING_BUFFER_LENGTH_FRAMES; _sampleCapacity = numFrameSamples * _frameCapacity;
_numFrameSamples = numFrameSamples;
_buffer = new int16_t[_sampleCapacity]; _buffer = new int16_t[_sampleCapacity];
if (_randomAccessMode) { if (_randomAccessMode) {
memset(_buffer, 0, _sampleCapacity * sizeof(int16_t)); memset(_buffer, 0, _sampleCapacity * sizeof(int16_t));
} }
_nextOutput = _buffer; reset();
_endOfLastWrite = _buffer;
} }
int AudioRingBuffer::parseData(const QByteArray& packet) { int AudioRingBuffer::parseData(const QByteArray& packet) {

View file

@ -31,15 +31,13 @@ const int NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL = NETWORK_BUFFER_LENGTH_BYTE
const unsigned int BUFFER_SEND_INTERVAL_USECS = floorf((NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL const unsigned int BUFFER_SEND_INTERVAL_USECS = floorf((NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL
/ (float) SAMPLE_RATE) * 1000 * 1000); / (float) SAMPLE_RATE) * 1000 * 1000);
const short RING_BUFFER_LENGTH_FRAMES = 10;
const int MAX_SAMPLE_VALUE = std::numeric_limits<int16_t>::max(); const int MAX_SAMPLE_VALUE = std::numeric_limits<int16_t>::max();
const int MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min(); const int MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min();
class AudioRingBuffer : public NodeData { class AudioRingBuffer : public NodeData {
Q_OBJECT Q_OBJECT
public: public:
AudioRingBuffer(int numFrameSamples, bool randomAccessMode = false); AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode = false);
~AudioRingBuffer(); ~AudioRingBuffer();
void reset(); void reset();
@ -84,6 +82,7 @@ protected:
int _overflowCount; /// how many times has the ring buffer has overwritten old data int _overflowCount; /// how many times has the ring buffer has overwritten old data
int _frameCapacity;
int _sampleCapacity; int _sampleCapacity;
bool _isFull; bool _isFull;
int _numFrameSamples; int _numFrameSamples;

View file

@ -19,8 +19,8 @@
#include "InjectedAudioRingBuffer.h" #include "InjectedAudioRingBuffer.h"
InjectedAudioRingBuffer::InjectedAudioRingBuffer(const QUuid& streamIdentifier, bool dynamicJitterBuffer) : InjectedAudioRingBuffer::InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier, bool dynamicJitterBuffer) :
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, /* isStereo=*/ false , dynamicJitterBuffer), PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, numFramesCapacity, false, dynamicJitterBuffer),
_streamIdentifier(streamIdentifier), _streamIdentifier(streamIdentifier),
_radius(0.0f), _radius(0.0f),
_attenuationRatio(0) _attenuationRatio(0)

View file

@ -18,7 +18,7 @@
class InjectedAudioRingBuffer : public PositionalAudioRingBuffer { class InjectedAudioRingBuffer : public PositionalAudioRingBuffer {
public: public:
InjectedAudioRingBuffer(const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false); InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false);
int parseData(const QByteArray& packet); int parseData(const QByteArray& packet);

View file

@ -11,8 +11,8 @@
#include "MixedAudioRingBuffer.h" #include "MixedAudioRingBuffer.h"
MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples) : MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity) :
AudioRingBuffer(numFrameSamples), AudioRingBuffer(numFrameSamples, numFramesCapacity),
_lastReadFrameAverageLoudness(0.0f) _lastReadFrameAverageLoudness(0.0f)
{ {

View file

@ -17,7 +17,7 @@
class MixedAudioRingBuffer : public AudioRingBuffer { class MixedAudioRingBuffer : public AudioRingBuffer {
Q_OBJECT Q_OBJECT
public: public:
MixedAudioRingBuffer(int numFrameSamples); MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity);
float getLastReadFrameAverageLoudness() const { return _lastReadFrameAverageLoudness; } float getLastReadFrameAverageLoudness() const { return _lastReadFrameAverageLoudness; }

View file

@ -85,10 +85,11 @@ quint64 InterframeTimeGapStats::getWindowMaxGap() {
} }
PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity,
bool isStereo, bool dynamicJitterBuffers) : bool isStereo, bool dynamicJitterBuffers) :
AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL), AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL,
numFramesCapacity),
_type(type), _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),
@ -261,7 +262,7 @@ void PositionalAudioRingBuffer::updateDesiredJitterBufferFrames() {
if (_desiredJitterBufferFrames < 1) { if (_desiredJitterBufferFrames < 1) {
_desiredJitterBufferFrames = 1; _desiredJitterBufferFrames = 1;
} }
const int maxDesired = RING_BUFFER_LENGTH_FRAMES - 1; const int maxDesired = _frameCapacity - 1;
if (_desiredJitterBufferFrames > maxDesired) { if (_desiredJitterBufferFrames > maxDesired) {
_desiredJitterBufferFrames = maxDesired; _desiredJitterBufferFrames = maxDesired;
} }

View file

@ -50,7 +50,8 @@ public:
Injector Injector
}; };
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo = false, bool dynamicJitterBuffers = false); PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity,
bool isStereo = false, bool dynamicJitterBuffers = false);
int parseData(const QByteArray& packet); int parseData(const QByteArray& packet);
int parsePositionalData(const QByteArray& positionalByteArray); int parsePositionalData(const QByteArray& positionalByteArray);

View file

@ -29,7 +29,7 @@ void AudioRingBufferTests::runAllTests() {
int readIndexAt; int readIndexAt;
AudioRingBuffer ringBuffer(10); // makes buffer of 100 int16_t samples AudioRingBuffer ringBuffer(10, 10); // makes buffer of 100 int16_t samples
for (int T = 0; T < 300; T++) { for (int T = 0; T < 300; T++) {
writeIndexAt = 0; writeIndexAt = 0;