From beee875e88069d7e29777998999e888f9c588330 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 23 Apr 2013 10:46:05 -0700 Subject: [PATCH] add a new AudioInjector class that can be leveraged from eve and injector --- libraries/shared/src/AudioInjector.cpp | 83 ++++++++++++++++++++++++++ libraries/shared/src/AudioInjector.h | 35 +++++++++++ 2 files changed, 118 insertions(+) create mode 100644 libraries/shared/src/AudioInjector.cpp create mode 100644 libraries/shared/src/AudioInjector.h diff --git a/libraries/shared/src/AudioInjector.cpp b/libraries/shared/src/AudioInjector.cpp new file mode 100644 index 0000000000..fac26a78cf --- /dev/null +++ b/libraries/shared/src/AudioInjector.cpp @@ -0,0 +1,83 @@ +// +// AudioInjector.cpp +// hifi +// +// Created by Stephen Birarda on 4/23/13. +// +// + +#include +#include + +#include "SharedUtil.h" +#include "PacketHeaders.h" + +#include "AudioInjector.h" + +const int BUFFER_LENGTH_BYTES = 512; +const int BUFFER_LENGTH_SAMPLES = BUFFER_LENGTH_BYTES / sizeof(int16_t); +const float SAMPLE_RATE = 22050.0; +const float BUFFER_SEND_INTERVAL_USECS = (BUFFER_LENGTH_SAMPLES / SAMPLE_RATE) * 1000000; + +AudioInjector::AudioInjector(const char* filename) : + _bearing(0), + _attenuationModifier(255) +{ + _position[0] = 0.0f; + _position[1] = 0.0f; + _position[2] = 0.0f; + + std::fstream sourceFile; + + sourceFile.open(filename, std::ios::in | std::ios::binary); + sourceFile.seekg(0, std::ios::end); + + _numTotalBytesAudio = sourceFile.tellg(); + sourceFile.seekg(0, std::ios::beg); + long sizeOfShortArray = _numTotalBytesAudio / 2; + _audioSampleArray = new int16_t[sizeOfShortArray]; + + sourceFile.read((char *)_audioSampleArray, _numTotalBytesAudio); +} + +AudioInjector::~AudioInjector() { + delete[] _audioSampleArray; +} + +void AudioInjector::setPosition(float* position) { + _position[0] = position[0]; + _position[1] = position[1]; + _position[2] = position[2]; +} + +void AudioInjector::injectAudio(UDPSocket *injectorSocket, sockaddr *destinationSocket) { + 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; + + for (int i = 0; i < 3; i++) { + memcpy(currentPacketPtr, &_position[i], sizeof(float)); + currentPacketPtr += sizeof(float); + } + + memcpy(currentPacketPtr, &_bearing, sizeof(float)); + currentPacketPtr += sizeof(float); + + *currentPacketPtr = _attenuationModifier; + currentPacketPtr++; + + for (int i = 0; i < _numTotalBytesAudio; i += BUFFER_LENGTH_SAMPLES) { + gettimeofday(&startTime, NULL); + + memcpy(currentPacketPtr, _audioSampleArray + i, BUFFER_LENGTH_BYTES); + injectorSocket->send(destinationSocket, dataPacket, sizeof(dataPacket)); + + double usecToSleep = usecTimestamp(&startTime) + BUFFER_SEND_INTERVAL_USECS - usecTimestampNow(); + usleep(usecToSleep); + } +} diff --git a/libraries/shared/src/AudioInjector.h b/libraries/shared/src/AudioInjector.h new file mode 100644 index 0000000000..2456a95c57 --- /dev/null +++ b/libraries/shared/src/AudioInjector.h @@ -0,0 +1,35 @@ +// +// AudioInjector.h +// hifi +// +// Created by Stephen Birarda on 4/23/13. +// +// + +#ifndef __hifi__AudioInjector__ +#define __hifi__AudioInjector__ + +#include +#include + +#include "UDPSocket.h" + +class AudioInjector { +public: + AudioInjector(const char* filename); + ~AudioInjector(); + + void setPosition(float* position); + void setBearing(float bearing) { _bearing = bearing; } + void setAttenuationModifier(unsigned char attenuationModifier) { _attenuationModifier = attenuationModifier; } + + void injectAudio(UDPSocket* injectorSocket, sockaddr* destinationSocket); +private: + int16_t* _audioSampleArray; + int _numTotalBytesAudio; + float _position[3]; + float _bearing; + unsigned char _attenuationModifier; +}; + +#endif /* defined(__hifi__AudioInjector__) */