git-svn-id: https://svn.code.sf.net/p/freetel/code@470 01035d8c-6547-0410-b346-abe4f9...
authorwittend99 <wittend99@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 16 May 2012 02:31:30 +0000 (02:31 +0000)
committerwittend99 <wittend99@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 16 May 2012 02:31:30 +0000 (02:31 +0000)
fdmdv2/pa_test/Debug/pa_test.exe
fdmdv2/pa_test/pa_class.cpp
fdmdv2/pa_test/pa_test.mk
fdmdv2/pa_test/pa_test.project

index 9393ef6e61a27fd1311353eb7f4c3826f0fa52c9..70ca4075eeef3bd4bef8c544963647b9973d7fea 100644 (file)
Binary files a/fdmdv2/pa_test/Debug/pa_test.exe and b/fdmdv2/pa_test/Debug/pa_test.exe differ
index 14e70e401fc13580b76f64e6d48f6f1d08ef8657..694ca7cffb1f6e1f73e74d5c87c4885d3fcdf19e 100644 (file)
-#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;
@@ -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
+
index d95eb471231c22dc3708b9be77eceead868d4b50..8306337d6fc0c276ec913af34b4fa1a64db3a09d 100644 (file)
@@ -13,7 +13,7 @@ CurrentFileName        :=
 CurrentFilePath        :=\r
 CurrentFileFullPath    :=\r
 User                   :=wittend\r
-Date                   :=5/14/2012\r
+Date                   :=5/15/2012\r
 CodeLitePath           :="C:\Program Files\CodeLite"\r
 LinkerName             :=g++\r
 ArchiveTool            :=ar rcus\r
index 16ec14d75edb1e0dd272f524c903871b03e1bc5a..28ec3f4492d655d35724df6d62e1c6551185a4e9 100644 (file)
@@ -99,4 +99,7 @@
       </Completion>
     </Configuration>
   </Settings>
+  <VirtualDirectory Name="include">
+    <File Name="pa_class.h"/>
+  </VirtualDirectory>
 </CodeLite_Project>