From: wittend99 Date: Wed, 16 May 2012 02:31:30 +0000 (+0000) Subject: git-svn-id: https://svn.code.sf.net/p/freetel/code@470 01035d8c-6547-0410-b346-abe4f9... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=add1f759509b8283fe23705cf3967e1dbbd5afc2;p=freetel-svn-tracking.git git-svn-id: https://svn.code.sf.net/p/freetel/code@470 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/fdmdv2/pa_test/Debug/pa_test.exe b/fdmdv2/pa_test/Debug/pa_test.exe index 9393ef6e..70ca4075 100644 Binary files a/fdmdv2/pa_test/Debug/pa_test.exe and b/fdmdv2/pa_test/Debug/pa_test.exe differ diff --git a/fdmdv2/pa_test/pa_class.cpp b/fdmdv2/pa_test/pa_class.cpp index 14e70e40..694ca7cf 100644 --- a/fdmdv2/pa_test/pa_class.cpp +++ b/fdmdv2/pa_test/pa_class.cpp @@ -1,28 +1,246 @@ -#include -#include -#include "portaudio.h" +#include "pa_class.h" -/* -** Note that many of the older ISA sound cards on PCs do NOT support -** full duplex audio (simultaneous record and playback). -** And some only support full duplex at lower sample rates. -*/ -#define SAMPLE_RATE (44100) -#define PA_SAMPLE_TYPE paFloat32 -#define FRAMES_PER_BUFFER (64) +PortAudioWrap::PortAudioWrap() +{ + stream = NULL; +// inputBuffer = 0; +// outputBuffer = NULL; + inputDevice = paNoDevice; + outputDevice = paNoDevice; + userData = NULL; + samplerate = 0; + framesPerBuffer = 0; + statusFlags = 0; + streamCallback = NULL; + streamFinishedCallback = NULL; + timeInfo = 0; +} -typedef float SAMPLE; +PortAudioWrap::~PortAudioWrap() +{ +} -float CubicAmplifier(float input); +PaError PortAudioWrap::init() +{ + return Pa_Initialize(); +} -static int fuzzCallback(const void *inputBuffer, - void *outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData); +PaError PortAudioWrap::streamOpen() +{ + return Pa_OpenStream( + &stream, + &inputBuffer, + &outputBuffer, + samplerate, + framesPerBuffer, + statusFlags, + *streamCallback, + userData + ); +} + +PaError PortAudioWrap::streamStart() +{ + return Pa_StartStream(this->stream); +} + +PaError PortAudioWrap::streamClose() +{ + if (isOpen()) + { + return Pa_CloseStream(this->stream); + } + else + { + return 1; + } +} + +void PortAudioWrap::terminate() +{ + Pa_Terminate(); +} + +void PortAudioWrap::stop() +{ + Pa_StopStream(stream); +} + +void PortAudioWrap::abort() +{ + Pa_AbortStream(stream); +} + +bool PortAudioWrap::isStopped() const +{ + PaError ret = Pa_IsStreamStopped(stream); + return ret; +} + +bool PortAudioWrap::isActive() const +{ + PaError ret = Pa_IsStreamActive(stream); + return ret; +} + +bool PortAudioWrap::isOpen() const +{ + return (stream != NULL); +} + +PaDeviceIndex PortAudioWrap::getDefaultInputDevice() +{ + return Pa_GetDefaultInputDevice(); +} + +PaDeviceIndex PortAudioWrap::getDefaultOutputDevice() +{ + return Pa_GetDefaultOutputDevice(); +} + +PaError PortAudioWrap::setInputChannelCount(int count) +{ + if(!isActive()) + { + inputBuffer.channelCount = count; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setInputSampleFormat(PaSampleFormat format) +{ + if(!isActive()) + { + inputBuffer.sampleFormat = format; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setInputLatency(PaTime latency) +{ + if(!isActive()) + { + inputBuffer.suggestedLatency = latency; + return paNoError; + } + return paStreamIsNotStopped; +} + +void PortAudioWrap::setInputHostApiStreamInfo(void *info) +{ + inputBuffer.hostApiSpecificStreamInfo = info; +} + +PaTime PortAudioWrap::getInputDefaultLowLatency() +{ + return Pa_GetDeviceInfo(inputBuffer.device)->defaultLowInputLatency; +} + +PaError PortAudioWrap::setOutputChannelCount(int count) +{ + if(!isActive()) + { + outputBuffer.channelCount = count; + return paNoError; + } + return paStreamIsNotStopped; +} -/* Non-linear amplifier with soft distortion curve. */ +PaError PortAudioWrap::setOutputSampleFormat(PaSampleFormat format) +{ + if(!isActive()) + { + outputBuffer.sampleFormat = format; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setOutputLatency(PaTime latency) +{ + if(!isOpen()) + { + outputBuffer.suggestedLatency = latency; + return paNoError; + } + return paStreamIsNotStopped; +} + +void PortAudioWrap::setOutputHostApiStreamInfo(void *info) +{ + outputBuffer.hostApiSpecificStreamInfo = info; +} + +PaTime PortAudioWrap::getOutputDefaultLowLatency() +{ + return Pa_GetDeviceInfo(inputBuffer.device)->defaultLowInputLatency; +} + +PaError PortAudioWrap::setFramesPerBuffer(unsigned long size) +{ + if(!isOpen()) + { + framesPerBuffer = size; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setSampleRate(unsigned long rate) +{ + if(!isOpen()) + { + samplerate = rate; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setStreamFlags(PaStreamFlags flags) +{ + if(!isOpen()) + { + statusFlags = flags; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setInputDevice(PaDeviceIndex flags) +{ + if(!isOpen()) + { + inputDevice = flags; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setOutputDevice(PaDeviceIndex flags) +{ + if(!isOpen()) + { + outputDevice = flags; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setCallback(PaStreamCallback *callback) +{ + if(!isOpen()) + { + streamCallback = callback; + return paNoError; + } + return paStreamIsNotStopped; +} + + + +// Non-linear amplifier with soft distortion curve. float CubicAmplifier(float input) { float output, temp; @@ -53,7 +271,7 @@ static int fuzzCallback(const void *inputBuffer, SAMPLE *out = (SAMPLE*)outputBuffer; const SAMPLE *in = (const SAMPLE*)inputBuffer; unsigned int i; - (void) timeInfo; /* Prevent unused variable warnings. */ + (void) timeInfo; // Prevent unused variable warnings. (void) statusFlags; (void) userData; @@ -61,8 +279,8 @@ static int fuzzCallback(const void *inputBuffer, { for(i = 0; i < framesPerBuffer; i++) { - *out++ = 0; /* left - silent */ - *out++ = 0; /* right - silent */ + *out++ = 0; // left - silent + *out++ = 0; // right - silent } gNumNoInputs += 1; } @@ -70,68 +288,73 @@ static int fuzzCallback(const void *inputBuffer, { for(i = 0; i < framesPerBuffer; i++) { - *out++ = FUZZ(*in++); /* left - distorted */ - *out++ = *in++; /* right - clean */ + *out++ = FUZZ(*in++); // left - distorted + *out++ = *in++; // right - clean } } return paContinue; } -#define BUILD_MAIN - -#ifdef BUILD_MAIN - +#if 1 int main(void) { - PaStreamParameters inputParameters, outputParameters; - PaStream *stream; PaError err; + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; + + PortAudioWrap pa = PortAudioWrap(); + err = pa.init(); + + inputDevice = pa.getDefaultInputDevice(); // default input device + if(inputDevice == paNoDevice) + { + fprintf(stderr, "Error: No default input device.\n"); + goto error; + } + err = pa.setInputDevice(inputDevice); + err = pa.setInputChannelCount(2); // stereo input + err = pa.setInputSampleFormat(PA_SAMPLE_TYPE); + err = pa.setInputLatency(pa.getInputDefaultLowLatency()); + pa.setInputHostApiStreamInfo(NULL); + + outputDevice = pa.getDefaultOutputDevice(); // default output device + if (outputDevice == paNoDevice) + { + fprintf(stderr,"Error: No default output device.\n"); + goto error; + } + err = pa.setOutputDevice(inputDevice); + err = pa.setOutputChannelCount(2); // stereo input + err = pa.setOutputSampleFormat(PA_SAMPLE_TYPE); + err = pa.setOutputLatency(pa.getOutputDefaultLowLatency()); + pa.setOutputHostApiStreamInfo(NULL); - err = Pa_Initialize(); - if( err != paNoError ) goto error; - - inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ - if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default input device.\n"); - goto error; - } - inputParameters.channelCount = 2; /* stereo input */ - inputParameters.sampleFormat = PA_SAMPLE_TYPE; - inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency; - inputParameters.hostApiSpecificStreamInfo = NULL; - - outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ - if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; - } - outputParameters.channelCount = 2; /* stereo output */ - outputParameters.sampleFormat = PA_SAMPLE_TYPE; - outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; - outputParameters.hostApiSpecificStreamInfo = NULL; - - err = Pa_OpenStream( - &stream, - &inputParameters, - &outputParameters, - SAMPLE_RATE, - FRAMES_PER_BUFFER, - 0, /* paClipOff, */ /* we won't output out of range samples so don't bother clipping them */ - fuzzCallback, - NULL ); - if( err != paNoError ) goto error; - - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; + err = pa.setFramesPerBuffer(FRAMES_PER_BUFFER); + err = pa.setSampleRate(SAMPLE_RATE); + err = pa.setStreamFlags(0); + err = pa.setCallback(fuzzCallback); + err = pa.streamOpen(); + + if(err != paNoError) + { + goto error; + } + err = pa.streamStart(); + if(err != paNoError) + { + goto error; + } printf("Hit ENTER to stop program.\n"); getchar(); - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error; - + err = pa.streamClose(); + if( err != paNoError ) + { + goto error; + } printf("Finished. gNumNoInputs = %d\n", gNumNoInputs ); - Pa_Terminate(); + pa.terminate(); return 0; error: @@ -140,7 +363,8 @@ error: fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; - return 0; + } #endif + diff --git a/fdmdv2/pa_test/pa_test.mk b/fdmdv2/pa_test/pa_test.mk index d95eb471..8306337d 100644 --- a/fdmdv2/pa_test/pa_test.mk +++ b/fdmdv2/pa_test/pa_test.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/14/2012 +Date :=5/15/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus diff --git a/fdmdv2/pa_test/pa_test.project b/fdmdv2/pa_test/pa_test.project index 16ec14d7..28ec3f44 100644 --- a/fdmdv2/pa_test/pa_test.project +++ b/fdmdv2/pa_test/pa_test.project @@ -99,4 +99,7 @@ + + +