From 8d5a53b2c9cc53aafc93d41f7be7cf3ec3cffc98 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 12 Feb 2013 20:48:09 -0800 Subject: [PATCH 1/3] Added agent type to domain server, interface client --- domain/src/main.cpp | 22 +++++++++++++++------- interface/src/Agent.cpp | 34 +++++++++++++--------------------- interface/src/Agent.h | 2 +- interface/src/Head.h | 4 ++-- interface/src/main.cpp | 12 +++++++----- interface/src/octal.cpp | 21 --------------------- 6 files changed, 38 insertions(+), 57 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 2e0a41a278..f514ca25e5 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -5,6 +5,8 @@ // Created by Philip Rosedale on 11/20/12. // Copyright (c) 2012 High Fidelity, Inc. All rights reserved. // +// The Domain Server +// #include #include @@ -33,12 +35,13 @@ const int MAX_AGENTS = 1000; const int LOGOFF_CHECK_INTERVAL = 2000; struct AgentList { + char agentType; uint32_t ip; in_addr sin_addr; in_port_t port; float x, y, z; bool active; - timeval time; + timeval time, connectTime; } agents[MAX_AGENTS]; int num_agents = 0; @@ -89,7 +92,7 @@ int network_init() return handle; } -int addAgent(uint32_t ip, in_port_t port, float x, float y, float z) { +int addAgent(uint32_t ip, in_port_t port, char agentType, float x, float y, float z) { // Search for agent in list and add if needed int i = 0; int is_new = 0; @@ -104,7 +107,9 @@ int addAgent(uint32_t ip, in_port_t port, float x, float y, float z) { agents[i].active = true; agents[i].sin_addr.s_addr = ip; agents[i].port = port; + agents[i].agentType = agentType; gettimeofday(&agents[i].time, NULL); + if (is_new) gettimeofday(&agents[i].connectTime, NULL); if (i == num_agents) { num_agents++; } @@ -117,7 +122,7 @@ void update_agent_list(timeval now) { for (i = 0; i < num_agents; i++) { if ((diffclock(agents[i].time, now) > LOGOFF_CHECK_INTERVAL) && agents[i].active) { - std::cout << "Expired Agent from " << + std::cout << "Expired Agent type " << agents[i].agentType << " from " << inet_ntoa(agents[i].sin_addr) << ":" << agents[i].port << "\n"; agents[i].active = false; } @@ -135,12 +140,14 @@ void send_agent_list(int handle, sockaddr_in * dest_address) { //std::cout << "send list to: " << inet_ntoa(dest_address->sin_addr) << "\n"; for (i = 0; i < num_agents; i++) { if (agents[i].active) { + // Write the type of the agent + buffer[length++] = agents[i].agentType; // Write agent's IP address address = inet_ntoa(agents[i].sin_addr); memcpy(&buffer[length], address, strlen(address)); length += strlen(address); // Add port number - buffer[length++] = ':'; + buffer[length++] = ' '; sprintf(portstring, "%d\n", agents[i].port); memcpy(&buffer[length], portstring, strlen(portstring)); length += strlen(portstring); @@ -185,9 +192,10 @@ int main(int argc, const char * argv[]) //std::cout << "Packet from: " << inet_ntoa(dest_address.sin_addr) //<< " " << packet_data << "\n"; float x,y,z; - sscanf(packet_data, "%f,%f,%f", &x, &y, &z); - if (addAgent(dest_address.sin_addr.s_addr, ntohs(dest_address.sin_port), x, y, z)) { - std::cout << "Added Agent from " << + char agentType; + sscanf(packet_data, "%c %f,%f,%f", &agentType, &x, &y, &z); + if (addAgent(dest_address.sin_addr.s_addr, ntohs(dest_address.sin_port), agentType, x, y, z)) { + std::cout << "Added Agent, type " << agentType << " from " << inet_ntoa(dest_address.sin_addr) << ":" << ntohs(dest_address.sin_port) << "\n"; } // Reply with packet listing nearby active agents diff --git a/interface/src/Agent.cpp b/interface/src/Agent.cpp index ea358c1fbb..b36edf4bad 100644 --- a/interface/src/Agent.cpp +++ b/interface/src/Agent.cpp @@ -20,6 +20,7 @@ struct AgentList { unsigned short port; timeval pingStarted; int pingMsecs; + char agentType; Head head; } agents[MAX_AGENTS]; @@ -35,18 +36,16 @@ int update_agents(char * data, int length) { size_t spot; size_t start_spot = 0; std::string address, port; + char agentType; unsigned short nPort = 0; + unsigned int iPort = 0; spot = packet.find_first_of (",", 0); while (spot != std::string::npos) { std::string thisAgent = packet.substr(start_spot, spot-start_spot); - if (thisAgent.find_first_of(":", 0) != std::string::npos) { - address = thisAgent.substr(0, thisAgent.find_first_of(":", 0)); - port = thisAgent.substr(thisAgent.find_first_of(":", 0) + 1, - thisAgent.length() - thisAgent.find_first_of(":", 0)); - nPort = atoi(port.c_str()); - } - //std::cout << "IP: " << address << ", port: " << nPort << "\n"; - add_agent((char *)address.c_str(), nPort); + //std::cout << "raw string: " << thisAgent << "\n"; + sscanf(thisAgent.c_str(), "%c %s %u", &agentType, address.c_str(), &iPort); + nPort = (unsigned short) iPort; + add_agent((char *)address.c_str(), nPort, agentType); numAgents++; start_spot = spot + 1; if (start_spot < packet.length()) @@ -83,7 +82,7 @@ void update_agent(char * address, unsigned short port, char * data, int length) // // Look for an agent by it's IP number, add if it does not exist in local list // -int add_agent(char * address, unsigned short port) { +int add_agent(char * address, unsigned short port, char agentType) { //std::cout << "Checking for " << IP->c_str() << " "; for (int i = 0; i < num_agents; i++) { if ((strcmp(address, agents[i].address) == 0) && (agents[i].port == port)) { @@ -94,6 +93,7 @@ int add_agent(char * address, unsigned short port) { if (num_agents < MAX_AGENTS) { strcpy(agents[num_agents].address, address); agents[num_agents].port = port; + agents[num_agents].agentType = agentType; std::cout << "Added Agent # " << num_agents << " with Address " << agents[num_agents].address << ":" << agents[num_agents].port << "\n"; num_agents++; @@ -110,17 +110,9 @@ int add_agent(char * address, unsigned short port) { int broadcastToAgents(UDPSocket *handle, char * data, int length) { int sent_bytes; //printf("broadcasting to %d agents\n", num_agents); - for (int i = 0; i < num_agents; i++) { - //printf("bcast to %s\n", agents[i].address); - // - // STUPID HACK: For some reason on OSX with NAT translation packets sent to localhost are - // received as from the NAT translated port but have to be sent to the local port number. - // - //if (1) //(strcmp("192.168.1.53",agents[i].address) == 0) - // sent_bytes = handle->send(agents[i].address, 40103, data, length); - //else + for (int i = 0; i < num_agents; i++) { + //std::cout << "to: Agent address " << agents[i].address << " port " << agents[i].port << "\n"; sent_bytes = handle->send(agents[i].address, agents[i].port, data, length); - if (sent_bytes != length) { std::cout << "Broadcast packet fail!\n"; return 0; @@ -135,7 +127,7 @@ void pingAgents(UDPSocket *handle) { for (int i = 0; i < num_agents; i++) { gettimeofday(&agents[i].pingStarted, NULL); handle->send(agents[i].address, agents[i].port, payload, 1); - printf("\nSent Ping at %d usecs\n", agents[i].pingStarted.tv_usec); + //printf("\nSent Ping at %d usecs\n", agents[i].pingStarted.tv_usec); } } @@ -146,7 +138,7 @@ void setAgentPing(char * address, unsigned short port) { timeval pingReceived; gettimeofday(&pingReceived, NULL); float pingMsecs = diffclock(&agents[i].pingStarted, &pingReceived); - printf("Received ping at %d usecs, Agent ping = %3.1f\n", pingReceived.tv_usec, pingMsecs); + //printf("Received ping at %d usecs, Agent ping = %3.1f\n", pingReceived.tv_usec, pingMsecs); agents[i].pingMsecs = pingMsecs; } } diff --git a/interface/src/Agent.h b/interface/src/Agent.h index e3b0585de1..305864aa43 100644 --- a/interface/src/Agent.h +++ b/interface/src/Agent.h @@ -20,7 +20,7 @@ int update_agents(char * data, int length); -int add_agent(char * address, unsigned short port); +int add_agent(char * address, unsigned short port, char agentType); int broadcastToAgents(UDPSocket * handle, char * data, int length); void pingAgents(UDPSocket *handle); void setAgentPing(char * address, unsigned short port); diff --git a/interface/src/Head.h b/interface/src/Head.h index a2a57381a7..558fb4f6db 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -88,8 +88,8 @@ public: float getLoudness() {return loudness;}; float getAverageLoudness() {return averageLoudness;}; - float setAverageLoudness(float al) {averageLoudness = al;}; - float setLoudness(float l) {loudness = l;}; + void setAverageLoudness(float al) {averageLoudness = al;}; + void setLoudness(float l) {loudness = l;}; void SetNewHeadTarget(float, float); glm::vec3 getPos() { return position; }; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index b1de646265..07528e785a 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -56,7 +56,7 @@ int simulate_on = 1; const int MAX_PACKET_SIZE = 1500; const int AGENT_UDP_PORT = 40103; -char DOMAINSERVER_IP[] = "192.168.1.53"; +char DOMAINSERVER_IP[] = "127.0.0.1"; const int DOMAINSERVER_PORT = 40102; UDPSocket agentSocket(AGENT_UDP_PORT); @@ -224,9 +224,11 @@ void Timer(int extra) glutTimerFunc(1000,Timer,0); gettimeofday(&timer_start, NULL); + // // Send a message to the domainserver telling it we are ALIVE + // char output[100]; - sprintf(output, "%f,%f,%f", location[0], location[1], location[2]); + sprintf(output, "%c %f,%f,%f", 'I', location[0], location[1], location[2]); int packet_size = strlen(output); agentSocket.send(DOMAINSERVER_IP, DOMAINSERVER_PORT, output, packet_size); @@ -239,9 +241,9 @@ void Timer(int extra) gettimeofday(&starttest, NULL); char junk[1000]; junk[0] = 'J'; - for (int i = 0; i < 3000; i++) + for (int i = 0; i < 10000; i++) { - agentSocket.send("192.168.1.38", AGENT_UDP_PORT, junk, 1000); + agentSocket.send((char *)"192.168.1.38", AGENT_UDP_PORT, junk, 1000); } gettimeofday(&endtest, NULL); float sendTime = diffclock(&starttest, &endtest); @@ -801,7 +803,7 @@ void read_network() // // Got Ping, reply immediately! // - printf("Replying to ping!\n"); + //printf("Replying to ping!\n"); char reply[] = "R"; agentSocket.send(inet_ntoa(senderAddress.sin_addr), ntohs(senderAddress.sin_port), reply, 1); } else if (incoming_packet[0] == 'R') { diff --git a/interface/src/octal.cpp b/interface/src/octal.cpp index e2a176747a..4e5f1eb7c5 100644 --- a/interface/src/octal.cpp +++ b/interface/src/octal.cpp @@ -27,24 +27,3 @@ void getVoxel(float * pos, int scale, float * vpos) { vpos[Z] = floor(pos[Z]*vscale)/vscale; } -// -// Given a pointer to an octal code and some domain owner data, iterate the tree and add the node(s) as needed. -// -domainNode* createNode(int lengthInBits, char * octalData, - char * hostname, char * nickname, int domain_id) { - domainNode * currentNode = &rootNode; - for (int i = 0; i < lengthInBits; i+=3) { - char octet = 0; - if (i%8 < 6) octet = octalData[i/8] << (i%8); - else { - octet = octalData[i/8] << (i%8) && ((octalData[i/8 + 1] >> (i%8)) << (8 - i%8)); - } - if (currentNode->child[octet] == NULL) currentNode->child[octet] = new domainNode; - currentNode = currentNode->child[octet]; - } - // Copy in the new node info... - strcpy(currentNode->hostname, hostname); - strcpy(currentNode->nickname, nickname); - currentNode->domain_id = domain_id; - return currentNode; -} From 53a3d1f8c9690a606de9a486043bdf5c59eae89d Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 12 Feb 2013 23:27:36 -0800 Subject: [PATCH 2/3] Added audio waveform oscilloscope, fixing head rendering of other agents and self. --- interface/src/Agent.cpp | 19 ++++++--- interface/src/Agent.h | 5 ++- interface/src/Audio.cpp | 18 +++++++-- interface/src/Audio.h | 6 ++- interface/src/AudioData.cpp | 5 +++ interface/src/Cube.cpp | 2 - interface/src/Head.cpp | 17 +------- interface/src/Oscilloscope.cpp | 14 ++++--- interface/src/Oscilloscope.h | 9 +++-- interface/src/main.cpp | 74 ++++++++++++++++------------------ interface/src/world.h | 1 + 11 files changed, 92 insertions(+), 78 deletions(-) diff --git a/interface/src/Agent.cpp b/interface/src/Agent.cpp index d32837f26e..1feaa63703 100644 --- a/interface/src/Agent.cpp +++ b/interface/src/Agent.cpp @@ -21,6 +21,7 @@ struct AgentList { timeval pingStarted; int pingMsecs; char agentType; + bool isSelf; Head head; } agents[MAX_AGENTS]; @@ -55,12 +56,15 @@ int update_agents(char * data, int length) { return numAgents; } -void render_agents() { +// Render the heads of the agents +void render_agents(int renderSelf) { for (int i = 0; i < num_agents; i++) { glm::vec3 pos = agents[i].head.getPos(); glPushMatrix(); - glTranslatef(pos.x, pos.y, pos.z); - agents[i].head.render(0); + if (!agents[i].isSelf || renderSelf) { + glTranslatef(-pos.x, -pos.y, -pos.z); + agents[i].head.render(0); + } glPopMatrix(); } } @@ -75,6 +79,9 @@ void update_agent(char * address, unsigned short port, char * data, int length) if ((strcmp(address, agents[i].address) == 0) && (agents[i].port == port)) { // Update the agent agents[i].head.recvBroadcastData(data, length); + if ((strcmp(address, "127.0.0.1") == 0) && (port == AGENT_UDP_PORT)) { + agents[i].isSelf = true; + } else agents[i].isSelf = false; } } } @@ -107,14 +114,16 @@ int add_agent(char * address, unsigned short port, char agentType) { // // Broadcast data to all the other agents you are aware of, returns 1 if success // -int broadcastToAgents(UDPSocket *handle, char * data, int length) { +int broadcastToAgents(UDPSocket *handle, char * data, int length, int sendToSelf) { int sent_bytes; //printf("broadcasting to %d agents\n", num_agents); for (int i = 0; i < num_agents; i++) { //std::cout << "to: Agent address " << agents[i].address << " port " << agents[i].port << "\n"; + if (sendToSelf || ((strcmp((char *)"127.0.0.1", agents[i].address) != 0) + && (agents[i].port != AGENT_UDP_PORT))) sent_bytes = handle->send(agents[i].address, agents[i].port, data, length); if (sent_bytes != length) { - std::cout << "Broadcast packet fail!\n"; + std::cout << "Broadcast to agents FAILED\n"; return 0; } } diff --git a/interface/src/Agent.h b/interface/src/Agent.h index 305864aa43..5542388aba 100644 --- a/interface/src/Agent.h +++ b/interface/src/Agent.h @@ -18,13 +18,14 @@ #include #include "UDPSocket.h" +const int AGENT_UDP_PORT = 40103; int update_agents(char * data, int length); int add_agent(char * address, unsigned short port, char agentType); -int broadcastToAgents(UDPSocket * handle, char * data, int length); +int broadcastToAgents(UDPSocket * handle, char * data, int length, int sendToSelf); void pingAgents(UDPSocket *handle); void setAgentPing(char * address, unsigned short port); void update_agent(char * address, unsigned short port, char * data, int length); -void render_agents(); +void render_agents(int renderSelf); #endif diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 949b79efe3..9614d740ca 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -17,6 +17,8 @@ #include "AudioSource.h" #include "UDPSocket.h" +Oscilloscope * scope; + const short BUFFER_LENGTH_BYTES = 1024; const short BUFFER_LENGTH_SAMPLES = BUFFER_LENGTH_BYTES / sizeof(int16_t); @@ -97,6 +99,14 @@ int audioCallback (const void *inputBuffer, loudness /= BUFFER_LENGTH_SAMPLES; data->lastInputLoudness = loudness; data->averagedInputLoudness = 0.66*data->averagedInputLoudness + 0.33*loudness; + // + // If scope is turned on, copy input buffer to scope + // + if (scope->getState()) { + for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) { + scope->addData((float)inputLeft[i]/32767.0, i); + } + } } int16_t *outputLeft = ((int16_t **) outputBuffer)[0]; @@ -299,17 +309,19 @@ void *receiveAudioViaUDP(void *args) { * @return Returns true if successful or false if an error occurred. Use Audio::getError() to retrieve the error code. */ -bool Audio::init() +bool Audio::init(Oscilloscope * s) { Head *deadHead = new Head(); - return Audio::init(deadHead); + return Audio::init(deadHead, s); } -bool Audio::init(Head *mainHead) +bool Audio::init(Head *mainHead, Oscilloscope * s) { err = Pa_Initialize(); if (err != paNoError) goto error; + scope = s; + if (ECHO_SERVER_TEST) { data = new AudioData(BUFFER_LENGTH_BYTES); diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 001fb622f4..be6460ebe0 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -13,12 +13,13 @@ #include #include "Head.h" #include "AudioData.h" +#include "Oscilloscope.h" class Audio { public: // initializes audio I/O - static bool init(); - static bool init(Head* mainHead); + static bool init(Oscilloscope * s); + static bool init(Head* mainHead, Oscilloscope * s); static void render(); static void render(int screenWidth, int screenHeight); @@ -32,6 +33,7 @@ private: static AudioData *data; + // protects constructor so that public init method is used Audio(); diff --git a/interface/src/AudioData.cpp b/interface/src/AudioData.cpp index 0745a045b5..32416a402a 100644 --- a/interface/src/AudioData.cpp +++ b/interface/src/AudioData.cpp @@ -12,6 +12,11 @@ AudioData::AudioData(int bufferLength) { sources = NULL; samplesToQueue = new int16_t[bufferLength / sizeof(int16_t)]; + averagedLatency = 0.0; + lastCallback.tv_usec = 0; + wasStarved = 0; + measuredJitter = 0; + jitterBuffer = 0; } AudioData::AudioData(int numberOfSources, int bufferLength) { diff --git a/interface/src/Cube.cpp b/interface/src/Cube.cpp index 6dee84a0a1..5b093016e3 100644 --- a/interface/src/Cube.cpp +++ b/interface/src/Cube.cpp @@ -59,7 +59,6 @@ VoxelSystem::VoxelSystem(int num, } void VoxelSystem::render() { - glPushMatrix(); int i = 0; while (i < cube_count) { glPushMatrix(); @@ -69,7 +68,6 @@ void VoxelSystem::render() { glPopMatrix(); i++; } - glPopMatrix(); } void VoxelSystem::simulate(float deltaTime) { diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 09a9d0af45..34e1e28e9b 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -214,22 +214,7 @@ void Head::render(int faceToFace) glPushMatrix(); glScalef(scale, scale, scale); - glTranslatef(leanSideways, 0.f, leanForward); - - if (!faceToFace) - { - //printf("x: %3.1f\n", position.x); - //glTranslatef(3,3,2); - //printf("head: %3.1f, %3.1f, %3.1f\n", position.x, position.y, position.z); - float x = position.x; - float y = position.y; - float z = position.z; - - //glTranslatef(6.1, 0, 1.4); - glTranslatef(x,y,z); - //glTranslatef(position.x, position.y, position.z); - } glRotatef(Yaw/2.0, 0, 1, 0); glRotatef(Pitch/2.0, 1, 0, 0); @@ -237,7 +222,7 @@ void Head::render(int faceToFace) // Overall scale of head - glScalef(1.5, 2.0, 2.0); + if (faceToFace) glScalef(1.5, 2.0, 2.0); glColor3fv(skinColor); // Head diff --git a/interface/src/Oscilloscope.cpp b/interface/src/Oscilloscope.cpp index d06b263ebe..f5c90da4b2 100644 --- a/interface/src/Oscilloscope.cpp +++ b/interface/src/Oscilloscope.cpp @@ -9,22 +9,26 @@ #include "Oscilloscope.h" Oscilloscope::Oscilloscope(int w, - int h) { + int h, bool isOn) { width = w; height = h; data = new float[width]; for (int i = 0; i < width; i++) { data[i] = 0.0; } + state = isOn; current_sample = 0; } -void Oscilloscope::addData(float d) { - data[current_sample++] = d; +void Oscilloscope::addData(float d, int position) { + data[position] = d; } -void Oscilloscope::render() { +void Oscilloscope::render(float r, float g, float b) { + glColor3f(r,g,b); glBegin(GL_LINES); - //glVertex2f( + for (int i = 0; i < width; i++) { + glVertex2f((float)i, height/2 + data[i]*(float)height); + } glEnd(); } \ No newline at end of file diff --git a/interface/src/Oscilloscope.h b/interface/src/Oscilloscope.h index b86565f6fd..6bbeed2a54 100644 --- a/interface/src/Oscilloscope.h +++ b/interface/src/Oscilloscope.h @@ -18,13 +18,16 @@ class Oscilloscope { public: Oscilloscope(int width, - int height); - void addData(float data); - void render(); + int height, bool isOn); + void addData(float d, int position); + void render(float r, float g, float b); + void setState(bool s) {state = s;}; + bool getState() {return state;}; private: int width; int height; float * data; int current_sample; + bool state; }; #endif /* defined(__interface__oscilloscope__) */ diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 07528e785a..4058575205 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -44,6 +44,7 @@ #include "Cube.h" #include "Lattice.h" #include "Finger.h" +#include "Oscilloscope.h" using namespace std; @@ -55,7 +56,6 @@ int simulate_on = 1; // const int MAX_PACKET_SIZE = 1500; -const int AGENT_UDP_PORT = 40103; char DOMAINSERVER_IP[] = "127.0.0.1"; const int DOMAINSERVER_PORT = 40102; UDPSocket agentSocket(AGENT_UDP_PORT); @@ -73,15 +73,16 @@ int target_x, target_y; int target_display = 0; int head_mirror = 1; // Whether to mirror own head when viewing it +int sendToSelf = 0; int WIDTH = 1200; int HEIGHT = 800; -int fullscreen = 0; +int fullscreen = 0; + +Oscilloscope audioScope(512,200,false); #define HAND_RADIUS 0.25 // Radius of in-world 'hand' of you -Head myHead; // The rendered head of oneself or others -Head dummyHead; // Test Head to render -int showDummyHead = 0; +Head myHead; // The rendered head of oneself Hand myHand(HAND_RADIUS, glm::vec3(0,1,1)); // My hand (used to manipulate things in world) @@ -301,18 +302,11 @@ void init(void) { myHead.setRenderYaw(start_yaw); - dummyHead.setPitch(0); - dummyHead.setRoll(0); - dummyHead.setYaw(0); - dummyHead.setScale(0.25); - - dummyHead.setPos(glm::vec3(0,0,0)); - if (audio_on) { if (serial_on) { - Audio::init(&myHead); + Audio::init(&myHead, &audioScope); } else { - Audio::init(); + Audio::init(&audioScope); } printf( "Audio started.\n" ); } @@ -330,7 +324,6 @@ void init(void) { myHand.setNoise(noise); myHead.setNoise(noise); - dummyHead.setNoise(noise); } if (serial_on) @@ -387,8 +380,6 @@ void reset_sensors() // Reset serial I/O sensors // myHead.setRenderYaw(start_yaw); - dummyHead.setRenderPitch(0); - dummyHead.setRenderYaw(0); yaw = render_yaw_rate = 0; pitch = render_pitch = render_pitch_rate = 0; @@ -537,16 +528,10 @@ void update_pos(float frametime) myHead.setAverageLoudness(averageLoudness); // Send my streaming head data to agents that are nearby and need to see it! - const int MAX_BROADCAST_STRING = 200; char broadcast_string[MAX_BROADCAST_STRING]; int broadcast_bytes = myHead.getBroadcastData(broadcast_string); - broadcastToAgents(&agentSocket, broadcast_string, broadcast_bytes); - - //printf("-> %s\n", broadcast_string); - //dummyHead.recvBroadcastData(broadcast_string, broadcast_bytes); - //printf("head bytes: %d\n", broadcast_bytes); - + broadcastToAgents(&agentSocket, broadcast_string, broadcast_bytes, sendToSelf); } int render_test_spot = WIDTH/2; @@ -561,6 +546,8 @@ void display(void) glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); + + // Setup 3D lights glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); @@ -591,21 +578,9 @@ void display(void) // Draw field vectors if (display_field) field.render(); - - // Render my own head - if (display_head) { - glPushMatrix(); - glLoadIdentity(); - glTranslatef(0.f, 0.f, -7.f); - myHead.render(1); - glPopMatrix(); - } - - // Render dummy head - if (showDummyHead) dummyHead.render(0); - + // Render heads of other agents - if (!display_head) render_agents(); + render_agents(sendToSelf); if (display_hand) myHand.render(); @@ -614,11 +589,22 @@ void display(void) // Render the world box if (!display_head && stats_on) render_world_box(); + // Render my own head + + if (display_head) { + glPushMatrix(); + glLoadIdentity(); + glTranslatef(0.f, 0.f, -7.f); + myHead.render(1); + glPopMatrix(); + } + // render audio sources and start them if (audio_on) { Audio::render(); } + //glm::vec3 test(0.5, 0.5, 0.5); //render_vector(&test); @@ -635,6 +621,8 @@ void display(void) // lattice.render(WIDTH, HEIGHT); // myFinger.render(); Audio::render(WIDTH, HEIGHT); + if (audioScope.getState()) audioScope.render(0,1,0); + //drawvec3(100, 100, 0.15, 0, 1.0, 0, myHead.getPos(), 0, 1, 0); glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, pointer_attenuation_quadratic ); @@ -831,7 +819,10 @@ void read_network() // update_agent(inet_ntoa(senderAddress.sin_addr), ntohs(senderAddress.sin_port), &incoming_packet[1], bytes_recvd - 1); } else if (incoming_packet[0] == 'T') { - printf("Got test! From port %d\n", senderAddress.sin_port); + // Received a self-test packet (to get one's own IP), copy it to local variable! + printf("My Address: %s:%u\n", + inet_ntoa(senderAddress.sin_addr), + senderAddress.sin_port); } } } @@ -950,7 +941,10 @@ int main(int argc, char** argv) // Create network socket and buffer incoming_packet = new char[MAX_PACKET_SIZE]; - // + // Send one test packet to detect own IP, port: + char selfTest[] = "T"; + agentSocket.send((char *)"127.0.0.1", AGENT_UDP_PORT, selfTest, 1); + printf("Testing stats math... "); StDev stdevtest; stdevtest.reset(); diff --git a/interface/src/world.h b/interface/src/world.h index a832c29b67..0f93a2258b 100644 --- a/interface/src/world.h +++ b/interface/src/world.h @@ -11,6 +11,7 @@ #ifndef __interface__world__ #define __interface__world__ + const float WORLD_SIZE = 10.0; #define PI 3.14159265 From 4ed19712765ddc959a86436c14cd1314bfb4f52a Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 13 Feb 2013 10:14:31 -0800 Subject: [PATCH 3/3] Made oscilloscope 2 channel, turned on by default (need to fix injecting the last audio buffer tho). --- interface/src/Audio.cpp | 10 +++++++++- interface/src/Oscilloscope.cpp | 25 ++++++++++++++++++------- interface/src/Oscilloscope.h | 6 +++--- interface/src/main.cpp | 4 ++-- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 9614d740ca..a0fa6a9660 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -104,7 +104,7 @@ int audioCallback (const void *inputBuffer, // if (scope->getState()) { for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) { - scope->addData((float)inputLeft[i]/32767.0, i); + scope->addData((float)inputLeft[i]/32767.0, 1, i); } } } @@ -115,6 +115,14 @@ int audioCallback (const void *inputBuffer, memset(outputLeft, 0, BUFFER_LENGTH_BYTES); memset(outputRight, 0, BUFFER_LENGTH_BYTES); + // Copy output data to oscilloscope + if (scope->getState()) { + for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) { + scope->addData((float)outputRight[i]/32767.0, 2, i); + } + } + + if (ECHO_SERVER_TEST) { AudioRingBuffer *ringBuffer = data->ringBuffer; diff --git a/interface/src/Oscilloscope.cpp b/interface/src/Oscilloscope.cpp index f5c90da4b2..34cf9a62c8 100644 --- a/interface/src/Oscilloscope.cpp +++ b/interface/src/Oscilloscope.cpp @@ -12,23 +12,34 @@ Oscilloscope::Oscilloscope(int w, int h, bool isOn) { width = w; height = h; - data = new float[width]; + data1 = new float[width]; + data2 = new float[width]; for (int i = 0; i < width; i++) { - data[i] = 0.0; + data1[i] = 0.0; + data2[i] = 0.0; } state = isOn; current_sample = 0; } -void Oscilloscope::addData(float d, int position) { - data[position] = d; +void Oscilloscope::addData(float d, int channel, int position) { + if (channel == 1) data1[position] = d; + else data2[position] = d; } -void Oscilloscope::render(float r, float g, float b) { - glColor3f(r,g,b); +void Oscilloscope::render() { + glColor3f(1,1,1); glBegin(GL_LINES); for (int i = 0; i < width; i++) { - glVertex2f((float)i, height/2 + data[i]*(float)height); + glVertex2f((float)i, height/2 + data1[i]*(float)height); } glEnd(); + + glColor3f(0,1,1); + glBegin(GL_LINES); + for (int i = 0; i < width; i++) { + glVertex2f((float)i, height/2 + data2[i]*(float)height); + } + glEnd(); + } \ No newline at end of file diff --git a/interface/src/Oscilloscope.h b/interface/src/Oscilloscope.h index 6bbeed2a54..503707e990 100644 --- a/interface/src/Oscilloscope.h +++ b/interface/src/Oscilloscope.h @@ -19,14 +19,14 @@ class Oscilloscope { public: Oscilloscope(int width, int height, bool isOn); - void addData(float d, int position); - void render(float r, float g, float b); + void addData(float d, int channel, int position); + void render(); void setState(bool s) {state = s;}; bool getState() {return state;}; private: int width; int height; - float * data; + float *data1, *data2; int current_sample; bool state; }; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 4058575205..dc8fcc25df 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -79,7 +79,7 @@ int WIDTH = 1200; int HEIGHT = 800; int fullscreen = 0; -Oscilloscope audioScope(512,200,false); +Oscilloscope audioScope(512,200,true); #define HAND_RADIUS 0.25 // Radius of in-world 'hand' of you Head myHead; // The rendered head of oneself @@ -621,7 +621,7 @@ void display(void) // lattice.render(WIDTH, HEIGHT); // myFinger.render(); Audio::render(WIDTH, HEIGHT); - if (audioScope.getState()) audioScope.render(0,1,0); + if (audioScope.getState()) audioScope.render(); //drawvec3(100, 100, 0.15, 0, 1.0, 0, myHead.getPos(), 0, 1, 0);