From 7d608ba5925001be0c2a16f9b27425a20527adbb Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Sun, 10 Jul 2016 21:01:20 -0700 Subject: [PATCH] groundwork for injector support --- assignment-client/src/audio/AudioMixer.cpp | 5 ---- .../src/audio/AudioMixerClientData.cpp | 26 ++++++++++++++++++- libraries/audio/src/AudioInjector.cpp | 9 ++++++- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 2f1a5de309..720f9d52de 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -535,11 +535,6 @@ void AudioMixer::handleNegotiateAudioFormat(QSharedPointer mess qDebug() << "selectedCodecName:" << selectedCodecName; - auto avatarAudioStream = clientData->getAvatarAudioStream(); - if (avatarAudioStream) { - avatarAudioStream->setupCodec(selectedCodec, selectedCodecName, AudioConstants::MONO); - } - auto replyPacket = NLPacket::create(PacketType::SelectedAudioFormat); // write them to our packet diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index c733683e5a..182f443225 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -142,9 +142,16 @@ int AudioMixerClientData::parseData(ReceivedMessage& message) { if (streamIt == _audioStreams.end()) { // we don't have this injected stream yet, so add it + auto injectorStream = new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings()); + +#if INJECTORS_SUPPORT_CODECS + injectorStream->setupCodec(_codec, _selectedCodecName, isStereo ? AudioConstants::STEREO : AudioConstants::MONO); + qDebug() << "creating new injectorStream... codec:" << _selectedCodecName; +#endif + auto emplaced = _audioStreams.emplace( streamIdentifier, - std::unique_ptr { new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings()) } + std::unique_ptr { injectorStream } ); streamIt = emplaced.first; @@ -343,6 +350,23 @@ void AudioMixerClientData::setupCodec(CodecPluginPointer codec, const QString& c _selectedCodecName = codecName; _encoder = codec->createEncoder(AudioConstants::SAMPLE_RATE, AudioConstants::STEREO); _decoder = codec->createDecoder(AudioConstants::SAMPLE_RATE, AudioConstants::MONO); + + auto avatarAudioStream = getAvatarAudioStream(); + if (avatarAudioStream) { + avatarAudioStream->setupCodec(codec, codecName, AudioConstants::MONO); + } + +#if INJECTORS_SUPPORT_CODECS + // fixup codecs for any active injectors... + auto it = _audioStreams.begin(); + while (it != _audioStreams.end()) { + SharedStreamPointer stream = it->second; + if (stream->getType() == PositionalAudioStream::Injector) { + stream->setupCodec(codec, codecName, stream->isStereo() ? AudioConstants::STEREO : AudioConstants::MONO); + } + ++it; + } +#endif } void AudioMixerClientData::cleanupCodec() { diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 878a4c627c..fee33dcb92 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -289,16 +289,23 @@ int64_t AudioInjector::injectNextFrame() { _currentPacket->seek(audioDataOffset); + // This code is copying bytes from the _audioData directly into the packet, handling looping appropriately. + // Might be a reasonable place to do the encode step here. + QByteArray decodedAudio; while (totalBytesLeftToCopy > 0) { int bytesToCopy = std::min(totalBytesLeftToCopy, _audioData.size() - _currentSendOffset); - _currentPacket->write(_audioData.data() + _currentSendOffset, bytesToCopy); + decodedAudio.append(_audioData.data() + _currentSendOffset, bytesToCopy); _currentSendOffset += bytesToCopy; totalBytesLeftToCopy -= bytesToCopy; if (_options.loop && _currentSendOffset >= _audioData.size()) { _currentSendOffset = 0; } } + // FIXME -- good place to call codec encode here. We need to figure out how to tell the AudioInjector which + // codec to use... possible through AbstractAudioInterface. + QByteArray encodedAudio = decodedAudio; + _currentPacket->write(encodedAudio.data(), encodedAudio.size()); // set the correct size used for this packet _currentPacket->setPayloadSize(_currentPacket->pos());