diff --git a/avatar/src/main.cpp b/avatar/src/main.cpp index b94066d029..5e87312eca 100644 --- a/avatar/src/main.cpp +++ b/avatar/src/main.cpp @@ -35,62 +35,61 @@ #include "AvatarAgentData.h" const int AVATAR_LISTEN_PORT = 55444; -const unsigned short BROADCAST_INTERVAL = 20; +const unsigned short BROADCAST_INTERVAL_USECS = 20 * 1000 * 1000; AgentList agentList(AGENT_TYPE_AVATAR_MIXER, AVATAR_LISTEN_PORT); unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { - unsigned char *packetData = new unsigned char(); - - currentPosition += packSocket(currentPosition, agentToAdd->getActiveSocket()); + currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); AvatarAgentData *agentData = (AvatarAgentData *)agentToAdd->getLinkedData(); - sprintf((char *)packetData, PACKET_FORMAT, agentData->getPitch(), - agentData->getYaw(), - agentData->getRoll(), - agentData->getHeadPositionX(), - agentData->getHeadPositionY(), - agentData->getHeadPositionZ(), - agentData->getLoudness(), - agentData->getAverageLoudness(), - agentData->getHandPositionX(), - agentData->getHandPositionY(), - agentData->getHandPositionZ()); - - memcpy(currentPosition, packetData, strlen((const char*)packetData)); - currentPosition += strlen((const char*)packetData); + int bytesWritten = sprintf((char *)currentPosition, + PACKET_FORMAT, + agentData->getPitch(), + agentData->getYaw(), + agentData->getRoll(), + agentData->getHeadPositionX(), + agentData->getHeadPositionY(), + agentData->getHeadPositionZ(), + agentData->getLoudness(), + agentData->getAverageLoudness(), + agentData->getHandPositionX(), + agentData->getHandPositionY(), + agentData->getHandPositionZ()); + currentPosition += bytesWritten; return currentPosition; } void *sendAvatarData(void *args) { timeval startTime; + + unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; + *broadcastPacket = PACKET_HEADER_HEAD_DATA; + + unsigned char* currentBufferPosition = NULL; + while (true) { gettimeofday(&startTime, NULL); - unsigned char *currentBufferPosition; - unsigned char *startPointer; - unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; - - broadcastPacket = (unsigned char *)PACKET_HEADER_HEAD_DATA; - currentBufferPosition = broadcastPacket + 1; - startPointer = currentBufferPosition; - + currentBufferPosition = broadcastPacket + 1; for (std::vector::iterator avatarAgent = agentList.getAgents().begin(); avatarAgent != agentList.getAgents().end(); avatarAgent++) { - addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); + currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); } for (std::vector::iterator avatarAgent = agentList.getAgents().begin(); avatarAgent != agentList.getAgents().end(); avatarAgent++) { - agentList.getAgentSocket().send(avatarAgent->getActiveSocket(), broadcastPacket, strlen((const char *)broadcastPacket)); + agentList.getAgentSocket().send(avatarAgent->getPublicSocket(), + broadcastPacket, + currentBufferPosition - broadcastPacket); } - double usecToSleep = usecTimestamp(&startTime) + (BROADCAST_INTERVAL * 10000000) - usecTimestampNow(); + double usecToSleep = BROADCAST_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&startTime)); usleep(usecToSleep); } } @@ -132,4 +131,7 @@ int main(int argc, char* argv[]) agentList.stopDomainServerCheckInThread(); agentList.stopSilentAgentRemovalThread(); + + pthread_join(sendAvatarDataThread, NULL); + return 0; } diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 460533d50e..da6132c93e 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -90,6 +90,11 @@ void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size } void AgentList::updateDataForAllAgents(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { + // find the avatar mixer in our agent list and update the lastRecvTime from it + int avatarMixerIndex = indexOfMatchingAgent(senderAddress); + Agent *avatarMixerAgent = &agents[avatarMixerIndex]; + avatarMixerAgent->setLastRecvTimeUsecs(usecTimestampNow()); + int bytesForEachAgent = sizeof(float) * 11; unsigned char *currentPosition = packetData + 1; @@ -207,6 +212,8 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, audioMixerSocketUpdate(publicSocketIn->sin_addr.s_addr, publicSocketIn->sin_port); } else if (newAgent.getType() == AGENT_TYPE_VOXEL) { newAgent.activatePublicSocket(); + } else if (newAgent.getType() == AGENT_TYPE_AVATAR_MIXER) { + newAgent.activatePublicSocket(); } std::cout << "Added agent - " << &newAgent << "\n";