From d242f5d5d980f76d54baf733f557172bf42816c1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 14:35:03 -0700 Subject: [PATCH] repair AudioMixerClientData parseData --- .../src/audio/AudioMixerClientData.cpp | 35 +++++++++++-------- .../src/audio/AudioMixerClientData.h | 4 +-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 13cfe4d1a0..59f5982159 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -49,20 +49,18 @@ AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() const { return NULL; } -int AudioMixerClientData::parseData(const QByteArray& packet) { - PacketType::Value packetType = packetTypeForPacket(packet); +int AudioMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingNode) { + PacketType::Value packetType = packet.getType(); + if (packetType == PacketType::AudioStreamStats) { - const char* dataAt = packet.data(); - // skip over header, appendFlag, and num stats packed - dataAt += (numBytesForPacketHeader(packet) + sizeof(quint8) + sizeof(quint16)); + packet.seek(sizeof(quint8) + sizeof(quint16)); // read the downstream audio stream stats - memcpy(&_downstreamAudioStreamStats, dataAt, sizeof(AudioStreamStats)); - dataAt += sizeof(AudioStreamStats); + packet.readPrimitive(&_downstreamAudioStreamStats); - return dataAt - packet.data(); + return packet.pos(); } else { PositionalAudioStream* matchingStream = NULL; @@ -76,8 +74,11 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { // we don't have a mic stream yet, so add it // read the channel flag to see if our stream is stereo or not - const char* channelFlagAt = packet.constData() + numBytesForPacketHeader(packet) + sizeof(quint16); - quint8 channelFlag = *(reinterpret_cast(channelFlagAt)); + packet.seek(sizeof(quint16)); + + quint8 channelFlag; + packet.readPrimitive(&channelFlag); + bool isStereo = channelFlag == 1; _audioStreams.insert(nullUUID, matchingStream = new AvatarAudioStream(isStereo, AudioMixer::getStreamSettings())); @@ -88,20 +89,24 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { // this is injected audio // 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; + packet.seek(sizeof(quint16)); + QUuid streamIdentifier = QUuid::fromRfc4122(packet.read(NUM_BYTES_RFC4122_UUID)); + bool isStereo; - QDataStream(packet.mid(bytesBeforeStereoIdentifier)) >> isStereo; + packet.readPrimitive(&isStereo); if (!_audioStreams.contains(streamIdentifier)) { // we don't have this injected stream yet, so add it - _audioStreams.insert(streamIdentifier, matchingStream = new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings())); + _audioStreams.insert(streamIdentifier, + matchingStream = new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings())); } else { matchingStream = _audioStreams.value(streamIdentifier); } } + // seek to the beginning of the packet so that the next reader is in the right spot + packet.seek(0); + return matchingStream->parseData(packet); } return 0; diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 4f3f8e360d..99f8683b70 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -25,7 +25,7 @@ class PerListenerSourcePairData { public: - PerListenerSourcePairData() { + PerListenerSourcePairData() { _penumbraFilter.initialize(AudioConstants::SAMPLE_RATE, AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / 2); }; AudioFilterHSF1s& getPenumbraFilter() { return _penumbraFilter; } @@ -42,7 +42,7 @@ public: const QHash& getAudioStreams() const { return _audioStreams; } AvatarAudioStream* getAvatarAudioStream() const; - int parseData(const QByteArray& packet); + int parseData(NLPacket& packet, QSharedPointer sendingNode); void checkBuffersBeforeFrameSend();