mirror of
https://github.com/overte-org/overte.git
synced 2025-04-22 16:13:28 +02:00
refactoring broadcast avatar data, auto-activate AM public socket
This commit is contained in:
parent
4f576ba86f
commit
8fe87d08e9
2 changed files with 38 additions and 29 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in a new issue