From 25850136155dfb0126b85a83c212d20dcd93a7c0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 17 Nov 2014 09:54:43 -0800 Subject: [PATCH 1/4] JS signal when AM mutes client --- interface/src/DatagramProcessor.cpp | 1 + libraries/audio/src/AudioScriptingInterface.h | 3 +++ 2 files changed, 4 insertions(+) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 6f9f4cae68..5d034c1c17 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -152,6 +152,7 @@ void DatagramProcessor::processDatagrams() { if (glm::distance(Application::getInstance()->getAvatar()->getPosition(), position) < radius && !Application::getInstance()->getAudio()->getMuted()) { Application::getInstance()->getAudio()->toggleMute(); + AudioScriptingInterface::getInstance().mutedByMixer(); } break; } diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index 0017806b40..7a60577042 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -37,6 +37,9 @@ public slots: void injectorStopped(); +signals: + void mutedByMixer(); + private: AudioScriptingInterface(); QList< QPointer > _activeInjectors; From 46eebe9d40a3b270bcdae8277a500fcc2e5325d4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 17 Nov 2014 10:26:47 -0800 Subject: [PATCH 2/4] Give noisy mutes their own packet type --- assignment-client/src/audio/AudioMixer.cpp | 16 ++--------- interface/src/DatagramProcessor.cpp | 27 +++++++++++++------ libraries/audio/src/AudioScriptingInterface.h | 1 + libraries/networking/src/PacketHeaders.h | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 6c8a4fd1c2..81bfe7a734 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -779,21 +779,9 @@ void AudioMixer::run() { static const int TIME_BETWEEN_MUTES = 5; // in secs if (usecTimestampNow() - nodeData->getAvatarAudioStream()->getLastMuted() > TIME_BETWEEN_MUTES * USECS_PER_SECOND) { - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); - int packetSize = headerSize + sizeof(glm::vec3) + sizeof(float); - - // Fake data to force mute - glm::vec3 position = nodeData->getAvatarAudioStream()->getPosition(); - float radius = 1.0f; - - char* packet = (char*)malloc(packetSize); - populatePacketHeader(packet, PacketTypeMuteEnvironment); - memcpy(packet + headerSize, &position, sizeof(glm::vec3)); - memcpy(packet + headerSize + sizeof(glm::vec3), &radius, sizeof(float)); - - nodeList->writeDatagram(packet, packetSize, node); + QByteArray packet = byteArrayWithPopulatedHeader(PacketTypeNoisyMute); + nodeList->writeDatagram(packet, node); nodeData->getAvatarAudioStream()->setLastMutedNow(); - free(packet); } } diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 5d034c1c17..96680423ed 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -141,18 +141,29 @@ void DatagramProcessor::processDatagrams() { AccountManager::getInstance().checkAndSignalForAccessToken(); break; } + case PacketTypeNoisyMute: case PacketTypeMuteEnvironment: { - glm::vec3 position; - float radius; + bool mute = !Application::getInstance()->getAudio()->getMuted(); - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); - memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); - memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); + if (incomingType == PacketTypeMuteEnvironment) { + glm::vec3 position; + float radius, distance; + + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); + memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); + memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); + distance = glm::distance(Application::getInstance()->getAvatar()->getPosition(), position); + + mute = mute && (distance < radius); + } - if (glm::distance(Application::getInstance()->getAvatar()->getPosition(), position) < radius - && !Application::getInstance()->getAudio()->getMuted()) { + if (mute) { Application::getInstance()->getAudio()->toggleMute(); - AudioScriptingInterface::getInstance().mutedByMixer(); + if (incomingType == PacketTypeMuteEnvironment) { + AudioScriptingInterface::getInstance().environmentMuted(); + } else { + AudioScriptingInterface::getInstance().mutedByMixer(); + } } break; } diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index 7a60577042..5b67666a97 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -39,6 +39,7 @@ public slots: signals: void mutedByMixer(); + void environmentMuted(); private: AudioScriptingInterface(); diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index d617f2243a..6cca5b505d 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -54,7 +54,7 @@ enum PacketType { UNUSED_2, UNUSED_3, UNUSED_4, - UNUSED_5, + PacketTypeNoisyMute, PacketTypeMetavoxelData, PacketTypeAvatarIdentity, PacketTypeAvatarBillboard, From 4615afe034577dcdd1db6463dd99f6c6a0b85171 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 17 Nov 2014 10:32:28 -0800 Subject: [PATCH 3/4] Remove lastMuted member in AvatarAudioStream --- assignment-client/src/audio/AudioMixer.cpp | 10 +++------- assignment-client/src/audio/AvatarAudioStream.cpp | 3 +-- assignment-client/src/audio/AvatarAudioStream.h | 5 ----- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 81bfe7a734..ab4524cb71 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -776,13 +776,9 @@ void AudioMixer::run() { // if the stream should be muted, send mute packet if (nodeData->getAvatarAudioStream() && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { - static const int TIME_BETWEEN_MUTES = 5; // in secs - if (usecTimestampNow() - nodeData->getAvatarAudioStream()->getLastMuted() > - TIME_BETWEEN_MUTES * USECS_PER_SECOND) { - QByteArray packet = byteArrayWithPopulatedHeader(PacketTypeNoisyMute); - nodeList->writeDatagram(packet, node); - nodeData->getAvatarAudioStream()->setLastMutedNow(); - } + QByteArray packet = byteArrayWithPopulatedHeader(PacketTypeNoisyMute); + nodeList->writeDatagram(packet, node); + nodeData->getAvatarAudioStream()->setLastMutedNow(); } if (node->getType() == NodeType::Agent && node->getActiveSocket() diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index cd67722a2e..90dcefa09d 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -14,8 +14,7 @@ #include "AvatarAudioStream.h" AvatarAudioStream::AvatarAudioStream(bool isStereo, const InboundAudioStream::Settings& settings) : - PositionalAudioStream(PositionalAudioStream::Microphone, isStereo, settings), - _lastMuted(usecTimestampNow()) + PositionalAudioStream(PositionalAudioStream::Microphone, isStereo, settings) { } diff --git a/assignment-client/src/audio/AvatarAudioStream.h b/assignment-client/src/audio/AvatarAudioStream.h index e1fb6dd486..482c6fd538 100644 --- a/assignment-client/src/audio/AvatarAudioStream.h +++ b/assignment-client/src/audio/AvatarAudioStream.h @@ -20,17 +20,12 @@ class AvatarAudioStream : public PositionalAudioStream { public: AvatarAudioStream(bool isStereo, const InboundAudioStream::Settings& settings); - qint64 getLastMuted() const { return _lastMuted; } - void setLastMutedNow() { _lastMuted = usecTimestampNow(); } - private: // disallow copying of AvatarAudioStream objects AvatarAudioStream(const AvatarAudioStream&); AvatarAudioStream& operator= (const AvatarAudioStream&); int parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); - - qint64 _lastMuted; }; #endif // hifi_AvatarAudioStream_h From 0528a9ff9b21009f95661ca71496ded5f21e1646 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 17 Nov 2014 10:49:35 -0800 Subject: [PATCH 4/4] Remove forgotten setLastMuted --- assignment-client/src/audio/AudioMixer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index ab4524cb71..32447d1d61 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -778,7 +778,6 @@ void AudioMixer::run() { && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { QByteArray packet = byteArrayWithPopulatedHeader(PacketTypeNoisyMute); nodeList->writeDatagram(packet, node); - nodeData->getAvatarAudioStream()->setLastMutedNow(); } if (node->getType() == NodeType::Agent && node->getActiveSocket()