From d4ec337cae00a44718fc0d80d0c5650a583f0c52 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 23 Oct 2014 13:39:56 -0700 Subject: [PATCH 1/8] Don't send reverb data as often --- assignment-client/src/audio/AudioMixer.cpp | 58 ++++++++++++++++------ libraries/audio/src/InboundAudioStream.cpp | 28 ++++++++--- libraries/audio/src/InboundAudioStream.h | 6 +++ 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 8d87638434..faaebb1102 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -731,30 +731,56 @@ void AudioMixer::run() { dataAt += sizeof(quint16); // Pack stream properties - bool inAZone = false; + bool hasReverb = false; + float reverbTime; + float wetLevel; + + // find reverb properties for (int i = 0; i < _zoneReverbSettings.size(); ++i) { AudioMixerClientData* data = static_cast(node->getLinkedData()); - glm::vec3 streamPosition = data->getAvatarAudioStream()->getPosition(); + AvatarAudioStream* stream = data->getAvatarAudioStream(); + glm::vec3 streamPosition = stream->getPosition(); if (_audioZones[_zoneReverbSettings[i].zone].contains(streamPosition)) { - bool hasReverb = true; - float reverbTime = _zoneReverbSettings[i].reverbTime; - float wetLevel = _zoneReverbSettings[i].wetLevel; - - memcpy(dataAt, &hasReverb, sizeof(bool)); - dataAt += sizeof(bool); + hasReverb = true; + reverbTime = _zoneReverbSettings[i].reverbTime; + wetLevel = _zoneReverbSettings[i].wetLevel; + break; + } + } + AvatarAudioStream* stream = nodeData->getAvatarAudioStream(); + bool dataChanged = (stream->hasReverb() != hasReverb) || + (stream->hasReverb() && (stream->getRevebTime() != reverbTime || + stream->getWetLevel() != wetLevel)); + // Update stream + if (hasReverb) { + stream->setReverb(reverbTime, wetLevel); + } else { + stream->clearReverb(); + } + + // Send at change or every so often + float CHANCE_OF_SEND = 0.01; + bool sendData = dataChanged || (randFloat() < CHANCE_OF_SEND); + + unsigned char bitset = 0; + if (sendData) { + setAtBit(bitset, HAS_DATA_BIT); + if (hasReverb) { + setAtBit(bitset, HAS_REVERB_BIT); + } + + memcpy(dataAt, &bitset, sizeof(unsigned char)); + dataAt += sizeof(unsigned char); + + if (hasReverb) { memcpy(dataAt, &reverbTime, sizeof(float)); dataAt += sizeof(float); memcpy(dataAt, &wetLevel, sizeof(float)); dataAt += sizeof(float); - - inAZone = true; - break; } - } - if (!inAZone) { - bool hasReverb = false; - memcpy(dataAt, &hasReverb, sizeof(bool)); - dataAt += sizeof(bool); + } else { + memcpy(dataAt, &bitset, sizeof(unsigned char)); + dataAt += sizeof(unsigned char); } // pack mixed audio samples diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 59578951f8..3e4a8639c6 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -13,6 +13,7 @@ #include "InboundAudioStream.h" #include "PacketHeaders.h" +#include const int STARVE_HISTORY_CAPACITY = 50; @@ -83,6 +84,12 @@ void InboundAudioStream::clearBuffer() { _currentJitterBufferFrames = 0; } +void InboundAudioStream::setReverb(float reverbTime, float wetLevel) { + _hasReverb = true; + _reverbTime = reverbTime; + _wetLevel = wetLevel; +} + void InboundAudioStream::perSecondCallbackForUpdatingStats() { _incomingSequenceNumberStats.pushStatsToHistory(); _timeGapStatsForDesiredCalcOnTooManyStarves.currentIntervalComplete(); @@ -165,14 +172,19 @@ int InboundAudioStream::parseData(const QByteArray& packet) { int InboundAudioStream::parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { int read = 0; if (type == PacketTypeMixedAudio) { - memcpy(&_hasReverb, packetAfterSeqNum.data() + read, sizeof(bool)); - read += sizeof(bool); + char bitset; + memcpy(&bitset, packetAfterSeqNum.data() + read, sizeof(char)); + read += sizeof(char); - if (_hasReverb) { - memcpy(&_reverbTime, packetAfterSeqNum.data() + read, sizeof(float)); - read += sizeof(float); - memcpy(&_wetLevel, packetAfterSeqNum.data() + read, sizeof(float)); - read += sizeof(float); + bool hasData = oneAtBit(bitset, HAS_DATA_BIT); + if (hasData) { + _hasReverb = oneAtBit(bitset, HAS_REVERB_BIT); + if (_hasReverb) { + memcpy(&_reverbTime, packetAfterSeqNum.data() + read, sizeof(float)); + read += sizeof(float); + memcpy(&_wetLevel, packetAfterSeqNum.data() + read, sizeof(float)); + read += sizeof(float); + } } } @@ -206,7 +218,7 @@ int InboundAudioStream::writeDroppableSilentSamples(int silentSamples) { _framesAvailableStat.reset(); } - + int ret = _ringBuffer.addSilentSamples(silentSamples - numSilentFramesToDrop * samplesPerFrame); return ret; diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 3e69db0afb..737147e2ba 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -45,6 +45,10 @@ const int DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES = 50; const int DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION = 10; const bool DEFAULT_REPETITION_WITH_FADE = true; +// Mixed Audio bitset +const int HAS_DATA_BIT = 0; // 1st bit +const int HAS_REVERB_BIT = 1; // 2nd bit + class InboundAudioStream : public NodeData { Q_OBJECT public: @@ -158,6 +162,8 @@ public: bool hasReverb() const { return _hasReverb; } float getRevebTime() const { return _reverbTime; } float getWetLevel() const { return _wetLevel; } + void setReverb(float reverbTime, float wetLevel); + void clearReverb() { _hasReverb = false; } public slots: /// This function should be called every second for all the stats to function properly. If dynamic jitter buffers From d528c47a83bacd44fc88b6a53d7d5a7e22a43d66 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 23 Oct 2014 13:42:17 -0700 Subject: [PATCH 2/8] Bump audio packet version --- libraries/networking/src/PacketHeaders.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 8ce379b203..b96d88430a 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -53,7 +53,7 @@ PacketVersion versionForPacketType(PacketType type) { case PacketTypeSilentAudioFrame: return 4; case PacketTypeMixedAudio: - return 2; + return 3; case PacketTypeAvatarData: return 3; case PacketTypeAvatarIdentity: From 1ae1d28e7b3259fc42647453ef59c079608549b7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 23 Oct 2014 14:07:42 -0700 Subject: [PATCH 3/8] typo --- interface/external/gverb/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/external/gverb/readme.txt b/interface/external/gverb/readme.txt index aa2fe8a602..1a85659b91 100644 --- a/interface/external/gverb/readme.txt +++ b/interface/external/gverb/readme.txt @@ -1,7 +1,7 @@ Instructions for adding the Gverb library to Interface (This is a required library) -Clément Brisset, Octobre 22nd, 2014 +Clément Brisset, October 22nd, 2014 1. Go to https://github.com/highfidelity/gverb Or download the sources directly via this link: From 5e49c08e273b253081650864071bc460d857b250 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 23 Oct 2014 14:08:36 -0700 Subject: [PATCH 4/8] extra space --- libraries/audio/src/InboundAudioStream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 3e4a8639c6..a830d7c9db 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -218,7 +218,7 @@ int InboundAudioStream::writeDroppableSilentSamples(int silentSamples) { _framesAvailableStat.reset(); } - + int ret = _ringBuffer.addSilentSamples(silentSamples - numSilentFramesToDrop * samplesPerFrame); return ret; From 529a7e0369108305ef96d105d327b1f981f115be Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 23 Oct 2014 22:55:40 -0700 Subject: [PATCH 5/8] CR --- assignment-client/src/audio/AudioMixer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index faaebb1102..31f50251b9 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -759,7 +759,7 @@ void AudioMixer::run() { } // Send at change or every so often - float CHANCE_OF_SEND = 0.01; + float CHANCE_OF_SEND = 0.01f; bool sendData = dataChanged || (randFloat() < CHANCE_OF_SEND); unsigned char bitset = 0; From 6072fd4066d02098eee08f08d29674a27202c251 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 24 Oct 2014 10:41:54 -0700 Subject: [PATCH 6/8] Added audio env packet type --- libraries/networking/src/PacketHeaders.cpp | 5 +++++ libraries/networking/src/PacketHeaders.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index b96d88430a..0b6a3bc1f0 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -135,8 +135,13 @@ QString nameForPacketType(PacketType type) { PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityAddResponse); PACKET_TYPE_NAME_LOOKUP(PacketTypeOctreeDataNack); PACKET_TYPE_NAME_LOOKUP(PacketTypeVoxelEditNack); + PACKET_TYPE_NAME_LOOKUP(PacketTypeAudioEnvironment); PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityEditNack); PACKET_TYPE_NAME_LOOKUP(PacketTypeSignedTransactionPayment); + PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerHeartbeat); + PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerHeartbeatResponse); + PACKET_TYPE_NAME_LOOKUP(PacketTypeUnverifiedPing); + PACKET_TYPE_NAME_LOOKUP(PacketTypeUnverifiedPingReply); default: return QString("Type: ") + QString::number((int)type); } diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 7632f47686..2e9ce697f0 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -68,7 +68,7 @@ enum PacketType { PacketTypeEntityAddResponse, PacketTypeOctreeDataNack, // 45 PacketTypeVoxelEditNack, - UNUSED_6, + PacketTypeAudioEnvironment, PacketTypeEntityEditNack, // 48 PacketTypeSignedTransactionPayment, PacketTypeIceServerHeartbeat, From 847ef64b667f266aaceebcec5a4002f48f23fc80 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 24 Oct 2014 14:27:55 -0700 Subject: [PATCH 7/8] move audio env data over to new packet --- assignment-client/src/audio/AudioMixer.cpp | 68 +++++++++++----------- interface/src/Audio.cpp | 21 +++++++ interface/src/Audio.h | 1 + interface/src/DatagramProcessor.cpp | 14 +++-- libraries/audio/src/InboundAudioStream.cpp | 22 +------ libraries/networking/src/PacketHeaders.cpp | 4 +- 6 files changed, 68 insertions(+), 62 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 31f50251b9..afde574ae2 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -638,8 +638,9 @@ void AudioMixer::run() { int nextFrame = 0; QElapsedTimer timer; timer.start(); - + char clientMixBuffer[MAX_PACKET_SIZE]; + char clientEnvBuffer[MAX_PACKET_SIZE]; int usecToSleep = BUFFER_SEND_INTERVAL_USECS; @@ -718,23 +719,25 @@ void AudioMixer::run() { && nodeData->getAvatarAudioStream()) { int streamsMixed = prepareMixForListeningNode(node.data()); - - char* dataAt; + + char* mixDataAt; if (streamsMixed > 0) { - // pack header - int numBytesPacketHeader = populatePacketHeader(clientMixBuffer, PacketTypeMixedAudio); - dataAt = clientMixBuffer + numBytesPacketHeader; - + // pack headers + int numBytesMixPacketHeader = populatePacketHeader(clientMixBuffer, PacketTypeMixedAudio); + mixDataAt = clientMixBuffer + numBytesMixPacketHeader; + // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - memcpy(dataAt, &sequence, sizeof(quint16)); - dataAt += sizeof(quint16); - - // Pack stream properties - bool hasReverb = false; - float reverbTime; - float wetLevel; + memcpy(mixDataAt, &sequence, sizeof(quint16)); + mixDataAt += sizeof(quint16); + // pack mixed audio samples + memcpy(mixDataAt, _mixSamples, NETWORK_BUFFER_LENGTH_BYTES_STEREO); + mixDataAt += NETWORK_BUFFER_LENGTH_BYTES_STEREO; + + // Send stream properties + bool hasReverb = false; + float reverbTime, wetLevel; // find reverb properties for (int i = 0; i < _zoneReverbSettings.size(); ++i) { AudioMixerClientData* data = static_cast(node->getLinkedData()); @@ -762,48 +765,45 @@ void AudioMixer::run() { float CHANCE_OF_SEND = 0.01f; bool sendData = dataChanged || (randFloat() < CHANCE_OF_SEND); - unsigned char bitset = 0; if (sendData) { + int numBytesEnvPacketHeader = populatePacketHeader(clientEnvBuffer, PacketTypeAudioEnvironment); + char* envDataAt = clientEnvBuffer + numBytesEnvPacketHeader; + + unsigned char bitset = 0; setAtBit(bitset, HAS_DATA_BIT); if (hasReverb) { setAtBit(bitset, HAS_REVERB_BIT); } - memcpy(dataAt, &bitset, sizeof(unsigned char)); - dataAt += sizeof(unsigned char); + memcpy(envDataAt, &bitset, sizeof(unsigned char)); + envDataAt += sizeof(unsigned char); if (hasReverb) { - memcpy(dataAt, &reverbTime, sizeof(float)); - dataAt += sizeof(float); - memcpy(dataAt, &wetLevel, sizeof(float)); - dataAt += sizeof(float); + memcpy(envDataAt, &reverbTime, sizeof(float)); + envDataAt += sizeof(float); + memcpy(envDataAt, &wetLevel, sizeof(float)); + envDataAt += sizeof(float); } - } else { - memcpy(dataAt, &bitset, sizeof(unsigned char)); - dataAt += sizeof(unsigned char); + nodeList->writeDatagram(clientEnvBuffer, envDataAt - clientEnvBuffer, node); } - - // pack mixed audio samples - memcpy(dataAt, _mixSamples, NETWORK_BUFFER_LENGTH_BYTES_STEREO); - dataAt += NETWORK_BUFFER_LENGTH_BYTES_STEREO; } else { // pack header int numBytesPacketHeader = populatePacketHeader(clientMixBuffer, PacketTypeSilentAudioFrame); - dataAt = clientMixBuffer + numBytesPacketHeader; + mixDataAt = clientMixBuffer + numBytesPacketHeader; // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - memcpy(dataAt, &sequence, sizeof(quint16)); - dataAt += sizeof(quint16); + memcpy(mixDataAt, &sequence, sizeof(quint16)); + mixDataAt += sizeof(quint16); // pack number of silent audio samples quint16 numSilentSamples = NETWORK_BUFFER_LENGTH_SAMPLES_STEREO; - memcpy(dataAt, &numSilentSamples, sizeof(quint16)); - dataAt += sizeof(quint16); + memcpy(mixDataAt, &numSilentSamples, sizeof(quint16)); + mixDataAt += sizeof(quint16); } // send mixed audio packet - nodeList->writeDatagram(clientMixBuffer, dataAt - clientMixBuffer, node); + nodeList->writeDatagram(clientMixBuffer, mixDataAt - clientMixBuffer, node); nodeData->incrementOutgoingMixedAudioSequenceNumber(); // send an audio stream stats packet if it's time diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index dd84eb3211..7d039387bb 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -1018,6 +1018,27 @@ void Audio::parseAudioStreamStatsPacket(const QByteArray& packet) { } } +void Audio::parseAudioEnvironmentData(const QByteArray &packet) { + int numBytesPacketHeader = numBytesForPacketHeader(packet); + const char* dataAt = packet.constData() + numBytesPacketHeader; + + char bitset; + memcpy(&bitset, dataAt, sizeof(char)); + dataAt += sizeof(char); + + bool hasReverb = oneAtBit(bitset, HAS_REVERB_BIT);; + if (hasReverb) { + float reverbTime, wetLevel; + memcpy(&reverbTime, dataAt, sizeof(float)); + dataAt += sizeof(float); + memcpy(&wetLevel, dataAt, sizeof(float)); + dataAt += sizeof(float); + _receivedAudioStream.setReverb(reverbTime, wetLevel); + } else { + _receivedAudioStream.clearReverb(); + } +} + void Audio::sendDownstreamAudioStatsPacket() { // since this function is called every second, we'll sample for some of our stats here diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 900b6ce0d6..fcbfb12761 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -125,6 +125,7 @@ public slots: void stop(); void addReceivedAudioToStream(const QByteArray& audioByteArray); void parseAudioStreamStatsPacket(const QByteArray& packet); + void parseAudioEnvironmentData(const QByteArray& packet); void addSpatialAudioToBuffer(unsigned int sampleTime, const QByteArray& spatialAudio, unsigned int numSamples); void handleAudioInput(); void reset(); diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 868654b9da..6f9f4cae68 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -49,14 +49,18 @@ void DatagramProcessor::processDatagrams() { PacketType incomingType = packetTypeForPacket(incomingPacket); // only process this packet if we have a match on the packet version switch (incomingType) { + case PacketTypeAudioEnvironment: + case PacketTypeAudioStreamStats: case PacketTypeMixedAudio: - case PacketTypeSilentAudioFrame: - case PacketTypeAudioStreamStats: { - if (incomingType != PacketTypeAudioStreamStats) { - QMetaObject::invokeMethod(&application->_audio, "addReceivedAudioToStream", Qt::QueuedConnection, + case PacketTypeSilentAudioFrame: { + if (incomingType == PacketTypeAudioStreamStats) { + QMetaObject::invokeMethod(&application->_audio, "parseAudioStreamStatsPacket", Qt::QueuedConnection, + Q_ARG(QByteArray, incomingPacket)); + } else if (incomingType == PacketTypeAudioEnvironment) { + QMetaObject::invokeMethod(&application->_audio, "parseAudioEnvironmentData", Qt::QueuedConnection, Q_ARG(QByteArray, incomingPacket)); } else { - QMetaObject::invokeMethod(&application->_audio, "parseAudioStreamStatsPacket", Qt::QueuedConnection, + QMetaObject::invokeMethod(&application->_audio, "addReceivedAudioToStream", Qt::QueuedConnection, Q_ARG(QByteArray, incomingPacket)); } diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index a830d7c9db..12449a9879 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -170,27 +170,9 @@ int InboundAudioStream::parseData(const QByteArray& packet) { } int InboundAudioStream::parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { - int read = 0; - if (type == PacketTypeMixedAudio) { - char bitset; - memcpy(&bitset, packetAfterSeqNum.data() + read, sizeof(char)); - read += sizeof(char); - - bool hasData = oneAtBit(bitset, HAS_DATA_BIT); - if (hasData) { - _hasReverb = oneAtBit(bitset, HAS_REVERB_BIT); - if (_hasReverb) { - memcpy(&_reverbTime, packetAfterSeqNum.data() + read, sizeof(float)); - read += sizeof(float); - memcpy(&_wetLevel, packetAfterSeqNum.data() + read, sizeof(float)); - read += sizeof(float); - } - } - } - // mixed audio packets do not have any info between the seq num and the audio data. - numAudioSamples = (packetAfterSeqNum.size() - read) / sizeof(int16_t); - return read; + numAudioSamples = packetAfterSeqNum.size() / sizeof(int16_t); + return 0; } int InboundAudioStream::parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties, int numAudioSamples) { diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 0b6a3bc1f0..73671295df 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -53,7 +53,7 @@ PacketVersion versionForPacketType(PacketType type) { case PacketTypeSilentAudioFrame: return 4; case PacketTypeMixedAudio: - return 3; + return 1; case PacketTypeAvatarData: return 3; case PacketTypeAvatarIdentity: @@ -71,11 +71,9 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeOctreeStats: return 1; - case PacketTypeEntityAddOrEdit: case PacketTypeEntityData: return VERSION_ENTITIES_SUPPORT_DIMENSIONS; - case PacketTypeEntityErase: return 2; case PacketTypeAudioStreamStats: From 12f0237dc7df928dd87dcbb628034056070c4e6d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 24 Oct 2014 14:56:56 -0700 Subject: [PATCH 8/8] Cleanup --- assignment-client/src/audio/AudioMixer.cpp | 24 +++++++++++----------- libraries/audio/src/InboundAudioStream.cpp | 1 - libraries/audio/src/InboundAudioStream.h | 5 ++--- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index afde574ae2..bd3e37c0ae 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -638,7 +638,7 @@ void AudioMixer::run() { int nextFrame = 0; QElapsedTimer timer; timer.start(); - + char clientMixBuffer[MAX_PACKET_SIZE]; char clientEnvBuffer[MAX_PACKET_SIZE]; @@ -719,13 +719,13 @@ void AudioMixer::run() { && nodeData->getAvatarAudioStream()) { int streamsMixed = prepareMixForListeningNode(node.data()); - + char* mixDataAt; if (streamsMixed > 0) { - // pack headers + // pack header int numBytesMixPacketHeader = populatePacketHeader(clientMixBuffer, PacketTypeMixedAudio); mixDataAt = clientMixBuffer + numBytesMixPacketHeader; - + // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); memcpy(mixDataAt, &sequence, sizeof(quint16)); @@ -741,8 +741,7 @@ void AudioMixer::run() { // find reverb properties for (int i = 0; i < _zoneReverbSettings.size(); ++i) { AudioMixerClientData* data = static_cast(node->getLinkedData()); - AvatarAudioStream* stream = data->getAvatarAudioStream(); - glm::vec3 streamPosition = stream->getPosition(); + glm::vec3 streamPosition = data->getAvatarAudioStream()->getPosition(); if (_audioZones[_zoneReverbSettings[i].zone].contains(streamPosition)) { hasReverb = true; reverbTime = _zoneReverbSettings[i].reverbTime; @@ -754,11 +753,13 @@ void AudioMixer::run() { bool dataChanged = (stream->hasReverb() != hasReverb) || (stream->hasReverb() && (stream->getRevebTime() != reverbTime || stream->getWetLevel() != wetLevel)); - // Update stream - if (hasReverb) { - stream->setReverb(reverbTime, wetLevel); - } else { - stream->clearReverb(); + if (dataChanged) { + // Update stream + if (hasReverb) { + stream->setReverb(reverbTime, wetLevel); + } else { + stream->clearReverb(); + } } // Send at change or every so often @@ -770,7 +771,6 @@ void AudioMixer::run() { char* envDataAt = clientEnvBuffer + numBytesEnvPacketHeader; unsigned char bitset = 0; - setAtBit(bitset, HAS_DATA_BIT); if (hasReverb) { setAtBit(bitset, HAS_REVERB_BIT); } diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 12449a9879..366659b633 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -13,7 +13,6 @@ #include "InboundAudioStream.h" #include "PacketHeaders.h" -#include const int STARVE_HISTORY_CAPACITY = 50; diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 737147e2ba..ad2b7266ed 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -45,9 +45,8 @@ const int DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES = 50; const int DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION = 10; const bool DEFAULT_REPETITION_WITH_FADE = true; -// Mixed Audio bitset -const int HAS_DATA_BIT = 0; // 1st bit -const int HAS_REVERB_BIT = 1; // 2nd bit +// Audio Env bitset +const int HAS_REVERB_BIT = 0; // 1st bit class InboundAudioStream : public NodeData { Q_OBJECT