-#include <stdio.h>
-#include <math.h>
-#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;\r
+// inputBuffer = 0;
+// outputBuffer = NULL;
+ inputDevice = paNoDevice;
+ outputDevice = paNoDevice;
+ userData = NULL;\r
+ samplerate = 0;\r
+ framesPerBuffer = 0;
+ statusFlags = 0;\r
+ streamCallback = NULL;\r
+ streamFinishedCallback = NULL;\r
+ 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()\r
+{
+ return Pa_OpenStream(
+ &stream,
+ &inputBuffer,
+ &outputBuffer,
+ samplerate,
+ framesPerBuffer,
+ statusFlags,
+ *streamCallback,
+ userData
+ );
+}
+
+PaError PortAudioWrap::streamStart()\r
+{
+ return Pa_StartStream(this->stream);
+}
+
+PaError PortAudioWrap::streamClose()\r
+{
+ if (isOpen())
+ {
+ return Pa_CloseStream(this->stream);
+ }
+ else
+ {
+ return 1;
+ }
+}
+\r
+void PortAudioWrap::terminate()\r
+{
+ Pa_Terminate();
+}
+\r
+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\r
+{\r
+ return (stream != NULL);\r
+}\r
+
+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;
+}
+\r
+void PortAudioWrap::setInputHostApiStreamInfo(void *info)
+{
+ inputBuffer.hostApiSpecificStreamInfo = info;
+}
+\r
+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)\r
+{
+ if(!isOpen())
+ {
+ samplerate = rate;
+ return paNoError;
+ }
+ return paStreamIsNotStopped;
+}
+
+PaError PortAudioWrap::setStreamFlags(PaStreamFlags flags)\r
+{
+ if(!isOpen())
+ {
+ statusFlags = flags;
+ return paNoError;
+ }
+ return paStreamIsNotStopped;
+}
+
+PaError PortAudioWrap::setInputDevice(PaDeviceIndex flags)\r
+{
+ if(!isOpen())
+ {
+ inputDevice = flags;
+ return paNoError;
+ }
+ return paStreamIsNotStopped;
+}
+
+PaError PortAudioWrap::setOutputDevice(PaDeviceIndex flags)\r
+{
+ if(!isOpen())
+ {
+ outputDevice = flags;
+ return paNoError;
+ }
+ return paStreamIsNotStopped;
+}
+
+PaError PortAudioWrap::setCallback(PaStreamCallback *callback)\r
+{
+ if(!isOpen())
+ {
+ streamCallback = callback;
+ return paNoError;
+ }
+ return paStreamIsNotStopped;
+}
+
+
+
+// Non-linear amplifier with soft distortion curve.
float CubicAmplifier(float input)
{
float output, temp;
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;
{
for(i = 0; i < framesPerBuffer; i++)
{
- *out++ = 0; /* left - silent */
- *out++ = 0; /* right - silent */
+ *out++ = 0; // left - silent
+ *out++ = 0; // right - silent
}
gNumNoInputs += 1;
}
{
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:
fprintf( stderr, "Error number: %d\n", err );
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
return -1;
- return 0;
+
}
#endif
+