From 9cbc53abc30ea3cd7ed1329ba890a4896113bfda Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 16 Sep 2014 13:06:46 -0700 Subject: [PATCH] pack position and orientation in silent frames --- .../src/audio/AvatarAudioStream.cpp | 46 +++++++++++-------- interface/src/Audio.cpp | 9 ++++ libraries/audio/src/InboundAudioStream.cpp | 10 +--- libraries/networking/src/PacketHeaders.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 5 ++ 5 files changed, 45 insertions(+), 27 deletions(-) diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index c7534d0551..90dcefa09d 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -19,28 +19,38 @@ AvatarAudioStream::AvatarAudioStream(bool isStereo, const InboundAudioStream::Se } int AvatarAudioStream::parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { - - _shouldLoopbackForNode = (type == PacketTypeMicrophoneAudioWithEcho); - int readBytes = 0; - // read the channel flag - quint8 channelFlag = packetAfterSeqNum.at(readBytes); - bool isStereo = channelFlag == 1; - readBytes += sizeof(quint8); + if (type == PacketTypeSilentAudioFrame) { + const char* dataAt = packetAfterSeqNum.constData(); + quint16 numSilentSamples = *(reinterpret_cast(dataAt)); + readBytes += sizeof(quint16); + numAudioSamples = (int)numSilentSamples; - // 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; + // read the positional data + readBytes += parsePositionalData(packetAfterSeqNum.mid(readBytes)); + + } else { + _shouldLoopbackForNode = (type == PacketTypeMicrophoneAudioWithEcho); + + // read the channel flag + quint8 channelFlag = packetAfterSeqNum.at(readBytes); + bool isStereo = channelFlag == 1; + readBytes += sizeof(quint8); + + // 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; + } + + // read the positional data + readBytes += parsePositionalData(packetAfterSeqNum.mid(readBytes)); + + // calculate how many samples are in this packet + int numAudioBytes = packetAfterSeqNum.size() - readBytes; + numAudioSamples = numAudioBytes / sizeof(int16_t); } - - // read the positional data - readBytes += parsePositionalData(packetAfterSeqNum.mid(readBytes)); - - // calculate how many samples are in this packet - int numAudioBytes = packetAfterSeqNum.size() - readBytes; - numAudioSamples = numAudioBytes / sizeof(int16_t); return readBytes; } diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 71b64d7c6e..79704eebf1 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -753,6 +753,15 @@ void Audio::handleAudioInput() { quint16 numSilentSamples = numNetworkSamples; memcpy(currentPacketPtr, &numSilentSamples, sizeof(quint16)); currentPacketPtr += sizeof(quint16); + + // memcpy the three float positions + memcpy(currentPacketPtr, &headPosition, sizeof(headPosition)); + currentPacketPtr += (sizeof(headPosition)); + + // memcpy our orientation + memcpy(currentPacketPtr, &headOrientation, sizeof(headOrientation)); + currentPacketPtr += sizeof(headOrientation); + } else { // set the mono/stereo byte *currentPacketPtr++ = isStereo; diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index cc474ea491..dda57d87da 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -109,14 +109,8 @@ int InboundAudioStream::parseData(const QByteArray& packet) { int networkSamples; - if (packetType == PacketTypeSilentAudioFrame) { - quint16 numSilentSamples = *(reinterpret_cast(dataAt)); - readBytes += sizeof(quint16); - networkSamples = (int)numSilentSamples; - } else { - // parse the info after the seq number and before the audio data (the stream properties) - readBytes += parseStreamProperties(packetType, packet.mid(readBytes), networkSamples); - } + // parse the info after the seq number and before the audio data (the stream properties) + readBytes += parseStreamProperties(packetType, packet.mid(readBytes), networkSamples); // handle this packet based on its arrival status. switch (arrivalInfo._status) { diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 5513c09a61..f04e398b98 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -51,7 +51,7 @@ PacketVersion versionForPacketType(PacketType type) { case PacketTypeMicrophoneAudioWithEcho: return 2; case PacketTypeSilentAudioFrame: - return 3; + return 4; case PacketTypeMixedAudio: return 1; case PacketTypeAvatarData: diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d85d201d88..0f285a0df3 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -505,6 +505,11 @@ void ScriptEngine::run() { // write the number of silent samples so the audio-mixer can uphold timing packetStream.writeRawData(reinterpret_cast(&SCRIPT_AUDIO_BUFFER_SAMPLES), sizeof(int16_t)); + // use the orientation and position of this avatar for the source of this audio + packetStream.writeRawData(reinterpret_cast(&_avatarData->getPosition()), sizeof(glm::vec3)); + glm::quat headOrientation = _avatarData->getHeadOrientation(); + packetStream.writeRawData(reinterpret_cast(&headOrientation), sizeof(glm::quat)); + } else if (nextSoundOutput) { // assume scripted avatar audio is mono and set channel flag to zero packetStream << (quint8)0;