diff --git a/audio-mixer/src/InjectedAudioRingBuffer.cpp b/audio-mixer/src/InjectedAudioRingBuffer.cpp index 9a2fa31b65..91ed24c1a3 100644 --- a/audio-mixer/src/InjectedAudioRingBuffer.cpp +++ b/audio-mixer/src/InjectedAudioRingBuffer.cpp @@ -6,6 +6,8 @@ // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // +#include + #include "InjectedAudioRingBuffer.h" InjectedAudioRingBuffer::InjectedAudioRingBuffer() : @@ -14,4 +16,26 @@ InjectedAudioRingBuffer::InjectedAudioRingBuffer() : _streamIdentifier() { +} + +int InjectedAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { + unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_HEADER_INJECT_AUDIO); + + // pull stream identifier from the packet + memcpy(&_streamIdentifier, currentBuffer, sizeof(_streamIdentifier)); + currentBuffer += sizeof(_streamIdentifier); + + // use parsePositionalData in parent PostionalAudioRingBuffer class to pull common positional data + currentBuffer += parsePositionalData(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); + + // pull out the radius for this injected source - if it's zero this is a point source + memcpy(&_radius, currentBuffer, sizeof(_radius)); + currentBuffer += sizeof(_radius); + + unsigned int attenuationByte = *(currentBuffer++); + _attenuationRatio = attenuationByte / MAX_INJECTOR_VOLUME; + + currentBuffer += parseAudioSamples(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); + + return currentBuffer - sourceBuffer; } \ No newline at end of file diff --git a/audio-mixer/src/InjectedAudioRingBuffer.h b/audio-mixer/src/InjectedAudioRingBuffer.h index b49b7a2994..f5caef5f75 100644 --- a/audio-mixer/src/InjectedAudioRingBuffer.h +++ b/audio-mixer/src/InjectedAudioRingBuffer.h @@ -17,6 +17,8 @@ class InjectedAudioRingBuffer : public PositionalAudioRingBuffer { public: InjectedAudioRingBuffer(); + int parseData(unsigned char* sourceBuffer, int numBytes); + float getRadius() const { return _radius; } float getAttenuationRatio() const { return _attenuationRatio; } const unsigned char* getStreamIdentifier() const { return _streamIdentifier; } diff --git a/audio-mixer/src/PositionalAudioRingBuffer.cpp b/audio-mixer/src/PositionalAudioRingBuffer.cpp index 6dc21ec429..5cd856d8c1 100644 --- a/audio-mixer/src/PositionalAudioRingBuffer.cpp +++ b/audio-mixer/src/PositionalAudioRingBuffer.cpp @@ -6,6 +6,8 @@ // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // +#include + #include "PositionalAudioRingBuffer.h" PositionalAudioRingBuffer::PositionalAudioRingBuffer() : @@ -18,6 +20,33 @@ PositionalAudioRingBuffer::PositionalAudioRingBuffer() : } +int PositionalAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { + unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_HEADER); + currentBuffer += parsePositionalData(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); + currentBuffer += parseAudioSamples(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); + + return currentBuffer - sourceBuffer; +} + +int PositionalAudioRingBuffer::parsePositionalData(unsigned char* sourceBuffer, int numBytes) { + unsigned char* currentBuffer = sourceBuffer; + + memcpy(&_position, currentBuffer, sizeof(_position)); + currentBuffer += sizeof(_position); + + memcpy(&_orientation, sourceBuffer, sizeof(_orientation)); + currentBuffer += sizeof(_orientation); + + // if this agent sent us a NaN for first float in orientation then don't consider this good audio and bail + if (std::isnan(_orientation.x)) { + _endOfLastWrite = _nextOutput = _buffer; + _isStarted = false; + return 0; + } + + return currentBuffer - sourceBuffer; +} + bool PositionalAudioRingBuffer::shouldBeAddedToMix(int numJitterBufferSamples) { if (_endOfLastWrite) { if (!_isStarted && diffLastWriteNextOutput() <= BUFFER_LENGTH_SAMPLES_PER_CHANNEL + numJitterBufferSamples) { diff --git a/audio-mixer/src/PositionalAudioRingBuffer.h b/audio-mixer/src/PositionalAudioRingBuffer.h index e23263223a..567c6cbf78 100644 --- a/audio-mixer/src/PositionalAudioRingBuffer.h +++ b/audio-mixer/src/PositionalAudioRingBuffer.h @@ -17,6 +17,9 @@ class PositionalAudioRingBuffer : public AudioRingBuffer { public: PositionalAudioRingBuffer(); + int parseData(unsigned char* sourceBuffer, int numBytes); + int parsePositionalData(unsigned char* sourceBuffer, int numBytes); + bool shouldBeAddedToMix(int numJitterBufferSamples); bool wasAddedToMix() const { return _wasAddedToMix; } diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 11977bcd7f..159f984d1c 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -142,9 +142,6 @@ int audioCallback (const void* inputBuffer, memcpy(currentPacketPtr, &headPosition, sizeof(headPosition)); currentPacketPtr += (sizeof(headPosition)); - // tell the mixer not to add additional attenuation to our source - *(currentPacketPtr++) = 255; - // memcpy our orientation memcpy(currentPacketPtr, &headOrientation, sizeof(headOrientation)); currentPacketPtr += sizeof(headOrientation); diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 5e57016def..86e6f8958b 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -15,8 +15,6 @@ #include "AudioInjector.h" -const int MAX_INJECTOR_VOLUME = 0xFF; - AudioInjector::AudioInjector(const char* filename) : _position(0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f), @@ -72,20 +70,17 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination timeval startTime; // calculate the number of bytes required for additional data - int leadingBytes = sizeof(PACKET_HEADER) + sizeof(INJECT_AUDIO_AT_POINT_COMMAND) + sizeof(_streamIdentifier) - + sizeof(_position) + sizeof(_orientation) + sizeof(_volume); - - if (_radius > 0) { - // we'll need 4 extra bytes if the cube side length is being sent as well - leadingBytes += sizeof(_radius); - } + int leadingBytes = sizeof(PACKET_HEADER) + + sizeof(_streamIdentifier) + + sizeof(_position) + + sizeof(_orientation) + + sizeof(_radius) + + sizeof(_volume); unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes]; dataPacket[0] = PACKET_HEADER_INJECT_AUDIO; - // add the correct command for point source or cube of sound - dataPacket[1] = (_radius > 0) ? INJECT_AUDIO_AT_CUBE_COMMAND : INJECT_AUDIO_AT_POINT_COMMAND; - unsigned char *currentPacketPtr = dataPacket + sizeof(PACKET_HEADER) + sizeof(INJECT_AUDIO_AT_POINT_COMMAND); + unsigned char *currentPacketPtr = dataPacket + sizeof(PACKET_HEADER_INJECT_AUDIO); // copy the identifier for this injector memcpy(currentPacketPtr, &_streamIdentifier, sizeof(_streamIdentifier)); @@ -94,19 +89,15 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination memcpy(currentPacketPtr, &_position, sizeof(_position)); currentPacketPtr += sizeof(_position); - if (_radius > 0) { - // if we have a cube half height we need to send it here - // this tells the mixer how much volume the injected audio will occupy - memcpy(currentPacketPtr, &_radius, sizeof(_radius)); - currentPacketPtr += sizeof(_radius); - } - - *currentPacketPtr = _volume; - currentPacketPtr++; - memcpy(currentPacketPtr, &_orientation, sizeof(_orientation)); currentPacketPtr += sizeof(_orientation); + memcpy(currentPacketPtr, &_radius, sizeof(_radius)); + currentPacketPtr += sizeof(_radius); + + *currentPacketPtr = _volume; + currentPacketPtr++; + gettimeofday(&startTime, NULL); int nextFrame = 0; diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 409f046273..6b61b2540b 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -17,8 +17,8 @@ #include "AudioRingBuffer.h" const int STREAM_IDENTIFIER_NUM_BYTES = 8; -const char INJECT_AUDIO_AT_POINT_COMMAND = 'P'; -const char INJECT_AUDIO_AT_CUBE_COMMAND = 'C'; + +const int MAX_INJECTOR_VOLUME = 0xFF; const float INJECT_INTERVAL_USECS = (BUFFER_LENGTH_SAMPLES_PER_CHANNEL / SAMPLE_RATE) * 1000000;