From 9e0df2dbd15ac1bbe36d4132b4972be4019c9de8 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 18 Mar 2013 17:10:05 -0600 Subject: [PATCH 01/26] Add unique id to agents and broadcast back --- domain/src/main.cpp | 1 + shared/src/Agent.cpp | 11 ++++++++++- shared/src/Agent.h | 5 ++++- shared/src/AgentList.cpp | 5 ++++- shared/src/AgentList.h | 2 +- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index e32434c543..8bdd0a736b 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -44,6 +44,7 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); + currentPosition += agentToAdd->getAgentId(); currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index cacb3a5f94..f48d139eae 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -14,7 +14,7 @@ Agent::Agent() {} -Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType) { +Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId) { publicSocket = new sockaddr; memcpy(publicSocket, agentPublicSocket, sizeof(sockaddr)); @@ -22,6 +22,7 @@ Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agent memcpy(localSocket, agentLocalSocket, sizeof(sockaddr)); type = agentType; + agentId = thisAgentId; firstRecvTimeUsecs = usecTimestampNow(); lastRecvTimeUsecs = usecTimestampNow(); @@ -75,6 +76,14 @@ void Agent::setType(char newType) { type = newType; } +int16_t Agent::getAgentId() { + return agentId; +} + +void Agent::setAgentId(int16_t thisAgentId) { + agentId = thisAgentId; +} + double Agent::getFirstRecvTimeUsecs() { return firstRecvTimeUsecs; } diff --git a/shared/src/Agent.h b/shared/src/Agent.h index dafbeb768f..edb8f67f50 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -16,7 +16,7 @@ class Agent { public: Agent(); - Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType); + Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId); Agent(const Agent &otherAgent); ~Agent(); Agent& operator=(Agent otherAgent); @@ -25,6 +25,8 @@ class Agent { bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); char getType(); void setType(char newType); + int16_t getAgentId(); + void setAgentId(int16_t thisAgentId); double getFirstRecvTimeUsecs(); void setFirstRecvTimeUsecs(double newTimeUsecs); double getLastRecvTimeUsecs(); @@ -44,6 +46,7 @@ class Agent { void swap(Agent &first, Agent &second); sockaddr *publicSocket, *localSocket, *activeSocket; char type; + int16_t agentId; double firstRecvTimeUsecs; double lastRecvTimeUsecs; AgentData *linkedData; diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 0bdedb10cd..4fc27b498b 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -20,12 +20,14 @@ AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; + lastAgentId = 0; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; + lastAgentId = 0; } AgentList::~AgentList() { @@ -139,7 +141,8 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - Agent newAgent = Agent(publicSocket, localSocket, agentType); + Agent newAgent = Agent(publicSocket, localSocket, agentType, this->lastAgentId); + ++this->lastAgentId; if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index d4c9b69d23..d1c607f066 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -45,7 +45,7 @@ class AgentList { UDPSocket agentSocket; std::vector agents; pthread_t removeSilentAgentsThread; - + int16_t lastAgentId; int indexOfMatchingAgent(sockaddr *senderAddress); void handlePingReply(sockaddr *agentAddress); }; From e396269d78bb032525850065196e96488dd3adb1 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Tue, 19 Mar 2013 11:02:47 -0600 Subject: [PATCH 02/26] Switching to unsigned --- shared/src/Agent.cpp | 6 +++--- shared/src/Agent.h | 8 ++++---- shared/src/AgentList.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index f48d139eae..2c0d6b8927 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -14,7 +14,7 @@ Agent::Agent() {} -Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId) { +Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, uint16_t thisAgentId) { publicSocket = new sockaddr; memcpy(publicSocket, agentPublicSocket, sizeof(sockaddr)); @@ -76,11 +76,11 @@ void Agent::setType(char newType) { type = newType; } -int16_t Agent::getAgentId() { +uint16_t Agent::getAgentId() { return agentId; } -void Agent::setAgentId(int16_t thisAgentId) { +void Agent::setAgentId(uint16_t thisAgentId) { agentId = thisAgentId; } diff --git a/shared/src/Agent.h b/shared/src/Agent.h index edb8f67f50..61f01b4b60 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -16,7 +16,7 @@ class Agent { public: Agent(); - Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId); + Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, uint16_t thisAgentId); Agent(const Agent &otherAgent); ~Agent(); Agent& operator=(Agent otherAgent); @@ -25,8 +25,8 @@ class Agent { bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); char getType(); void setType(char newType); - int16_t getAgentId(); - void setAgentId(int16_t thisAgentId); + uint16_t getAgentId(); + void setAgentId(uint16_t thisAgentId); double getFirstRecvTimeUsecs(); void setFirstRecvTimeUsecs(double newTimeUsecs); double getLastRecvTimeUsecs(); @@ -46,7 +46,7 @@ class Agent { void swap(Agent &first, Agent &second); sockaddr *publicSocket, *localSocket, *activeSocket; char type; - int16_t agentId; + uint16_t agentId; double firstRecvTimeUsecs; double lastRecvTimeUsecs; AgentData *linkedData; diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index d1c607f066..b7e12c9627 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -45,7 +45,7 @@ class AgentList { UDPSocket agentSocket; std::vector agents; pthread_t removeSilentAgentsThread; - int16_t lastAgentId; + uint16_t lastAgentId; int indexOfMatchingAgent(sockaddr *senderAddress); void handlePingReply(sockaddr *agentAddress); }; From a76f8a46cde507d172be1ea9ba42cf7f0a6f251a Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:20:45 -0600 Subject: [PATCH 03/26] Handle new and existing agent Ids --- domain/src/main.cpp | 2 ++ shared/src/Agent.cpp | 4 ++++ shared/src/Agent.h | 1 + shared/src/AgentList.cpp | 25 +++++++++++++++++++++---- shared/src/AgentList.h | 6 ++++-- shared/src/UDPSocket.cpp | 2 +- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index cc51bb79b6..05fb088329 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -50,7 +50,9 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); + // FIX THIS - NOT ONE BYTE currentPosition += agentToAdd->getAgentId(); + // --- currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index b95c3e7dbd..269703260f 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -162,6 +162,10 @@ bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, cha && socketMatch(localSocket, otherLocalSocket); } +bool Agent::exists(uint16_t *otherAgentId) { + return agentId == *otherAgentId; +} + std::ostream& operator<<(std::ostream& os, const Agent* agent) { sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket; sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket; diff --git a/shared/src/Agent.h b/shared/src/Agent.h index 087d828b49..e5fa583f20 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -28,6 +28,7 @@ class Agent { bool operator==(const Agent& otherAgent); bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); + bool exists(uint16_t *agentId); char getType(); void setType(char newType); uint16_t getAgentId(); diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 13869f53af..134672e971 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -109,10 +109,16 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } +int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { + memcpy(packedData, agentId, sizeof(uint16_t)); + return sizeof(uint16_t); +} + int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; char agentType; + uint16_t agentId; // assumes only IPv4 addresses sockaddr_in agentPublicSocket; @@ -125,17 +131,21 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { while((readPtr - startPtr) < dataBytes) { agentType = *readPtr++; + readPtr += unpackAgentId(readPtr, (uint16_t *)&agentId); readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); - addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); + //syncClientAgentList(agentId, (sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); + + addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); } return readAgents; } -bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType) { +bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId = 0) { std::vector::iterator agent; + uint16_t thisAgentId; for(agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { @@ -146,8 +156,15 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - Agent newAgent = Agent(publicSocket, localSocket, agentType, this->lastAgentId); - ++this->lastAgentId; + + if (agentId == 0) { + thisAgentId = this->lastAgentId; + ++this->lastAgentId; + } else { + thisAgentId = agentId; + } + + Agent newAgent = Agent(publicSocket, localSocket, agentType, thisAgentId); if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index e152815ad1..9d6e9991dc 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -35,9 +35,11 @@ class AgentList { std::vector& getAgents(); UDPSocket& getAgentSocket(); - + int updateList(unsigned char *packetData, size_t dataBytes); - bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType); + bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); + int unpackAgentId(unsigned char *packedData, uint16_t *agentId); + int packAgentId(unsigned char *packStore, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void broadcastToAgents(char *broadcastData, size_t dataBytes); diff --git a/shared/src/UDPSocket.cpp b/shared/src/UDPSocket.cpp index f4bceb884f..436b627045 100644 --- a/shared/src/UDPSocket.cpp +++ b/shared/src/UDPSocket.cpp @@ -115,7 +115,7 @@ bool UDPSocket::receive(sockaddr *recvAddress, void *receivedData, ssize_t *rece socklen_t addressSize = sizeof(&recvAddress); *receivedBytes = recvfrom(handle, static_cast(receivedData), MAX_BUFFER_LENGTH_BYTES, - 0, recvAddress, reinterpret_cast(&addressSize)); + 0, recvAddress, &addressSize); return (*receivedBytes > 0); } From a1691f54a1fa574e76037c0f9f977a77d97b69d8 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:30:17 -0600 Subject: [PATCH 04/26] Starting agent count at 1 to allow for 0 to be non-id specifier and packing the id into boadcast packet --- shared/src/AgentList.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 134672e971..8cae9547bd 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -25,14 +25,14 @@ AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; - lastAgentId = 0; + lastAgentId = 1; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; - lastAgentId = 0; + lastAgentId = 1; } AgentList::~AgentList() { @@ -114,6 +114,11 @@ int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { return sizeof(uint16_t); } +int AgentList::packAgentId(unsigned char *packStore, uint16_t agentId) { + memcpy(&agentId, packStore, sizeof(uint16_t)); + return sizeof(uint16_t); +} + int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; From e3d842dff7b12a4b7af93fd96fe3107372f76265 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:43:16 -0600 Subject: [PATCH 05/26] Packing agent ID on domain broadcast packet --- domain/src/main.cpp | 4 +--- shared/src/AgentList.h | 5 +++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 05fb088329..d80864eaa0 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -50,9 +50,7 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); - // FIX THIS - NOT ONE BYTE - currentPosition += agentToAdd->getAgentId(); - // --- + currentPosition += packAgentId(currentPosition, agentToAdd->getAgentId()); currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 9d6e9991dc..e376f29af7 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -38,8 +38,6 @@ class AgentList { int updateList(unsigned char *packetData, size_t dataBytes); bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); - int unpackAgentId(unsigned char *packedData, uint16_t *agentId); - int packAgentId(unsigned char *packStore, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void broadcastToAgents(char *broadcastData, size_t dataBytes); @@ -56,4 +54,7 @@ class AgentList { void handlePingReply(sockaddr *agentAddress); }; +int unpackAgentId(unsigned char *packedData, uint16_t *agentId); +int packAgentId(unsigned char *packStore, uint16_t agentId); + #endif /* defined(__hifi__AgentList__) */ From a4f6d8567607cf61dbf440ea2f76ff5773cb9b4d Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:45:19 -0600 Subject: [PATCH 06/26] Fixing definitions --- shared/src/AgentList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 8cae9547bd..7d71f1da2c 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -109,12 +109,12 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } -int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { +int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { memcpy(packedData, agentId, sizeof(uint16_t)); return sizeof(uint16_t); } -int AgentList::packAgentId(unsigned char *packStore, uint16_t agentId) { +int packAgentId(unsigned char *packStore, uint16_t agentId) { memcpy(&agentId, packStore, sizeof(uint16_t)); return sizeof(uint16_t); } From dc92f0be4233221f962472c67c2fd99113586afd Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 13:34:35 -0600 Subject: [PATCH 07/26] More agent IDing around the code --- domain/src/main.cpp | 6 ++++-- shared/src/AgentList.cpp | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index d80864eaa0..bd49ca0ee9 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -73,6 +73,7 @@ int main(int argc, const char * argv[]) int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; + uint16_t agentId = 0; agentLocalAddress.sin_family = AF_INET; agentList.startSilentAgentRemovalThread(); @@ -82,9 +83,10 @@ int main(int argc, const char * argv[]) std::map newestSoloAgents; agentType = packetData[0]; - unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); + unpackAgentId(&packetData[1], (uint16_t *)&agentId); + unpackSocket(&packetData[2], (sockaddr *)&agentLocalAddress); - agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType); + agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentId); currentBufferPos = broadcastPacket + 1; startPointer = currentBufferPos; diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 7d71f1da2c..eab053e5d0 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -140,8 +140,6 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); - //syncClientAgentList(agentId, (sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); - addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); } From ed7234d56aae7987a851090126caa7ce0182a917 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 13:50:32 -0600 Subject: [PATCH 08/26] Fixing index --- domain/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index e26332f9e9..99aa1db05e 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -84,7 +84,7 @@ int main(int argc, const char * argv[]) agentType = packetData[0]; unpackAgentId(&packetData[1], (uint16_t *)&agentId); - unpackSocket(&packetData[2], (sockaddr *)&agentLocalAddress); + unpackSocket(&packetData[3], (sockaddr *)&agentLocalAddress); agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentId); From 61c866a34caf5e195106d056ee508afa37cf2560 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 16:57:30 -0600 Subject: [PATCH 09/26] Handling increase of id smarter --- domain/src/main.cpp | 8 ++++---- interface/src/main.cpp | 4 ++-- shared/src/AgentList.cpp | 31 ++++++++++++++++--------------- shared/src/AgentList.h | 2 ++ 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 99aa1db05e..fad3f21130 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -73,7 +73,6 @@ int main(int argc, const char * argv[]) int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; - uint16_t agentId = 0; agentLocalAddress.sin_family = AF_INET; agentList.startSilentAgentRemovalThread(); @@ -83,10 +82,11 @@ int main(int argc, const char * argv[]) std::map newestSoloAgents; agentType = packetData[0]; - unpackAgentId(&packetData[1], (uint16_t *)&agentId); - unpackSocket(&packetData[3], (sockaddr *)&agentLocalAddress); + unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); - agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentId); + if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentList.getLastAgentId())) { + agentList.increaseAgentId(); + } currentBufferPos = broadcastPacket + 1; startPointer = currentBufferPos; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 5759aa3c8a..e23ad8ff6a 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -228,9 +228,9 @@ void Timer(int extra) // // Send a message to the domainserver telling it we are ALIVE - // + // unsigned char output[7]; - output[0] = 'I'; + output[0] = 'I'; packSocket(output + 1, localAddress, htons(AGENT_SOCKET_LISTEN_PORT)); agentList.getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index ddfc619315..a32c1e1fd6 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -108,14 +108,12 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } -int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { - memcpy(packedData, agentId, sizeof(uint16_t)); - return sizeof(uint16_t); +uint16_t AgentList::getLastAgentId() { + return lastAgentId; } -int packAgentId(unsigned char *packStore, uint16_t agentId) { - memcpy(&agentId, packStore, sizeof(uint16_t)); - return sizeof(uint16_t); +void AgentList::increaseAgentId() { + ++lastAgentId; } int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { @@ -149,7 +147,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, std::vector::iterator agent; uint16_t thisAgentId; - for(agent = agents.begin(); agent != agents.end(); agent++) { + for (agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { // we already have this agent, stop checking break; @@ -159,14 +157,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - if (agentId == 0) { - thisAgentId = this->lastAgentId; - ++this->lastAgentId; - } else { - thisAgentId = agentId; - } - - Agent newAgent = Agent(publicSocket, localSocket, agentType, thisAgentId); + Agent newAgent = Agent(publicSocket, localSocket, agentType, agentId); if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network @@ -285,4 +276,14 @@ void AgentList::startSilentAgentRemovalThread() { void AgentList::stopSilentAgentRemovalThread() { stopAgentRemovalThread = true; pthread_join(removeSilentAgentsThread, NULL); +} + +int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { + memcpy(packedData, agentId, sizeof(uint16_t)); + return sizeof(uint16_t); +} + +int packAgentId(unsigned char *packStore, uint16_t agentId) { + memcpy(&agentId, packStore, sizeof(uint16_t)); + return sizeof(uint16_t); } \ No newline at end of file diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 5edb2ca620..8aabf88476 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -37,6 +37,8 @@ class AgentList { int updateList(unsigned char *packetData, size_t dataBytes); int indexOfMatchingAgent(sockaddr *senderAddress); + uint16_t getLastAgentId(); + void increaseAgentId(); bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); From be96f1cdd058d5113647f148f35da12130324621 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 16:58:52 -0600 Subject: [PATCH 10/26] No longer need exists --- shared/src/Agent.cpp | 4 ---- shared/src/Agent.h | 1 - 2 files changed, 5 deletions(-) diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index 269703260f..b95c3e7dbd 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -162,10 +162,6 @@ bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, cha && socketMatch(localSocket, otherLocalSocket); } -bool Agent::exists(uint16_t *otherAgentId) { - return agentId == *otherAgentId; -} - std::ostream& operator<<(std::ostream& os, const Agent* agent) { sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket; sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket; diff --git a/shared/src/Agent.h b/shared/src/Agent.h index e5fa583f20..087d828b49 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -28,7 +28,6 @@ class Agent { bool operator==(const Agent& otherAgent); bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); - bool exists(uint16_t *agentId); char getType(); void setType(char newType); uint16_t getAgentId(); From bd18aeefe4e093f57f64ae17d911807352c668bc Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 17:39:07 -0600 Subject: [PATCH 11/26] Couple of quick changes --- shared/src/AgentList.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index a32c1e1fd6..b91ad2a487 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -24,13 +24,13 @@ pthread_mutex_t vectorChangeMutex = PTHREAD_MUTEX_INITIALIZER; AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; - lastAgentId = 1; + lastAgentId = 0; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; - lastAgentId = 1; + lastAgentId = 0; } @@ -143,7 +143,7 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { return readAgents; } -bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId = 0) { +bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId) { std::vector::iterator agent; uint16_t thisAgentId; From 0ab62b7493a2396f2f2eaf0e66aa07102f81a9c0 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 20:42:56 -0600 Subject: [PATCH 12/26] Stream injector --- CMakeLists.txt | 3 +- injector/CMakeLists.txt | 17 ++++ injector/src/injector.cpp | 194 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 injector/CMakeLists.txt create mode 100644 injector/src/injector.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index cd284ff3e4..5fd99276c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,4 +6,5 @@ add_subdirectory(space) add_subdirectory(domain) add_subdirectory(mixer) add_subdirectory(voxel) -add_subdirectory(interface) \ No newline at end of file +add_subdirectory(interface) +add_subdirectory(injector) diff --git a/injector/CMakeLists.txt b/injector/CMakeLists.txt new file mode 100644 index 0000000000..e85116e90f --- /dev/null +++ b/injector/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 2.8) + +project(injector) + +# grab the implemenation and header files +file(GLOB INJECTOR_SRCS src/*.cpp src/*.h) + +# add the mixer executable +add_executable(injector ${INJECTOR_SRCS}) + +# link the shared hifi library +include(../LinkHifiShared.cmake) +link_hifi_shared_library(injector) + +# link the threads library +find_package(Threads REQUIRED) +target_link_libraries(injector ${CMAKE_THREAD_LIBS_INIT}) diff --git a/injector/src/injector.cpp b/injector/src/injector.cpp new file mode 100644 index 0000000000..3824949182 --- /dev/null +++ b/injector/src/injector.cpp @@ -0,0 +1,194 @@ +// +// main.cpp +// AudioInjector2 +// +// Created by Leonardo Murillo on 3/5/13. +// Copyright (c) 2013 Leonardo Murillo. All rights reserved. +// + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "UDPSocket.h" +#include "UDPSocket.cpp" +#include + +char EC2_WEST_AUDIO_SERVER[] = "54.241.92.53"; +const int AUDIO_UDP_LISTEN_PORT = 55443; +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; + +// Command line parameter defaults +bool loopAudio = true; +float sleepIntervalMin = 1.00; +float sleepIntervalMax = 2.00; +float positionInUniverse[] = {0, 0, 0, 0}; +char attenuationModifier[] = {0}; +char *sourceAudioFile; +const char *allowedParameters = ":rb::t::c::a::f:"; + +char *charBuffer; +int16_t *buffer; +long length; + +UDPSocket *streamSocket; + +void printBinaryValue(char element) { + std::bitset<8> x(element); + std::cout << "Printing binary value: " << x << std::endl; +} + +float randomFloat(float a, float b) { + float random = ((float) rand()) / (float) RAND_MAX; + float diff = b - a; + float r = random * diff; + return a + r; +} + +void usage(void) +{ + std::cout << "High Fidelity - Interface audio injector" << std::endl; + std::cout << " -r Random sleep mode. If not specified will default to constant loop." << std::endl; + std::cout << " -b FLOAT Min. number of seconds to sleep. Only valid in random sleep mode. Default 1.0" << std::endl; + std::cout << " -t FLOAT Max. number of seconds to sleep. Only valid in random sleep mode. Default 2.0" << std::endl; + std::cout << " -c FLOAT,FLOAT,FLOAT,FLOAT X,Y,Z,YAW position in universe where audio will be originating from and direction. Defaults to 0,0,0,0" << std::endl; + std::cout << " -a 0-255 Attenuation curve modifier, defaults to 0" << std::endl; + std::cout << " -f FILENAME Name of audio source file. Required - RAW format, 22050hz 16bit signed mono" << std::endl; +}; + +bool processParameters(int parameterCount, char* parameterData[]) +{ + int p; + while ((p = getopt(parameterCount, parameterData, allowedParameters)) != -1) { + switch (p) { + case 'r': + loopAudio = false; + std::cout << "[DEBUG] Random sleep mode enabled" << std::endl; + break; + case 'b': + sleepIntervalMin = atof(optarg); + std::cout << "[DEBUG] Min delay between plays " << sleepIntervalMin << "sec" << std::endl; + break; + case 't': + sleepIntervalMax = atof(optarg); + std::cout << "[DEBUG] Max delay between plays " << sleepIntervalMax << "sec" << std::endl; + break; + case 'f': + sourceAudioFile = optarg; + std::cout << "[DEBUG] Opening file: " << sourceAudioFile << std::endl; + break; + case 'c': + { + std::istringstream ss(optarg); + std::string token; + + int i = 0; + while (std::getline(ss, token, ',')) { + positionInUniverse[i] = atof(token.c_str()); + ++i; + if (i == 4) { + break; + } + } + + break; + } + case 'a': + attenuationModifier[0] = atoi(optarg); + std::cout << "[DEBUG] Attenuation modifier: " << optarg << std::endl; + break; + default: + usage(); + return false; + } + } + return true; +}; + +void loadFile(void) { + std::fstream sourceFile; + sourceFile.open(sourceAudioFile, std::ios::in | std::ios::binary); + sourceFile.seekg(0, std::ios::end); + length = sourceFile.tellg(); + sourceFile.seekg(0, std::ios::beg); + long sizeOfShortArray = length / 2; + buffer = new int16_t[sizeOfShortArray]; + sourceFile.read((char *)buffer, length); +} + +void stream(void) +{ + timeval startTime; + + int leadingBytes = 1 + (sizeof(float) * 4); + unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes]; + + dataPacket[0] = 'I'; + unsigned char *currentPacketPtr = dataPacket + 1; + + for (int p = 0; p < 4; p++) { + memcpy(currentPacketPtr, &positionInUniverse[p], sizeof(float)); + currentPacketPtr += sizeof(float); + } + + memcpy(currentPacketPtr, &attenuationModifier[0], sizeof(char)); + currentPacketPtr += sizeof(char); + + for (int i = 0; i < length; i += BUFFER_LENGTH_SAMPLES) { + gettimeofday(&startTime, NULL); + memcpy(currentPacketPtr, &buffer[i], BUFFER_LENGTH_BYTES); + streamSocket->send(EC2_WEST_AUDIO_SERVER, AUDIO_UDP_LISTEN_PORT, dataPacket, sizeof(dataPacket)); + double usecToSleep = usecTimestamp(&startTime) + BUFFER_SEND_INTERVAL_USECS - usecTimestampNow(); + usleep(usecToSleep); + } +}; + +int main(int argc, char* argv[]) +{ + + srand(time(0)); + int AUDIO_UDP_SEND_PORT = 1500 + (rand() % (int)(1500 - 2000 + 1)); + + UDPSocket *streamSocket = new UDPSocket(AUDIO_UDP_SEND_PORT); + + if (processParameters(argc, argv)) { + if (sourceAudioFile) { + loadFile(); + } else { + std::cout << "[FATAL] Source audio file not specified" << std::endl; + exit(-1); + } + + for (int i = 0; i < sizeof(positionInUniverse)/sizeof(positionInUniverse[0]); ++i) { + std::cout << "Position " << positionInUniverse[i] << std::endl; + } + + float delay; + int usecDelay; + while (1) { + stream(); + + if (loopAudio) { + delay = 0; + } else { + delay = randomFloat(sleepIntervalMin, sleepIntervalMax); + } + usecDelay = delay * 1000 * 1000; + usleep(usecDelay); + } + } + return 0; +} + + From 896047d2aaa786b07afe1dde74c65ab89bbe82a1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 12:05:32 -0700 Subject: [PATCH 13/26] have the mixer additionally attenuate sources based on extra byte --- interface/src/Audio.cpp | 3 +++ mixer/src/main.cpp | 14 +++++++------- shared/src/AudioRingBuffer.cpp | 11 +++++++++++ shared/src/AudioRingBuffer.h | 3 +++ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 5fc5d55dcf..df06c07cfc 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -158,6 +158,9 @@ int audioCallback (const void *inputBuffer, currentPacketPtr += sizeof(float); } + // tell the mixer not to add additional attenuation to our source + *(currentPacketPtr++) = 255; + // memcpy the corrected render yaw float correctedYaw = fmodf(data->linkedHead->getRenderYaw(), 360); diff --git a/mixer/src/main.cpp b/mixer/src/main.cpp index c7c88a0f3a..f9936d71be 100644 --- a/mixer/src/main.cpp +++ b/mixer/src/main.cpp @@ -147,9 +147,6 @@ void *sendBuffer(void *args) float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI); float angleToSource; - if (agentWantsLoopback) { - - } // find the angle we need for calculation based on the orientation of the triangle if (otherAgentPosition[0] > agentPosition[0]) { @@ -178,8 +175,6 @@ void *sendBuffer(void *args) int numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; float weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); - printf("The weak channel AR is %f\n", weakChannelAmplitudeRatio); - int16_t *goodChannel = angleToSource > 0 ? clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL : clientMix; int16_t *delayedChannel = angleToSource > 0 ? clientMix : clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL; @@ -193,11 +188,16 @@ void *sendBuffer(void *args) if (s < numSamplesDelay) { // pull the earlier sample for the delayed channel - int earlierSample = delaySamplePointer[s] * distanceCoeffs[lowAgentIndex][highAgentIndex]; + int earlierSample = delaySamplePointer[s] * + distanceCoeffs[lowAgentIndex][highAgentIndex] * + otherAgentBuffer->getAttenuationRatio(); + plateauAdditionOfSamples(delayedChannel[s], earlierSample * weakChannelAmplitudeRatio); } - int16_t currentSample = (otherAgentBuffer->getNextOutput()[s] * distanceCoeffs[lowAgentIndex][highAgentIndex]); + int16_t currentSample = (otherAgentBuffer->getNextOutput()[s] * + distanceCoeffs[lowAgentIndex][highAgentIndex]) * + otherAgentBuffer->getAttenuationRatio(); plateauAdditionOfSamples(goodChannel[s], currentSample); if (s + numSamplesDelay < BUFFER_LENGTH_SAMPLES_PER_CHANNEL) { diff --git a/shared/src/AudioRingBuffer.cpp b/shared/src/AudioRingBuffer.cpp index f6443db066..6dd18de520 100644 --- a/shared/src/AudioRingBuffer.cpp +++ b/shared/src/AudioRingBuffer.cpp @@ -89,6 +89,14 @@ void AudioRingBuffer::setPosition(float *newPosition) { position[2] = newPosition[2]; } +float AudioRingBuffer::getAttenuationRatio() { + return attenuationRatio; +} + +void AudioRingBuffer::setAttenuationRatio(float newAttenuation) { + attenuationRatio = newAttenuation; +} + float AudioRingBuffer::getBearing() { return bearing; } @@ -109,6 +117,9 @@ void AudioRingBuffer::parseData(void *data, int size) { dataPtr += sizeof(float); } + unsigned int attenuationByte = *(dataPtr++); + attenuationRatio = attenuationByte / 255.0f; + memcpy(&bearing, dataPtr, sizeof(float)); dataPtr += sizeof(float); diff --git a/shared/src/AudioRingBuffer.h b/shared/src/AudioRingBuffer.h index 90d3550bb0..6b214a5f8f 100644 --- a/shared/src/AudioRingBuffer.h +++ b/shared/src/AudioRingBuffer.h @@ -33,6 +33,8 @@ class AudioRingBuffer : public AgentData { void setAddedToMix(bool added); float* getPosition(); void setPosition(float newPosition[]); + float getAttenuationRatio(); + void setAttenuationRatio(float newAttenuation); float getBearing(); void setBearing(float newBearing); @@ -41,6 +43,7 @@ class AudioRingBuffer : public AgentData { int ringBufferLengthSamples; int bufferLengthSamples; float position[3]; + float attenuationRatio; float bearing; int16_t *nextOutput; int16_t *endOfLastWrite; From 54a946ee80111c6a62c711b7629b5b84f54faddc Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 15:54:08 -0600 Subject: [PATCH 14/26] Splitting line, adding agentId to copy constructor and swap --- domain/src/main.cpp | 7 ++++++- shared/src/Agent.cpp | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index fad3f21130..940ec5f578 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -84,8 +84,13 @@ int main(int argc, const char * argv[]) agentType = packetData[0]; unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); - if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentList.getLastAgentId())) { + if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, + (sockaddr *)&agentLocalAddress, + agentType, + agentList.getLastAgentId())) { + agentList.increaseAgentId(); + } currentBufferPos = broadcastPacket + 1; diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index b95c3e7dbd..9b64fc26e1 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -43,6 +43,9 @@ Agent::Agent(const Agent &otherAgent) { localSocket = new sockaddr; memcpy(localSocket, otherAgent.localSocket, sizeof(sockaddr)); + agentId = *new uint16_t; + memcpy(&agentId, &otherAgent.agentId, sizeof(uint16_t)); + if (otherAgent.activeSocket == otherAgent.publicSocket) { activeSocket = publicSocket; } else if (otherAgent.activeSocket == otherAgent.localSocket) { @@ -153,6 +156,7 @@ void Agent::swap(Agent &first, Agent &second) { swap(first.activeSocket, second.activeSocket); swap(first.type, second.type); swap(first.linkedData, second.linkedData); + swap(first.agentId, second.agentId); } bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType) { From cb84b7573be51e32a6121c288dbc47ecfe0bdc54 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 15:56:22 -0600 Subject: [PATCH 15/26] Getting rid of unused declaration --- shared/src/AgentList.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index b91ad2a487..d92e894079 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -145,7 +145,6 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId) { std::vector::iterator agent; - uint16_t thisAgentId; for (agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { From 63589985f4b2262ad994c9020a84a79019071aa0 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 16:12:51 -0600 Subject: [PATCH 16/26] Removing unneeded memcpy --- shared/src/Agent.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index 9b64fc26e1..8ec12c9020 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -43,8 +43,7 @@ Agent::Agent(const Agent &otherAgent) { localSocket = new sockaddr; memcpy(localSocket, otherAgent.localSocket, sizeof(sockaddr)); - agentId = *new uint16_t; - memcpy(&agentId, &otherAgent.agentId, sizeof(uint16_t)); + agentId = otherAgent.agentId; if (otherAgent.activeSocket == otherAgent.publicSocket) { activeSocket = publicSocket; From 0917cafd4e5e9a9cd8dd9a75d2e37659c987c559 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 16:25:25 -0600 Subject: [PATCH 17/26] Using shared utils and changing modifier data type --- injector/CMakeLists.txt | 2 +- injector/src/injector.cpp | 31 +++++++++---------------------- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/injector/CMakeLists.txt b/injector/CMakeLists.txt index e85116e90f..ffb352124b 100644 --- a/injector/CMakeLists.txt +++ b/injector/CMakeLists.txt @@ -5,7 +5,7 @@ project(injector) # grab the implemenation and header files file(GLOB INJECTOR_SRCS src/*.cpp src/*.h) -# add the mixer executable +# add the executable add_executable(injector ${INJECTOR_SRCS}) # link the shared hifi library diff --git a/injector/src/injector.cpp b/injector/src/injector.cpp index 3824949182..e33398370e 100644 --- a/injector/src/injector.cpp +++ b/injector/src/injector.cpp @@ -1,6 +1,6 @@ // -// main.cpp -// AudioInjector2 +// injector.cpp +// Audio Injector // // Created by Leonardo Murillo on 3/5/13. // Copyright (c) 2013 Leonardo Murillo. All rights reserved. @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -34,7 +33,7 @@ bool loopAudio = true; float sleepIntervalMin = 1.00; float sleepIntervalMax = 2.00; float positionInUniverse[] = {0, 0, 0, 0}; -char attenuationModifier[] = {0}; +unsigned char attenuationModifier = 255; char *sourceAudioFile; const char *allowedParameters = ":rb::t::c::a::f:"; @@ -44,18 +43,6 @@ long length; UDPSocket *streamSocket; -void printBinaryValue(char element) { - std::bitset<8> x(element); - std::cout << "Printing binary value: " << x << std::endl; -} - -float randomFloat(float a, float b) { - float random = ((float) rand()) / (float) RAND_MAX; - float diff = b - a; - float r = random * diff; - return a + r; -} - void usage(void) { std::cout << "High Fidelity - Interface audio injector" << std::endl; @@ -63,7 +50,7 @@ void usage(void) std::cout << " -b FLOAT Min. number of seconds to sleep. Only valid in random sleep mode. Default 1.0" << std::endl; std::cout << " -t FLOAT Max. number of seconds to sleep. Only valid in random sleep mode. Default 2.0" << std::endl; std::cout << " -c FLOAT,FLOAT,FLOAT,FLOAT X,Y,Z,YAW position in universe where audio will be originating from and direction. Defaults to 0,0,0,0" << std::endl; - std::cout << " -a 0-255 Attenuation curve modifier, defaults to 0" << std::endl; + std::cout << " -a 0-255 Attenuation curve modifier, defaults to 255" << std::endl; std::cout << " -f FILENAME Name of audio source file. Required - RAW format, 22050hz 16bit signed mono" << std::endl; }; @@ -105,7 +92,7 @@ bool processParameters(int parameterCount, char* parameterData[]) break; } case 'a': - attenuationModifier[0] = atoi(optarg); + attenuationModifier = atoi(optarg); std::cout << "[DEBUG] Attenuation modifier: " << optarg << std::endl; break; default: @@ -142,8 +129,8 @@ void stream(void) currentPacketPtr += sizeof(float); } - memcpy(currentPacketPtr, &attenuationModifier[0], sizeof(char)); - currentPacketPtr += sizeof(char); + *currentPacketPtr = attenuationModifier; + currentPacketPtr++; for (int i = 0; i < length; i += BUFFER_LENGTH_SAMPLES) { gettimeofday(&startTime, NULL); @@ -176,13 +163,13 @@ int main(int argc, char* argv[]) float delay; int usecDelay; - while (1) { + while (true) { stream(); if (loopAudio) { delay = 0; } else { - delay = randomFloat(sleepIntervalMin, sleepIntervalMax); + delay = randFloatInRange(sleepIntervalMin, sleepIntervalMax); } usecDelay = delay * 1000 * 1000; usleep(usecDelay); From 3ca5263582cd80bcaa510abac5cf40fe079a78fd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:23:13 -0700 Subject: [PATCH 18/26] abstract check in with DS to AgentList --- shared/src/AgentList.cpp | 87 ++++++++++++++++++++++++++++++++++------ shared/src/AgentList.h | 62 ++++++++++++++++------------ shared/src/UDPSocket.cpp | 23 +++++++++++ shared/src/UDPSocket.h | 1 + 4 files changed, 135 insertions(+), 38 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 125e90feed..18fc6fdd3f 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -17,22 +17,25 @@ #endif const char * SOLO_AGENT_TYPES_STRING = "MV"; +char DOMAIN_HOSTNAME[] = "highfidelity.below92.com"; +char DOMAIN_IP[100] = "192.168.1.47"; // IP Address will be re-set by lookup on startup +const int DOMAINSERVER_PORT = 40102; -bool stopAgentRemovalThread = false; +bool silentAgentThreadStopFlag = false; +bool domainServerCheckinStopFlag = false; pthread_mutex_t vectorChangeMutex = PTHREAD_MUTEX_INITIALIZER; -AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { - linkedDataCreateCallback = NULL; - audioMixerSocketUpdate = NULL; -} - -AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { +AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) : agentSocket(newSocketListenPort) { + ownerType = newOwnerType; + socketListenPort = newSocketListenPort; linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; } AgentList::~AgentList() { + // stop the spawned threads, if they were started stopSilentAgentRemovalThread(); + stopDomainServerCheckInThread(); } std::vector& AgentList::getAgents() { @@ -43,6 +46,14 @@ UDPSocket& AgentList::getAgentSocket() { return agentSocket; } +char AgentList::getOwnerType() { + return ownerType; +} + +unsigned int AgentList::getSocketListenPort() { + return socketListenPort; +} + void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes) { switch (((char *)packetData)[0]) { case 'D': @@ -154,10 +165,10 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, // this is an audio mixer // for now that means we need to tell the audio class // to use the local socket information the domain server gave us - sockaddr_in *localSocketIn = (sockaddr_in *)localSocket; - audioMixerSocketUpdate(localSocketIn->sin_addr.s_addr, localSocketIn->sin_port); + sockaddr_in *publicSocketIn = (sockaddr_in *)publicSocket; + audioMixerSocketUpdate(publicSocketIn->sin_addr.s_addr, publicSocketIn->sin_port); } else if (newAgent.getType() == 'V') { - newAgent.activateLocalSocket(); + newAgent.activatePublicSocket(); } std::cout << "Added agent - " << &newAgent << "\n"; @@ -227,7 +238,7 @@ void *removeSilentAgents(void *args) { std::vector *agents = (std::vector *)args; double checkTimeUSecs, sleepTime; - while (!stopAgentRemovalThread) { + while (!silentAgentThreadStopFlag) { checkTimeUSecs = usecTimestampNow(); for(std::vector::iterator agent = agents->begin(); agent != agents->end();) { @@ -259,6 +270,58 @@ void AgentList::startSilentAgentRemovalThread() { } void AgentList::stopSilentAgentRemovalThread() { - stopAgentRemovalThread = true; + silentAgentThreadStopFlag = true; pthread_join(removeSilentAgentsThread, NULL); +} + +void *checkInWithDomainServer(void *args) { + + AgentList *parentAgentList = (AgentList *)args; + + timeval lastSend; + unsigned char output[7]; + + in_addr_t localAddress = getLocalAddress(); + + // Lookup the IP address of the domain server if we need to + if (atoi(DOMAIN_IP) == 0) { + struct hostent* pHostInfo; + if ((pHostInfo = gethostbyname(DOMAIN_HOSTNAME)) != NULL) { + sockaddr_in tempAddress; + memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); + strcpy(DOMAIN_IP, inet_ntoa(tempAddress.sin_addr)); + printf("Domain server %s: %s\n", DOMAIN_HOSTNAME, DOMAIN_IP); + + } else { + printf("Failed lookup domainserver\n"); + } + } else printf("Using static domainserver IP: %s\n", DOMAIN_IP); + + + while (!domainServerCheckinStopFlag) { + gettimeofday(&lastSend, NULL); + + output[0] = parentAgentList->getOwnerType(); + packSocket(output + 1, localAddress, htons(parentAgentList->getSocketListenPort())); + + parentAgentList->getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); + + double usecToSleep = 1000000 - (usecTimestampNow() - usecTimestamp(&lastSend)); + + if (usecToSleep > 0) { + usleep(usecToSleep); + } + } + + pthread_exit(0); + return NULL; +} + +void AgentList::startDomainServerCheckInThread() { + pthread_create(&checkInWithDomainServerThread, NULL, checkInWithDomainServer, (void *)this); +} + +void AgentList::stopDomainServerCheckInThread() { + domainServerCheckinStopFlag = true; + pthread_join(checkInWithDomainServerThread, NULL); } \ No newline at end of file diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 954bdfc334..c8743ee0d9 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -19,38 +19,48 @@ #endif const int MAX_PACKET_SIZE = 1500; -const unsigned short AGENT_SOCKET_LISTEN_PORT = 40103; +const unsigned int AGENT_SOCKET_LISTEN_PORT = 40103; const int AGENT_SILENCE_THRESHOLD_USECS = 2 * 1000000; extern const char *SOLO_AGENT_TYPES_STRING; +extern char DOMAIN_HOSTNAME[]; +extern char DOMAIN_IP[100]; // IP Address will be re-set by lookup on startup +extern const int DOMAINSERVER_PORT; + class AgentList { - public: - AgentList(); - AgentList(int socketListenPort); - ~AgentList(); - - void(*linkedDataCreateCallback)(Agent *); - void(*audioMixerSocketUpdate)(in_addr_t, in_port_t); - - std::vector& getAgents(); - UDPSocket& getAgentSocket(); + UDPSocket agentSocket; + char ownerType; + unsigned int socketListenPort; + std::vector agents; + pthread_t removeSilentAgentsThread; + pthread_t checkInWithDomainServerThread; - int updateList(unsigned char *packetData, size_t dataBytes); - int indexOfMatchingAgent(sockaddr *senderAddress); - bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType); - void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); - void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); - void broadcastToAgents(char *broadcastData, size_t dataBytes); - void sendToAgent(Agent *destAgent, void *packetData, size_t dataBytes); - void pingAgents(); - void startSilentAgentRemovalThread(); - void stopSilentAgentRemovalThread(); - private: - UDPSocket agentSocket; - std::vector agents; - pthread_t removeSilentAgentsThread; + void handlePingReply(sockaddr *agentAddress); +public: + AgentList(char ownerType, unsigned int socketListenPort = AGENT_SOCKET_LISTEN_PORT); + ~AgentList(); + + void(*linkedDataCreateCallback)(Agent *); + void(*audioMixerSocketUpdate)(in_addr_t, in_port_t); - void handlePingReply(sockaddr *agentAddress); + std::vector& getAgents(); + UDPSocket& getAgentSocket(); + + int updateList(unsigned char *packetData, size_t dataBytes); + int indexOfMatchingAgent(sockaddr *senderAddress); + bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType); + void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); + void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); + void broadcastToAgents(char *broadcastData, size_t dataBytes); + void sendToAgent(Agent *destAgent, void *packetData, size_t dataBytes); + void pingAgents(); + char getOwnerType(); + unsigned int getSocketListenPort(); + + void startSilentAgentRemovalThread(); + void stopSilentAgentRemovalThread(); + void startDomainServerCheckInThread(); + void stopDomainServerCheckInThread(); }; #endif /* defined(__hifi__AgentList__) */ diff --git a/shared/src/UDPSocket.cpp b/shared/src/UDPSocket.cpp index 436b627045..7a601b054c 100644 --- a/shared/src/UDPSocket.cpp +++ b/shared/src/UDPSocket.cpp @@ -17,6 +17,7 @@ #else #include #include +#include #endif sockaddr_in destSockaddr, senderAddress; @@ -64,6 +65,28 @@ int unpackSocket(unsigned char *packedData, sockaddr *unpackDestSocket) { return 6; // this could be more if we ever need IPv6 } +int getLocalAddress() { + // get this agent's local address so we can pass that to DS + struct ifaddrs * ifAddrStruct = NULL; + struct ifaddrs * ifa = NULL; + + int family; + int localAddress = 0; + + getifaddrs(&ifAddrStruct); + + for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { + family = ifa->ifa_addr->sa_family; + if (family == AF_INET) { + localAddress = ((sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr; + } + } + + freeifaddrs(ifAddrStruct); + + return localAddress; +} + UDPSocket::UDPSocket(int listeningPort) { // create the socket handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); diff --git a/shared/src/UDPSocket.h b/shared/src/UDPSocket.h index 46718c1da6..26fdc7727b 100644 --- a/shared/src/UDPSocket.h +++ b/shared/src/UDPSocket.h @@ -36,5 +36,6 @@ bool socketMatch(sockaddr *first, sockaddr *second); int packSocket(unsigned char *packStore, in_addr_t inAddress, in_port_t networkOrderPort); int packSocket(unsigned char *packStore, sockaddr *socketToPack); int unpackSocket(unsigned char *packedData, sockaddr *unpackDestSocket); +int getLocalAddress(); #endif /* defined(__interface__UDPSocket__) */ From c8190b95aaa1d0bf77930053766a2c9c56ffaee6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:23:42 -0700 Subject: [PATCH 19/26] remove un-needed AgentList include from VoxelSystem --- interface/src/VoxelSystem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 4e88d01ddf..94775d1b50 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -12,7 +12,6 @@ #include // to load voxels from file #include #include -#include #include "VoxelSystem.h" const int MAX_VOXELS_PER_SYSTEM = 250000; From 507b6e006449f1ccf35793ee0ef894beef3bbcac Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:24:14 -0700 Subject: [PATCH 20/26] use abstracted DS check in method from AgentList --- domain/src/main.cpp | 11 ++++++- interface/src/main.cpp | 52 +++--------------------------- mixer/src/main.cpp | 52 ++---------------------------- voxel/src/main.cpp | 73 ++---------------------------------------- 4 files changed, 19 insertions(+), 169 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 60164ded9c..03229b57e1 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -45,7 +45,7 @@ const int LOGOFF_CHECK_INTERVAL = 5000; #define DEBUG_TO_SELF 0 int lastActiveCount = 0; -AgentList agentList(DOMAIN_LISTEN_PORT); +AgentList agentList('D', DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); @@ -74,6 +74,8 @@ int main(int argc, const char * argv[]) sockaddr_in agentPublicAddress, agentLocalAddress; agentLocalAddress.sin_family = AF_INET; + in_addr_t serverLocalAddress = getLocalAddress(); + agentList.startSilentAgentRemovalThread(); while (true) { @@ -83,6 +85,13 @@ int main(int argc, const char * argv[]) agentType = packetData[0]; unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); + // check the agent public address + // if it matches our local address we're on the same box + // so hardcode the EC2 public address for now + if (agentPublicAddress.sin_addr.s_addr == serverLocalAddress) { + agentPublicAddress.sin_addr.s_addr = 895283510; + } + agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType); currentBufferPos = broadcastPacket + 1; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 3df7672a2f..d4bd0e3f6f 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -46,7 +46,7 @@ #include "Particle.h" #include "Texture.h" #include "Cloud.h" -#include "AgentList.h" +#include #include "VoxelSystem.h" #include "Lattice.h" #include "Finger.h" @@ -64,11 +64,7 @@ int simulate_on = 1; // Network Socket and network constants // -char DOMAIN_HOSTNAME[] = "highfidelity.below92.com"; -char DOMAIN_IP[100] = ""; // IP Address will be used first if not empty string -const int DOMAINSERVER_PORT = 40102; - -AgentList agentList; +AgentList agentList('I'); pthread_t networkReceiveThread; bool stopNetworkReceiveThread = false; @@ -89,14 +85,11 @@ int WIDTH = 1200; int HEIGHT = 800; int fullscreen = 0; -in_addr_t localAddress; - Oscilloscope audioScope(256,200,true); #define HAND_RADIUS 0.25 // Radius of in-world 'hand' of you Head myHead; // The rendered head of oneself - glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); ParticleSystem balls(0, box, @@ -227,15 +220,6 @@ void Timer(int extra) glutTimerFunc(1000,Timer,0); gettimeofday(&timer_start, NULL); - // - // Send a message to the domainserver telling it we are ALIVE - // - unsigned char output[7]; - output[0] = 'I'; - packSocket(output + 1, localAddress, htons(AGENT_SOCKET_LISTEN_PORT)); - - agentList.getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); - // Ping the agents we can see agentList.pingAgents(); @@ -948,43 +932,17 @@ void audioMixerUpdate(in_addr_t newMixerAddress, in_port_t newMixerPort) { int main(int argc, char** argv) { -#ifndef _WIN32 - struct ifaddrs * ifAddrStruct=NULL; - struct ifaddrs * ifa=NULL; - - getifaddrs(&ifAddrStruct); - - for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4 - // is a valid IP4 Address - localAddress = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr; - } - } -#endif - - // Lookup the IP address of things we have hostnames - if (atoi(DOMAIN_IP) == 0) { - struct hostent* pHostInfo; - if ((pHostInfo = gethostbyname(DOMAIN_HOSTNAME)) != NULL) { - sockaddr_in tempAddress; - memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); - strcpy(DOMAIN_IP, inet_ntoa(tempAddress.sin_addr)); - printf("Domain server %s: %s\n", DOMAIN_HOSTNAME, DOMAIN_IP); - - } else { - printf("Failed lookup domainserver\n"); - } - } else printf("Using static domainserver IP: %s\n", DOMAIN_IP); - // the callback for our instance of AgentList is attachNewHeadToAgent agentList.linkedDataCreateCallback = &attachNewHeadToAgent; + #ifndef _WIN32 agentList.audioMixerSocketUpdate = &audioMixerUpdate; #endif // start the thread which checks for silent agents agentList.startSilentAgentRemovalThread(); - + agentList.startDomainServerCheckInThread(); + #ifdef _WIN32 WSADATA WsaData; int wsaresult = WSAStartup( MAKEWORD(2,2), &WsaData ); diff --git a/mixer/src/main.cpp b/mixer/src/main.cpp index f9936d71be..b1e159bddf 100644 --- a/mixer/src/main.cpp +++ b/mixer/src/main.cpp @@ -53,11 +53,7 @@ const int AGENT_LOOPBACK_MODIFIER = 307; const int LOOPBACK_SANITY_CHECK = 0; -char DOMAIN_HOSTNAME[] = "highfidelity.below92.com"; -char DOMAIN_IP[100] = ""; // IP Address will be re-set by lookup on startup -const int DOMAINSERVER_PORT = 40102; - -AgentList agentList(MIXER_LISTEN_PORT); +AgentList agentList('M', MIXER_LISTEN_PORT); StDev stdev; void plateauAdditionOfSamples(int16_t &mixSample, int16_t sampleToAdd) { @@ -235,29 +231,6 @@ void *sendBuffer(void *args) pthread_exit(0); } -void *reportAliveToDS(void *args) { - - timeval lastSend; - unsigned char output[7]; - - while (true) { - gettimeofday(&lastSend, NULL); - - *output = 'M'; - packSocket(output + 1, 895283510, htons(MIXER_LISTEN_PORT)); -// packSocket(output + 1, 788637888, htons(MIXER_LISTEN_PORT)); - agentList.getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); - - double usecToSleep = 1000000 - (usecTimestampNow() - usecTimestamp(&lastSend)); - - if (usecToSleep > 0) { - usleep(usecToSleep); - } else { - std::cout << "No sleep required!"; - } - } -} - void attachNewBufferToAgent(Agent *newAgent) { if (newAgent->getLinkedData() == NULL) { newAgent->setLinkedData(new AudioRingBuffer(RING_BUFFER_SAMPLES, BUFFER_LENGTH_SAMPLES_PER_CHANNEL)); @@ -273,26 +246,7 @@ int main(int argc, const char * argv[]) agentList.linkedDataCreateCallback = attachNewBufferToAgent; agentList.startSilentAgentRemovalThread(); - - // Lookup the IP address of things we have hostnames - if (atoi(DOMAIN_IP) == 0) { - struct hostent* pHostInfo; - if ((pHostInfo = gethostbyname(DOMAIN_HOSTNAME)) != NULL) { - sockaddr_in tempAddress; - memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); - strcpy(DOMAIN_IP, inet_ntoa(tempAddress.sin_addr)); - printf("Domain server %s: %s\n", DOMAIN_HOSTNAME, DOMAIN_IP); - - } else { - printf("Failed lookup domainserver\n"); - } - } else { - printf("Using static domainserver IP: %s\n", DOMAIN_IP); - } - - // setup the agentSocket to report to domain server - pthread_t reportAliveThread; - pthread_create(&reportAliveThread, NULL, reportAliveToDS, NULL); + agentList.startDomainServerCheckInThread(); unsigned char *packetData = new unsigned char[MAX_PACKET_SIZE]; @@ -342,8 +296,6 @@ int main(int argc, const char * argv[]) } } - agentList.stopSilentAgentRemovalThread(); - pthread_join(reportAliveThread, NULL); pthread_join(sendBufferThread, NULL); return 0; diff --git a/voxel/src/main.cpp b/voxel/src/main.cpp index ab1e2aacdf..8fe9154ab0 100644 --- a/voxel/src/main.cpp +++ b/voxel/src/main.cpp @@ -39,41 +39,9 @@ const int MIN_BRIGHTNESS = 64; const float DEATH_STAR_RADIUS = 4.0; const float MAX_CUBE = 0.05f; -char DOMAIN_HOSTNAME[] = "highfidelity.below92.com"; -char DOMAIN_IP[100] = ""; // IP Address will be re-set by lookup on startup -const int DOMAINSERVER_PORT = 40102; - const int MAX_VOXEL_TREE_DEPTH_LEVELS = 10; -AgentList agentList(VOXEL_LISTEN_PORT); -in_addr_t localAddress; - -void *reportAliveToDS(void *args) { - - timeval lastSend; - unsigned char output[7]; - - while (true) { - gettimeofday(&lastSend, NULL); - - *output = 'V'; - packSocket(output + 1, 895283510, htons(VOXEL_LISTEN_PORT)); -// packSocket(output + 1, 788637888, htons(VOXEL_LISTEN_PORT)); - agentList.getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); - - double usecToSleep = 1000000 - (usecTimestampNow() - usecTimestamp(&lastSend)); - - if (usecToSleep > 0) { - #ifdef _WIN32 - Sleep( static_cast(1000.0f*usecToSleep) ); - #else - usleep(usecToSleep); - #endif - } else { - std::cout << "No sleep required!"; - } - } -} +AgentList agentList('V', VOXEL_LISTEN_PORT); int randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) { // randomly generate children for this node @@ -142,43 +110,9 @@ int main(int argc, const char * argv[]) { setvbuf(stdout, NULL, _IOLBF, 0); -#ifndef _WIN32 - // get the local address of the voxel server - struct ifaddrs * ifAddrStruct=NULL; - struct ifaddrs * ifa=NULL; - - getifaddrs(&ifAddrStruct); - - for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4 - // is a valid IP4 Address - localAddress = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr; - } - } -#endif - - // Lookup the IP address of things we have hostnames - if (atoi(DOMAIN_IP) == 0) { - struct hostent* pHostInfo; - if ((pHostInfo = gethostbyname(DOMAIN_HOSTNAME)) != NULL) { - sockaddr_in tempAddress; - memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); - strcpy(DOMAIN_IP, inet_ntoa(tempAddress.sin_addr)); - printf("Domain server %s: %s\n", DOMAIN_HOSTNAME, DOMAIN_IP); - - } else { - printf("Failed lookup domainserver\n"); - } - } else { - printf("Using static domainserver IP: %s\n", DOMAIN_IP); - } - - // setup the agentSocket to report to domain server - pthread_t reportAliveThread; - pthread_create(&reportAliveThread, NULL, reportAliveToDS, NULL); - agentList.linkedDataCreateCallback = &attachVoxelAgentDataToAgent; agentList.startSilentAgentRemovalThread(); + agentList.startDomainServerCheckInThread(); srand((unsigned)time(0)); @@ -245,8 +179,5 @@ int main(int argc, const char * argv[]) } } - pthread_join(reportAliveThread, NULL); - agentList.stopSilentAgentRemovalThread(); - return 0; } \ No newline at end of file From eb185f2ce8c73db6a258ef3eb6912498000904be Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:37:24 -0700 Subject: [PATCH 21/26] remove command options methods from SharedUtil that crash Jenkins --- shared/src/SharedUtil.cpp | 30 ------------------------------ shared/src/SharedUtil.h | 3 --- 2 files changed, 33 deletions(-) diff --git a/shared/src/SharedUtil.cpp b/shared/src/SharedUtil.cpp index 3e9e75e2bb..cb55232a89 100644 --- a/shared/src/SharedUtil.cpp +++ b/shared/src/SharedUtil.cpp @@ -79,36 +79,6 @@ void switchToResourcesIfRequired() { #endif } -////////////////////////////////////////////////////////////////////////////////////////// -// Function: getCmdOption() -// Description: Handy little function to tell you if a command line flag and option was -// included while launching the application, and to get the option value -// immediately following the flag. For example if you ran: -// ./app -i filename.txt -// then you're using the "-i" flag to set the input file name. -// Usage: char * inputFilename = getCmdOption(argv, argv + argc, "-i"); -// Complaints: Brad :) -char* getCmdOption(char ** begin, char ** end, const std::string & option) -{ - char ** itr = std::find(begin, end, option); - if (itr != end && ++itr != end) - { - return *itr; - } - return 0; -} - -////////////////////////////////////////////////////////////////////////////////////////// -// Function: getCmdOption() -// Description: Handy little function to tell you if a command line option flag was -// included while launching the application. Returns bool true/false -// Usage: bool wantDump = cmdOptionExists(argv, argv+argc, "-d"); -// Complaints: Brad :) -bool cmdOptionExists(char** begin, char** end, const std::string& option) -{ - return std::find(begin, end, option) != end; -} - ////////////////////////////////////////////////////////////////////////////////////////// // Function: pointToVoxel() // Description: Given a universal point with location x,y,z this will return the voxel diff --git a/shared/src/SharedUtil.h b/shared/src/SharedUtil.h index 1ba5ff8280..79790b5ed3 100644 --- a/shared/src/SharedUtil.h +++ b/shared/src/SharedUtil.h @@ -33,9 +33,6 @@ bool oneAtBit(unsigned char byte, int bitIndex); void switchToResourcesIfRequired(); -char* getCmdOption(char ** begin, char ** end, const std::string& option); -bool cmdOptionExists(char** begin, char** end, const std::string& option); - unsigned char* pointToVoxel(float x, float y, float z, float s, unsigned char r, unsigned char g, unsigned char b ); #endif /* defined(__hifi__SharedUtil__) */ From 1e2876ce755571d0d642170f4df149d960ad8ae0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:40:19 -0700 Subject: [PATCH 22/26] include stdint for use of uint16_t --- shared/src/Agent.h | 1 + shared/src/AgentList.h | 1 + 2 files changed, 2 insertions(+) diff --git a/shared/src/Agent.h b/shared/src/Agent.h index 087d828b49..4fc7bd9a83 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -10,6 +10,7 @@ #define __hifi__Agent__ #include +#include #include "AgentData.h" #ifdef _WIN32 diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 97ba313359..4e313a2e4a 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -11,6 +11,7 @@ #include #include +#include #include "Agent.h" #include "UDPSocket.h" From 3df93804d157a14582e6ab42bb785e18fa10740c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:41:42 -0700 Subject: [PATCH 23/26] include cstring for memcpy in AgentList --- shared/src/AgentList.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 85ed514237..0c0f24ef00 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -6,8 +6,9 @@ // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // -#include "AgentList.h" #include +#include +#include "AgentList.h" #include "SharedUtil.h" #ifdef _WIN32 From a2b05d5f1465bef82ef91b37e20803a7285b8633 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:43:31 -0700 Subject: [PATCH 24/26] include stdlib for use of atoi --- shared/src/AgentList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 0c0f24ef00..3ff902802c 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -8,6 +8,7 @@ #include #include +#include #include "AgentList.h" #include "SharedUtil.h" From d76fafda675b010688e618edbefb3b35f5cc62e5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:45:49 -0700 Subject: [PATCH 25/26] remove call that included getCmdOption --- interface/src/main.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index d4bd0e3f6f..8b78cf69eb 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -973,14 +973,6 @@ int main(int argc, char** argv) printf( "Initialized Display.\n" ); init(); - - // Check to see if the user passed in a command line option for loading a local - // Voxel File. If so, load it now. - char* voxelsFilename = getCmdOption(argv, argv + argc, "-i"); - if (voxelsFilename) - { - voxels.loadVoxelsFile(voxelsFilename); - } // create thread for receipt of data via UDP pthread_create(&networkReceiveThread, NULL, networkReceive, NULL); From 9dbb64aaec80d258c822cabc1878d7305ba9386a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 25 Mar 2013 16:54:36 -0700 Subject: [PATCH 26/26] have mixer and voxel server also maintain agent IDs --- mixer/src/main.cpp | 6 +++++- voxel/src/main.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mixer/src/main.cpp b/mixer/src/main.cpp index b1e159bddf..ea97e85d0e 100644 --- a/mixer/src/main.cpp +++ b/mixer/src/main.cpp @@ -286,7 +286,11 @@ int main(int argc, const char * argv[]) // add or update the existing interface agent if (!LOOPBACK_SANITY_CHECK) { - agentList.addOrUpdateAgent(agentAddress, agentAddress, packetData[0]); + + if (agentList.addOrUpdateAgent(agentAddress, agentAddress, packetData[0], agentList.getLastAgentId())) { + agentList.increaseAgentId(); + } + agentList.updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); } else { memcpy(loopbackAudioPacket, packetData + 1 + (sizeof(float) * 4), 1024); diff --git a/voxel/src/main.cpp b/voxel/src/main.cpp index 8fe9154ab0..28cf559322 100644 --- a/voxel/src/main.cpp +++ b/voxel/src/main.cpp @@ -139,7 +139,11 @@ int main(int argc, const char * argv[]) while (true) { if (agentList.getAgentSocket().receive(&agentPublicAddress, packetData, &receivedBytes)) { if (packetData[0] == 'H') { - agentList.addOrUpdateAgent(&agentPublicAddress, &agentPublicAddress, packetData[0]); + + if (agentList.addOrUpdateAgent(&agentPublicAddress, &agentPublicAddress, packetData[0], agentList.getLastAgentId())) { + agentList.increaseAgentId(); + } + agentList.updateAgentWithData(&agentPublicAddress, (void *)packetData, receivedBytes); VoxelAgentData *agentData = (VoxelAgentData *) agentList.getAgents()[agentList.indexOfMatchingAgent(&agentPublicAddress)].getLinkedData();