From 46041b2ed9658526e9eacc51eddcf8084ccc3d5b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 26 Apr 2013 10:21:14 -0700 Subject: [PATCH 01/10] Style tweaks: preface privates with underscore, capitalize enum members. --- interface/src/Avatar.cpp | 2 +- interface/src/ChatEntry.cpp | 32 ++++++++++++++-------------- interface/src/ChatEntry.h | 7 +++--- interface/src/main.cpp | 6 +++--- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/avatars/src/AvatarData.h | 11 +++++++--- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 305555577b..8086a3a07a 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -654,7 +654,7 @@ void Avatar::render(bool lookingInMirror) { glTranslatef(width * 0.5, 0, 0); glDisable(GL_LIGHTING); - if (_keyState == NoKeyDown) { + if (_keyState == NO_KEY_DOWN) { drawtext(0, 0, chatMessageScale, 180, 1.0, 0, _chatMessage.c_str(), 0, 1, 0); } else { diff --git a/interface/src/ChatEntry.cpp b/interface/src/ChatEntry.cpp index b658cbaefd..aca13a79ac 100644 --- a/interface/src/ChatEntry.cpp +++ b/interface/src/ChatEntry.cpp @@ -15,8 +15,8 @@ using namespace std; const int MAX_CONTENT_LENGTH = 140; void ChatEntry::clear () { - contents.clear(); - cursorPos = 0; + _contents.clear(); + _cursorPos = 0; } bool ChatEntry::key(unsigned char k) { @@ -25,22 +25,22 @@ bool ChatEntry::key(unsigned char k) { return false; case '\b': - if (cursorPos != 0) { - contents.erase(cursorPos - 1, 1); - cursorPos--; + if (_cursorPos != 0) { + _contents.erase(_cursorPos - 1, 1); + _cursorPos--; } return true; case 127: // delete - if (cursorPos < contents.size()) { - contents.erase(cursorPos, 1); + if (_cursorPos < _contents.size()) { + _contents.erase(_cursorPos, 1); } return true; default: - if (contents.size() != MAX_CONTENT_LENGTH) { - contents.insert(cursorPos, 1, k); - cursorPos++; + if (_contents.size() != MAX_CONTENT_LENGTH) { + _contents.insert(_cursorPos, 1, k); + _cursorPos++; } return true; } @@ -49,24 +49,24 @@ bool ChatEntry::key(unsigned char k) { void ChatEntry::specialKey(unsigned char k) { switch (k) { case GLUT_KEY_LEFT: - if (cursorPos != 0) { - cursorPos--; + if (_cursorPos != 0) { + _cursorPos--; } break; case GLUT_KEY_RIGHT: - if (cursorPos != contents.size()) { - cursorPos++; + if (_cursorPos != _contents.size()) { + _cursorPos++; } break; } } void ChatEntry::render(int screenWidth, int screenHeight) { - drawtext(20, screenHeight - 150, 0.10, 0, 1.0, 0, contents.c_str(), 1, 1, 1); + drawtext(20, screenHeight - 150, 0.10, 0, 1.0, 0, _contents.c_str(), 1, 1, 1); float width = 0; - for (string::iterator it = contents.begin(), end = it + cursorPos; it != end; it++) { + for (string::iterator it = _contents.begin(), end = it + _cursorPos; it != end; it++) { width += glutStrokeWidth(GLUT_STROKE_ROMAN, *it)*0.10; } glDisable(GL_LINE_SMOOTH); diff --git a/interface/src/ChatEntry.h b/interface/src/ChatEntry.h index ea9fc8eb77..db92822158 100644 --- a/interface/src/ChatEntry.h +++ b/interface/src/ChatEntry.h @@ -14,7 +14,7 @@ class ChatEntry { public: - const std::string& getContents () const { return contents; } + const std::string& getContents () const { return _contents; } void clear (); @@ -25,9 +25,8 @@ public: private: - std::string contents; - - int cursorPos; + std::string _contents; + int _cursorPos; }; #endif /* defined(__interface__ChatEntry__) */ diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 06478f4a7e..f1abfb36aa 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1389,7 +1389,7 @@ void specialkey(int k, int x, int y) void keyUp(unsigned char k, int x, int y) { if (::chatEntryOn) { - myAvatar.setKeyState(AvatarData::NoKeyDown); + myAvatar.setKeyState(NO_KEY_DOWN); return; } @@ -1407,7 +1407,7 @@ void key(unsigned char k, int x, int y) if (::chatEntryOn) { if (chatEntry.key(k)) { myAvatar.setKeyState(k == '\b' || k == 127 ? // backspace or delete - AvatarData::DeleteKeyDown : AvatarData::InsertKeyDown); + DELETE_KEY_DOWN : INSERT_KEY_DOWN); myAvatar.setChatMessage(string(chatEntry.getContents().size(), 'X')); } else { @@ -1486,7 +1486,7 @@ void key(unsigned char k, int x, int y) if (k == '\r') { ::chatEntryOn = true; - myAvatar.setKeyState(AvatarData::NoKeyDown); + myAvatar.setKeyState(NO_KEY_DOWN); myAvatar.setChatMessage(string()); } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b80fbc445e..8881c397af 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -51,7 +51,7 @@ AvatarData::AvatarData() : _cameraAspectRatio(0.0f), _cameraNearClip(0.0f), _cameraFarClip(0.0f), - _keyState(NoKeyDown) { + _keyState(NO_KEY_DOWN) { } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 39a53481fa..88d5c1ac1f 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -15,6 +15,13 @@ #include +enum KeyState +{ + NO_KEY_DOWN, + INSERT_KEY_DOWN, + DELETE_KEY_DOWN +}; + class AvatarData : public AgentData { public: AvatarData(); @@ -76,8 +83,6 @@ public: void setCameraNearClip(float nearClip) { _cameraNearClip = nearClip; } void setCameraFarClip(float farClip) { _cameraFarClip = farClip; } - enum KeyState { NoKeyDown, InsertKeyDown, DeleteKeyDown }; - // key state void setKeyState(KeyState s) { _keyState = s; } KeyState keyState() const { return _keyState; } @@ -118,7 +123,7 @@ protected: float _cameraNearClip; float _cameraFarClip; - // key state (nothing, down, up, backspace) + // key state KeyState _keyState; // chat message From b9fdba27113b59a97ae7b45486a991f170655575 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 26 Apr 2013 11:08:41 -0700 Subject: [PATCH 02/10] Rather than creating a thread to read datagrams, just set the socket to nonblocking mode and check it before simulating. This addresses one aspect of the lack of synchronization on AgentList, but there are other issues... --- interface/src/main.cpp | 68 ++++++++++++------------------ libraries/shared/src/UDPSocket.cpp | 14 +++++- libraries/shared/src/UDPSocket.h | 3 ++ 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index f1abfb36aa..582a03ed00 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -39,8 +39,6 @@ #include #endif -#include - #include #include #include @@ -88,10 +86,7 @@ using namespace std; void reshape(int width, int height); // will be defined below void loadViewFrustum(ViewFrustum& viewFrustum); // will be defined below - -pthread_t networkReceiveThread; -bool stopNetworkReceiveThread = false; - +unsigned char incomingPacket[MAX_PACKET_SIZE]; int packetCount = 0; int packetsPerSecond = 0; int bytesPerSecond = 0; @@ -429,8 +424,6 @@ void terminate () { #ifndef _WIN32 audio.terminate(); #endif - stopNetworkReceiveThread = true; - pthread_join(networkReceiveThread, NULL); exit(EXIT_SUCCESS); } @@ -1492,41 +1485,34 @@ void key(unsigned char k, int x, int y) } // Receive packets from other agents/servers and decide what to do with them! -void *networkReceive(void *args) +void networkReceive() { sockaddr senderAddress; ssize_t bytesReceived; - unsigned char *incomingPacket = new unsigned char[MAX_PACKET_SIZE]; - while (!stopNetworkReceiveThread) { - if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { - packetCount++; - bytesCount += bytesReceived; - - switch (incomingPacket[0]) { - case PACKET_HEADER_TRANSMITTER_DATA: - myAvatar.processTransmitterData(incomingPacket, bytesReceived); - break; - case PACKET_HEADER_VOXEL_DATA: - case PACKET_HEADER_Z_COMMAND: - case PACKET_HEADER_ERASE_VOXEL: - voxels.parseData(incomingPacket, bytesReceived); - break; - case PACKET_HEADER_BULK_AVATAR_DATA: - AgentList::getInstance()->processBulkAgentData(&senderAddress, - incomingPacket, - bytesReceived); - break; - default: - AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); - break; - } + while (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { + packetCount++; + bytesCount += bytesReceived; + + switch (incomingPacket[0]) { + case PACKET_HEADER_TRANSMITTER_DATA: + myAvatar.processTransmitterData(incomingPacket, bytesReceived); + break; + case PACKET_HEADER_VOXEL_DATA: + case PACKET_HEADER_Z_COMMAND: + case PACKET_HEADER_ERASE_VOXEL: + voxels.parseData(incomingPacket, bytesReceived); + break; + case PACKET_HEADER_BULK_AVATAR_DATA: + AgentList::getInstance()->processBulkAgentData(&senderAddress, + incomingPacket, + bytesReceived); + break; + default: + AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); + break; } } - - delete[] incomingPacket; - pthread_exit(0); - return NULL; } void idle(void) { @@ -1560,6 +1546,9 @@ void idle(void) { // updateAvatar(deltaTime); + // read incoming packets from network + networkReceive(); + //loop through all the other avatars and simulate them... AgentList* agentList = AgentList::getInstance(); for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { @@ -1703,6 +1692,7 @@ int main(int argc, const char * argv[]) listenPort = atoi(portStr); } AgentList::createInstance(AGENT_TYPE_AVATAR, listenPort); + AgentList::getInstance()->getAgentSocket().setBlocking(false); gettimeofday(&applicationStartupTime, NULL); const char* domainIP = getCmdOption(argc, argv, "--domain"); @@ -1785,10 +1775,6 @@ int main(int argc, const char * argv[]) printLog("Local Voxel File loaded.\n"); } - // create thread for receipt of data via UDP - pthread_create(&networkReceiveThread, NULL, networkReceive, NULL); - printLog("Network receive thread created.\n"); - glutTimerFunc(1000, Timer, 0); glutMainLoop(); diff --git a/libraries/shared/src/UDPSocket.cpp b/libraries/shared/src/UDPSocket.cpp index 0fa5ce08a4..31040946e0 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -119,7 +119,7 @@ unsigned short loadBufferWithSocketInfo(char *addressBuffer, sockaddr *socket) { } } -UDPSocket::UDPSocket(int listeningPort) { +UDPSocket::UDPSocket(int listeningPort) : blocking(true) { init(); // create the socket handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -191,6 +191,18 @@ bool UDPSocket::init() { return true; } +void UDPSocket::setBlocking(bool blocking) { + this->blocking = blocking; + +#ifdef _WIN32 + u_long mode = blocking ? 0 : 1; + ioctlsocket(handle, FIONBIO, &mode); +#else + int flags = fcntl(handle, F_GETFL, 0); + fcntl(handle, F_SETFL, blocking ? (flags & ~O_NONBLOCK) : (flags | O_NONBLOCK)); +#endif +} + // Receive data on this socket with retrieving address of sender bool UDPSocket::receive(void *receivedData, ssize_t *receivedBytes) { diff --git a/libraries/shared/src/UDPSocket.h b/libraries/shared/src/UDPSocket.h index 2bc5638b5e..80c093d6f4 100644 --- a/libraries/shared/src/UDPSocket.h +++ b/libraries/shared/src/UDPSocket.h @@ -23,12 +23,15 @@ class UDPSocket { UDPSocket(int listening_port); ~UDPSocket(); bool init(); + void setBlocking(bool blocking); + bool isBlocking() { return blocking; } int send(sockaddr *destAddress, const void *data, size_t byteLength); int send(char *destAddress, int destPort, const void *data, size_t byteLength); bool receive(void *receivedData, ssize_t *receivedBytes); bool receive(sockaddr *recvAddress, void *receivedData, ssize_t *receivedBytes); private: int handle; + bool blocking; }; bool socketMatch(sockaddr *first, sockaddr *second); From 948f9607f631d27c17198de4bbbd15438ff6ce76 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 26 Apr 2013 11:49:52 -0700 Subject: [PATCH 03/10] send head position as source position to mixer --- interface/src/Audio.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index f90027d25a..df1e547d31 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -151,10 +151,8 @@ int audioCallback (const void *inputBuffer, unsigned char *currentPacketPtr = dataPacket + 1; // memcpy the three float positions - for (int p = 0; p < 3; p++) { - memcpy(currentPacketPtr, &data->linkedAvatar->getPosition()[p], sizeof(float)); - currentPacketPtr += sizeof(float); - } + memcpy(currentPacketPtr, &data->linkedAvatar->getHeadPosition(), sizeof(float) * 3); + currentPacketPtr += (sizeof(float) * 3); // tell the mixer not to add additional attenuation to our source *(currentPacketPtr++) = 255; From 57c39ceb9908e622cc574d34c1a785f9eae09c26 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 26 Apr 2013 11:53:07 -0700 Subject: [PATCH 04/10] add some debugging to audio mixer for distance attenuation --- audio-mixer/src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 9cb977dc1c..bc9de27844 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -127,7 +127,7 @@ void *sendBuffer(void *args) for (AgentList::iterator otherAgent = agentList->begin(); otherAgent != agentList->end(); otherAgent++) { - if (otherAgent != agent || ( otherAgent == agent && agentWantsLoopback)) { + if (otherAgent != agent || (otherAgent == agent && agentWantsLoopback)) { AudioRingBuffer* otherAgentBuffer = (AudioRingBuffer*) otherAgent->getLinkedData(); float *agentPosition = agentRingBuffer->getPosition(); @@ -146,6 +146,7 @@ void *sendBuffer(void *args) float minCoefficient = std::min(1.0f, powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); + printf("The DC between agent %d and %d is %f\n", agent->getAgentId(), otherAgent->getAgentId(), minCoefficient); distanceCoeffs[lowAgentIndex][highAgentIndex] = minCoefficient; } From e2cb1866ed0073bac8ad2fc3b859da3d8d82fde2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 26 Apr 2013 11:59:26 -0700 Subject: [PATCH 05/10] add another line of debugging for audio mixer distance coeff --- audio-mixer/src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index bc9de27844..9dd7b29008 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -146,6 +146,7 @@ void *sendBuffer(void *args) float minCoefficient = std::min(1.0f, powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); + printf("The distance between the two agents is %d\n", distanceToAgent); printf("The DC between agent %d and %d is %f\n", agent->getAgentId(), otherAgent->getAgentId(), minCoefficient); distanceCoeffs[lowAgentIndex][highAgentIndex] = minCoefficient; } From 7744685de4117a4f477473844e34e836ce4304e5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 26 Apr 2013 12:01:47 -0700 Subject: [PATCH 06/10] debug of distance should be float and not integer --- audio-mixer/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 9dd7b29008..8909475ab3 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -146,7 +146,7 @@ void *sendBuffer(void *args) float minCoefficient = std::min(1.0f, powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); - printf("The distance between the two agents is %d\n", distanceToAgent); + printf("The distance between the two agents is %f\n", distanceToAgent); printf("The DC between agent %d and %d is %f\n", agent->getAgentId(), otherAgent->getAgentId(), minCoefficient); distanceCoeffs[lowAgentIndex][highAgentIndex] = minCoefficient; } From 21f1669388bf6b094f1a47e33dc68701ed2f5e53 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 26 Apr 2013 13:10:44 -0700 Subject: [PATCH 07/10] How'd those tabs get in there? --- interface/src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 7c9e5bdf77..7a7b4aa2ca 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1534,9 +1534,9 @@ void idle(void) { // Sample hardware, update view frustum if needed, Lsend avatar data to mixer/agents // updateAvatar(deltaTime); - - // read incoming packets from network - networkReceive(); + + // read incoming packets from network + networkReceive(); //loop through all the other avatars and simulate them... AgentList* agentList = AgentList::getInstance(); From 5442362b3aa39109d8b2d3417763640a34e23a94 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 26 Apr 2013 17:01:54 -0700 Subject: [PATCH 08/10] change DISTANCE_RATIO const in audio-mixer main --- audio-mixer/src/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 8909475ab3..a561cbe2bd 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -52,11 +52,10 @@ const float BUFFER_SEND_INTERVAL_USECS = (BUFFER_LENGTH_SAMPLES_PER_CHANNEL / SA const long MAX_SAMPLE_VALUE = std::numeric_limits::max(); const long MIN_SAMPLE_VALUE = std::numeric_limits::min(); -const float DISTANCE_RATIO = 3.0/4.2; +const float DISTANCE_RATIO = 3.0f / 0.3f; const float PHASE_AMPLITUDE_RATIO_AT_90 = 0.5; const int PHASE_DELAY_AT_90 = 20; - const int AGENT_LOOPBACK_MODIFIER = 307; const int LOOPBACK_SANITY_CHECK = 0; From c26becf6cbb11db30d5cb7b708da01dcd8a91446 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 26 Apr 2013 17:10:52 -0700 Subject: [PATCH 09/10] Added toggle for nonblocking networking; default to threaded for now, since we're seeing lower frame rates. --- interface/src/main.cpp | 81 +++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 7a7b4aa2ca..fa135bbd74 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -39,6 +39,8 @@ #include #endif +#include + #include #include #include @@ -85,6 +87,10 @@ using namespace std; void reshape(int width, int height); // will be defined below void loadViewFrustum(ViewFrustum& viewFrustum); // will be defined below +bool enableNetworkThread = true; +pthread_t networkReceiveThread; +bool stopNetworkReceiveThread = false; + unsigned char incomingPacket[MAX_PACKET_SIZE]; int packetCount = 0; int packetsPerSecond = 0; @@ -416,6 +422,11 @@ void terminate () { audio.terminate(); #endif + if (enableNetworkThread) { + stopNetworkReceiveThread = true; + pthread_join(networkReceiveThread, NULL); + } + exit(EXIT_SUCCESS); } @@ -1474,34 +1485,43 @@ void key(unsigned char k, int x, int y) } // Receive packets from other agents/servers and decide what to do with them! -void networkReceive() +void* networkReceive(void* args) { sockaddr senderAddress; ssize_t bytesReceived; - - while (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { - packetCount++; - bytesCount += bytesReceived; - - switch (incomingPacket[0]) { - case PACKET_HEADER_TRANSMITTER_DATA: - myAvatar.processTransmitterData(incomingPacket, bytesReceived); - break; - case PACKET_HEADER_VOXEL_DATA: - case PACKET_HEADER_Z_COMMAND: - case PACKET_HEADER_ERASE_VOXEL: - voxels.parseData(incomingPacket, bytesReceived); - break; - case PACKET_HEADER_BULK_AVATAR_DATA: - AgentList::getInstance()->processBulkAgentData(&senderAddress, - incomingPacket, - bytesReceived); - break; - default: - AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); - break; + + while (!stopNetworkReceiveThread) { + if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { + packetCount++; + bytesCount += bytesReceived; + + switch (incomingPacket[0]) { + case PACKET_HEADER_TRANSMITTER_DATA: + myAvatar.processTransmitterData(incomingPacket, bytesReceived); + break; + case PACKET_HEADER_VOXEL_DATA: + case PACKET_HEADER_Z_COMMAND: + case PACKET_HEADER_ERASE_VOXEL: + voxels.parseData(incomingPacket, bytesReceived); + break; + case PACKET_HEADER_BULK_AVATAR_DATA: + AgentList::getInstance()->processBulkAgentData(&senderAddress, + incomingPacket, + bytesReceived); + break; + default: + AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); + break; + } + } else if (!enableNetworkThread) { + break; } } + + if (enableNetworkThread) { + pthread_exit(0); + } + return NULL; } void idle(void) { @@ -1536,7 +1556,9 @@ void idle(void) { updateAvatar(deltaTime); // read incoming packets from network - networkReceive(); + if (!enableNetworkThread) { + networkReceive(0); + } //loop through all the other avatars and simulate them... AgentList* agentList = AgentList::getInstance(); @@ -1680,7 +1702,10 @@ int main(int argc, const char * argv[]) listenPort = atoi(portStr); } AgentList::createInstance(AGENT_TYPE_AVATAR, listenPort); - AgentList::getInstance()->getAgentSocket().setBlocking(false); + enableNetworkThread = !cmdOptionExists(argc, argv, "--nonblocking"); + if (!enableNetworkThread) { + AgentList::getInstance()->getAgentSocket().setBlocking(false); + } gettimeofday(&applicationStartupTime, NULL); const char* domainIP = getCmdOption(argc, argv, "--domain"); @@ -1763,6 +1788,12 @@ int main(int argc, const char * argv[]) printLog("Local Voxel File loaded.\n"); } + // create thread for receipt of data via UDP + if (enableNetworkThread) { + pthread_create(&networkReceiveThread, NULL, networkReceive, NULL); + printLog("Network receive thread created.\n"); + } + glutTimerFunc(1000, Timer, 0); glutMainLoop(); From 14012ee44bdf4255b6652ecf19c03d682d22035a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 26 Apr 2013 17:11:51 -0700 Subject: [PATCH 10/10] remove the debugging to confirm that distance attenuation is working --- audio-mixer/src/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index a561cbe2bd..a7c34b8a36 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -145,8 +145,6 @@ void *sendBuffer(void *args) float minCoefficient = std::min(1.0f, powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); - printf("The distance between the two agents is %f\n", distanceToAgent); - printf("The DC between agent %d and %d is %f\n", agent->getAgentId(), otherAgent->getAgentId(), minCoefficient); distanceCoeffs[lowAgentIndex][highAgentIndex] = minCoefficient; }