diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index eebd2a81e7..9e6ec1209c 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -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; } } @@ -529,14 +541,16 @@ void Agent::processAgentAvatarAudio() { return; } + // write the codec + audioPacket->writeString(_selectedCodecName); + // write the number of silent samples so the audio-mixer can uphold timing - audioPacket->writePrimitive(AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL); + audioPacket->writePrimitive(numAvailableSamples); // use the orientation and position of this avatar for the source of this audio audioPacket->writePrimitive(scriptedAvatar->getPosition()); glm::quat headOrientation = scriptedAvatar->getHeadOrientation(); audioPacket->writePrimitive(headOrientation); - } else if (nextSoundOutput) { // write the codec @@ -550,30 +564,28 @@ void Agent::processAgentAvatarAudio() { glm::quat headOrientation = scriptedAvatar->getHeadOrientation(); audioPacket->writePrimitive(headOrientation); + QByteArray decodedBuffer(reinterpret_cast(nextSoundOutput), numAvailableSamples*sizeof(int16_t)); + QByteArray encodedBuffer; // encode it if(_encoder) { - QByteArray decodedBuffer(reinterpret_cast(nextSoundOutput), numAvailableSamples*sizeof(int16_t)); - QByteArray encodedBuffer; _encoder->encode(decodedBuffer, encodedBuffer); - audioPacket->write(encodedBuffer.data(), encodedBuffer.size()); - } else { - audioPacket->write(reinterpret_cast(nextSoundOutput), numAvailableSamples*sizeof(int16_t)); + } else { + encodedBuffer = decodedBuffer; } - + audioPacket->write(encodedBuffer.constData(), encodedBuffer.size()); } - // write audio packet to AudioMixer nodes + // write audio packet to AudioMixer nodes auto nodeList = DependencyManager::get(); nodeList->eachNode([this, &nodeList, &audioPacket](const SharedNodePointer& node) { // only send to nodes of type AudioMixer if (node->getType() == NodeType::AudioMixer) { - // pack sequence number - quint16 sequence = _outgoingScriptAudioSequenceNumbers[node->getUUID()]++; - audioPacket->seek(0); - audioPacket->writePrimitive(sequence); - - // send audio packet - nodeList->sendUnreliablePacket(*audioPacket, *node); + // pack sequence number + quint16 sequence = _outgoingScriptAudioSequenceNumbers[node->getUUID()]++; + audioPacket->seek(0); + audioPacket->writePrimitive(sequence); + // send audio packet + nodeList->sendUnreliablePacket(*audioPacket, *node); } }); } 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