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"
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<Agent>::iterator avatarAgent = agentList.getAgents().begin();
avatarAgent != agentList.getAgents().end();
avatarAgent++) {
addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
}
for (std::vector<Agent>::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;
}

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) {
// 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";