diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 6ee044a709..3acd783bb0 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -348,6 +348,16 @@ void AudioMixer::readPendingDatagrams() { || mixerPacketType == PacketTypeSilentAudioFrame) { nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket); + } else if (mixerPacketType == PacketTypeMuteEnvironment) { + QByteArray packet = receivedPacket; + populatePacketHeader(packet, PacketTypeMuteEnvironment); + + foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { + if (node->getType() == NodeType::Agent && node->getActiveSocket() && node->getLinkedData() && node != nodeList->sendingNodeForPacket(receivedPacket)) { + nodeList->writeDatagram(packet, packet.size(), node); + } + } + } else { // let processNodeData handle it. nodeList->processNodeData(senderSockAddr, receivedPacket); diff --git a/examples/editModels.js b/examples/editModels.js index ecf398edfa..384d2f75a8 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -370,7 +370,7 @@ function moveOverlays() { toolsX = windowDimensions.x - 8 - toolWidth; toolsY = (windowDimensions.y - toolsHeight) / 2; - Overlays.addOverlay(firstModel, { + Overlays.editOverlay(firstModel, { x: toolsX, y: toolsY + ((toolHeight + toolVerticalSpacing) * 0), width: toolWidth, height: toolHeight, }); } diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 287744eba2..56078c1a8d 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -131,6 +131,20 @@ void DatagramProcessor::processDatagrams() { break; } + case PacketTypeMuteEnvironment: { + glm::vec3 position; + float radius; + + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); + memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); + memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); + + if (glm::distance(Application::getInstance()->getAvatar()->getPosition(), position) < radius + && !Application::getInstance()->getAudio()->getMuted()) { + Application::getInstance()->getAudio()->toggleMute(); + } + break; + } default: nodeList->processNodeData(senderSockAddr, incomingPacket); break; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 13b72bcdb3..0587e979f6 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -68,6 +68,7 @@ const float DEFAULT_FACESHIFT_EYE_DEFLECTION = 0.25f; const float DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER = 1.0f; const int ONE_SECOND_OF_FRAMES = 60; const int FIVE_SECONDS_OF_FRAMES = 5 * ONE_SECOND_OF_FRAMES; +const float MUTE_RADIUS = 50; Menu::Menu() : _actionHash(), @@ -397,6 +398,11 @@ Menu::Menu() : false, appInstance->getAudio(), SLOT(toggleMute())); + addActionToQMenuAndActionHash(audioDebugMenu, + MenuOption::MuteEnvironment, + 0, + this, + SLOT(muteEnvironment())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioToneInjection, 0, false, @@ -1000,6 +1006,30 @@ void Menu::multipleDestinationsDecision(const QJsonObject& userData, const QJson disconnect(manager, &LocationManager::multipleDestinationsFound, this, &Menu::multipleDestinationsDecision); } +void Menu::muteEnvironment() { + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); + int packetSize = headerSize + sizeof(glm::vec3) + sizeof(float); + + glm::vec3 position = Application::getInstance()->getAvatar()->getPosition(); + + char* packet = (char*)malloc(packetSize); + populatePacketHeader(packet, PacketTypeMuteEnvironment); + memcpy(packet + headerSize, &position, sizeof(glm::vec3)); + memcpy(packet + headerSize + sizeof(glm::vec3), &MUTE_RADIUS, sizeof(float)); + + QByteArray mutePacket(packet, packetSize); + + // grab our audio mixer from the NodeList, if it exists + SharedNodePointer audioMixer = NodeList::getInstance()->soloNodeOfType(NodeType::AudioMixer); + + if (audioMixer) { + // send off this mute packet + NodeList::getInstance()->writeDatagram(mutePacket, audioMixer); + } + + free(packet); +} + void Menu::goToLocation() { MyAvatar* myAvatar = Application::getInstance()->getAvatar(); glm::vec3 avatarPos = myAvatar->getPosition(); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 723d320905..d1097929f7 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -191,6 +191,7 @@ private slots: void audioMuteToggled(); void namedLocationCreated(LocationManager::NamedLocationCreateResponse response); void multipleDestinationsDecision(const QJsonObject& userData, const QJsonObject& placeData); + void muteEnvironment(); private: static Menu* _instance; @@ -339,6 +340,7 @@ namespace MenuOption { const QString Models = "Models"; const QString MoveWithLean = "Move with Lean"; const QString MuteAudio = "Mute Microphone"; + const QString MuteEnvironment = "Mute Environment"; const QString NameLocation = "Name this location"; const QString NewVoxelCullingMode = "New Voxel Culling Mode"; const QString OctreeStats = "Voxel and Particle Statistics"; diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 844fce77fe..d5b1e8301c 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -39,7 +39,7 @@ enum PacketType { PacketTypeRequestAssignment, PacketTypeCreateAssignment, PacketTypeDomainOAuthRequest, - PacketTypeDataServerGet, // reusable + PacketTypeMuteEnvironment, PacketTypeDataServerSend, // reusable PacketTypeDataServerConfirm, PacketTypeVoxelQuery,