diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 5720ecaaf5..25c775f14b 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -31,12 +31,14 @@ #include "Agent.h" +static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 10; + Agent::Agent(const QByteArray& packet) : ThreadedAssignment(packet), _voxelEditSender(), _particleEditSender(), _modelEditSender(), - _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO), + _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES), _avatarHashMap() { // be the parent of the script engine so it gets moved when we do diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 9b14ecfd19..b8f4d18b1d 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -19,6 +19,8 @@ #include "AudioMixer.h" #include "AudioMixerClientData.h" +static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 100; + AudioMixerClientData::AudioMixerClientData() : _ringBuffers(), _outgoingMixedAudioSequenceNumber(0), @@ -76,7 +78,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { if (!avatarRingBuffer) { // 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); } @@ -101,7 +103,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { if (!matchingInjectedRingBuffer) { // 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()); _ringBuffers.push_back(matchingInjectedRingBuffer); } diff --git a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp index 9c6cc32f57..ec08471e26 100644 --- a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp +++ b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp @@ -13,8 +13,8 @@ #include "AvatarAudioRingBuffer.h" -AvatarAudioRingBuffer::AvatarAudioRingBuffer(bool isStereo, bool dynamicJitterBuffer) : - PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, isStereo, dynamicJitterBuffer) { +AvatarAudioRingBuffer::AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo, bool dynamicJitterBuffer) : + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, numFramesCapacity, isStereo, dynamicJitterBuffer) { } diff --git a/assignment-client/src/audio/AvatarAudioRingBuffer.h b/assignment-client/src/audio/AvatarAudioRingBuffer.h index e227e70958..816fd937a6 100644 --- a/assignment-client/src/audio/AvatarAudioRingBuffer.h +++ b/assignment-client/src/audio/AvatarAudioRingBuffer.h @@ -18,7 +18,7 @@ class AvatarAudioRingBuffer : public PositionalAudioRingBuffer { public: - AvatarAudioRingBuffer(bool isStereo = false, bool dynamicJitterBuffer = false); + AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo = false, bool dynamicJitterBuffer = false); int parseData(const QByteArray& packet); private: diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index f5f148969c..1ae3b5b8e6 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -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 AUDIO_RING_BUFFER_CAPACITY_FRAMES = 10; + // Mute icon configration static const int MUTE_ICON_SIZE = 24; @@ -66,8 +68,8 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) : _loopbackOutputDevice(NULL), _proceduralAudioOutput(NULL), _proceduralOutputDevice(NULL), - _inputRingBuffer(0), - _ringBuffer(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL), + _inputRingBuffer(0, AUDIO_RING_BUFFER_CAPACITY_FRAMES), + _ringBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES), _isStereoInput(false), _averagedLatency(0.0), _measuredJitter(0), diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 6ae3b19541..56b6725745 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -19,10 +19,11 @@ #include "AudioRingBuffer.h" -AudioRingBuffer::AudioRingBuffer(int numFrameSamples, bool randomAccessMode) : +AudioRingBuffer::AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode) : NodeData(), _overflowCount(0), - _sampleCapacity(numFrameSamples * RING_BUFFER_LENGTH_FRAMES), + _frameCapacity(numFramesCapacity), + _sampleCapacity(numFrameSamples * numFramesCapacity), _isFull(false), _numFrameSamples(numFrameSamples), _isStarved(true), @@ -48,6 +49,8 @@ AudioRingBuffer::~AudioRingBuffer() { } void AudioRingBuffer::reset() { + _overflowCount = 0; + _isFull = false; _endOfLastWrite = _buffer; _nextOutput = _buffer; _isStarved = true; @@ -55,13 +58,13 @@ void AudioRingBuffer::reset() { void AudioRingBuffer::resizeForFrameSize(qint64 numFrameSamples) { delete[] _buffer; - _sampleCapacity = numFrameSamples * RING_BUFFER_LENGTH_FRAMES; + _sampleCapacity = numFrameSamples * _frameCapacity; + _numFrameSamples = numFrameSamples; _buffer = new int16_t[_sampleCapacity]; if (_randomAccessMode) { memset(_buffer, 0, _sampleCapacity * sizeof(int16_t)); } - _nextOutput = _buffer; - _endOfLastWrite = _buffer; + reset(); } int AudioRingBuffer::parseData(const QByteArray& packet) { diff --git a/libraries/audio/src/AudioRingBuffer.h b/libraries/audio/src/AudioRingBuffer.h index 8d19f9c0bb..0bf5e2d1d6 100644 --- a/libraries/audio/src/AudioRingBuffer.h +++ b/libraries/audio/src/AudioRingBuffer.h @@ -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 / (float) SAMPLE_RATE) * 1000 * 1000); -const short RING_BUFFER_LENGTH_FRAMES = 10; - const int MAX_SAMPLE_VALUE = std::numeric_limits::max(); const int MIN_SAMPLE_VALUE = std::numeric_limits::min(); class AudioRingBuffer : public NodeData { Q_OBJECT public: - AudioRingBuffer(int numFrameSamples, bool randomAccessMode = false); + AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode = false); ~AudioRingBuffer(); void reset(); @@ -84,6 +82,7 @@ protected: int _overflowCount; /// how many times has the ring buffer has overwritten old data + int _frameCapacity; int _sampleCapacity; bool _isFull; int _numFrameSamples; diff --git a/libraries/audio/src/InjectedAudioRingBuffer.cpp b/libraries/audio/src/InjectedAudioRingBuffer.cpp index 0d7cea356b..aab86c1e26 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.cpp +++ b/libraries/audio/src/InjectedAudioRingBuffer.cpp @@ -19,8 +19,8 @@ #include "InjectedAudioRingBuffer.h" -InjectedAudioRingBuffer::InjectedAudioRingBuffer(const QUuid& streamIdentifier, bool dynamicJitterBuffer) : - PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, /* isStereo=*/ false , dynamicJitterBuffer), +InjectedAudioRingBuffer::InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier, bool dynamicJitterBuffer) : + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, numFramesCapacity, false, dynamicJitterBuffer), _streamIdentifier(streamIdentifier), _radius(0.0f), _attenuationRatio(0) diff --git a/libraries/audio/src/InjectedAudioRingBuffer.h b/libraries/audio/src/InjectedAudioRingBuffer.h index 4e3fea672b..64862b6963 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.h +++ b/libraries/audio/src/InjectedAudioRingBuffer.h @@ -18,7 +18,7 @@ class InjectedAudioRingBuffer : public PositionalAudioRingBuffer { public: - InjectedAudioRingBuffer(const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false); + InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false); int parseData(const QByteArray& packet); diff --git a/libraries/audio/src/MixedAudioRingBuffer.cpp b/libraries/audio/src/MixedAudioRingBuffer.cpp index c975d7b68e..fb414ee387 100644 --- a/libraries/audio/src/MixedAudioRingBuffer.cpp +++ b/libraries/audio/src/MixedAudioRingBuffer.cpp @@ -11,8 +11,8 @@ #include "MixedAudioRingBuffer.h" -MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples) : - AudioRingBuffer(numFrameSamples), +MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity) : + AudioRingBuffer(numFrameSamples, numFramesCapacity), _lastReadFrameAverageLoudness(0.0f) { diff --git a/libraries/audio/src/MixedAudioRingBuffer.h b/libraries/audio/src/MixedAudioRingBuffer.h index 25574a3ea6..4ebe4d577e 100644 --- a/libraries/audio/src/MixedAudioRingBuffer.h +++ b/libraries/audio/src/MixedAudioRingBuffer.h @@ -17,7 +17,7 @@ class MixedAudioRingBuffer : public AudioRingBuffer { Q_OBJECT public: - MixedAudioRingBuffer(int numFrameSamples); + MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity); float getLastReadFrameAverageLoudness() const { return _lastReadFrameAverageLoudness; } diff --git a/libraries/audio/src/PositionalAudioRingBuffer.cpp b/libraries/audio/src/PositionalAudioRingBuffer.cpp index 546ed97fe2..edb76cce69 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.cpp +++ b/libraries/audio/src/PositionalAudioRingBuffer.cpp @@ -85,10 +85,11 @@ quint64 InterframeTimeGapStats::getWindowMaxGap() { } -PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, +PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity, 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), _position(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) { _desiredJitterBufferFrames = 1; } - const int maxDesired = RING_BUFFER_LENGTH_FRAMES - 1; + const int maxDesired = _frameCapacity - 1; if (_desiredJitterBufferFrames > maxDesired) { _desiredJitterBufferFrames = maxDesired; } diff --git a/libraries/audio/src/PositionalAudioRingBuffer.h b/libraries/audio/src/PositionalAudioRingBuffer.h index b204dc766b..53f4d942fc 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.h +++ b/libraries/audio/src/PositionalAudioRingBuffer.h @@ -50,7 +50,8 @@ public: 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 parsePositionalData(const QByteArray& positionalByteArray); diff --git a/tests/audio/src/AudioRingBufferTests.cpp b/tests/audio/src/AudioRingBufferTests.cpp index 506e81e13e..1c312d8323 100644 --- a/tests/audio/src/AudioRingBufferTests.cpp +++ b/tests/audio/src/AudioRingBufferTests.cpp @@ -29,7 +29,7 @@ void AudioRingBufferTests::runAllTests() { 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++) { writeIndexAt = 0;