From cbf4b108207e9780fc33581ae848393e79a75842 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 31 Jan 2013 12:54:11 -0800 Subject: [PATCH] go back to a single stream for audio I/O --- Source/Audio.cpp | 55 +++++++++++------------------------------------- Source/Audio.h | 17 ++++----------- 2 files changed, 16 insertions(+), 56 deletions(-) diff --git a/Source/Audio.cpp b/Source/Audio.cpp index 659bae298c..156e4f02a1 100644 --- a/Source/Audio.cpp +++ b/Source/Audio.cpp @@ -30,8 +30,7 @@ const int AUDIO_UDP_LISTEN_PORT = 55444; bool Audio::initialized; PaError Audio::err; -PaStream *Audio::inputStream; -PaStream *Audio::outputStream; +PaStream *Audio::stream; AudioData *Audio::data; std::ofstream logFile; @@ -55,37 +54,28 @@ std::ofstream logFile; Can be used to end the stream from within the callback. */ -int inputCallback(const void *inputBuffer, +int audioCallback (const void *inputBuffer, void *outputBuffer, unsigned long frames, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) { - UDPSocket *audioSocket = (UDPSocket *) userData; + AudioData *data = (AudioData *) userData; int16_t *inputLeft = ((int16_t **) inputBuffer)[0]; // int16_t *inputRight = ((int16_t **) inputBuffer)[1]; if (inputLeft != NULL) { - audioSocket->send((char *) "192.168.1.19", 55443, (void *)inputLeft, BUFFER_LENGTH_BYTES); + data->audioSocket->send((char *) "192.168.1.19", 55443, (void *)inputLeft, BUFFER_LENGTH_BYTES); } - return paContinue; -} - -int outputCallback(const void *inputBuffer, - void *outputBuffer, - unsigned long frames, - const PaStreamCallbackTimeInfo *timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData) -{ - AudioData *data = (AudioData *) userData; - int16_t *outputLeft = ((int16_t **) outputBuffer)[0]; int16_t *outputRight = ((int16_t **) outputBuffer)[1]; + memset(outputLeft, 0, BUFFER_LENGTH_BYTES); + memset(outputRight, 0, BUFFER_LENGTH_BYTES); + for (int s = 0; s < NUM_AUDIO_SOURCES; s++) { AudioSource *source = data->sources[s]; @@ -95,9 +85,6 @@ int outputCallback(const void *inputBuffer, memcpy(outputLeft, source->sourceData, BUFFER_LENGTH_BYTES); memcpy(outputRight, source->sourceData, BUFFER_LENGTH_BYTES); } else { - memset(outputLeft, 0, BUFFER_LENGTH_BYTES); - memset(outputRight, 0, BUFFER_LENGTH_BYTES); - glm::vec3 headPos = data->linkedHead->getPos(); glm::vec3 sourcePos = source->position; @@ -239,35 +226,20 @@ bool Audio::init(Head *mainHead) data->linkedHead = mainHead; - err = Pa_OpenDefaultStream(&inputStream, + err = Pa_OpenDefaultStream(&stream, 2, // input channels - NULL, // output channels - (paInt16 | paNonInterleaved), // sample format - 22050, // sample rate (hz) - 512, // frames per buffer - inputCallback, // callback function - (void *) data->audioSocket); // user data to be passed to callback - - if (err != paNoError) goto error; - - err = Pa_OpenDefaultStream(&outputStream, - NULL, // input channels 2, // output channels (paInt16 | paNonInterleaved), // sample format 22050, // sample rate (hz) 512, // frames per buffer - outputCallback, // callback function + audioCallback, // callback function (void *) data); // user data to be passed to callback - if (err != paNoError) goto error; initialized = true; - // start the streams now that sources are good to go - Pa_StartStream(inputStream); - if (err != paNoError) goto error; - - Pa_StartStream(outputStream); + // start the stream now that sources are good to go + Pa_StartStream(stream); if (err != paNoError) goto error; return paNoError; @@ -309,10 +281,7 @@ bool Audio::terminate () } else { initialized = false; - err = Pa_CloseStream(inputStream); - if (err != paNoError) goto error; - - err = Pa_CloseStream(outputStream); + err = Pa_CloseStream(stream); if (err != paNoError) goto error; delete data; diff --git a/Source/Audio.h b/Source/Audio.h index 4370994ab9..9889a0d783 100644 --- a/Source/Audio.h +++ b/Source/Audio.h @@ -36,23 +36,14 @@ private: static PaError err; // audio stream handle - static PaStream *inputStream; - static PaStream *outputStream; + static PaStream *stream; - // give access to AudioData class from audio callbacks - friend int inputCallback (const void*, void*, unsigned long, const PaStreamCallbackTimeInfo*, PaStreamCallbackFlags, void*); - friend int outputCallback (const void*, void*, unsigned long, const PaStreamCallbackTimeInfo*, PaStreamCallbackFlags, void*); + // give access to AudioData class from audioCallback + friend int audioCallback (const void*, void*, unsigned long, const PaStreamCallbackTimeInfo*, PaStreamCallbackFlags, void*); }; // Audio callback called by portaudio. -int inputCallback (const void *inputBuffer, - void *outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo *timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData); - -int outputCallback (const void *inputBuffer, +int audioCallback (const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo,