refactoring broadcast avatar data, auto-activate AM public socket

This commit is contained in:
Stephen Birarda 2013-04-09 17:59:54 -07:00
parent 4f576ba86f
commit 8fe87d08e9
2 changed files with 38 additions and 29 deletions

View file

@ -35,62 +35,61 @@
#include "AvatarAgentData.h" #include "AvatarAgentData.h"
const int AVATAR_LISTEN_PORT = 55444; 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); AgentList agentList(AGENT_TYPE_AVATAR_MIXER, AVATAR_LISTEN_PORT);
unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) {
unsigned char *packetData = new unsigned char(); currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket());
currentPosition += packSocket(currentPosition, agentToAdd->getActiveSocket());
AvatarAgentData *agentData = (AvatarAgentData *)agentToAdd->getLinkedData(); AvatarAgentData *agentData = (AvatarAgentData *)agentToAdd->getLinkedData();
sprintf((char *)packetData, PACKET_FORMAT, agentData->getPitch(), int bytesWritten = sprintf((char *)currentPosition,
agentData->getYaw(), PACKET_FORMAT,
agentData->getRoll(), agentData->getPitch(),
agentData->getHeadPositionX(), agentData->getYaw(),
agentData->getHeadPositionY(), agentData->getRoll(),
agentData->getHeadPositionZ(), agentData->getHeadPositionX(),
agentData->getLoudness(), agentData->getHeadPositionY(),
agentData->getAverageLoudness(), agentData->getHeadPositionZ(),
agentData->getHandPositionX(), agentData->getLoudness(),
agentData->getHandPositionY(), agentData->getAverageLoudness(),
agentData->getHandPositionZ()); agentData->getHandPositionX(),
agentData->getHandPositionY(),
memcpy(currentPosition, packetData, strlen((const char*)packetData)); agentData->getHandPositionZ());
currentPosition += strlen((const char*)packetData);
currentPosition += bytesWritten;
return currentPosition; return currentPosition;
} }
void *sendAvatarData(void *args) { void *sendAvatarData(void *args) {
timeval startTime; timeval startTime;
unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE];
*broadcastPacket = PACKET_HEADER_HEAD_DATA;
unsigned char* currentBufferPosition = NULL;
while (true) { while (true) {
gettimeofday(&startTime, NULL); gettimeofday(&startTime, NULL);
unsigned char *currentBufferPosition; currentBufferPosition = broadcastPacket + 1;
unsigned char *startPointer;
unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE];
broadcastPacket = (unsigned char *)PACKET_HEADER_HEAD_DATA;
currentBufferPosition = broadcastPacket + 1;
startPointer = currentBufferPosition;
for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin(); for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin();
avatarAgent != agentList.getAgents().end(); avatarAgent != agentList.getAgents().end();
avatarAgent++) { avatarAgent++) {
addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
} }
for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin(); for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin();
avatarAgent != agentList.getAgents().end(); avatarAgent != agentList.getAgents().end();
avatarAgent++) { 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); usleep(usecToSleep);
} }
} }
@ -132,4 +131,7 @@ int main(int argc, char* argv[])
agentList.stopDomainServerCheckInThread(); agentList.stopDomainServerCheckInThread();
agentList.stopSilentAgentRemovalThread(); agentList.stopSilentAgentRemovalThread();
pthread_join(sendAvatarDataThread, NULL);
return 0;
} }

View file

@ -90,6 +90,11 @@ void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size
} }
void AgentList::updateDataForAllAgents(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { 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; int bytesForEachAgent = sizeof(float) * 11;
unsigned char *currentPosition = packetData + 1; 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); audioMixerSocketUpdate(publicSocketIn->sin_addr.s_addr, publicSocketIn->sin_port);
} else if (newAgent.getType() == AGENT_TYPE_VOXEL) { } else if (newAgent.getType() == AGENT_TYPE_VOXEL) {
newAgent.activatePublicSocket(); newAgent.activatePublicSocket();
} else if (newAgent.getType() == AGENT_TYPE_AVATAR_MIXER) {
newAgent.activatePublicSocket();
} }
std::cout << "Added agent - " << &newAgent << "\n"; std::cout << "Added agent - " << &newAgent << "\n";