From b3375c5e5f209c4c652bddd6d5085cb530792d79 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 17:07:56 -0800 Subject: [PATCH 01/13] fix crash by closing socket before deleting audio data --- interface/src/AudioData.cpp | 3 ++- interface/src/UDPSocket.cpp | 4 ++++ interface/src/UDPSocket.h | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/interface/src/AudioData.cpp b/interface/src/AudioData.cpp index 863142faf4..0745a045b5 100644 --- a/interface/src/AudioData.cpp +++ b/interface/src/AudioData.cpp @@ -39,6 +39,7 @@ AudioData::~AudioData() { } } - delete[] samplesToQueue; + + delete audioSocket; } \ No newline at end of file diff --git a/interface/src/UDPSocket.cpp b/interface/src/UDPSocket.cpp index 87e7a6e9e8..a225bb5d34 100644 --- a/interface/src/UDPSocket.cpp +++ b/interface/src/UDPSocket.cpp @@ -51,6 +51,10 @@ UDPSocket::UDPSocket(int listeningPort) { printf("Created UDP socket listening on port %d.\n", listeningPort); } +UDPSocket::~UDPSocket() { + close(handle); +} + bool UDPSocket::receive(void *receivedData, int *receivedBytes) { *receivedBytes = recvfrom(handle, receivedData, MAX_BUFFER_LENGTH_BYTES, diff --git a/interface/src/UDPSocket.h b/interface/src/UDPSocket.h index a360c55287..e2a27e39a8 100644 --- a/interface/src/UDPSocket.h +++ b/interface/src/UDPSocket.h @@ -17,6 +17,7 @@ class UDPSocket { public: UDPSocket(int listening_port); + ~UDPSocket(); int send(char *destAddress, int destPort, const void *data, int byteLength); bool receive(void *receivedData, int *receivedBytes); private: From a2a5e8ca057d85c11d5c1b8728b7a77e1d4e060f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 17:11:45 -0800 Subject: [PATCH 02/13] mixer working with copied AudioRingBuffer class --- mixer/src/socket.cpp | 112 +++++++++++++++++++++++++++++++++---------- 1 file changed, 88 insertions(+), 24 deletions(-) diff --git a/mixer/src/socket.cpp b/mixer/src/socket.cpp index e685984c8a..83a08a2a81 100644 --- a/mixer/src/socket.cpp +++ b/mixer/src/socket.cpp @@ -12,6 +12,7 @@ #include #include #include +#include "AudioRingBuffer.h" const int MAX_AGENTS = 1000; const int LOGOFF_CHECK_INTERVAL = 1000; @@ -23,10 +24,16 @@ const int BUFFER_LENGTH_SAMPLES = BUFFER_LENGTH_BYTES / sizeof(int16_t); const float SAMPLE_RATE = 22050.0; const float BUFFER_SEND_INTERVAL_USECS = (BUFFER_LENGTH_SAMPLES/SAMPLE_RATE) * 1000000; -const int MAX_SAMPLE_VALUE = std::numeric_limits::max(); -const int MIN_SAMPLE_VALUE = std::numeric_limits::min(); +const short JITTER_BUFFER_MSECS = 20; +const short JITTER_BUFFER_SAMPLES = JITTER_BUFFER_MSECS * (SAMPLE_RATE / 1000.0); -const int MAX_SOURCE_BUFFERS = 10; +const short RING_BUFFER_FRAMES = 10; +const short RING_BUFFER_SAMPLES = RING_BUFFER_FRAMES * BUFFER_LENGTH_SAMPLES; + +const long MAX_SAMPLE_VALUE = std::numeric_limits::max(); +const long MIN_SAMPLE_VALUE = std::numeric_limits::min(); + +const int MAX_SOURCE_BUFFERS = 20; int16_t* whiteNoiseBuffer; int whiteNoiseLength; @@ -44,10 +51,7 @@ struct AgentList { int num_agents = 0; -struct SourceBuffer { - int16_t sourceAudioData[BUFFER_LENGTH_SAMPLES]; - bool transmitted; -} sourceBuffers[MAX_SOURCE_BUFFERS]; +AudioRingBuffer *sourceBuffers[MAX_SOURCE_BUFFERS]; double diffclock(timeval *clock1, timeval *clock2) { @@ -110,8 +114,22 @@ int addAgent(sockaddr_in dest_address, void *audioData) { agents[i].active = true; gettimeofday(&agents[i].time, NULL); - memcpy(sourceBuffers[i].sourceAudioData, audioData, BUFFER_LENGTH_BYTES); - sourceBuffers[i].transmitted = false; + if (sourceBuffers[i]->endOfLastWrite == NULL) { + sourceBuffers[i]->endOfLastWrite = sourceBuffers[i]->buffer; + } else if (sourceBuffers[i]->diffLastWriteNextOutput() > RING_BUFFER_SAMPLES - BUFFER_LENGTH_SAMPLES) { + // reset us to started state + sourceBuffers[i]->endOfLastWrite = sourceBuffers[i]->buffer; + sourceBuffers[i]->nextOutput = sourceBuffers[i]->buffer; + sourceBuffers[i]->started = false; + } + + memcpy(sourceBuffers[i]->endOfLastWrite, audioData, BUFFER_LENGTH_BYTES); + + sourceBuffers[i]->endOfLastWrite += BUFFER_LENGTH_SAMPLES; + + if (sourceBuffers[i]->endOfLastWrite >= sourceBuffers[i]->buffer + RING_BUFFER_SAMPLES) { + sourceBuffers[i]->endOfLastWrite = sourceBuffers[i]->buffer; + } if (i == num_agents) { num_agents++; @@ -134,7 +152,7 @@ void *send_buffer_thread(void *args) timeval startTime, sendTime, now; int16_t *clientMix = new int16_t[BUFFER_LENGTH_SAMPLES]; - int16_t *masterMix = new int16_t[BUFFER_LENGTH_SAMPLES]; + long *masterMix = new long[BUFFER_LENGTH_SAMPLES]; gettimeofday(&startTime, NULL); @@ -142,28 +160,74 @@ void *send_buffer_thread(void *args) sentBytes = 0; int sampleOffset = ((currentFrame - 1) * BUFFER_LENGTH_SAMPLES) % whiteNoiseLength; - memcpy(masterMix, whiteNoiseBuffer + sampleOffset, BUFFER_LENGTH_BYTES); + // memcpy(masterMix, whiteNoiseBuffer + sampleOffset, BUFFER_LENGTH_BYTES); + // memset(masterMix, 0, BUFFER_LENGTH_BYTES); + + for (int wb = 0; wb < BUFFER_LENGTH_SAMPLES; wb++) { + masterMix[wb] = 0; + } gettimeofday(&sendTime, NULL); + for (int b = 0; b < MAX_SOURCE_BUFFERS; b++) { + if (sourceBuffers[b]->endOfLastWrite != NULL) { + if (!sourceBuffers[b]->started + && sourceBuffers[b]->diffLastWriteNextOutput() <= BUFFER_LENGTH_SAMPLES + JITTER_BUFFER_SAMPLES) { + std::cout << "Held back buffer " << b << ".\n"; + } else if (sourceBuffers[b]->diffLastWriteNextOutput() < BUFFER_LENGTH_SAMPLES) { + std::cout << "Buffer " << b << " starved.\n"; + sourceBuffers[b]->started = false; + } else { + sourceBuffers[b]->started = true; + sourceBuffers[b]->transmitted = true; + + for (int s = 0; s < BUFFER_LENGTH_SAMPLES; s++) { + masterMix[s] += sourceBuffers[b]->nextOutput[s]; + } + + sourceBuffers[b]->nextOutput += BUFFER_LENGTH_SAMPLES; + + if (sourceBuffers[b]->nextOutput >= sourceBuffers[b]->buffer + RING_BUFFER_SAMPLES) { + sourceBuffers[b]->nextOutput = sourceBuffers[b]->buffer; + } + } + } + } + for (int a = 0; a < num_agents; a++) { if (diffclock(&agents[a].time, &sendTime) <= LOGOFF_CHECK_INTERVAL) { - memcpy(clientMix, masterMix, BUFFER_LENGTH_BYTES); + + int16_t *previousOutput = NULL; + if (sourceBuffers[a]->transmitted) { + previousOutput = (sourceBuffers[a]->nextOutput == sourceBuffers[a]->buffer) + ? sourceBuffers[a]->buffer + RING_BUFFER_SAMPLES - BUFFER_LENGTH_SAMPLES + : sourceBuffers[a]->nextOutput - BUFFER_LENGTH_SAMPLES; + sourceBuffers[a]->transmitted = false; + } - for (int b = 0; b < MAX_SOURCE_BUFFERS; b++) { - if (b != a && !sourceBuffers[b].transmitted) { - for (int s = 0; s < BUFFER_LENGTH_SAMPLES; s++) { - // we have source buffer data for this sample - int mixSample = clientMix[s] + sourceBuffers[b].sourceAudioData[s]; - - int sampleToAdd = std::max(mixSample, MIN_SAMPLE_VALUE); - sampleToAdd = std::min(sampleToAdd, MAX_SAMPLE_VALUE); + for(int as = 0; as < BUFFER_LENGTH_SAMPLES; as++) { + long longSample = previousOutput != NULL + ? masterMix[as] - previousOutput[as] + : masterMix[as]; - clientMix[s] = sampleToAdd; - } + + int16_t shortSample; + + if (longSample < 0) { + shortSample = std::max(longSample, MIN_SAMPLE_VALUE); + } else { + shortSample = std::min(longSample, MAX_SAMPLE_VALUE); + } - sourceBuffers[b].transmitted = true; + clientMix[as] = shortSample; + + // std::cout << as << " - CM: " << clientMix[as] << " MM: " << masterMix[as] << "\n"; + // std::cout << previousOutput - sourceBuffers[a]->buffer << "\n"; + + if (previousOutput != NULL) { + // std::cout << "PO: " << previousOutput[as] << "\n"; } + } sockaddr_in dest_address = agents[a].agent_addr; @@ -259,7 +323,7 @@ int main(int argc, const char * argv[]) int16_t packet_data[BUFFER_LENGTH_SAMPLES]; for (int b = 0; b < MAX_SOURCE_BUFFERS; b++) { - sourceBuffers[b].transmitted = true; + sourceBuffers[b] = new AudioRingBuffer(10 * BUFFER_LENGTH_SAMPLES); } struct send_buffer_struct send_buffer_args; From b45286c6e5261454832fe52c4f238450f48c7792 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 17:16:12 -0800 Subject: [PATCH 03/13] add copied AudioRingBuffer for mixer, comment crashing mouse calls --- interface/src/main.cpp | 11 ++++---- mixer/src/AudioRingBuffer.cpp | 51 +++++++++++++++++++++++++++++++++++ mixer/src/AudioRingBuffer.h | 31 +++++++++++++++++++++ 3 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 mixer/src/AudioRingBuffer.cpp create mode 100644 mixer/src/AudioRingBuffer.h diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 8a64b7e169..86b3b215bc 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -594,14 +594,13 @@ void display(void) glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); - //lattice.render(WIDTH, HEIGHT); + // lattice.render(WIDTH, HEIGHT); + // myFinger.render(); Audio::render(WIDTH, HEIGHT); //drawvec3(100, 100, 0.15, 0, 1.0, 0, myHead.getPos(), 0, 1, 0); glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, pointer_attenuation_quadratic ); -// myFinger.render(); - if (mouse_pressed == 1) { glPointSize( 10.0f ); @@ -853,7 +852,7 @@ void mouseFunc( int button, int state, int x, int y ) mouse_x = x; mouse_y = y; mouse_pressed = 1; -// lattice.mouseClick((float)x/(float)WIDTH,(float)y/(float)HEIGHT); + lattice.mouseClick((float)x/(float)WIDTH,(float)y/(float)HEIGHT); } if( button == GLUT_LEFT_BUTTON && state == GLUT_UP ) { @@ -886,8 +885,8 @@ void mouseoverFunc( int x, int y) mouse_y = y; if (mouse_pressed == 0) { - lattice.mouseOver((float)x/(float)WIDTH,(float)y/(float)HEIGHT); - myFinger.setTarget(mouse_x, mouse_y); +// lattice.mouseOver((float)x/(float)WIDTH,(float)y/(float)HEIGHT); +// myFinger.setTarget(mouse_x, mouse_y); } } diff --git a/mixer/src/AudioRingBuffer.cpp b/mixer/src/AudioRingBuffer.cpp new file mode 100644 index 0000000000..79d805969f --- /dev/null +++ b/mixer/src/AudioRingBuffer.cpp @@ -0,0 +1,51 @@ +// +// AudioRingBuffer.cpp +// interface +// +// Created by Stephen Birarda on 2/1/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include "AudioRingBuffer.h" + +AudioRingBuffer::AudioRingBuffer(short ringBufferSamples) { + ringBufferLengthSamples = ringBufferSamples; + + started = false; + transmitted = false; + + endOfLastWrite = NULL; + + buffer = new int16_t[ringBufferLengthSamples]; + nextOutput = buffer; +}; + +AudioRingBuffer::~AudioRingBuffer() { + delete[] buffer; +}; + +short AudioRingBuffer::diffLastWriteNextOutput() +{ + if (endOfLastWrite == NULL) { + return 0; + } else { + short sampleDifference = endOfLastWrite - nextOutput; + + if (sampleDifference < 0) { + sampleDifference += ringBufferLengthSamples; + } + + return sampleDifference; + } +} + +short AudioRingBuffer::bufferOverlap(int16_t *pointer, short addedDistance) +{ + short samplesLeft = (buffer + ringBufferLengthSamples) - pointer; + + if (samplesLeft < addedDistance) { + return addedDistance - samplesLeft; + } else { + return 0; + } +} diff --git a/mixer/src/AudioRingBuffer.h b/mixer/src/AudioRingBuffer.h new file mode 100644 index 0000000000..2454dbe916 --- /dev/null +++ b/mixer/src/AudioRingBuffer.h @@ -0,0 +1,31 @@ +// +// AudioRingBuffer.h +// interface +// +// Created by Stephen Birarda on 2/1/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#ifndef __interface__AudioRingBuffer__ +#define __interface__AudioRingBuffer__ + +#include +#include + +class AudioRingBuffer { + public: + int16_t *nextOutput; + int16_t *endOfLastWrite; + int16_t *buffer; + short ringBufferLengthSamples; + bool started; + bool transmitted; + + short diffLastWriteNextOutput(); + short bufferOverlap(int16_t *pointer, short addedDistance); + + AudioRingBuffer(short ringBufferSamples); + ~AudioRingBuffer(); +}; + +#endif /* defined(__interface__AudioRingBuffer__) */ From 8fb58221d0a9c7346f8891b41b478069bc16d25c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 17:36:41 -0800 Subject: [PATCH 04/13] build portaudio from same directory as source --- interface/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 98aee9666a..9e356aa5eb 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -35,9 +35,11 @@ target_link_libraries(interface ) include(ExternalProject) +set(PORTAUDIO_PROJ_DIR external/portaudio) ExternalProject_Add( portaudio - PREFIX external/portaudio + PREFIX ${PORTAUDIO_PROJ_DIR} + BINARY_DIR ${PORTAUDIO_PROJ_DIR}/src/portaudio URL ${PORTAUDIO_DIR}/pa_snapshot_020813.tgz CONFIGURE_COMMAND /configure BUILD_COMMAND make From 903bffd797f98d141876c1c5703b4274d1c57b8b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 17:39:26 -0800 Subject: [PATCH 05/13] set portaudio install dir to avoid permissions error --- interface/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 9e356aa5eb..c4c9ea643a 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -40,6 +40,7 @@ ExternalProject_Add( portaudio PREFIX ${PORTAUDIO_PROJ_DIR} BINARY_DIR ${PORTAUDIO_PROJ_DIR}/src/portaudio + INSTALL_DIR ${PORTAUDIO_PROJ_DIR}/install URL ${PORTAUDIO_DIR}/pa_snapshot_020813.tgz CONFIGURE_COMMAND /configure BUILD_COMMAND make From 262b2d82acd34a962c052319915db7d37715452c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 17:42:23 -0800 Subject: [PATCH 06/13] Revert "set portaudio install dir to avoid permissions error" This reverts commit 903bffd797f98d141876c1c5703b4274d1c57b8b. --- interface/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index c4c9ea643a..9e356aa5eb 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -40,7 +40,6 @@ ExternalProject_Add( portaudio PREFIX ${PORTAUDIO_PROJ_DIR} BINARY_DIR ${PORTAUDIO_PROJ_DIR}/src/portaudio - INSTALL_DIR ${PORTAUDIO_PROJ_DIR}/install URL ${PORTAUDIO_DIR}/pa_snapshot_020813.tgz CONFIGURE_COMMAND /configure BUILD_COMMAND make From 0521a48a72a264f3db4a6388871a9df26a9c3f14 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:01:20 -0800 Subject: [PATCH 07/13] tell portaudio configure to install to same dir --- interface/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 9e356aa5eb..fd31c0a0d8 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 + CONFIGURE_COMMAND /configure --prefix ${CMAKE_CURRENT_SOURCE_DIR}/${PORTAUDIO_PROJ_DIR} BUILD_COMMAND make ) From 788f7091937798d5a538fd3df8e109de2d576a74 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:04:22 -0800 Subject: [PATCH 08/13] use absolute path for portaudio install dir --- interface/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index fd31c0a0d8..c2410660aa 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_SOURCE_PATH}/${PORTAUDIO_PROJ_DIR} BUILD_COMMAND make ) From d2f38a4c43dc41348ef5b5b9d144b7f409954718 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:08:30 -0800 Subject: [PATCH 09/13] ask CMake for absolute path for portaudio configure prefix --- interface/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index c2410660aa..39cd151abb 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -36,12 +36,13 @@ target_link_libraries(interface include(ExternalProject) set(PORTAUDIO_PROJ_DIR external/portaudio) +get_filename_component(PORTAUDIO_LIB_INSTALL_PATH ${PORTAUDIO_PROJ_DIR} ABSOLUTE) ExternalProject_Add( portaudio PREFIX ${PORTAUDIO_PROJ_DIR} BINARY_DIR ${PORTAUDIO_PROJ_DIR}/src/portaudio URL ${PORTAUDIO_DIR}/pa_snapshot_020813.tgz - CONFIGURE_COMMAND /configure --prefix ${PROJECT_SOURCE_PATH}/${PORTAUDIO_PROJ_DIR} + CONFIGURE_COMMAND /configure --prefix ${PORTAUDIO_LIB_INSTALL_PATH} BUILD_COMMAND make ) From b20ab5b5ca4a32f3c6e6365afeed5d2200fbc713 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:15:24 -0800 Subject: [PATCH 10/13] wrap prefix dir for portaudio config in quotes --- interface/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 39cd151abb..e29812f11b 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -36,13 +36,12 @@ target_link_libraries(interface include(ExternalProject) set(PORTAUDIO_PROJ_DIR external/portaudio) -get_filename_component(PORTAUDIO_LIB_INSTALL_PATH ${PORTAUDIO_PROJ_DIR} ABSOLUTE) ExternalProject_Add( portaudio PREFIX ${PORTAUDIO_PROJ_DIR} BINARY_DIR ${PORTAUDIO_PROJ_DIR}/src/portaudio URL ${PORTAUDIO_DIR}/pa_snapshot_020813.tgz - CONFIGURE_COMMAND /configure --prefix ${PORTAUDIO_LIB_INSTALL_PATH} + CONFIGURE_COMMAND /configure --prefix "${CMAKE_CURRENT_SOURCE_DIR}/${PORTAUDIO_PROJ_DIR}" BUILD_COMMAND make ) From 616a1cb45fb2d9f654d2972100d664ffde2cf258 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:15:56 -0800 Subject: [PATCH 11/13] play opera for single user audio server test --- mixer/src/socket.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mixer/src/socket.cpp b/mixer/src/socket.cpp index 83a08a2a81..4967721047 100644 --- a/mixer/src/socket.cpp +++ b/mixer/src/socket.cpp @@ -160,11 +160,10 @@ void *send_buffer_thread(void *args) sentBytes = 0; int sampleOffset = ((currentFrame - 1) * BUFFER_LENGTH_SAMPLES) % whiteNoiseLength; - // memcpy(masterMix, whiteNoiseBuffer + sampleOffset, BUFFER_LENGTH_BYTES); - // memset(masterMix, 0, BUFFER_LENGTH_BYTES); + int16_t *noisePointer = whiteNoiseBuffer + sampleOffset; for (int wb = 0; wb < BUFFER_LENGTH_SAMPLES; wb++) { - masterMix[wb] = 0; + masterMix[wb] = noisePointer[wb]; } gettimeofday(&sendTime, NULL); From aaf9b73dafd49614a325b4a1c3159ac1db0c2ee0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:42:28 -0800 Subject: [PATCH 12/13] add find modules for Jack and librt, link to interface --- cmake/modules/FindJack.cmake | 82 +++++++++++++++++++++++++++++++++++ cmake/modules/FindLibrt.cmake | 61 ++++++++++++++++++++++++++ interface/CMakeLists.txt | 14 ++++++ 3 files changed, 157 insertions(+) create mode 100644 cmake/modules/FindJack.cmake create mode 100644 cmake/modules/FindLibrt.cmake diff --git a/cmake/modules/FindJack.cmake b/cmake/modules/FindJack.cmake new file mode 100644 index 0000000000..a39fd63470 --- /dev/null +++ b/cmake/modules/FindJack.cmake @@ -0,0 +1,82 @@ +# - Try to find jack-2.6 +# Once done this will define +# +# JACK_FOUND - system has jack +# JACK_INCLUDE_DIRS - the jack include directory +# JACK_LIBRARIES - Link these to use jack +# JACK_DEFINITIONS - Compiler switches required for using jack +# +# Copyright (c) 2008 Andreas Schneider +# Modified for other libraries by Lasse Kärkkäinen +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + +if (JACK_LIBRARIES AND JACK_INCLUDE_DIRS) + # in cache already + set(JACK_FOUND TRUE) +else (JACK_LIBRARIES AND JACK_INCLUDE_DIRS) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + include(UsePkgConfig) + pkgconfig(jack _JACK_INCLUDEDIR _JACK_LIBDIR _JACK_LDFLAGS _JACK_CFLAGS) + else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(_JACK jack) + endif (PKG_CONFIG_FOUND) + endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_path(JACK_INCLUDE_DIR + NAMES + jack/jack.h + PATHS + ${_JACK_INCLUDEDIR} + /usr/include + /usr/local/include + /opt/local/include + /sw/include + ) + + find_library(JACK_LIBRARY + NAMES + jack + PATHS + ${_JACK_LIBDIR} + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + if (JACK_LIBRARY AND JACK_INCLUDE_DIR) + set(JACK_FOUND TRUE) + + set(JACK_INCLUDE_DIRS + ${JACK_INCLUDE_DIR} + ) + + set(JACK_LIBRARIES + ${JACK_LIBRARIES} + ${JACK_LIBRARY} + ) + + endif (JACK_LIBRARY AND JACK_INCLUDE_DIR) + + if (JACK_FOUND) + if (NOT JACK_FIND_QUIETLY) + message(STATUS "Found jack: ${JACK_LIBRARY}") + endif (NOT JACK_FIND_QUIETLY) + else (JACK_FOUND) + if (JACK_FIND_REQUIRED) + message(FATAL_ERROR "Could not find JACK") + endif (JACK_FIND_REQUIRED) + endif (JACK_FOUND) + + # show the JACK_INCLUDE_DIRS and JACK_LIBRARIES variables only in the advanced view + mark_as_advanced(JACK_INCLUDE_DIRS JACK_LIBRARIES) + +endif (JACK_LIBRARIES AND JACK_INCLUDE_DIRS) + diff --git a/cmake/modules/FindLibrt.cmake b/cmake/modules/FindLibrt.cmake new file mode 100644 index 0000000000..34450d3924 --- /dev/null +++ b/cmake/modules/FindLibrt.cmake @@ -0,0 +1,61 @@ +# You may redistribute this program and/or modify it under the terms of +# the GNU General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +if(NOT LIBRT_FOUND) + + find_path(LIBRT_INCLUDE_DIR + NAMES + time.h + PATHS + ${LIBRTDIR}/include/ + ) + + find_file( + LIBRT_LIBRARIES librt.a + PATHS + ${LIBRTDIR}/lib/ + /usr/local/lib64/ + /usr/local/lib/ + /usr/lib/i386-linux-gnu/ + /usr/lib/x86_64-linux-gnu/ + /usr/lib64/ + /usr/lib/ + ) + set (LIBRT_DYNAMIC "Using static library.") + + if (NOT LIBRT_LIBRARIES) + find_library( + LIBRT_LIBRARIES rt + PATHS + ${LIBRTDIR}/lib/ + /usr/local/lib64/ + /usr/local/lib/ + /usr/lib/i386-linux-gnu/ + /usr/lib/x86_64-linux-gnu/ + /usr/lib64/ + /usr/lib/ + ) + set (LIBRT_DYNAMIC "Using dynamic library.") + endif (NOT LIBRT_LIBRARIES) + + if (LIBRT_INCLUDE_DIR AND LIBRT_LIBRARIES) + set (LIBRT_FOUND TRUE) + endif (LIBRT_INCLUDE_DIR AND LIBRT_LIBRARIES) + + if (LIBRT_FOUND) + message(STATUS "Found librt: ${LIBRT_INCLUDE_DIR}, ${LIBRT_LIBRARIES} ${LIBRT_DYNAMIC}") + else (LIBRT_FOUND) + if (Librt_FIND_REQUIRED) + message (FATAL_ERROR "Could not find librt, try to setup LIBRT_PREFIX accordingly") + endif (Librt_FIND_REQUIRED) + endif (LIBRT_FOUND) + +endif (NOT LIBRT_FOUND) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index e29812f11b..190faffa31 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -21,6 +21,20 @@ find_package(GLUT REQUIRED) find_package(GLM REQUIRED) find_package(LodePNG REQUIRED) +if (UNIX AND NOT APPLE) + find_package(Threads REQUIRED) + find_package(Librt REQUIRED) + find_package(Jack REQUIRED) + find_package(ALSA REQUIRED) + + target_link_libraries(interface + ${CMAKE_THREAD_LIBS_INIT} + ${LIBRT_LIBRARIES} + ${JACK_LIBRARIES} + ${ALSA_LIBRARIES} + ) +endif (UNIX AND NOT APPLE) + include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} From 6d67d6f1a6063da4f58177cf4aa8b9514d05b43a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 11 Feb 2013 18:45:18 -0800 Subject: [PATCH 13/13] link required unix libraries to portaudio target --- interface/CMakeLists.txt | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 190faffa31..f1712aca8f 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -21,20 +21,6 @@ find_package(GLUT REQUIRED) find_package(GLM REQUIRED) find_package(LodePNG REQUIRED) -if (UNIX AND NOT APPLE) - find_package(Threads REQUIRED) - find_package(Librt REQUIRED) - find_package(Jack REQUIRED) - find_package(ALSA REQUIRED) - - target_link_libraries(interface - ${CMAKE_THREAD_LIBS_INIT} - ${LIBRT_LIBRARIES} - ${JACK_LIBRARIES} - ${ALSA_LIBRARIES} - ) -endif (UNIX AND NOT APPLE) - include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} @@ -59,6 +45,20 @@ ExternalProject_Add( BUILD_COMMAND make ) +if (UNIX AND NOT APPLE) + find_package(Threads REQUIRED) + find_package(Librt REQUIRED) + find_package(Jack REQUIRED) + find_package(ALSA REQUIRED) + + target_link_libraries(portaudio + ${CMAKE_THREAD_LIBS_INIT} + ${LIBRT_LIBRARIES} + ${JACK_LIBRARIES} + ${ALSA_LIBRARIES} + ) +endif (UNIX AND NOT APPLE) + ExternalProject_Get_Property(portaudio binary_dir) ExternalProject_Get_Property(portaudio source_dir) include_directories(${source_dir}/include)