mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 12:54:30 +02:00
Deleting silent agents
This commit is contained in:
parent
64e563ef7c
commit
35a8207769
2 changed files with 40 additions and 8 deletions
|
@ -69,7 +69,8 @@ AvatarAgent::AvatarAgent(sockaddr activeSocket,
|
||||||
float averageLoudness,
|
float averageLoudness,
|
||||||
float handPositionX,
|
float handPositionX,
|
||||||
float handPositionY,
|
float handPositionY,
|
||||||
float handPositionZ) {
|
float handPositionZ,
|
||||||
|
double lastHeartbeat) {
|
||||||
|
|
||||||
this->setActiveSocket(activeSocket);
|
this->setActiveSocket(activeSocket);
|
||||||
this->setPitch(pitch);
|
this->setPitch(pitch);
|
||||||
|
@ -79,6 +80,7 @@ AvatarAgent::AvatarAgent(sockaddr activeSocket,
|
||||||
this->setLoudness(loudness);
|
this->setLoudness(loudness);
|
||||||
this->setAverageLoudness(averageLoudness);
|
this->setAverageLoudness(averageLoudness);
|
||||||
this->setHandPosition(handPositionX, handPositionY, handPositionZ);
|
this->setHandPosition(handPositionX, handPositionY, handPositionZ);
|
||||||
|
this->setLastHeartbeat(lastHeartbeat);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,6 +137,10 @@ float AvatarAgent::getHandPositionZ() {
|
||||||
return _handPositionZ;
|
return _handPositionZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double AvatarAgent::getLastHeartbeat() {
|
||||||
|
return _lastHeartbeat;
|
||||||
|
}
|
||||||
|
|
||||||
// Property setters
|
// Property setters
|
||||||
void AvatarAgent::setPitch(float pitch) {
|
void AvatarAgent::setPitch(float pitch) {
|
||||||
_pitch = pitch;
|
_pitch = pitch;
|
||||||
|
@ -168,6 +174,9 @@ void AvatarAgent::setHandPosition(float x, float y, float z) {
|
||||||
_handPositionZ = z;
|
_handPositionZ = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AvatarAgent::setLastHeartbeat(double lastHeartbeat) {
|
||||||
|
_lastHeartbeat = lastHeartbeat;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, AvatarAgent *agentToAdd) {
|
unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, AvatarAgent *agentToAdd) {
|
||||||
unsigned char *packetData = new unsigned char();
|
unsigned char *packetData = new unsigned char();
|
||||||
|
@ -209,24 +218,39 @@ void *sendAvatarData(void *args) {
|
||||||
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
|
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
|
||||||
avatarAgent != avatarAgentList->end();
|
avatarAgent != avatarAgentList->end();
|
||||||
avatarAgent++) {
|
avatarAgent++) {
|
||||||
|
|
||||||
addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
|
addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
|
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
|
||||||
avatarAgent != avatarAgentList->end();
|
avatarAgent != avatarAgentList->end();
|
||||||
avatarAgent++) {
|
avatarAgent++) {
|
||||||
|
|
||||||
avatarMixerSocket->send(avatarAgent->getActiveSocket(), broadcastPacket, strlen((const char *)broadcastPacket));
|
avatarMixerSocket->send(avatarAgent->getActiveSocket(), broadcastPacket, strlen((const char *)broadcastPacket));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double usecToSleep = usecTimestamp(&startTime) + (BROADCAST_INTERVAL * 10000000) - usecTimestampNow();
|
double usecToSleep = usecTimestamp(&startTime) + (BROADCAST_INTERVAL * 10000000) - usecTimestampNow();
|
||||||
|
delete[] broadcastPacket;
|
||||||
usleep(usecToSleep);
|
usleep(usecToSleep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *popInactiveAvatarAgents(void *args) {
|
||||||
|
|
||||||
|
double checkTime, sleepTime;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
checkTime = usecTimestampNow();
|
||||||
|
|
||||||
|
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
|
||||||
|
avatarAgent != avatarAgentList->end();
|
||||||
|
avatarAgent++) {
|
||||||
|
if ((checkTime - avatarAgent->getLastHeartbeat()) > AGENT_SILENCE_THRESHOLD_USECS) {
|
||||||
|
avatarAgent = avatarAgentList->erase(avatarAgent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||||
|
@ -234,6 +258,9 @@ int main(int argc, char* argv[])
|
||||||
pthread_t sendAvatarDataThread;
|
pthread_t sendAvatarDataThread;
|
||||||
pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL);
|
pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL);
|
||||||
|
|
||||||
|
pthread_t popInactiveAvatarAgentsThread;
|
||||||
|
pthread_create(&popInactiveAvatarAgentsThread, NULL, popInactiveAvatarAgents, NULL);
|
||||||
|
|
||||||
sockaddr *agentAddress = new sockaddr;
|
sockaddr *agentAddress = new sockaddr;
|
||||||
char *packetData = new char[MAX_PACKET_SIZE];
|
char *packetData = new char[MAX_PACKET_SIZE];
|
||||||
ssize_t receivedBytes = 0;
|
ssize_t receivedBytes = 0;
|
||||||
|
@ -273,7 +300,6 @@ int main(int argc, char* argv[])
|
||||||
matchingAgent = findAvatarAgentBySocket(agentAddress);
|
matchingAgent = findAvatarAgentBySocket(agentAddress);
|
||||||
|
|
||||||
if (matchingAgent) {
|
if (matchingAgent) {
|
||||||
|
|
||||||
// We already have this agent on our list, just modify positional data
|
// We already have this agent on our list, just modify positional data
|
||||||
matchingAgent->setPitch(*pitch);
|
matchingAgent->setPitch(*pitch);
|
||||||
matchingAgent->setYaw(*yaw);
|
matchingAgent->setYaw(*yaw);
|
||||||
|
@ -282,6 +308,7 @@ int main(int argc, char* argv[])
|
||||||
matchingAgent->setLoudness(*loudness);
|
matchingAgent->setLoudness(*loudness);
|
||||||
matchingAgent->setAverageLoudness(*averageLoudness);
|
matchingAgent->setAverageLoudness(*averageLoudness);
|
||||||
matchingAgent->setHandPosition(*handPositionX, *handPositionY, *handPositionZ);
|
matchingAgent->setHandPosition(*handPositionX, *handPositionY, *handPositionZ);
|
||||||
|
matchingAgent->setLastHeartbeat(usecTimestampNow());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// This is a new agent, we need to add to the list
|
// This is a new agent, we need to add to the list
|
||||||
|
@ -296,7 +323,8 @@ int main(int argc, char* argv[])
|
||||||
*averageLoudness,
|
*averageLoudness,
|
||||||
*handPositionX,
|
*handPositionX,
|
||||||
*handPositionY,
|
*handPositionY,
|
||||||
*handPositionZ);
|
*handPositionZ,
|
||||||
|
usecTimestampNow());
|
||||||
avatarAgentList->push_back(thisAgentHolder);
|
avatarAgentList->push_back(thisAgentHolder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ private:
|
||||||
float _handPositionX;
|
float _handPositionX;
|
||||||
float _handPositionY;
|
float _handPositionY;
|
||||||
float _handPositionZ;
|
float _handPositionZ;
|
||||||
|
double _lastHeartbeat;
|
||||||
public:
|
public:
|
||||||
AvatarAgent(sockaddr activeSocket,
|
AvatarAgent(sockaddr activeSocket,
|
||||||
float pitch,
|
float pitch,
|
||||||
|
@ -56,7 +57,8 @@ public:
|
||||||
float averageLoudness,
|
float averageLoudness,
|
||||||
float handPositionX,
|
float handPositionX,
|
||||||
float handPositionY,
|
float handPositionY,
|
||||||
float handPositionZ);
|
float handPositionZ,
|
||||||
|
double lastHeartbeat);
|
||||||
~AvatarAgent();
|
~AvatarAgent();
|
||||||
sockaddr *getActiveSocket();
|
sockaddr *getActiveSocket();
|
||||||
void setActiveSocket(sockaddr activeSocket);
|
void setActiveSocket(sockaddr activeSocket);
|
||||||
|
@ -78,4 +80,6 @@ public:
|
||||||
float getHandPositionY();
|
float getHandPositionY();
|
||||||
float getHandPositionZ();
|
float getHandPositionZ();
|
||||||
void setHandPosition(float x, float y, float z);
|
void setHandPosition(float x, float y, float z);
|
||||||
|
double getLastHeartbeat();
|
||||||
|
void setLastHeartbeat(double lastHeartbeat);
|
||||||
};
|
};
|
Loading…
Reference in a new issue