From fd051310daa4006acb98412971a49def62f38a72 Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 1 Jul 2014 12:01:51 -0700 Subject: [PATCH 1/9] prune missing set before constructing nack packets; make MAX_REASONALBE_SEQUENCE_GAP global and sentPacketHistory to use that value as the default history size --- .../src/octree/OctreeInboundPacketProcessor.cpp | 6 +++++- .../src/octree/OctreeInboundPacketProcessor.h | 1 + assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- interface/src/Application.cpp | 8 ++++---- libraries/networking/src/SentPacketHistory.h | 4 +++- libraries/networking/src/SequenceNumberStats.cpp | 1 - libraries/networking/src/SequenceNumberStats.h | 6 +++--- libraries/octree/src/OctreeSceneStats.h | 1 + 8 files changed, 18 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 3d2ca6ddc3..7716f9e2aa 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -216,9 +216,13 @@ int OctreeInboundPacketProcessor::sendNackPackets() { } const SharedNodePointer& destinationNode = NodeList::getInstance()->getNodeHash().value(nodeUUID); - const QSet& missingSequenceNumbers = nodeStats.getIncomingEditSequenceNumberStats().getMissingSet(); + + // retrieve sequence number stats of node, prune its missing set + SequenceNumberStats& sequenceNumberStats = nodeStats.getIncomingEditSequenceNumberStats(); + sequenceNumberStats.pruneMissingSet(); // construct nack packet(s) for this node + const QSet& missingSequenceNumbers = sequenceNumberStats.getMissingSet(); int numSequenceNumbersAvailable = missingSequenceNumbers.size(); QSet::const_iterator missingSequenceNumberIterator = missingSequenceNumbers.constBegin(); while (numSequenceNumbersAvailable > 0) { diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.h b/assignment-client/src/octree/OctreeInboundPacketProcessor.h index 960282384b..2fb83123c4 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.h +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.h @@ -35,6 +35,7 @@ public: { return _totalElementsInPacket == 0 ? 0 : _totalLockWaitTime / _totalElementsInPacket; } const SequenceNumberStats& getIncomingEditSequenceNumberStats() const { return _incomingEditSequenceNumberStats; } + SequenceNumberStats& getIncomingEditSequenceNumberStats() { return _incomingEditSequenceNumberStats; } void trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime, int editsInPacket, quint64 processTime, quint64 lockWaitTime); diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 3531c3f9cb..11783fe7d2 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -42,7 +42,7 @@ OctreeQueryNode::OctreeQueryNode() : _lastRootTimestamp(0), _myPacketType(PacketTypeUnknown), _isShuttingDown(false), - _sentPacketHistory(1000) + _sentPacketHistory() { } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 72ac7ba62a..c17c669149 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2179,11 +2179,11 @@ int Application::sendNackPackets() { _octreeSceneStatsLock.unlock(); continue; } - OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; - // make copy of missing sequence numbers from stats - const QSet missingSequenceNumbers = - stats.getIncomingOctreeSequenceNumberStats().getMissingSet(); + // get sequence number stats of node, prune its missing set, and make a copy of the missing set + SequenceNumberStats& sequenceNumberStats = _octreeServerSceneStats[nodeUUID].getIncomingOctreeSequenceNumberStats(); + sequenceNumberStats.pruneMissingSet(); + const QSet missingSequenceNumbers = sequenceNumberStats.getMissingSet(); _octreeSceneStatsLock.unlock(); diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index 53a6919c42..325f973f7e 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -15,10 +15,12 @@ #include #include +#include "SequenceNumberStats.h" + class SentPacketHistory { public: - SentPacketHistory(int size = 1000); + SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); void packetSent(uint16_t sequenceNumber, const QByteArray& packet); const QByteArray* getPacket(uint16_t sequenceNumber) const; diff --git a/libraries/networking/src/SequenceNumberStats.cpp b/libraries/networking/src/SequenceNumberStats.cpp index 15d3c0542e..5bdeedf39d 100644 --- a/libraries/networking/src/SequenceNumberStats.cpp +++ b/libraries/networking/src/SequenceNumberStats.cpp @@ -39,7 +39,6 @@ void SequenceNumberStats::reset() { } static const int UINT16_RANGE = std::numeric_limits::max() + 1; -static const int MAX_REASONABLE_SEQUENCE_GAP = 1000; // this must be less than UINT16_RANGE / 2 for rollover handling to work void SequenceNumberStats::sequenceNumberReceived(quint16 incoming, QUuid senderUUID, const bool wantExtraDebugging) { diff --git a/libraries/networking/src/SequenceNumberStats.h b/libraries/networking/src/SequenceNumberStats.h index b2561552ef..88c8748b03 100644 --- a/libraries/networking/src/SequenceNumberStats.h +++ b/libraries/networking/src/SequenceNumberStats.h @@ -15,13 +15,15 @@ #include "SharedUtil.h" #include +const int MAX_REASONABLE_SEQUENCE_GAP = 1000; + class SequenceNumberStats { public: SequenceNumberStats(); void reset(); - void sequenceNumberReceived(quint16 incoming, QUuid senderUUID = QUuid(), const bool wantExtraDebugging = false); + void pruneMissingSet(const bool wantExtraDebugging = false); quint32 getNumReceived() const { return _numReceived; } quint32 getNumUnreasonable() const { return _numUnreasonable; } @@ -34,8 +36,6 @@ public: const QSet& getMissingSet() const { return _missingSet; } private: - void pruneMissingSet(const bool wantExtraDebugging); - quint16 _lastReceived; QSet _missingSet; diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index d7b65c63be..cefaaa5764 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -168,6 +168,7 @@ public: float getIncomingFlightTimeAverage() { return _incomingFlightTimeAverage.getAverage(); } const SequenceNumberStats& getIncomingOctreeSequenceNumberStats() const { return _incomingOctreeSequenceNumberStats; } + SequenceNumberStats& getIncomingOctreeSequenceNumberStats() { return _incomingOctreeSequenceNumberStats; } private: From 3730be980413c9813f5fd6b7f84da577f8bce668 Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 1 Jul 2014 14:03:26 -0700 Subject: [PATCH 2/9] nacked edit packets are not resent if NACKs are disabled in menu --- interface/src/DatagramProcessor.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index a159af7be5..6c39994bf3 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -149,13 +149,19 @@ void DatagramProcessor::processDatagrams() { break; } case PacketTypeVoxelEditNack: - application->_voxelEditSender.processNackPacket(incomingPacket); + if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { + application->_voxelEditSender.processNackPacket(incomingPacket); + } break; case PacketTypeParticleEditNack: - application->_particleEditSender.processNackPacket(incomingPacket); + if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { + application->_particleEditSender.processNackPacket(incomingPacket); + } break; case PacketTypeModelEditNack: - application->_modelEditSender.processNackPacket(incomingPacket); + if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { + application->_modelEditSender.processNackPacket(incomingPacket); + } break; default: nodeList->processNodeData(senderSockAddr, incomingPacket); From a5943e3608d039059c1ad8a298e0b5b518f6f252 Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 1 Jul 2014 16:24:31 -0700 Subject: [PATCH 3/9] made AudioRingBuffer frames capacity variable --- assignment-client/src/Agent.cpp | 4 +++- .../src/audio/AudioMixerClientData.cpp | 6 ++++-- .../src/audio/AvatarAudioRingBuffer.cpp | 4 ++-- assignment-client/src/audio/AvatarAudioRingBuffer.h | 2 +- interface/src/Audio.cpp | 6 ++++-- libraries/audio/src/AudioRingBuffer.cpp | 13 ++++++++----- libraries/audio/src/AudioRingBuffer.h | 5 ++--- libraries/audio/src/InjectedAudioRingBuffer.cpp | 4 ++-- libraries/audio/src/InjectedAudioRingBuffer.h | 2 +- libraries/audio/src/MixedAudioRingBuffer.cpp | 4 ++-- libraries/audio/src/MixedAudioRingBuffer.h | 2 +- libraries/audio/src/PositionalAudioRingBuffer.cpp | 7 ++++--- libraries/audio/src/PositionalAudioRingBuffer.h | 3 ++- tests/audio/src/AudioRingBufferTests.cpp | 2 +- 14 files changed, 37 insertions(+), 27 deletions(-) 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; From ab503583dd8497be6baadf26822fc1c382e716f9 Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 1 Jul 2014 17:33:38 -0700 Subject: [PATCH 4/9] switched order of args in PositionalAudioRingBuffer --- assignment-client/src/audio/AvatarAudioRingBuffer.cpp | 2 +- libraries/audio/src/InjectedAudioRingBuffer.cpp | 2 +- libraries/audio/src/PositionalAudioRingBuffer.cpp | 2 +- libraries/audio/src/PositionalAudioRingBuffer.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp index ec08471e26..a3e15c7f9e 100644 --- a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp +++ b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp @@ -14,7 +14,7 @@ #include "AvatarAudioRingBuffer.h" AvatarAudioRingBuffer::AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo, bool dynamicJitterBuffer) : - PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, numFramesCapacity, isStereo, dynamicJitterBuffer) { + PositionalAudioRingBuffer(numFramesCapacity, PositionalAudioRingBuffer::Microphone, isStereo, dynamicJitterBuffer) { } diff --git a/libraries/audio/src/InjectedAudioRingBuffer.cpp b/libraries/audio/src/InjectedAudioRingBuffer.cpp index aab86c1e26..77688506dd 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.cpp +++ b/libraries/audio/src/InjectedAudioRingBuffer.cpp @@ -20,7 +20,7 @@ #include "InjectedAudioRingBuffer.h" InjectedAudioRingBuffer::InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier, bool dynamicJitterBuffer) : - PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, numFramesCapacity, false, dynamicJitterBuffer), + PositionalAudioRingBuffer(numFramesCapacity, PositionalAudioRingBuffer::Injector, false, dynamicJitterBuffer), _streamIdentifier(streamIdentifier), _radius(0.0f), _attenuationRatio(0) diff --git a/libraries/audio/src/PositionalAudioRingBuffer.cpp b/libraries/audio/src/PositionalAudioRingBuffer.cpp index edb76cce69..e1e85721f0 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.cpp +++ b/libraries/audio/src/PositionalAudioRingBuffer.cpp @@ -85,7 +85,7 @@ quint64 InterframeTimeGapStats::getWindowMaxGap() { } -PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity, +PositionalAudioRingBuffer::PositionalAudioRingBuffer(int numFramesCapacity, PositionalAudioRingBuffer::Type type, bool isStereo, bool dynamicJitterBuffers) : AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, diff --git a/libraries/audio/src/PositionalAudioRingBuffer.h b/libraries/audio/src/PositionalAudioRingBuffer.h index 53f4d942fc..ac56d8487c 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.h +++ b/libraries/audio/src/PositionalAudioRingBuffer.h @@ -50,7 +50,7 @@ public: Injector }; - PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity, + PositionalAudioRingBuffer(int numFramesCapacity, PositionalAudioRingBuffer::Type type, bool isStereo = false, bool dynamicJitterBuffers = false); int parseData(const QByteArray& packet); From 059628c26a6a083f90c86bcb6402f63cd1656518 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 3 Jul 2014 10:37:09 -0700 Subject: [PATCH 5/9] fixed bug in SequenceNumberStats and its unit test; test passes now --- libraries/networking/src/SequenceNumberStats.cpp | 3 +-- tests/networking/src/SequenceNumberStatsTests.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/SequenceNumberStats.cpp b/libraries/networking/src/SequenceNumberStats.cpp index 5bdeedf39d..5174d53ba2 100644 --- a/libraries/networking/src/SequenceNumberStats.cpp +++ b/libraries/networking/src/SequenceNumberStats.cpp @@ -94,6 +94,7 @@ void SequenceNumberStats::sequenceNumberReceived(quint16 incoming, QUuid senderU _numEarly++; _numLost += (incomingInt - expectedInt); + _lastReceived = incoming; // add all sequence numbers that were skipped to the missing sequence numbers list for (int missingInt = expectedInt; missingInt < incomingInt; missingInt++) { @@ -105,8 +106,6 @@ void SequenceNumberStats::sequenceNumberReceived(quint16 incoming, QUuid senderU if (_missingSet.size() > MAX_REASONABLE_SEQUENCE_GAP) { pruneMissingSet(wantExtraDebugging); } - - _lastReceived = incoming; } else { // late if (wantExtraDebugging) { qDebug() << "this packet is later than expected..."; diff --git a/tests/networking/src/SequenceNumberStatsTests.cpp b/tests/networking/src/SequenceNumberStatsTests.cpp index 89a14deb20..8d37a3e41f 100644 --- a/tests/networking/src/SequenceNumberStatsTests.cpp +++ b/tests/networking/src/SequenceNumberStatsTests.cpp @@ -115,6 +115,11 @@ void SequenceNumberStatsTests::earlyLateTest() { } } stats.reset(); + numSent = 0; + numEarly = 0; + numLate = 0; + numLost = 0; + numRecovered = 0; } } @@ -203,6 +208,11 @@ void SequenceNumberStatsTests::duplicateTest() { } } stats.reset(); + numSent = 0; + numDuplicate = 0; + numEarly = 0; + numLate = 0; + numLost = 0; } } @@ -263,5 +273,8 @@ void SequenceNumberStatsTests::pruneTest() { } } stats.reset(); + numSent = 0; + numEarly = 0; + numLost = 0; } } From a2451a96516ed1b4f365cdfd7ec158b145430cc2 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 3 Jul 2014 10:41:54 -0700 Subject: [PATCH 6/9] moved and updated a comment in SequenceNumberStats --- libraries/networking/src/SequenceNumberStats.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/SequenceNumberStats.cpp b/libraries/networking/src/SequenceNumberStats.cpp index 5174d53ba2..3f696a522b 100644 --- a/libraries/networking/src/SequenceNumberStats.cpp +++ b/libraries/networking/src/SequenceNumberStats.cpp @@ -112,6 +112,8 @@ void SequenceNumberStats::sequenceNumberReceived(quint16 incoming, QUuid senderU } _numLate++; + // do not update _lastReceived; it shouldn't become smaller + // remove this from missing sequence number if it's in there if (_missingSet.remove(incoming)) { if (wantExtraDebugging) { @@ -125,8 +127,6 @@ void SequenceNumberStats::sequenceNumberReceived(quint16 incoming, QUuid senderU } _numDuplicate++; } - - // do not update _incomingLastSequence; it shouldn't become smaller } } } From 507518f16d90128413bf617d699af4220b062477 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 3 Jul 2014 11:11:56 -0700 Subject: [PATCH 7/9] removed numFramesCapacity from being exposed everywhere --- assignment-client/src/Agent.cpp | 4 +--- assignment-client/src/audio/AudioMixerClientData.cpp | 7 ++----- assignment-client/src/audio/AvatarAudioRingBuffer.cpp | 4 ++-- assignment-client/src/audio/AvatarAudioRingBuffer.h | 2 +- interface/src/Audio.cpp | 6 ++---- libraries/audio/src/AudioRingBuffer.cpp | 2 +- libraries/audio/src/AudioRingBuffer.h | 4 +++- libraries/audio/src/InjectedAudioRingBuffer.cpp | 4 ++-- libraries/audio/src/InjectedAudioRingBuffer.h | 2 +- libraries/audio/src/MixedAudioRingBuffer.cpp | 4 ++-- libraries/audio/src/MixedAudioRingBuffer.h | 2 +- libraries/audio/src/PositionalAudioRingBuffer.cpp | 5 ++--- libraries/audio/src/PositionalAudioRingBuffer.h | 5 +++-- 13 files changed, 23 insertions(+), 28 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 25c775f14b..5720ecaaf5 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -31,14 +31,12 @@ #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, AUDIO_RING_BUFFER_CAPACITY_FRAMES), + _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO), _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 b8f4d18b1d..f6437f9c97 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -19,8 +19,6 @@ #include "AudioMixer.h" #include "AudioMixerClientData.h" -static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 100; - AudioMixerClientData::AudioMixerClientData() : _ringBuffers(), _outgoingMixedAudioSequenceNumber(0), @@ -78,7 +76,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { if (!avatarRingBuffer) { // we don't have an AvatarAudioRingBuffer yet, so add it - avatarRingBuffer = new AvatarAudioRingBuffer(AUDIO_RING_BUFFER_CAPACITY_FRAMES, isStereo, AudioMixer::getUseDynamicJitterBuffers()); + avatarRingBuffer = new AvatarAudioRingBuffer(isStereo, AudioMixer::getUseDynamicJitterBuffers()); _ringBuffers.push_back(avatarRingBuffer); } @@ -103,8 +101,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(AUDIO_RING_BUFFER_CAPACITY_FRAMES, streamIdentifier, - AudioMixer::getUseDynamicJitterBuffers()); + matchingInjectedRingBuffer = new InjectedAudioRingBuffer(streamIdentifier, AudioMixer::getUseDynamicJitterBuffers()); _ringBuffers.push_back(matchingInjectedRingBuffer); } diff --git a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp index a3e15c7f9e..9c6cc32f57 100644 --- a/assignment-client/src/audio/AvatarAudioRingBuffer.cpp +++ b/assignment-client/src/audio/AvatarAudioRingBuffer.cpp @@ -13,8 +13,8 @@ #include "AvatarAudioRingBuffer.h" -AvatarAudioRingBuffer::AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo, bool dynamicJitterBuffer) : - PositionalAudioRingBuffer(numFramesCapacity, PositionalAudioRingBuffer::Microphone, isStereo, dynamicJitterBuffer) { +AvatarAudioRingBuffer::AvatarAudioRingBuffer(bool isStereo, bool dynamicJitterBuffer) : + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, isStereo, dynamicJitterBuffer) { } diff --git a/assignment-client/src/audio/AvatarAudioRingBuffer.h b/assignment-client/src/audio/AvatarAudioRingBuffer.h index 816fd937a6..e227e70958 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(int numFramesCapacity, bool isStereo = false, bool dynamicJitterBuffer = false); + AvatarAudioRingBuffer(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 1ae3b5b8e6..98987f2d0a 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -48,8 +48,6 @@ 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; @@ -68,8 +66,8 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) : _loopbackOutputDevice(NULL), _proceduralAudioOutput(NULL), _proceduralOutputDevice(NULL), - _inputRingBuffer(0, AUDIO_RING_BUFFER_CAPACITY_FRAMES), - _ringBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES), + _inputRingBuffer(0), + _ringBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO), _isStereoInput(false), _averagedLatency(0.0), _measuredJitter(0), diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 56b6725745..636ee76844 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -19,7 +19,7 @@ #include "AudioRingBuffer.h" -AudioRingBuffer::AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode) : +AudioRingBuffer::AudioRingBuffer(int numFrameSamples, bool randomAccessMode, int numFramesCapacity) : NodeData(), _overflowCount(0), _frameCapacity(numFramesCapacity), diff --git a/libraries/audio/src/AudioRingBuffer.h b/libraries/audio/src/AudioRingBuffer.h index 0bf5e2d1d6..0a6a123b71 100644 --- a/libraries/audio/src/AudioRingBuffer.h +++ b/libraries/audio/src/AudioRingBuffer.h @@ -34,10 +34,12 @@ const unsigned int BUFFER_SEND_INTERVAL_USECS = floorf((NETWORK_BUFFER_LENGTH_SA const int MAX_SAMPLE_VALUE = std::numeric_limits::max(); const int MIN_SAMPLE_VALUE = std::numeric_limits::min(); +const int DEFAULT_RING_BUFFER_FRAME_CAPACITY = 10; + class AudioRingBuffer : public NodeData { Q_OBJECT public: - AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode = false); + AudioRingBuffer(int numFrameSamples, bool randomAccessMode = false, int numFramesCapacity = DEFAULT_RING_BUFFER_FRAME_CAPACITY); ~AudioRingBuffer(); void reset(); diff --git a/libraries/audio/src/InjectedAudioRingBuffer.cpp b/libraries/audio/src/InjectedAudioRingBuffer.cpp index 77688506dd..c84fe173c9 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.cpp +++ b/libraries/audio/src/InjectedAudioRingBuffer.cpp @@ -19,8 +19,8 @@ #include "InjectedAudioRingBuffer.h" -InjectedAudioRingBuffer::InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier, bool dynamicJitterBuffer) : - PositionalAudioRingBuffer(numFramesCapacity, PositionalAudioRingBuffer::Injector, false, dynamicJitterBuffer), +InjectedAudioRingBuffer::InjectedAudioRingBuffer(const QUuid& streamIdentifier, bool dynamicJitterBuffer) : + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, false, dynamicJitterBuffer), _streamIdentifier(streamIdentifier), _radius(0.0f), _attenuationRatio(0) diff --git a/libraries/audio/src/InjectedAudioRingBuffer.h b/libraries/audio/src/InjectedAudioRingBuffer.h index 64862b6963..4e3fea672b 100644 --- a/libraries/audio/src/InjectedAudioRingBuffer.h +++ b/libraries/audio/src/InjectedAudioRingBuffer.h @@ -18,7 +18,7 @@ class InjectedAudioRingBuffer : public PositionalAudioRingBuffer { public: - InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false); + InjectedAudioRingBuffer(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 fb414ee387..c975d7b68e 100644 --- a/libraries/audio/src/MixedAudioRingBuffer.cpp +++ b/libraries/audio/src/MixedAudioRingBuffer.cpp @@ -11,8 +11,8 @@ #include "MixedAudioRingBuffer.h" -MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity) : - AudioRingBuffer(numFrameSamples, numFramesCapacity), +MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples) : + AudioRingBuffer(numFrameSamples), _lastReadFrameAverageLoudness(0.0f) { diff --git a/libraries/audio/src/MixedAudioRingBuffer.h b/libraries/audio/src/MixedAudioRingBuffer.h index 4ebe4d577e..25574a3ea6 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, int numFramesCapacity); + MixedAudioRingBuffer(int numFrameSamples); float getLastReadFrameAverageLoudness() const { return _lastReadFrameAverageLoudness; } diff --git a/libraries/audio/src/PositionalAudioRingBuffer.cpp b/libraries/audio/src/PositionalAudioRingBuffer.cpp index e1e85721f0..8f3030782f 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.cpp +++ b/libraries/audio/src/PositionalAudioRingBuffer.cpp @@ -85,11 +85,10 @@ quint64 InterframeTimeGapStats::getWindowMaxGap() { } -PositionalAudioRingBuffer::PositionalAudioRingBuffer(int numFramesCapacity, PositionalAudioRingBuffer::Type type, - bool isStereo, bool dynamicJitterBuffers) : +PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo, bool dynamicJitterBuffers) : AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, - numFramesCapacity), + AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY), _type(type), _position(0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f), diff --git a/libraries/audio/src/PositionalAudioRingBuffer.h b/libraries/audio/src/PositionalAudioRingBuffer.h index ac56d8487c..6a7c4b492a 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.h +++ b/libraries/audio/src/PositionalAudioRingBuffer.h @@ -43,6 +43,8 @@ private: bool _newWindowMaxGapAvailable; }; +const int AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY = 100; + class PositionalAudioRingBuffer : public AudioRingBuffer { public: enum Type { @@ -50,8 +52,7 @@ public: Injector }; - PositionalAudioRingBuffer(int numFramesCapacity, PositionalAudioRingBuffer::Type type, - bool isStereo = false, bool dynamicJitterBuffers = false); + PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo = false, bool dynamicJitterBuffers = false); int parseData(const QByteArray& packet); int parsePositionalData(const QByteArray& positionalByteArray); From 2c6b2000b2733250ad3cc7d228f090840314741c Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 3 Jul 2014 11:34:16 -0700 Subject: [PATCH 8/9] forgot arg in AudioRingBuffer constructor in PositionalAudioRingBUffer changed _currentJitterBufferFrames to be -1 to indicate starved. --- libraries/audio/src/PositionalAudioRingBuffer.cpp | 8 ++++---- libraries/audio/src/PositionalAudioRingBuffer.h | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/audio/src/PositionalAudioRingBuffer.cpp b/libraries/audio/src/PositionalAudioRingBuffer.cpp index 8f3030782f..def71b7d90 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.cpp +++ b/libraries/audio/src/PositionalAudioRingBuffer.cpp @@ -88,7 +88,7 @@ quint64 InterframeTimeGapStats::getWindowMaxGap() { PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo, bool dynamicJitterBuffers) : AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, - AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY), + false, AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY), _type(type), _position(0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f), @@ -98,7 +98,7 @@ PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer:: _isStereo(isStereo), _listenerUnattenuatedZone(NULL), _desiredJitterBufferFrames(1), - _currentJitterBufferFrames(0), + _currentJitterBufferFrames(-1), _dynamicJitterBuffers(dynamicJitterBuffers) { } @@ -216,8 +216,8 @@ bool PositionalAudioRingBuffer::shouldBeAddedToMix() { // if the buffer doesn't have a full frame of samples to take for mixing, it is starved _isStarved = true; - // set to 0 to indicate the jitter buffer is starved - _currentJitterBufferFrames = 0; + // set to -1 to indicate the jitter buffer is starved + _currentJitterBufferFrames = -1; // reset our _shouldOutputStarveDebug to true so the next is printed _shouldOutputStarveDebug = true; diff --git a/libraries/audio/src/PositionalAudioRingBuffer.h b/libraries/audio/src/PositionalAudioRingBuffer.h index 6a7c4b492a..0322afb47b 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.h +++ b/libraries/audio/src/PositionalAudioRingBuffer.h @@ -105,6 +105,11 @@ protected: int _desiredJitterBufferFrames; int _currentJitterBufferFrames; bool _dynamicJitterBuffers; + + // extra stats + int _starveCount; + int _silentFramesDropped; + }; #endif // hifi_PositionalAudioRingBuffer_h From 94c0c15c769549ae1dbaaf025488efbd0bd0d9b2 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 3 Jul 2014 12:06:18 -0700 Subject: [PATCH 9/9] fixed more small bugs with AudioRingBuffer constructor --- interface/src/Audio.cpp | 2 +- tests/audio/src/AudioRingBufferTests.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 98987f2d0a..2357be32d4 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -93,7 +93,7 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) : _processSpatialAudio(false), _spatialAudioStart(0), _spatialAudioFinish(0), - _spatialAudioRingBuffer(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL, true), // random access mode + _spatialAudioRingBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, true), // random access mode _scopeEnabled(false), _scopeEnabledPause(false), _scopeInputOffset(0), diff --git a/tests/audio/src/AudioRingBufferTests.cpp b/tests/audio/src/AudioRingBufferTests.cpp index 1c312d8323..b9ed596e52 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, 10); // makes buffer of 100 int16_t samples + AudioRingBuffer ringBuffer(10, false, 10); // makes buffer of 100 int16_t samples for (int T = 0; T < 300; T++) { writeIndexAt = 0;