From 6a61762659e8578b3072d9189311a4d2cfe5fb93 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Wed, 26 Oct 2016 17:41:34 -0700 Subject: [PATCH] First try AudioMixer has same issue transitioning from silence to encoded audio and back, it seems. This makes that go away, but I don't like it. Better to support a flush function in the encoder but for now lets do this and be sure it is the entire issue. --- assignment-client/src/audio/AudioMixer.cpp | 6 ++++++ assignment-client/src/audio/AudioMixerClientData.cpp | 10 ++++++++++ assignment-client/src/audio/AudioMixerClientData.h | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 0252c037bf..e580c62905 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -819,6 +819,9 @@ void AudioMixer::broadcastMixes() { std::unique_ptr mixPacket; if (mixHasAudio) { + // may need to flush, this checks + nodeData->flushEncoder(); + int mixPacketBytes = sizeof(quint16) + AudioConstants::MAX_CODEC_NAME_LENGTH_ON_WIRE + AudioConstants::NETWORK_FRAME_BYTES_STEREO; mixPacket = NLPacket::create(PacketType::MixedAudio, mixPacketBytes); @@ -852,6 +855,9 @@ void AudioMixer::broadcastMixes() { // pack number of silent audio samples quint16 numSilentSamples = AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; mixPacket->writePrimitive(numSilentSamples); + + // we will need to flush encoder since we are sending silent packets outside it + nodeData->shouldFlushEncoder(); } // Send audio environment diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 1eb36cd8a7..a0b96ff39b 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -366,6 +366,16 @@ void AudioMixerClientData::sendSelectAudioFormat(SharedNodePointer node, const Q nodeList->sendPacket(std::move(replyPacket), *node); } +void AudioMixerClientData::flushEncoder() { + static QByteArray zeros(AudioConstants::NETWORK_FRAME_BYTES_STEREO, 0); + static QByteArray encodedZeros; + if (_shouldFlushEncoder) { + _shouldFlushEncoder = false; + if (_encoder) { + _encoder->encode(zeros, encodedZeros); + } + } +} void AudioMixerClientData::setupCodec(CodecPluginPointer codec, const QString& codecName) { cleanupCodec(); // cleanup any previously allocated coders first diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 2f8ff4d049..51f06b41c4 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -77,6 +77,8 @@ public: encodedBuffer = decodedBuffer; } } + void flushEncoder(); + void shouldFlushEncoder() { _shouldFlushEncoder = true; } QString getCodecName() { return _selectedCodecName; } @@ -105,6 +107,8 @@ private: QString _selectedCodecName; Encoder* _encoder{ nullptr }; // for outbound mixed stream Decoder* _decoder{ nullptr }; // for mic stream + + bool _shouldFlushEncoder { false }; }; #endif // hifi_AudioMixerClientData_h