diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 6c326b3d28..2f60640da3 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -89,10 +89,13 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { // grab the stream identifier for this injected audio int bytesBeforeStreamIdentifier = numBytesForPacketHeader(packet) + sizeof(quint16); QUuid streamIdentifier = QUuid::fromRfc4122(packet.mid(bytesBeforeStreamIdentifier, NUM_BYTES_RFC4122_UUID)); + int bytesBeforeStereoIdentifier = bytesBeforeStreamIdentifier + NUM_BYTES_RFC4122_UUID; + bool isStereo; + QDataStream(packet.mid(bytesBeforeStereoIdentifier)) >> isStereo; if (!_audioStreams.contains(streamIdentifier)) { // we don't have this injected stream yet, so add it - _audioStreams.insert(streamIdentifier, matchingStream = new InjectedAudioStream(streamIdentifier, AudioMixer::getStreamSettings())); + _audioStreams.insert(streamIdentifier, matchingStream = new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings())); } else { matchingStream = _audioStreams.value(streamIdentifier); } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 10623651a0..d5e1c59d7a 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -33,7 +33,8 @@ AudioInjector::AudioInjector(QObject* parent) : AudioInjector::AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions) : _sound(sound), _options(injectorOptions), - _shouldStop(false) + _shouldStop(false), + _currentSendPosition(0) { } @@ -44,9 +45,13 @@ void AudioInjector::setOptions(AudioInjectorOptions& options) { const uchar MAX_INJECTOR_VOLUME = 0xFF; void AudioInjector::injectAudio() { - QByteArray soundByteArray = _sound->getByteArray(); + if (_currentSendPosition < 0 || + _currentSendPosition >= soundByteArray.size()) { + _currentSendPosition = 0; + } + // make sure we actually have samples downloaded to inject if (soundByteArray.size()) { // give our sample byte array to the local audio interface, if we have it, so it can be handled locally diff --git a/libraries/audio/src/InjectedAudioStream.cpp b/libraries/audio/src/InjectedAudioStream.cpp index 0cc13eae05..873b32cc40 100644 --- a/libraries/audio/src/InjectedAudioStream.cpp +++ b/libraries/audio/src/InjectedAudioStream.cpp @@ -19,8 +19,8 @@ #include "InjectedAudioStream.h" -InjectedAudioStream::InjectedAudioStream(const QUuid& streamIdentifier, const InboundAudioStream::Settings& settings) : - PositionalAudioStream(PositionalAudioStream::Injector, false, settings), +InjectedAudioStream::InjectedAudioStream(const QUuid& streamIdentifier, const bool isStereo, const InboundAudioStream::Settings& settings) : + PositionalAudioStream(PositionalAudioStream::Injector, isStereo, settings), _streamIdentifier(streamIdentifier), _radius(0.0f), _attenuationRatio(0) @@ -39,9 +39,14 @@ int InjectedAudioStream::parseStreamProperties(PacketType type, // skip the stream identifier packetStream.skipRawData(NUM_BYTES_RFC4122_UUID); - packetStream >> _isStereo; - if (isStereo()) { - _ringBuffer.resizeForFrameSize(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO); + // read the channel flag + bool isStereo; + packetStream >> isStereo; + + // if isStereo value has changed, restart the ring buffer with new frame size + if (isStereo != _isStereo) { + _ringBuffer.resizeForFrameSize(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL); + _isStereo = isStereo; } // pull the loopback flag and set our boolean diff --git a/libraries/audio/src/InjectedAudioStream.h b/libraries/audio/src/InjectedAudioStream.h index f3840b1029..60c36dfb12 100644 --- a/libraries/audio/src/InjectedAudioStream.h +++ b/libraries/audio/src/InjectedAudioStream.h @@ -18,7 +18,7 @@ class InjectedAudioStream : public PositionalAudioStream { public: - InjectedAudioStream(const QUuid& streamIdentifier, const InboundAudioStream::Settings& settings); + InjectedAudioStream(const QUuid& streamIdentifier, const bool isStereo, const InboundAudioStream::Settings& settings); float getRadius() const { return _radius; } float getAttenuationRatio() const { return _attenuationRatio; }