diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 1a436fc9bf..ce30a4b82c 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -98,15 +98,18 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf // if the frame to be mixed is silent, don't mix it if (bufferToAdd->getNextOutputTrailingLoudness() == 0.0f) { bufferToAdd->popFrames(1); + printf("trailing loudness too soft: not mixing!\n"); return; } // get pointer to frame to be mixed. If the stream cannot provide a frame (is starved), bail AudioRingBuffer::ConstIterator nextOutputStart; if (!bufferToAdd->popFrames(&nextOutputStart, 1)) { + printf("stream is starved! not mixing!\n"); return; } + printf("mixing stream\n"); float bearingRelativeAngleToSource = 0.0f; float attenuationCoefficient = 1.0f; @@ -312,7 +315,7 @@ void AudioMixer::prepareMixForListeningNode(Node* node) { QHash::ConstIterator i, end = otherNodeRingBuffers.constEnd(); for (i = otherNodeRingBuffers.begin(); i != end; i++) { PositionalAudioRingBuffer* otherNodeBuffer = i.value(); - + if (*otherNode != *node || otherNodeBuffer->shouldLoopbackForNode()) { addBufferToMixForListeningNodeWithBuffer(otherNodeBuffer, nodeRingBuffer); } diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 727cb5c554..4923e3d5e7 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -86,6 +86,7 @@ int InboundAudioStream::parseData(const QByteArray& packet) { } if (_isStarved && _ringBuffer.samplesAvailable() >= _desiredJitterBufferFrames * _ringBuffer.getNumFrameSamples()) { + printf("\nstream refilled from starve!\n"); _isStarved = false; } @@ -95,79 +96,60 @@ int InboundAudioStream::parseData(const QByteArray& packet) { } bool InboundAudioStream::popFrames(int numFrames, bool starveOnFail) { - if (_isStarved) { - _consecutiveNotMixedCount++; - return false; - } - - bool popped = false; - + bool popped; int numSamplesRequested = numFrames * _ringBuffer.getNumFrameSamples(); - if (_ringBuffer.samplesAvailable() >= numSamplesRequested) { + if (popped = shouldPop(numSamplesRequested, starveOnFail)) { _ringBuffer.shiftReadPosition(numSamplesRequested); - _hasStarted = true; - popped = true; - } else { - if (starveOnFail) { - setToStarved(); - _consecutiveNotMixedCount++; - } } - _framesAvailableStats.update(_ringBuffer.framesAvailable()); return popped; } bool InboundAudioStream::popFrames(int16_t* dest, int numFrames, bool starveOnFail) { - if (_isStarved) { - _consecutiveNotMixedCount++; - return false; - } - - bool popped = false; - + bool popped; int numSamplesRequested = numFrames * _ringBuffer.getNumFrameSamples(); - if (_ringBuffer.samplesAvailable() >= numSamplesRequested) { + if (popped = shouldPop(numSamplesRequested, starveOnFail)) { _ringBuffer.readSamples(dest, numSamplesRequested); - _hasStarted = true; - popped = true; - } else { - if (starveOnFail) { - setToStarved(); - _consecutiveNotMixedCount++; - } } - _framesAvailableStats.update(_ringBuffer.framesAvailable()); return popped; } bool InboundAudioStream::popFrames(AudioRingBuffer::ConstIterator* nextOutput, int numFrames, bool starveOnFail) { + bool popped; + int numSamplesRequested = numFrames * _ringBuffer.getNumFrameSamples(); + if (popped = shouldPop(numSamplesRequested, starveOnFail)) { + *nextOutput = _ringBuffer.nextOutput(); + _ringBuffer.shiftReadPosition(numSamplesRequested); + } + _framesAvailableStats.update(_ringBuffer.framesAvailable()); + + return popped; +} + +bool InboundAudioStream::shouldPop(int numSamples, bool starveOnFail) { + printf("\nshouldPop()\n"); + if (_isStarved) { + printf("\t we're starved, not popping\n"); _consecutiveNotMixedCount++; return false; } - bool popped = false; - - int numSamplesRequested = numFrames * _ringBuffer.getNumFrameSamples(); - if (_ringBuffer.samplesAvailable() >= numSamplesRequested) { - *nextOutput = _ringBuffer.nextOutput(); - _ringBuffer.shiftReadPosition(numSamplesRequested); + if (_ringBuffer.samplesAvailable() >= numSamples) { + printf("have requested samples and not starved, popping\n"); _hasStarted = true; - popped = true; + return true; } else { if (starveOnFail) { + printf("don't have enough samples; starved!\n"); setToStarved(); _consecutiveNotMixedCount++; } + return false; } - - _framesAvailableStats.update(_ringBuffer.framesAvailable()); - - return popped; } void InboundAudioStream::setToStarved() { diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 65a4f07918..fc1ef07844 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -79,6 +79,9 @@ public: int getSilentFramesDropped() const { return _silentFramesDropped; } int getOverflowCount() const { return _ringBuffer.getOverflowCount(); } +private: + bool shouldPop(int numSamples, bool starveOnFail); + protected: // disallow copying of InboundAudioStream objects InboundAudioStream(const InboundAudioStream&); diff --git a/libraries/audio/src/PositionalAudioRingBuffer.cpp b/libraries/audio/src/PositionalAudioRingBuffer.cpp index 519190d70d..3d686beccc 100644 --- a/libraries/audio/src/PositionalAudioRingBuffer.cpp +++ b/libraries/audio/src/PositionalAudioRingBuffer.cpp @@ -22,15 +22,15 @@ #include PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo, bool dynamicJitterBuffers) : -InboundAudioStream(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, -AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, dynamicJitterBuffers), -_type(type), -_position(0.0f, 0.0f, 0.0f), -_orientation(0.0f, 0.0f, 0.0f, 0.0f), -_shouldLoopbackForNode(false), -_isStereo(isStereo), -_nextOutputTrailingLoudness(0.0f), -_listenerUnattenuatedZone(NULL) + InboundAudioStream(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, + AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, dynamicJitterBuffers), + _type(type), + _position(0.0f, 0.0f, 0.0f), + _orientation(0.0f, 0.0f, 0.0f, 0.0f), + _shouldLoopbackForNode(false), + _isStereo(isStereo), + _nextOutputTrailingLoudness(0.0f), + _listenerUnattenuatedZone(NULL) { }