From fa521ac30de1a7bb13f691ae04dab2c6d0bec863 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 22 Nov 2014 22:56:33 -0500 Subject: [PATCH] Switch from portaudio callback to stream write MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s already in a thread, not sure if callback was helping? --- src/audio/AudioThread.cpp | 119 ++++++++++++++------------------------ src/audio/AudioThread.h | 8 +-- 2 files changed, 44 insertions(+), 83 deletions(-) diff --git a/src/audio/AudioThread.cpp b/src/audio/AudioThread.cpp index 3d1ea42..6949c9e 100644 --- a/src/audio/AudioThread.cpp +++ b/src/audio/AudioThread.cpp @@ -2,98 +2,65 @@ #include "CubicSDRDefs.h" #include -static int audioCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, void *userData) { - - AudioThread *src = (AudioThread *) userData; - - float *out = (float*) outputBuffer; - - if (statusFlags & paOutputOverflow) { - std::cout << "Audio buffer overflow.." << std::endl; - } - - if (statusFlags & paOutputUnderflow) { - std::cout << "Audio buffer underflow.." << std::endl; - } - - if ((statusFlags & paPrimingOutput) || (statusFlags & paOutputOverflow) || !src->audio_queue.size()) { - for (int i = 0; i < framesPerBuffer * 2; i++) { - out[i] = 0; - } - return paContinue; - } - - std::vector nextBuffer = src->audio_queue.front(); - - for (int i = 0; i < framesPerBuffer * 2; i++) { - out[i] = nextBuffer[src->audio_queue_ptr]; - - src->audio_queue_ptr++; - - if (src->audio_queue_ptr == nextBuffer.size()) { - src->audio_queue.pop(); - src->audio_queue_ptr = 0; - if (!src->audio_queue.size()) { - break; - } - nextBuffer = src->audio_queue.front(); - } - } - - return paContinue; -} - AudioThread::AudioThread(AudioThreadInputQueue *inputQueue) : - inputQueue(inputQueue), stream(NULL), audio_queue_ptr(0) { + inputQueue(inputQueue), stream(NULL) { } AudioThread::~AudioThread() { - PaError err; - err = Pa_StopStream(stream); - err = Pa_CloseStream(stream); - Pa_Terminate(); + PaError err; + err = Pa_StopStream(stream); + err = Pa_CloseStream(stream); + Pa_Terminate(); - std::cout << std::endl << "Audio Thread Done." << std::endl << std::endl; + std::cout << std::endl << "Audio Thread Done." << std::endl << std::endl; } void AudioThread::threadMain() { - PaError err; - err = Pa_Initialize(); - if (err != paNoError) { - std::cout << "Error starting portaudio :(\n"; - return; - } + PaError err; + err = Pa_Initialize(); + if (err != paNoError) { + std::cout << "Error starting portaudio :(\n"; + return; + } - int preferred_device = -1; + int preferred_device = -1; - outputParameters.device = (preferred_device != -1) ? preferred_device : Pa_GetDefaultOutputDevice(); - if (outputParameters.device == paNoDevice) { - std::cout << "Error: No default output device.\n"; - } + outputParameters.device = + (preferred_device != -1) ? + preferred_device : Pa_GetDefaultOutputDevice(); + if (outputParameters.device == paNoDevice) { + std::cout << "Error: No default output device.\n"; + } - outputParameters.channelCount = 2; - outputParameters.sampleFormat = paFloat32; - outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency; - outputParameters.hostApiSpecificStreamInfo = NULL; + outputParameters.channelCount = 2; + outputParameters.sampleFormat = paFloat32; + outputParameters.suggestedLatency = Pa_GetDeviceInfo( + outputParameters.device)->defaultHighOutputLatency; + outputParameters.hostApiSpecificStreamInfo = NULL; - stream = NULL; + stream = NULL; - err = Pa_OpenStream(&stream, NULL, &outputParameters, AUDIO_FREQUENCY, paFramesPerBufferUnspecified, - paPrimeOutputBuffersUsingStreamCallback | paClipOff, &audioCallback, this); +// err = Pa_OpenStream(&stream, NULL, &outputParameters, AUDIO_FREQUENCY, +// paFramesPerBufferUnspecified, +// paPrimeOutputBuffersUsingStreamCallback | paClipOff, &audioCallback, +// this); - err = Pa_StartStream(stream); - if (err != paNoError) { - std::cout << "Error starting stream: " << Pa_GetErrorText(err) << std::endl; - std::cout << "\tPortAudio error: " << Pa_GetErrorText(err) << std::endl; - } + err = Pa_OpenStream(&stream, NULL, &outputParameters, AUDIO_FREQUENCY, + paFramesPerBufferUnspecified, paClipOff, NULL, NULL); - while (1) { - AudioThreadInput inp; - inputQueue->pop(inp); - audio_queue.push(inp.data); - } + err = Pa_StartStream(stream); + if (err != paNoError) { + std::cout << "Error starting stream: " << Pa_GetErrorText(err) + << std::endl; + std::cout << "\tPortAudio error: " << Pa_GetErrorText(err) << std::endl; + } + + while (1) { + AudioThreadInput inp; + inputQueue->pop(inp); + Pa_WriteStream(stream, &inp.data[0], inp.data.size()/2); + } } /* diff --git a/src/audio/AudioThread.h b/src/audio/AudioThread.h index 44823aa..de23239 100644 --- a/src/audio/AudioThread.h +++ b/src/audio/AudioThread.h @@ -15,9 +15,6 @@ #include "ThreadQueue.h" #include "portaudio.h" -static int audioCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, void *userData); - class AudioThreadInput { public: int frequency; @@ -30,10 +27,7 @@ typedef ThreadQueue AudioThreadInputQueue; class AudioThread { public: - std::queue > audio_queue; - unsigned int audio_queue_ptr; - - AudioThread(AudioThreadInputQueue *inputQueue); + AudioThread(AudioThreadInputQueue *inputQueue); ~AudioThread();