diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0c23cdf12f..c82f35ff7f 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -36,7 +36,7 @@ Agent::Agent(const QByteArray& packet) : _voxelEditSender(), _particleEditSender(), _modelEditSender(), - _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO), + _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 1, false), _avatarHashMap() { // be the parent of the script engine so it gets moved when we do @@ -149,6 +149,10 @@ void Agent::readPendingDatagrams() { } else if (datagramPacketType == PacketTypeMixedAudio) { _receivedAudioBuffer.parseData(receivedPacket); + + _lastReceivedAudioLoudness = _receivedAudioBuffer.getNextOutputFrameLoudness(); + + _receivedAudioBuffer.clearBuffer(); // let this continue through to the NodeList so it updates last heard timestamp // for the sending audio mixer diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 2398eda0f2..b713062840 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -31,6 +30,8 @@ #include #include +#include "InboundMixedAudioStream.h" + class Agent : public ThreadedAssignment { Q_OBJECT @@ -51,7 +52,7 @@ public: void setIsListeningToAudioStream(bool isListeningToAudioStream) { _scriptEngine.setIsListeningToAudioStream(isListeningToAudioStream); } - float getLastReceivedAudioLoudness() const { return _receivedAudioBuffer.getLastReadFrameAverageLoudness(); } + float getLastReceivedAudioLoudness() const { return _lastReceivedAudioLoudness; } virtual void aboutToFinish(); @@ -70,7 +71,8 @@ private: VoxelTreeHeadlessViewer _voxelViewer; ModelTreeHeadlessViewer _modelViewer; - MixedAudioRingBuffer _receivedAudioBuffer; + InboundMixedAudioStream _receivedAudioBuffer; + float _lastReceivedAudioLoudness; AvatarHashMap _avatarHashMap; }; diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index e63c105cd2..7ad103642f 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -47,10 +47,8 @@ AudioRingBuffer::~AudioRingBuffer() { } void AudioRingBuffer::reset() { + clear(); _overflowCount = 0; - _isFull = false; - _endOfLastWrite = _buffer; - _nextOutput = _buffer; } void AudioRingBuffer::resizeForFrameSize(int numFrameSamples) { @@ -64,6 +62,12 @@ void AudioRingBuffer::resizeForFrameSize(int numFrameSamples) { reset(); } +void AudioRingBuffer::clear() { + _isFull = false; + _endOfLastWrite = _buffer; + _nextOutput = _buffer; +} + int AudioRingBuffer::parseData(const QByteArray& packet) { // skip packet header and sequence number int numBytesBeforeAudioData = numBytesForPacketHeader(packet) + sizeof(quint16); diff --git a/libraries/audio/src/AudioRingBuffer.h b/libraries/audio/src/AudioRingBuffer.h index a4fa906e97..b788f2aa67 100644 --- a/libraries/audio/src/AudioRingBuffer.h +++ b/libraries/audio/src/AudioRingBuffer.h @@ -46,6 +46,8 @@ public: void reset(); void resizeForFrameSize(int numFrameSamples); + void clear(); + int getSampleCapacity() const { return _sampleCapacity; } int getFrameCapacity() const { return _frameCapacity; } diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 105507992c..33a7c9b093 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -33,6 +33,8 @@ InboundAudioStream::InboundAudioStream(int numFrameSamples, int numFramesCapacit void InboundAudioStream::reset() { _ringBuffer.reset(); + _lastPopSucceeded = false; + _lastPopOutput = AudioRingBuffer::ConstIterator(); _isStarved = true; _hasStarted = false; resetStats(); @@ -50,6 +52,11 @@ void InboundAudioStream::resetStats() { _framesAvailableStats.reset(); } +void InboundAudioStream::clearBuffer() { + _ringBuffer.clear(); + _framesAvailableStats.reset(); +} + int InboundAudioStream::parseData(const QByteArray& packet) { PacketType packetType = packetTypeForPacket(packet); QUuid senderUUID = uuidFromPacketHeader(packet); diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 8460a8a92e..1b9f028d6f 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -47,9 +47,8 @@ public: InboundAudioStream(int numFrameSamples, int numFramesCapacity, bool dynamicJitterBuffers); void reset(); - void flushBuffer() { _ringBuffer.reset(); } void resetStats(); - + void clearBuffer(); virtual int parseData(const QByteArray& packet); diff --git a/libraries/audio/src/InboundMixedAudioStream.h b/libraries/audio/src/InboundMixedAudioStream.h index c23e6559e2..e35b0198f8 100644 --- a/libraries/audio/src/InboundMixedAudioStream.h +++ b/libraries/audio/src/InboundMixedAudioStream.h @@ -5,6 +5,9 @@ class InboundMixedAudioStream : public InboundAudioStream { public: InboundMixedAudioStream(int numFrameSamples, int numFramesCapacity, bool dynamicJitterBuffers); + + float getNextOutputFrameLoudness() const { return _ringBuffer.getNextOutputFrameLoudness(); } + protected: int parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties, int numAudioSamples);