diff --git a/injector/src/main.cpp b/injector/src/main.cpp index bf49cb6a99..9d2fa76c39 100644 --- a/injector/src/main.cpp +++ b/injector/src/main.cpp @@ -18,6 +18,7 @@ #include #include #include +#include char EC2_WEST_AUDIO_SERVER[] = "54.241.92.53"; const int AUDIO_UDP_LISTEN_PORT = 55443; @@ -29,7 +30,7 @@ float sleepIntervalMax = 2.00; char *sourceAudioFile = NULL; const char *allowedParameters = ":rb::t::c::a::f:"; float floatArguments[4] = {0.0f, 0.0f, 0.0f, 0.0f}; -unsigned char attenuationModifier = 255; +unsigned char volume = 255; void usage(void) { @@ -80,7 +81,7 @@ bool processParameters(int parameterCount, char* parameterData[]) break; } case 'a': - ::attenuationModifier = atoi(optarg); + ::volume = atoi(optarg); std::cout << "[DEBUG] Attenuation modifier: " << optarg << std::endl; break; default: @@ -110,19 +111,17 @@ int main(int argc, char* argv[]) { exit(-1); } else { AudioInjector injector(sourceAudioFile); - injector.setInjectorSocket(&streamSocket); - injector.setDestinationSocket((sockaddr*) &mixerSocket); - injector.setPosition(::floatArguments); + injector.setPosition(glm::vec3(::floatArguments[0], ::floatArguments[1], ::floatArguments[2])); injector.setBearing(*(::floatArguments + 3)); - injector.setAttenuationModifier(::attenuationModifier); + injector.setVolume(::volume); float delay = 0; int usecDelay = 0; while (true) { - injector.injectAudio(); - + injector.injectAudio(&streamSocket, (sockaddr*) &mixerSocket); + if (!::loopAudio) { delay = randFloatInRange(::sleepIntervalMin, ::sleepIntervalMax); usecDelay = delay * 1000 * 1000; diff --git a/libraries/audio/src/AudioInjectionManager.cpp b/libraries/audio/src/AudioInjectionManager.cpp index b9ca3a4150..ce252afd23 100644 --- a/libraries/audio/src/AudioInjectionManager.cpp +++ b/libraries/audio/src/AudioInjectionManager.cpp @@ -42,49 +42,7 @@ AudioInjector* AudioInjectionManager::injectorWithCapacity(int capacity) { void* AudioInjectionManager::injectAudioViaThread(void* args) { AudioInjector* injector = (AudioInjector*) args; - if (injector->_audioSampleArray) { - injector->setIsInjectingAudio(true); - - timeval startTime; - - // one byte for header, 3 positional floats, 1 bearing float, 1 attenuation modifier byte - int leadingBytes = 1 + (sizeof(float) * 4) + 1; - unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes]; - - dataPacket[0] = PACKET_HEADER_INJECT_AUDIO; - unsigned char *currentPacketPtr = dataPacket + 1; - - memcpy(currentPacketPtr, &injector->getPosition(), sizeof(injector->getPosition())); - currentPacketPtr += sizeof(injector->getPosition()); - - *currentPacketPtr = injector->getVolume(); - currentPacketPtr++; - - memcpy(currentPacketPtr, &injector->_bearing, sizeof(injector->_bearing)); - currentPacketPtr += sizeof(injector->_bearing); - - for (int i = 0; i < injector->_numTotalSamples; i += BUFFER_LENGTH_SAMPLES) { - gettimeofday(&startTime, NULL); - - int numSamplesToCopy = BUFFER_LENGTH_SAMPLES; - - if (injector->_numTotalSamples - i < BUFFER_LENGTH_SAMPLES) { - numSamplesToCopy = injector->_numTotalSamples - i; - memset(currentPacketPtr + numSamplesToCopy, 0, BUFFER_LENGTH_BYTES - (numSamplesToCopy * sizeof(int16_t))); - } - - memcpy(currentPacketPtr, injector->_audioSampleArray + i, numSamplesToCopy * sizeof(int16_t)); - - _injectorSocket->send(&_destinationSocket, dataPacket, sizeof(dataPacket)); - - double usecToSleep = BUFFER_SEND_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&startTime)); - if (usecToSleep > 0) { - usleep(usecToSleep); - } - } - - injector->_isInjectingAudio = false; - } + injector->injectAudio(_injectorSocket, &_destinationSocket); // if this an injector inside the injection manager's array we're responsible for deletion for (int i = 0; i < MAX_CONCURRENT_INJECTORS; i++) { diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 05530cebe3..fa05570d40 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -9,7 +9,9 @@ #include #include -#include "SharedUtil.h" +#include +#include +#include #include "AudioInjector.h" @@ -55,6 +57,52 @@ AudioInjector::~AudioInjector() { delete[] _audioSampleArray; } +void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destinationSocket) { + if (_audioSampleArray) { + _isInjectingAudio = true; + + timeval startTime; + + // one byte for header, 3 positional floats, 1 bearing float, 1 attenuation modifier byte + int leadingBytes = 1 + (sizeof(float) * 4) + 1; + unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes]; + + dataPacket[0] = PACKET_HEADER_INJECT_AUDIO; + unsigned char *currentPacketPtr = dataPacket + 1; + + memcpy(currentPacketPtr, &_position, sizeof(_position)); + currentPacketPtr += sizeof(_position); + + *currentPacketPtr = _volume; + currentPacketPtr++; + + memcpy(currentPacketPtr, &_bearing, sizeof(_bearing)); + currentPacketPtr += sizeof(_bearing); + + for (int i = 0; i < _numTotalSamples; i += BUFFER_LENGTH_SAMPLES) { + gettimeofday(&startTime, NULL); + + int numSamplesToCopy = BUFFER_LENGTH_SAMPLES; + + if (_numTotalSamples - i < BUFFER_LENGTH_SAMPLES) { + numSamplesToCopy = _numTotalSamples - i; + memset(currentPacketPtr + numSamplesToCopy, 0, BUFFER_LENGTH_BYTES - (numSamplesToCopy * sizeof(int16_t))); + } + + memcpy(currentPacketPtr, _audioSampleArray + i, numSamplesToCopy * sizeof(int16_t)); + + injectorSocket->send(destinationSocket, dataPacket, sizeof(dataPacket)); + + double usecToSleep = BUFFER_SEND_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&startTime)); + if (usecToSleep > 0) { + usleep(usecToSleep); + } + } + + _isInjectingAudio = false; + } +} + void AudioInjector::addSample(const int16_t sample) { if (_indexOfNextSlot != _numTotalSamples) { // only add this sample if we actually have space for it diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index fb5bf86c58..eb22df1177 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -25,6 +25,8 @@ public: AudioInjector(const char* filename); AudioInjector(int maxNumSamples); ~AudioInjector(); + + void injectAudio(UDPSocket* injectorSocket, sockaddr* destinationSocket); bool isInjectingAudio() const { return _isInjectingAudio; } void setIsInjectingAudio(bool isInjectingAudio) { _isInjectingAudio = isInjectingAudio; }