From 3ebb83f01dd4614783753153fb01f9b921dd3773 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 13:04:23 -0800 Subject: [PATCH 1/7] keep portaudio build contained to build directory --- interface/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index efccdd9a70..ce4ca7f1a4 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -41,7 +41,7 @@ ExternalProject_Add( PREFIX ${PORTAUDIO_PROJ_DIR} BINARY_DIR ${PORTAUDIO_PROJ_DIR}/src/portaudio URL ${PORTAUDIO_DIR}/pa_snapshot_020813.tgz - CONFIGURE_COMMAND /configure --prefix "${CMAKE_CURRENT_SOURCE_DIR}/${PORTAUDIO_PROJ_DIR}" + CONFIGURE_COMMAND /configure --prefix "${PROJECT_BINARY_DIR}/${PORTAUDIO_PROJ_DIR}" BUILD_COMMAND make ) From 49d7e34cd9d50bb424b2976c4803bccd56f186fd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 16:02:07 -0800 Subject: [PATCH 2/7] fix casing of util.h import in Agent.cpp --- interface/src/Agent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Agent.cpp b/interface/src/Agent.cpp index ea358c1fbb..1c8b61478c 100644 --- a/interface/src/Agent.cpp +++ b/interface/src/Agent.cpp @@ -9,7 +9,7 @@ #include #include "Agent.h" #include "Head.h" -#include "util.h" +#include "Util.h" // Structure to hold references to other agents that are nearby From c45eeb2a51c3df8eff28cc91d723f21c8a207756 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 16:52:38 -0800 Subject: [PATCH 3/7] add mixer subdirectory to root CMakeLists.txt --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f1ecedaba..bf6b31ecff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,4 +8,5 @@ set(LODEPNG_ROOT_DIR ${CMAKE_SOURCE_DIR}/external/LodePNG) set(PORTAUDIO_DIR ${CMAKE_SOURCE_DIR}/external/portaudio) add_subdirectory(interface) -add_subdirectory(domain) \ No newline at end of file +add_subdirectory(domain) +add_subdirectory(mixer) \ No newline at end of file From 4aca25297bdb4f141147928617b174d2c80bb439 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 17:04:00 -0800 Subject: [PATCH 4/7] rename socket.cpp to main.cpp, camelcase variables --- mixer/src/{socket.cpp => main.cpp} | 110 ++++++++++------------------- 1 file changed, 36 insertions(+), 74 deletions(-) rename mixer/src/{socket.cpp => main.cpp} (72%) diff --git a/mixer/src/socket.cpp b/mixer/src/main.cpp similarity index 72% rename from mixer/src/socket.cpp rename to mixer/src/main.cpp index 4967721047..d9aa24bfa9 100644 --- a/mixer/src/socket.cpp +++ b/mixer/src/main.cpp @@ -35,21 +35,16 @@ const long MIN_SAMPLE_VALUE = std::numeric_limits::min(); const int MAX_SOURCE_BUFFERS = 20; -int16_t* whiteNoiseBuffer; -int whiteNoiseLength; - -#define ECHO_DEBUG_MODE 0 - -sockaddr_in address, dest_address; -socklen_t destLength = sizeof(dest_address); +sockaddr_in address, destAddress; +socklen_t destLength = sizeof(destAddress); struct AgentList { - sockaddr_in agent_addr; + sockaddr_in agentAddr; bool active; timeval time; } agents[MAX_AGENTS]; -int num_agents = 0; +int numAgents = 0; AudioRingBuffer *sourceBuffers[MAX_SOURCE_BUFFERS]; @@ -99,18 +94,18 @@ int addAgent(sockaddr_in dest_address, void *audioData) { int is_new = 0; int i = 0; - for (i = 0; i < num_agents; i++) { - if (dest_address.sin_addr.s_addr == agents[i].agent_addr.sin_addr.s_addr - && dest_address.sin_port == agents[i].agent_addr.sin_port) { + for (i = 0; i < numAgents; i++) { + if (dest_address.sin_addr.s_addr == agents[i].agentAddr.sin_addr.s_addr + && dest_address.sin_port == agents[i].agentAddr.sin_port) { break; } } - if ((i == num_agents) || (agents[i].active == false)) { + if ((i == numAgents) || (agents[i].active == false)) { is_new = 1; } - agents[i].agent_addr = dest_address; + agents[i].agentAddr = dest_address; agents[i].active = true; gettimeofday(&agents[i].time, NULL); @@ -131,8 +126,8 @@ int addAgent(sockaddr_in dest_address, void *audioData) { sourceBuffers[i]->endOfLastWrite = sourceBuffers[i]->buffer; } - if (i == num_agents) { - num_agents++; + if (i == numAgents) { + numAgents++; } return is_new; @@ -159,11 +154,8 @@ void *send_buffer_thread(void *args) while (true) { sentBytes = 0; - int sampleOffset = ((currentFrame - 1) * BUFFER_LENGTH_SAMPLES) % whiteNoiseLength; - int16_t *noisePointer = whiteNoiseBuffer + sampleOffset; - for (int wb = 0; wb < BUFFER_LENGTH_SAMPLES; wb++) { - masterMix[wb] = noisePointer[wb]; + masterMix[wb] = 0; } gettimeofday(&sendTime, NULL); @@ -193,7 +185,7 @@ void *send_buffer_thread(void *args) } } - for (int a = 0; a < num_agents; a++) { + for (int a = 0; a < numAgents; a++) { if (diffclock(&agents[a].time, &sendTime) <= LOGOFF_CHECK_INTERVAL) { int16_t *previousOutput = NULL; @@ -229,10 +221,10 @@ void *send_buffer_thread(void *args) } - sockaddr_in dest_address = agents[a].agent_addr; + sockaddr_in destAddress = agents[a].agentAddr; sentBytes = sendto(handle, clientMix, BUFFER_LENGTH_BYTES, - 0, (sockaddr *) &dest_address, sizeof(dest_address)); + 0, (sockaddr *) &destAddress, sizeof(destAddress)); if (sentBytes < BUFFER_LENGTH_BYTES) { std::cout << "Error sending mix packet! " << sentBytes << strerror(errno) << "\n"; @@ -257,56 +249,30 @@ void *send_buffer_thread(void *args) } struct process_arg_struct { - int16_t *packet_data; - sockaddr_in dest_address; + int16_t *packetData; + sockaddr_in destAddress; }; void *process_client_packet(void *args) { - struct process_arg_struct *process_args = (struct process_arg_struct *) args; + struct process_arg_struct *processArgs = (struct process_arg_struct *) args; - sockaddr_in dest_address = process_args->dest_address; + sockaddr_in destAddress = processArgs->destAddress; - if (addAgent(dest_address, process_args->packet_data)) { + if (addAgent(destAddress, processArgs->packetData)) { std::cout << "Added agent: " << - inet_ntoa(dest_address.sin_addr) << " on " << - dest_address.sin_port << "\n"; + inet_ntoa(destAddress.sin_addr) << " on " << + destAddress.sin_port << "\n"; } pthread_exit(0); } -bool different_clients(sockaddr_in addr1, sockaddr_in addr2) -{ - return addr1.sin_addr.s_addr != addr2.sin_addr.s_addr || - (addr1.sin_addr.s_addr == addr2.sin_addr.s_addr && - addr1.sin_port != addr2.sin_port); -} - -void white_noise_buffer_init() { - // open a pointer to the audio file - FILE *whiteNoiseFile = fopen("opera.raw", "r"); - - // get length of file - std::fseek(whiteNoiseFile, 0, SEEK_END); - whiteNoiseLength = std::ftell(whiteNoiseFile) / sizeof(int16_t); - std::rewind(whiteNoiseFile); - - // read that amount of samples from the file - whiteNoiseBuffer = new int16_t[whiteNoiseLength]; - std::fread(whiteNoiseBuffer, sizeof(int16_t), whiteNoiseLength, whiteNoiseFile); - - // close it - std::fclose(whiteNoiseFile); -} - int main(int argc, const char * argv[]) { - timeval now, last_agent_update; - int received_bytes = 0; + timeval lastAgentUpdate; + int receivedBytes = 0; - // read in the workclub white noise file as a base layer of audio - white_noise_buffer_init(); int handle = network_init(); @@ -317,9 +283,9 @@ int main(int argc, const char * argv[]) std::cout << "Network Started. Waiting for packets.\n"; } - gettimeofday(&last_agent_update, NULL); + gettimeofday(&lastAgentUpdate, NULL); - int16_t packet_data[BUFFER_LENGTH_SAMPLES]; + int16_t packetData[BUFFER_LENGTH_SAMPLES]; for (int b = 0; b < MAX_SOURCE_BUFFERS; b++) { sourceBuffers[b] = new AudioRingBuffer(10 * BUFFER_LENGTH_SAMPLES); @@ -332,20 +298,16 @@ int main(int argc, const char * argv[]) pthread_create(&buffer_send_thread, NULL, send_buffer_thread, (void *)&send_buffer_args); while (true) { - received_bytes = recvfrom(handle, (int16_t*)packet_data, BUFFER_LENGTH_BYTES, - 0, (sockaddr*)&dest_address, &destLength); - if (ECHO_DEBUG_MODE) { - sendto(handle, packet_data, BUFFER_LENGTH_BYTES, - 0, (sockaddr *) &dest_address, sizeof(dest_address)); - } else { - struct process_arg_struct args; - args.packet_data = packet_data; - args.dest_address = dest_address; - - pthread_t client_process_thread; - pthread_create(&client_process_thread, NULL, process_client_packet, (void *)&args); - pthread_join(client_process_thread, NULL); - } + receivedBytes = recvfrom(handle, (int16_t*)packetData, BUFFER_LENGTH_BYTES, + 0, (sockaddr*)&destAddress, &destLength); + + struct process_arg_struct args; + args.packetData = packetData; + args.destAddress = destAddress; + + pthread_t client_process_thread; + pthread_create(&client_process_thread, NULL, process_client_packet, (void *)&args); + pthread_join(client_process_thread, NULL); } pthread_join(buffer_send_thread, NULL); From fab10ada3ea39d5499272e591cd2d10c2b03eb3f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 17:31:53 -0800 Subject: [PATCH 5/7] move shared UDPSocket class to shared dir for reuse in mixer --- CMakeLists.txt | 3 +++ interface/CMakeLists.txt | 5 +++-- {interface => shared}/src/UDPSocket.cpp | 0 {interface => shared}/src/UDPSocket.h | 0 4 files changed, 6 insertions(+), 2 deletions(-) rename {interface => shared}/src/UDPSocket.cpp (100%) rename {interface => shared}/src/UDPSocket.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf6b31ecff..cc2635f36b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,9 @@ set(GLM_ROOT_DIR ${CMAKE_SOURCE_DIR}/external) set(LODEPNG_ROOT_DIR ${CMAKE_SOURCE_DIR}/external/LodePNG) set(PORTAUDIO_DIR ${CMAKE_SOURCE_DIR}/external/portaudio) +set(HIFI_SHARED_DIR ${CMAKE_SOURCE_DIR}/shared/src) +file(GLOB HIFI_SHARED_SRCS ${HIFI_SHARED_DIR}/*.cpp ${HIFI_SHARED_DIR}/*.h) + add_subdirectory(interface) add_subdirectory(domain) add_subdirectory(mixer) \ No newline at end of file diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ce4ca7f1a4..71b234954b 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -12,9 +12,8 @@ endif (APPLE) configure_file(InterfaceConfig.h.in ${PROJECT_BINARY_DIR}/includes/InterfaceConfig.h) file(GLOB INTERFACE_SRCS src/*.cpp src/*.h) -include_directories(${PROJECT_BINARY_DIR}/includes) -add_executable(interface ${INTERFACE_SRCS}) +add_executable(interface ${INTERFACE_SRCS} ${HIFI_SHARED_SRCS}) find_package(OpenGL REQUIRED) find_package(GLUT REQUIRED) @@ -22,6 +21,8 @@ find_package(GLM REQUIRED) find_package(LodePNG REQUIRED) include_directories( + ${PROJECT_BINARY_DIR}/includes + ${HIFI_SHARED_DIR} ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ${GLM_INCLUDE_DIRS} diff --git a/interface/src/UDPSocket.cpp b/shared/src/UDPSocket.cpp similarity index 100% rename from interface/src/UDPSocket.cpp rename to shared/src/UDPSocket.cpp diff --git a/interface/src/UDPSocket.h b/shared/src/UDPSocket.h similarity index 100% rename from interface/src/UDPSocket.h rename to shared/src/UDPSocket.h From b92d8daa1d1ceda2376607310397842926108148 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 17:59:23 -0800 Subject: [PATCH 6/7] more mixer cleanup, UDPSocket hook up --- mixer/CMakeLists.txt | 4 +- mixer/src/main.cpp | 108 ++++++++++++++----------------------------- 2 files changed, 38 insertions(+), 74 deletions(-) diff --git a/mixer/CMakeLists.txt b/mixer/CMakeLists.txt index a966e49a64..d092eb1a02 100644 --- a/mixer/CMakeLists.txt +++ b/mixer/CMakeLists.txt @@ -4,4 +4,6 @@ project(mixer) file(GLOB MIXER_SRCS src/*.cpp src/*.h) -add_executable(mixer ${MIXER_SRCS}) \ No newline at end of file +add_executable(mixer ${MIXER_SRCS} ${HIFI_SHARED_SRCS}) + +include_directories(${HIFI_SHARED_DIR}) \ No newline at end of file diff --git a/mixer/src/main.cpp b/mixer/src/main.cpp index d9aa24bfa9..98b3313925 100644 --- a/mixer/src/main.cpp +++ b/mixer/src/main.cpp @@ -13,11 +13,12 @@ #include #include #include "AudioRingBuffer.h" +#include "UDPSocket.h" const int MAX_AGENTS = 1000; const int LOGOFF_CHECK_INTERVAL = 1000; -const int UDP_PORT = 55443; +const int MIXER_LISTEN_PORT = 55443; const int BUFFER_LENGTH_BYTES = 1024; const int BUFFER_LENGTH_SAMPLES = BUFFER_LENGTH_BYTES / sizeof(int16_t); @@ -39,7 +40,8 @@ sockaddr_in address, destAddress; socklen_t destLength = sizeof(destAddress); struct AgentList { - sockaddr_in agentAddr; + char *address; + unsigned short port; bool active; timeval time; } agents[MAX_AGENTS]; @@ -59,44 +61,14 @@ double usecTimestamp(timeval *time, double addedUsecs = 0) { return (time->tv_sec * 1000000.0) + time->tv_usec + addedUsecs; } -int create_socket() -{ - // Create socket - int handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - - if (handle <= 0) { - printf("Failed to create socket: %d\n", handle); - return false; - } - - return handle; -} - -int network_init() -{ - int handle = create_socket(); - - // Bind socket to port - address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = htons( (unsigned short) UDP_PORT ); - - if (bind(handle, (const sockaddr*) &address, sizeof(sockaddr_in)) < 0) { - printf( "failed to bind socket\n" ); - return false; - } - - return handle; -} - -int addAgent(sockaddr_in dest_address, void *audioData) { +int addAgent(sockaddr_in agentAddress, void *audioData) { // Search for agent in list and add if needed int is_new = 0; int i = 0; for (i = 0; i < numAgents; i++) { - if (dest_address.sin_addr.s_addr == agents[i].agentAddr.sin_addr.s_addr - && dest_address.sin_port == agents[i].agentAddr.sin_port) { + if (strcmp(inet_ntoa(agentAddress.sin_addr), agents[i].address) == 0 + && agentAddress.sin_port == agents[i].port) { break; } } @@ -105,7 +77,8 @@ int addAgent(sockaddr_in dest_address, void *audioData) { is_new = 1; } - agents[i].agentAddr = dest_address; + agents[i].address = inet_ntoa(agentAddress.sin_addr); + agents[i].port = ntohs(agentAddress.sin_port); agents[i].active = true; gettimeofday(&agents[i].time, NULL); @@ -133,14 +106,14 @@ int addAgent(sockaddr_in dest_address, void *audioData) { return is_new; } -struct send_buffer_struct { - int socket_handle; +struct sendBufferStruct { + UDPSocket *audioSocket; }; -void *send_buffer_thread(void *args) +void *sendBufferThread(void *args) { - struct send_buffer_struct *buffer_args = (struct send_buffer_struct *) args; - int handle = buffer_args->socket_handle; + struct sendBufferStruct *bufferArgs = (struct sendBufferStruct *)args; + UDPSocket *audioSocket = bufferArgs->audioSocket; int sentBytes; int currentFrame = 1; @@ -221,10 +194,7 @@ void *send_buffer_thread(void *args) } - sockaddr_in destAddress = agents[a].agentAddr; - - sentBytes = sendto(handle, clientMix, BUFFER_LENGTH_BYTES, - 0, (sockaddr *) &destAddress, sizeof(destAddress)); + audioSocket->send(agents[a].address, agents[a].port, clientMix, BUFFER_LENGTH_BYTES); if (sentBytes < BUFFER_LENGTH_BYTES) { std::cout << "Error sending mix packet! " << sentBytes << strerror(errno) << "\n"; @@ -248,21 +218,21 @@ void *send_buffer_thread(void *args) pthread_exit(0); } -struct process_arg_struct { +struct processArgStruct { int16_t *packetData; sockaddr_in destAddress; }; -void *process_client_packet(void *args) +void *processClientPacket(void *args) { - struct process_arg_struct *processArgs = (struct process_arg_struct *) args; + struct processArgStruct *processArgs = (struct processArgStruct *) args; sockaddr_in destAddress = processArgs->destAddress; if (addAgent(destAddress, processArgs->packetData)) { std::cout << "Added agent: " << inet_ntoa(destAddress.sin_addr) << " on " << - destAddress.sin_port << "\n"; + ntohs(destAddress.sin_port) << "\n"; } pthread_exit(0); @@ -272,16 +242,9 @@ int main(int argc, const char * argv[]) { timeval lastAgentUpdate; int receivedBytes = 0; - - int handle = network_init(); - - if (!handle) { - std::cout << "Failed to create listening socket.\n"; - return 0; - } else { - std::cout << "Network Started. Waiting for packets.\n"; - } + // setup our socket + UDPSocket audioSocket = UDPSocket(MIXER_LISTEN_PORT); gettimeofday(&lastAgentUpdate, NULL); @@ -291,26 +254,25 @@ int main(int argc, const char * argv[]) sourceBuffers[b] = new AudioRingBuffer(10 * BUFFER_LENGTH_SAMPLES); } - struct send_buffer_struct send_buffer_args; - send_buffer_args.socket_handle = handle; + struct sendBufferStruct sendBufferArgs; + sendBufferArgs.audioSocket = &audioSocket; - pthread_t buffer_send_thread; - pthread_create(&buffer_send_thread, NULL, send_buffer_thread, (void *)&send_buffer_args); + pthread_t bufferSendThread; + pthread_create(&bufferSendThread, NULL, sendBufferThread, (void *)&sendBufferArgs); while (true) { - receivedBytes = recvfrom(handle, (int16_t*)packetData, BUFFER_LENGTH_BYTES, - 0, (sockaddr*)&destAddress, &destLength); - - struct process_arg_struct args; - args.packetData = packetData; - args.destAddress = destAddress; - - pthread_t client_process_thread; - pthread_create(&client_process_thread, NULL, process_client_packet, (void *)&args); - pthread_join(client_process_thread, NULL); + if(audioSocket.receive(packetData, &receivedBytes)) { + struct processArgStruct args; + args.packetData = packetData; + args.destAddress = destAddress; + + pthread_t clientProcessThread; + pthread_create(&clientProcessThread, NULL, processClientPacket, (void *)&args); + pthread_join(clientProcessThread, NULL); + } } - pthread_join(buffer_send_thread, NULL); + pthread_join(bufferSendThread, NULL); return 0; } From 63070b4d3cf27a84560d86f2be7268d4d2478bca Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Feb 2013 18:06:31 -0800 Subject: [PATCH 7/7] link thread library to mixer target --- mixer/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mixer/CMakeLists.txt b/mixer/CMakeLists.txt index d092eb1a02..57a6606be7 100644 --- a/mixer/CMakeLists.txt +++ b/mixer/CMakeLists.txt @@ -6,4 +6,9 @@ file(GLOB MIXER_SRCS src/*.cpp src/*.h) add_executable(mixer ${MIXER_SRCS} ${HIFI_SHARED_SRCS}) -include_directories(${HIFI_SHARED_DIR}) \ No newline at end of file +include_directories(${HIFI_SHARED_DIR}) + +find_package(Threads REQUIRED) +target_link_libraries(interface + ${CMAKE_THREAD_LIBS_INIT} +) \ No newline at end of file