From ca3a194454fae57465d280034ff7b13e92833f78 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 2 Aug 2016 11:39:22 -0700 Subject: [PATCH] implment coded renegotiation in client if for some reason unexpected audio codecs come in to inbound stream --- .../src/audio/AudioMixerClientData.cpp | 7 ++++++- .../src/audio/AudioMixerClientData.h | 1 + libraries/audio-client/src/AudioClient.cpp | 17 ++++++++++++++++- libraries/audio-client/src/AudioClient.h | 2 ++ libraries/audio/src/InboundAudioStream.cpp | 2 +- libraries/audio/src/InboundAudioStream.h | 2 +- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 85491537a2..0a45137da6 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -113,7 +113,7 @@ int AudioMixerClientData::parseData(ReceivedMessage& message) { avatarAudioStream->setupCodec(_codec, _selectedCodecName, AudioConstants::MONO); qDebug() << "creating new AvatarAudioStream... codec:" << _selectedCodecName; - connect(avatarAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioMixerClientData::sendSelectAudioFormat); + connect(avatarAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioMixerClientData::handleMismatchAudioFormat); auto emplaced = _audioStreams.emplace( QUuid(), @@ -345,6 +345,11 @@ QJsonObject AudioMixerClientData::getAudioStreamStats() { return result; } +void AudioMixerClientData::handleMismatchAudioFormat(SharedNodePointer node, const QString& currentCodec, const QString& recievedCodec) { + qDebug() << __FUNCTION__ << "sendingNode:" << *node << "currentCodec:" << currentCodec << "recievedCodec:" << recievedCodec; + sendSelectAudioFormat(node, currentCodec); +} + void AudioMixerClientData::sendSelectAudioFormat(SharedNodePointer node, const QString& selectedCodecName) { auto replyPacket = NLPacket::create(PacketType::SelectedAudioFormat); replyPacket->writeString(selectedCodecName); diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index babfae3539..106841ee03 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -84,6 +84,7 @@ signals: void injectorStreamFinished(const QUuid& streamIdentifier); public slots: + void handleMismatchAudioFormat(SharedNodePointer node, const QString& currentCodec, const QString& recievedCodec); void sendSelectAudioFormat(SharedNodePointer node, const QString& selectedCodecName); private: diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index ac42de903d..398f4bb27c 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -119,6 +119,9 @@ AudioClient::AudioClient() : this, &AudioClient::processReceivedSamples, Qt::DirectConnection); connect(this, &AudioClient::changeDevice, this, [=](const QAudioDeviceInfo& outputDeviceInfo) { switchOutputToAudioDevice(outputDeviceInfo); }); + connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat); + + _inputDevices = getDeviceNames(QAudio::AudioInput); _outputDevices = getDeviceNames(QAudio::AudioOutput); @@ -147,6 +150,12 @@ AudioClient::~AudioClient() { } } +void AudioClient::handleMismatchAudioFormat(SharedNodePointer node, const QString& currentCodec, const QString& recievedCodec) { + qDebug() << __FUNCTION__ << "sendingNode:" << *node << "currentCodec:" << currentCodec << "recievedCodec:" << recievedCodec; + selectAudioFormat(recievedCodec); +} + + void AudioClient::reset() { _receivedAudioStream.reset(); _stats.reset(); @@ -532,7 +541,13 @@ void AudioClient::negotiateAudioFormat() { } void AudioClient::handleSelectedAudioFormat(QSharedPointer message) { - _selectedCodecName = message->readString(); + QString selectedCodecName = message->readString(); + selectAudioFormat(selectedCodecName); +} + +void AudioClient::selectAudioFormat(const QString& selectedCodecName) { + + _selectedCodecName = selectedCodecName; qDebug() << "Selected Codec:" << _selectedCodecName; diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 472092163b..171014edda 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -104,6 +104,7 @@ public: }; void negotiateAudioFormat(); + void selectAudioFormat(const QString& selectedCodecName); const MixedProcessedAudioStream& getReceivedAudioStream() const { return _receivedAudioStream; } MixedProcessedAudioStream& getReceivedAudioStream() { return _receivedAudioStream; } @@ -153,6 +154,7 @@ public slots: void handleNoisyMutePacket(QSharedPointer message); void handleMuteEnvironmentPacket(QSharedPointer message); void handleSelectedAudioFormat(QSharedPointer message); + void handleMismatchAudioFormat(SharedNodePointer node, const QString& currentCodec, const QString& recievedCodec); void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); } void handleAudioInput(); diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index de05abaa88..b908f57439 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -147,7 +147,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { writeDroppableSilentSamples(networkSamples); // inform others of the mismatch auto sendingNode = DependencyManager::get()->nodeWithUUID(message.getSourceID()); - emit mismatchedAudioCodec(sendingNode, _selectedCodecName); + emit mismatchedAudioCodec(sendingNode, _selectedCodecName, codecInPacket); } } break; diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index af79ff6164..1290d43ef8 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -182,7 +182,7 @@ public: void cleanupCodec(); signals: - void mismatchedAudioCodec(SharedNodePointer sendingNode, const QString& desiredCodec); + void mismatchedAudioCodec(SharedNodePointer sendingNode, const QString& currentCodec, const QString& recievedCodec); public slots: /// This function should be called every second for all the stats to function properly. If dynamic jitter buffers