diff options
Diffstat (limited to 'pd/portaudio/pa_tests/patest_record.c')
-rw-r--r-- | pd/portaudio/pa_tests/patest_record.c | 327 |
1 files changed, 0 insertions, 327 deletions
diff --git a/pd/portaudio/pa_tests/patest_record.c b/pd/portaudio/pa_tests/patest_record.c deleted file mode 100644 index 59471aaf..00000000 --- a/pd/portaudio/pa_tests/patest_record.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * $Id: patest_record.c,v 1.1.1.1 2003-05-09 16:03:56 ggeiger Exp $ - * patest_record.c - * Record input into an array. - * Save array to a file. - * Playback recorded data. - * - * Author: Phil Burk http://www.softsynth.com - * - * This program uses the PortAudio Portable Audio Library. - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and Phil Burk - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files - * (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * Any person wishing to distribute modifications to the Software is - * requested to send the modifications to the original developer so that - * they can be incorporated into the canonical version. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include "portaudio.h" - -/* #define SAMPLE_RATE (17932) /* Test failure to open with this value. */ -#define SAMPLE_RATE (44100) -#define NUM_SECONDS (5) -#define NUM_CHANNELS (2) -/* #define DITHER_FLAG (paDitherOff) /**/ -#define DITHER_FLAG (0) /**/ - -/* Select sample format. */ -#if 1 -#define PA_SAMPLE_TYPE paFloat32 -typedef float SAMPLE; -#define SAMPLE_SILENCE (0.0f) -#elif 1 -#define PA_SAMPLE_TYPE paInt16 -typedef short SAMPLE; -#define SAMPLE_SILENCE (0) -#elif 0 -#define PA_SAMPLE_TYPE paInt8 -typedef char SAMPLE; -#define SAMPLE_SILENCE (0) -#else -#define PA_SAMPLE_TYPE paUInt8 -typedef unsigned char SAMPLE; -#define SAMPLE_SILENCE (128) - -#endif - -typedef struct -{ - int frameIndex; /* Index into sample array. */ - int maxFrameIndex; - SAMPLE *recordedSamples; -} -paTestData; - -/* This routine will be called by the PortAudio engine when audio is needed. -** It may be called at interrupt level on some machines so don't do anything -** that could mess up the system like calling malloc() or free(). -*/ -static int recordCallback( void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - PaTimestamp outTime, void *userData ) -{ - paTestData *data = (paTestData*)userData; - SAMPLE *rptr = (SAMPLE*)inputBuffer; - SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS]; - long framesToCalc; - long i; - int finished; - unsigned long framesLeft = data->maxFrameIndex - data->frameIndex; - - (void) outputBuffer; /* Prevent unused variable warnings. */ - (void) outTime; - - if( framesLeft < framesPerBuffer ) - { - framesToCalc = framesLeft; - finished = paComplete; - } - else - { - framesToCalc = framesPerBuffer; - finished = paContinue; - } - - if( inputBuffer == NULL ) - { - for( i=0; i<framesToCalc; i++ ) - { - *wptr++ = SAMPLE_SILENCE; /* left */ - if( NUM_CHANNELS == 2 ) *wptr++ = SAMPLE_SILENCE; /* right */ - } - } - else - { - for( i=0; i<framesToCalc; i++ ) - { - *wptr++ = *rptr++; /* left */ - if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */ - } - } - data->frameIndex += framesToCalc; - return finished; -} - -/* This routine will be called by the PortAudio engine when audio is needed. -** It may be called at interrupt level on some machines so don't do anything -** that could mess up the system like calling malloc() or free(). -*/ -static int playCallback( void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - PaTimestamp outTime, void *userData ) -{ - paTestData *data = (paTestData*)userData; - SAMPLE *rptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS]; - SAMPLE *wptr = (SAMPLE*)outputBuffer; - unsigned int i; - int finished; - unsigned int framesLeft = data->maxFrameIndex - data->frameIndex; - (void) inputBuffer; /* Prevent unused variable warnings. */ - (void) outTime; - - if( framesLeft < framesPerBuffer ) - { - /* final buffer... */ - for( i=0; i<framesLeft; i++ ) - { - *wptr++ = *rptr++; /* left */ - if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */ - } - for( ; i<framesPerBuffer; i++ ) - { - *wptr++ = 0; /* left */ - if( NUM_CHANNELS == 2 ) *wptr++ = 0; /* right */ - } - data->frameIndex += framesLeft; - finished = paComplete; - } - else - { - for( i=0; i<framesPerBuffer; i++ ) - { - *wptr++ = *rptr++; /* left */ - if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */ - } - data->frameIndex += framesPerBuffer; - finished = paContinue; - } - return finished; -} - -/*******************************************************************/ -int main(void); -int main(void) -{ - PaStream *stream; - PaError err; - paTestData data; - int i; - int totalFrames; - int numSamples; - int numBytes; - SAMPLE max, average, val; - printf("patest_record.c\n"); fflush(stdout); - - data.maxFrameIndex = totalFrames = NUM_SECONDS * SAMPLE_RATE; /* Record for a few seconds. */ - data.frameIndex = 0; - numSamples = totalFrames * NUM_CHANNELS; - - numBytes = numSamples * sizeof(SAMPLE); - data.recordedSamples = (SAMPLE *) malloc( numBytes ); - if( data.recordedSamples == NULL ) - { - printf("Could not allocate record array.\n"); - exit(1); - } - for( i=0; i<numSamples; i++ ) data.recordedSamples[i] = 0; - - err = Pa_Initialize(); - if( err != paNoError ) goto error; - - /* Record some audio. -------------------------------------------- */ - err = Pa_OpenStream( - &stream, - Pa_GetDefaultInputDevice(), - NUM_CHANNELS, /* stereo input */ - PA_SAMPLE_TYPE, - 0, /* default latency */ - NULL, - paNoDevice, - 0, - PA_SAMPLE_TYPE, - 0, /* default latency */ - NULL, - SAMPLE_RATE, - 1024, /* frames per buffer */ - 0, //paDitherOff, /* flags */ - recordCallback, - &data ); - if( err != paNoError ) goto error; - - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; - printf("Now recording!!\n"); fflush(stdout); - - while( Pa_IsStreamActive( stream ) ) - { - Pa_Sleep(1000); - printf("index = %d\n", data.frameIndex ); fflush(stdout); - } - - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error; - - /* Measure maximum peak amplitude. */ - max = 0; - average = 0; - for( i=0; i<numSamples; i++ ) - { - val = data.recordedSamples[i]; - if( val < 0 ) val = -val; /* ABS */ - if( val > max ) - { - max = val; - } - average += val; - } - - average = average / numSamples; - - if( PA_SAMPLE_TYPE == paFloat32 ) - { - printf("sample max amplitude = %f\n", max ); - printf("sample average = %f\n", average ); - } - else - { - printf("sample max amplitude = %d\n", max ); - printf("sample average = %d\n", average ); - } - - /* Write recorded data to a file. */ -#if 0 - { - FILE *fid; - fid = fopen("recorded.raw", "wb"); - if( fid == NULL ) - { - printf("Could not open file."); - } - else - { - fwrite( data.recordedSamples, NUM_CHANNELS * sizeof(SAMPLE), totalFrames, fid ); - fclose( fid ); - printf("Wrote data to 'recorded.raw'\n"); - } - } -#endif - - /* Playback recorded data. -------------------------------------------- */ - data.frameIndex = 0; - printf("Begin playback.\n"); fflush(stdout); - err = Pa_OpenStream( - &stream, - paNoDevice, - 0, /* NO input */ - PA_SAMPLE_TYPE, - 0, /* default latency */ - NULL, - Pa_GetDefaultOutputDevice(), - NUM_CHANNELS, /* stereo output */ - PA_SAMPLE_TYPE, - 0, /* default latency */ - NULL, - SAMPLE_RATE, - 1024, /* frames per buffer */ - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - playCallback, - &data ); - if( err != paNoError ) goto error; - - if( stream ) - { - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; - printf("Waiting for playback to finish.\n"); fflush(stdout); - - while( Pa_IsStreamActive( stream ) ) Pa_Sleep(100); - - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error; - printf("Done.\n"); fflush(stdout); - } - free( data.recordedSamples ); - - Pa_Terminate(); - return 0; - -error: - Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); - fprintf( stderr, "Error number: %d\n", err ); - fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return -1; -} |