diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 5c97385ea4..d283262302 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -349,7 +349,7 @@ void Agent::executeScript() { audioTransform.setRotation(scriptedAvatar->getOrientation()); AbstractAudioInterface::emitAudioPacket(audio.data(), audio.size(), audioSequenceNumber, audioTransform, PacketType::MicrophoneAudioNoEcho); }); - + auto avatarHashMap = DependencyManager::set(); _scriptEngine->registerGlobalObject("AvatarList", avatarHashMap.data()); @@ -361,10 +361,6 @@ void Agent::executeScript() { // register ourselves to the script engine _scriptEngine->registerGlobalObject("Agent", this); - // FIXME -we shouldn't be calling this directly, it's normally called by run(), not sure why - // viewers would need this called. - //_scriptEngine->init(); // must be done before we set up the viewers - _scriptEngine->registerGlobalObject("SoundCache", DependencyManager::get().data()); QScriptValue webSocketServerConstructorValue = _scriptEngine->newFunction(WebSocketServerClass::constructor); @@ -478,9 +474,24 @@ void Agent::processAgentAvatar() { nodeList->broadcastToNodes(std::move(avatarPacket), NodeSet() << NodeType::AvatarMixer); } } +void Agent::flushEncoder() { + _flushEncoder = false; + static QByteArray zeros(AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL, 0); + static QByteArray encodedZeros; + if (_encoder) { + _encoder->encode(zeros, encodedZeros); + } +} void Agent::processAgentAvatarAudio() { if (_isAvatar && (_isListeningToAudioStream || _avatarSound)) { + // after sound is done playing, encoder has a bit of state in it, + // and needs some 0s to forget or you get a little click next time + // you play something + if (_flushEncoder) { + flushEncoder(); + } + // if we have an avatar audio stream then send it out to our audio-mixer auto scriptedAvatar = DependencyManager::get(); bool silentFrame = true; @@ -513,6 +524,7 @@ void Agent::processAgentAvatarAudio() { // and our sent bytes back to zero _avatarSound.clear(); _numAvatarSoundSentBytes = 0; + _flushEncoder = true; } } diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 67dba10de2..b882ac3125 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -81,7 +81,8 @@ signals: private: void negotiateAudioFormat(); void selectAudioFormat(const QString& selectedCodecName); - + void flushEncoder(); + std::unique_ptr _scriptEngine; EntityEditPacketSender _entityEditSender; EntityTreeHeadlessViewer _entityViewer; @@ -107,6 +108,7 @@ private: QString _selectedCodecName; Encoder* _encoder { nullptr }; QThread _avatarAudioTimerThread; + bool _flushEncoder { false }; }; #endif // hifi_Agent_h