diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 5bb33a9198..d987c807f7 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -272,16 +273,20 @@ int main(int argc, const char* argv[]) { // pull any new audio data from agents off of the network stack while (agentList->getAgentSocket()->receive(agentAddress, packetData, &receivedBytes)) { - if (packetData[0] == PACKET_HEADER_INJECT_AUDIO || packetData[0] == PACKET_HEADER_MICROPHONE_AUDIO) { - char agentType = (packetData[0] == PACKET_HEADER_MICROPHONE_AUDIO) - ? AGENT_TYPE_AVATAR - : AGENT_TYPE_AUDIO_INJECTOR; + if (packetData[0] == PACKET_HEADER_MICROPHONE_AUDIO) { + Agent* avatarAgent = agentList->addOrUpdateAgent(agentAddress, + agentAddress, + AGENT_TYPE_AVATAR, + agentList->getLastAgentID()); - if (agentList->addOrUpdateAgent(agentAddress, agentAddress, agentType, agentList->getLastAgentID())) { + if (avatarAgent->getAgentID() == agentList->getLastAgentID()) { agentList->increaseAgentID(); } agentList->updateAgentWithData(agentAddress, packetData, receivedBytes); + } else if (packetData[0] == PACKET_HEADER_INJECT_AUDIO) { + + // this is an injector stream - check our map to see if we have it already } } diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index d51e48b055..da2b41b1bd 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -70,6 +70,7 @@ int main(int argc, const char* argv[]) { unsigned char* currentBufferPosition = NULL; uint16_t agentID = 0; + Agent* avatarAgent = NULL; while (true) { if (agentList->getAgentSocket()->receive(agentAddress, packetData, &receivedBytes)) { @@ -79,10 +80,10 @@ int main(int argc, const char* argv[]) { unpackAgentId(packetData + 1, &agentID); // add or update the agent in our list - agentList->addOrUpdateAgent(agentAddress, agentAddress, AGENT_TYPE_AVATAR, agentID); + avatarAgent = agentList->addOrUpdateAgent(agentAddress, agentAddress, AGENT_TYPE_AVATAR, agentID); // parse positional data from an agent - agentList->updateAgentWithData(agentAddress, packetData, receivedBytes); + agentList->updateAgentWithData(avatarAgent, packetData, receivedBytes); currentBufferPosition = broadcastPacket + 1; diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 959456bd03..968057623f 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -115,10 +115,12 @@ int main(int argc, const char * argv[]) } } - if (agentList->addOrUpdateAgent((sockaddr*) &agentPublicAddress, - (sockaddr*) &agentLocalAddress, - agentType, - agentList->getLastAgentID())) { + Agent* newAgent = agentList->addOrUpdateAgent((sockaddr*) &agentPublicAddress, + (sockaddr*) &agentLocalAddress, + agentType, + agentList->getLastAgentID()); + + if (newAgent->getAgentID() == agentList->getLastAgentID()) { agentList->increaseAgentID(); } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 689b4c6cd9..7a1747a355 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -24,6 +24,8 @@ AudioInjector::AudioInjector(const char* filename) : _indexOfNextSlot(0), _isInjectingAudio(false) { + loadRandomIdentifier(_identifier, INJECTOR_IDENTIFIER_NUM_BYTES); + std::fstream sourceFile; sourceFile.open(filename, std::ios::in | std::ios::binary); @@ -51,6 +53,8 @@ AudioInjector::AudioInjector(int maxNumSamples) : _indexOfNextSlot(0), _isInjectingAudio(false) { + loadRandomIdentifier(_identifier, INJECTOR_IDENTIFIER_NUM_BYTES); + _audioSampleArray = new int16_t[maxNumSamples]; memset(_audioSampleArray, 0, _numTotalSamples * sizeof(int16_t)); } @@ -81,6 +85,10 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination memcpy(currentPacketPtr, &_bearing, sizeof(_bearing)); currentPacketPtr += sizeof(_bearing); + // copy the identifier for this injector + memcpy(currentPacketPtr, &_identifier, sizeof(_identifier)); + currentPacketPtr += sizeof(_identifier); + for (int i = 0; i < _numTotalSamples; i += BUFFER_LENGTH_SAMPLES) { gettimeofday(&startTime, NULL); diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index eb22df1177..fa907438bf 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -18,9 +18,9 @@ const int BUFFER_LENGTH_SAMPLES = BUFFER_LENGTH_BYTES / sizeof(int16_t); const float SAMPLE_RATE = 22050.0f; const float BUFFER_SEND_INTERVAL_USECS = (BUFFER_LENGTH_SAMPLES / SAMPLE_RATE) * 1000000; +const int INJECTOR_IDENTIFIER_NUM_BYTES = 8; + class AudioInjector { - friend class AudioInjectionManager; - public: AudioInjector(const char* filename); AudioInjector(int maxNumSamples); @@ -43,6 +43,7 @@ public: void addSample(const int16_t sample); void addSamples(int16_t* sampleBuffer, int numSamples); private: + unsigned char _identifier[INJECTOR_IDENTIFIER_NUM_BYTES]; int16_t* _audioSampleArray; int _numTotalSamples; glm::vec3 _position; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index f63947a580..2e11e8aa84 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -19,7 +19,6 @@ using namespace std; using avatars_lib::printLog; - int packFloatAngleToTwoByte(unsigned char* buffer, float angle) { const float ANGLE_CONVERSION_RATIO = (std::numeric_limits::max() / 360.0); diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index fef0446056..c667f733a4 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -126,11 +126,7 @@ void AgentList::processBulkAgentData(sockaddr *senderAddress, unsigned char *pac if (!matchingAgent) { // we're missing this agent, we need to add it to the list - addOrUpdateAgent(NULL, NULL, AGENT_TYPE_AVATAR, agentID); - - // TODO: this is a really stupid way to do this - // Add a reverse iterator and go from the end of the list - matchingAgent = agentWithID(agentID); + matchingAgent = addOrUpdateAgent(NULL, NULL, AGENT_TYPE_AVATAR, agentID); } currentPosition += updateAgentWithData(matchingAgent, @@ -218,7 +214,7 @@ int AgentList::processDomainServerList(unsigned char *packetData, size_t dataByt return readAgents; } -bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId) { +Agent* AgentList::addOrUpdateAgent(sockaddr* publicSocket, sockaddr* localSocket, char agentType, uint16_t agentId) { AgentList::iterator agent = end(); if (publicSocket != NULL) { @@ -250,7 +246,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, addAgentToList(newAgent); - return true; + return newAgent; } else { if (agent->getType() == AGENT_TYPE_AUDIO_MIXER || agent->getType() == AGENT_TYPE_VOXEL) { @@ -260,7 +256,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, } // we had this agent already, do nothing for now - return false; + return &*agent; } } diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 280927929f..3ac7cf1f8d 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -59,7 +59,7 @@ public: Agent* agentWithAddress(sockaddr *senderAddress); Agent* agentWithID(uint16_t agentID); - bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); + Agent* addOrUpdateAgent(sockaddr* publicSocket, sockaddr* localSocket, char agentType, uint16_t agentId); void processAgentData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes); void processBulkAgentData(sockaddr *senderAddress, unsigned char *packetData, int numTotalBytes); diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index d6820897b8..51794813a9 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -114,6 +114,15 @@ void switchToResourcesParentIfRequired() { #endif } +void loadRandomIdentifier(unsigned char* identifierBuffer, int numBytes) { + // seed the the random number generator + srand(time(NULL)); + + for (int i = 0; i < numBytes; i++) { + identifierBuffer[i] = rand() % 255; + } +} + ////////////////////////////////////////////////////////////////////////////////////////// // Function: getCmdOption() // Description: Handy little function to tell you if a command line flag and option was diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 98baa5488a..d0e71ec71e 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -53,6 +53,8 @@ void setAtBit(unsigned char& byte, int bitIndex); void switchToResourcesParentIfRequired(); +void loadRandomIdentifier(unsigned char* identifierBuffer, int numBytes); + const char* getCmdOption(int argc, const char * argv[],const char* option); bool cmdOptionExists(int argc, const char * argv[],const char* option); diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 25e86f1f8a..84d9834477 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -587,9 +587,12 @@ int main(int argc, const char * argv[]) if (packetData[0] == PACKET_HEADER_HEAD_DATA) { uint16_t agentID = 0; unpackAgentId(packetData + sizeof(PACKET_HEADER_HEAD_DATA), &agentID); - agentList->addOrUpdateAgent(&agentPublicAddress, &agentPublicAddress, AGENT_TYPE_AVATAR, agentID); + Agent* agent = agentList->addOrUpdateAgent(&agentPublicAddress, + &agentPublicAddress, + AGENT_TYPE_AVATAR, + agentID); - agentList->updateAgentWithData(&agentPublicAddress, packetData, receivedBytes); + agentList->updateAgentWithData(agent, packetData, receivedBytes); } } }