Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1171
Modified Files: Tag: desiredata s_audio_pablio.c Log Message: cleanup
Index: s_audio_pablio.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/s_audio_pablio.c,v retrieving revision 1.1.4.2.2.4 retrieving revision 1.1.4.2.2.4.2.1 diff -C2 -d -r1.1.4.2.2.4 -r1.1.4.2.2.4.2.1 *** s_audio_pablio.c 24 Jan 2006 01:29:54 -0000 1.1.4.2.2.4 --- s_audio_pablio.c 30 Jul 2007 22:16:27 -0000 1.1.4.2.2.4.2.1 *************** *** 43,54 **** #include "portaudio.h" #include "s_audio_paring.h" ! #include "s_audio_pablio.h" /* MSP */ #include <string.h>
/* MSP -- FRAMES_PER_BUFFER constant removed */ ! static void NPa_Sleep(int n) /* MSP wrapper to check we never stall... */ ! { #if 0 ! fprintf(stderr, "sleep\n"); #endif Pa_Sleep(n); --- 43,53 ---- #include "portaudio.h" #include "s_audio_paring.h" ! #include "s_audio_pablio.h" /* MSP */ #include <string.h>
/* MSP -- FRAMES_PER_BUFFER constant removed */ ! static void NPa_Sleep(int n) { /* MSP wrapper to check we never stall... */ #if 0 ! post("sleep"); #endif Pa_Sleep(n); *************** *** 81,134 **** */ #ifdef PA19 ! static int blockingIOCallback( const void *inputBuffer, void *outputBuffer, /* MSP */ ! unsigned long framesPerBuffer, ! const PaStreamCallbackTimeInfo *outTime, ! PaStreamCallbackFlags myflags, ! void *userData ) #else ! static int blockingIOCallback( void *inputBuffer, void *outputBuffer, ! unsigned long framesPerBuffer, ! PaTimestamp outTime, void *userData ) #endif { PABLIO_Stream *data = (PABLIO_Stream*)userData; ! (void) outTime; ! /* This may get called with NULL inputBuffer during initial setup. */ ! if( inputBuffer != NULL ) ! { ! PD_RingBuffer_Write( &data->inFIFO, inputBuffer, ! data->inbytesPerFrame * framesPerBuffer ); ! } ! if( outputBuffer != NULL ) ! { ! int i; int numBytes = data->outbytesPerFrame * framesPerBuffer; ! int numRead = PD_RingBuffer_Read( &data->outFIFO, outputBuffer, ! numBytes); /* Zero out remainder of buffer if we run out of data. */ ! for( i=numRead; i<numBytes; i++ ) ! { ! ((char *)outputBuffer)[i] = 0; ! } } - return 0; }
/* Allocate buffer. */ ! static PaError PABLIO_InitFIFO( RingBuffer *rbuf, long numFrames, long bytesPerFrame ) ! { long numBytes = numFrames * bytesPerFrame; ! char *buffer = (char *) malloc( numBytes ); ! if( buffer == NULL ) return paInsufficientMemory; ! memset( buffer, 0, numBytes ); ! return (PaError) PD_RingBuffer_Init( rbuf, numBytes, buffer ); }
/* Free buffer. */ ! static PaError PABLIO_TermFIFO( RingBuffer *rbuf ) ! { ! if( rbuf->buffer ) free( rbuf->buffer ); rbuf->buffer = NULL; return paNoError; --- 80,115 ---- */ #ifdef PA19 ! static int blockingIOCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, ! const PaStreamCallbackTimeInfo *outTime, PaStreamCallbackFlags myflags, void *userData) #else ! static int blockingIOCallback(void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, ! PaTimestamp outTime, void *userData ) #endif { PABLIO_Stream *data = (PABLIO_Stream*)userData; ! // (void) outTime; /* This may get called with NULL inputBuffer during initial setup. */ ! if (inputBuffer) PD_RingBuffer_Write( &data->inFIFO, inputBuffer, data->inbytesPerFrame * framesPerBuffer ); ! if (outputBuffer) { int numBytes = data->outbytesPerFrame * framesPerBuffer; ! int numRead = PD_RingBuffer_Read( &data->outFIFO, outputBuffer, numBytes); /* Zero out remainder of buffer if we run out of data. */ ! for (int i=numRead; i<numBytes; i++) ((char *)outputBuffer)[i] = 0; } return 0; }
/* Allocate buffer. */ ! static PaError PABLIO_InitFIFO(RingBuffer *rbuf, long numFrames, long bytesPerFrame) { long numBytes = numFrames * bytesPerFrame; ! char *buffer = (char *)malloc(numBytes); ! if (!buffer) return paInsufficientMemory; ! memset(buffer, 0, numBytes); ! return (PaError) PD_RingBuffer_Init(rbuf, numBytes, buffer); }
/* Free buffer. */ ! static PaError PABLIO_TermFIFO(RingBuffer *rbuf) { ! if (rbuf->buffer) free(rbuf->buffer); rbuf->buffer = NULL; return paNoError; *************** *** 139,153 **** * Will not return until all the data has been written. */ ! long PD_WriteAudioStream( PABLIO_Stream *aStream, void *data, long numFrames ) ! { long bytesWritten; char *p = (char *) data; long numBytes = aStream->outbytesPerFrame * numFrames; ! while( numBytes > 0) ! { ! bytesWritten = PD_RingBuffer_Write( &aStream->outFIFO, p, numBytes ); numBytes -= bytesWritten; p += bytesWritten; ! if( numBytes > 0) NPa_Sleep(10); /* MSP */ } return numFrames; --- 120,132 ---- * Will not return until all the data has been written. */ ! long PD_WriteAudioStream(PABLIO_Stream *aStream, void *data, long numFrames) { long bytesWritten; char *p = (char *) data; long numBytes = aStream->outbytesPerFrame * numFrames; ! while (numBytes > 0) { ! bytesWritten = PD_RingBuffer_Write(&aStream->outFIFO, p, numBytes); numBytes -= bytesWritten; p += bytesWritten; ! if (numBytes>0) NPa_Sleep(10); /* MSP */ } return numFrames; *************** *** 158,207 **** * Will not return until all the data has been read. */ ! long PD_ReadAudioStream( PABLIO_Stream *aStream, void *data, long numFrames ) ! { ! long bytesRead; ! char *p = (char *) data; long numBytes = aStream->inbytesPerFrame * numFrames; ! while( numBytes > 0) ! { ! bytesRead = PD_RingBuffer_Read( &aStream->inFIFO, p, numBytes ); numBytes -= bytesRead; p += bytesRead; ! if( numBytes > 0) NPa_Sleep(10); /* MSP */ } return numFrames; }
! /************************************************************ ! * Return the number of frames that could be written to the stream without ! * having to wait. ! */ ! long PD_GetAudioStreamWriteable( PABLIO_Stream *aStream ) ! { ! int bytesEmpty = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); return bytesEmpty / aStream->outbytesPerFrame; }
! /************************************************************ ! * Return the number of frames that are available to be read from the ! * stream without having to wait. ! */ ! long PD_GetAudioStreamReadable( PABLIO_Stream *aStream ) ! { ! int bytesFull = PD_RingBuffer_GetReadAvailable( &aStream->inFIFO ); return bytesFull / aStream->inbytesPerFrame; }
! /************************************************************/ ! static unsigned long RoundUpToNextPowerOf2( unsigned long n ) ! { long numBits = 0; if( ((n-1) & n) == 0) return n; /* Already Power of two. */ ! while( n > 0 ) ! { n= n>>1; numBits++; } ! return (1<<numBits); }
--- 137,172 ---- * Will not return until all the data has been read. */ ! long PD_ReadAudioStream(PABLIO_Stream *aStream, void *data, long numFrames) { ! char *p = (char *)data; long numBytes = aStream->inbytesPerFrame * numFrames; ! while (numBytes > 0) { ! long bytesRead = PD_RingBuffer_Read(&aStream->inFIFO, p, numBytes); numBytes -= bytesRead; p += bytesRead; ! if (numBytes > 0) NPa_Sleep(10); /* MSP */ } return numFrames; }
! /* Return the number of frames that could be written to the stream without having to wait. */ ! long PD_GetAudioStreamWriteable(PABLIO_Stream *aStream) { ! int bytesEmpty = PD_RingBuffer_GetWriteAvailable(&aStream->outFIFO); return bytesEmpty / aStream->outbytesPerFrame; }
! /* Return the number of frames that are available to be read from the stream without having to wait. */ ! long PD_GetAudioStreamReadable(PABLIO_Stream *aStream) { ! int bytesFull = PD_RingBuffer_GetReadAvailable(&aStream->inFIFO); return bytesFull / aStream->inbytesPerFrame; }
! static unsigned long RoundUpToNextPowerOf2(unsigned long n) { long numBits = 0; if( ((n-1) & n) == 0) return n; /* Already Power of two. */ ! while(n > 0) { n= n>>1; numBits++; } ! return 1<<numBits; }
*************** *** 209,221 **** * Opens a PortAudio stream with default characteristics. * Allocates PABLIO_Stream structure. - * * flags parameter can be an ORed combination of: ! * PABLIO_READ, PABLIO_WRITE, or PABLIO_READ_WRITE ! */ ! PaError PD_OpenAudioStream( PABLIO_Stream **rwblPtr, double sampleRate, ! PaSampleFormat format, int inchannels, ! int outchannels, int framesperbuf, int nbuffers, ! int indeviceno, int outdeviceno) /* MSP */ ! { long bytesPerSample; long doRead = 0; --- 174,181 ---- * Opens a PortAudio stream with default characteristics. * Allocates PABLIO_Stream structure. * flags parameter can be an ORed combination of: ! * PABLIO_READ, PABLIO_WRITE, or PABLIO_READ_WRITE */ ! PaError PD_OpenAudioStream(PABLIO_Stream **rwblPtr, double sampleRate, PaSampleFormat format, int inchannels, ! int outchannels, int framesperbuf, int nbuffers, int indeviceno, int outdeviceno) { long bytesPerSample; long doRead = 0; *************** *** 228,239 **** PaStreamParameters instreamparams, outstreamparams; /* MSP */ #endif - /* fprintf(stderr, "open %lf fmt %d flags %d ch: %d fperbuf: %d nbuf: %d devs: %d %d\n", sampleRate, format, flags, nchannels, framesperbuf, nbuffers, indeviceno, outdeviceno); */ ! ! if (indeviceno < 0) /* MSP... */ ! { #ifdef PA19 indeviceno = Pa_GetDefaultInputDevice(); --- 188,196 ---- PaStreamParameters instreamparams, outstreamparams; /* MSP */ #endif /* fprintf(stderr, "open %lf fmt %d flags %d ch: %d fperbuf: %d nbuf: %d devs: %d %d\n", sampleRate, format, flags, nchannels, framesperbuf, nbuffers, indeviceno, outdeviceno); */ ! if (indeviceno < 0) { #ifdef PA19 indeviceno = Pa_GetDefaultInputDevice(); *************** *** 241,250 **** indeviceno = Pa_GetDefaultInputDeviceID(); #endif ! if(indeviceno == paNoDevice) inchannels = 0; ! ! fprintf(stderr, "using default input device number: %d\n", indeviceno); } ! if (outdeviceno < 0) ! { #ifdef PA19 outdeviceno = Pa_GetDefaultOutputDevice(); --- 198,205 ---- indeviceno = Pa_GetDefaultInputDeviceID(); #endif ! if (indeviceno == paNoDevice) inchannels = 0; ! fprintf(stderr, "using default input device number: %d\n", indeviceno); } ! if (outdeviceno<0) { #ifdef PA19 outdeviceno = Pa_GetDefaultOutputDevice(); *************** *** 252,287 **** outdeviceno = Pa_GetDefaultOutputDeviceID(); #endif ! if(outdeviceno == paNoDevice) outchannels = 0; ! ! fprintf(stderr, "using default output device number: %d\n", outdeviceno); } ! /* fprintf(stderr, "nchan %d, flags %d, bufs %d, framesperbuf %d\n", ! nchannels, flags, nbuffers, framesperbuf); */ ! /* ...MSP */ ! /* Allocate PABLIO_Stream structure for caller. */ ! aStream = (PABLIO_Stream *) malloc( sizeof(PABLIO_Stream) ); if( aStream == NULL ) return paInsufficientMemory; ! memset( aStream, 0, sizeof(PABLIO_Stream) ); ! /* Determine size of a sample. */ ! bytesPerSample = Pa_GetSampleSize( format ); ! if( bytesPerSample < 0 ) ! { ! err = (PaError) bytesPerSample; ! goto error; ! } aStream->insamplesPerFrame = inchannels; /* MSP */ aStream->inbytesPerFrame = bytesPerSample * aStream->insamplesPerFrame; aStream->outsamplesPerFrame = outchannels; aStream->outbytesPerFrame = bytesPerSample * aStream->outsamplesPerFrame; - /* Initialize PortAudio */ err = Pa_Initialize(); if( err != paNoError ) goto error; - #ifdef PA19 numFrames = nbuffers * framesperbuf; /* ...MSP */ - instreamparams.device = indeviceno; /* MSP... */ instreamparams.channelCount = inchannels; --- 207,230 ---- outdeviceno = Pa_GetDefaultOutputDeviceID(); #endif ! if(outdeviceno == paNoDevice) outchannels = 0; ! fprintf(stderr, "using default output device number: %d\n", outdeviceno); } ! /* fprintf(stderr, "nchan %d, flags %d, bufs %d, framesperbuf %d\n", nchannels, flags, nbuffers, framesperbuf); */ /* Allocate PABLIO_Stream structure for caller. */ ! aStream = (PABLIO_Stream *) malloc(sizeof(PABLIO_Stream)); if( aStream == NULL ) return paInsufficientMemory; ! memset(aStream, 0, sizeof(PABLIO_Stream)); /* Determine size of a sample. */ ! bytesPerSample = Pa_GetSampleSize(format); ! if (bytesPerSample<0) {err = (PaError) bytesPerSample; goto error;} aStream->insamplesPerFrame = inchannels; /* MSP */ aStream->inbytesPerFrame = bytesPerSample * aStream->insamplesPerFrame; aStream->outsamplesPerFrame = outchannels; aStream->outbytesPerFrame = bytesPerSample * aStream->outsamplesPerFrame; /* Initialize PortAudio */ err = Pa_Initialize(); if( err != paNoError ) goto error; #ifdef PA19 numFrames = nbuffers * framesperbuf; /* ...MSP */ instreamparams.device = indeviceno; /* MSP... */ instreamparams.channelCount = inchannels; *************** *** 289,293 **** instreamparams.suggestedLatency = nbuffers*framesperbuf/sampleRate; instreamparams.hostApiSpecificStreamInfo = 0; - outstreamparams.device = outdeviceno; outstreamparams.channelCount = outchannels; --- 232,235 ---- *************** *** 295,299 **** outstreamparams.suggestedLatency = nbuffers*framesperbuf/sampleRate; outstreamparams.hostApiSpecificStreamInfo = 0; /* ... MSP */ - #else /* Warning: numFrames must be larger than amount of data processed per --- 237,240 ---- *************** *** 305,310 **** (int)nbuffers, (int)minNumBuffers); #endif - - numFrames = nbuffers * framesperbuf; /* fprintf(stderr, "numFrames %d\n", numFrames); */ --- 246,249 ---- *************** *** 312,327 **** doRead = (inchannels != 0); doWrite = (outchannels != 0); ! if(doRead) ! { ! err = PABLIO_InitFIFO( &aStream->inFIFO, numFrames, ! aStream->inbytesPerFrame ); ! if( err != paNoError ) goto error; } ! if(doWrite) ! { long numBytes; ! err = PABLIO_InitFIFO( &aStream->outFIFO, numFrames, ! aStream->outbytesPerFrame ); ! if( err != paNoError ) goto error; /* Make Write FIFO appear full initially. */ numBytes = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); --- 251,262 ---- doRead = (inchannels != 0); doWrite = (outchannels != 0); ! if(doRead) { ! err = PABLIO_InitFIFO(&aStream->inFIFO, numFrames, aStream->inbytesPerFrame); ! if (err != paNoError) goto error; } ! if(doWrite) { long numBytes; ! err = PABLIO_InitFIFO(&aStream->outFIFO, numFrames, aStream->outbytesPerFrame); ! if (err != paNoError) goto error; /* Make Write FIFO appear full initially. */ numBytes = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); *************** *** 329,375 **** }
! /* Open a PortAudio stream that we will use to communicate with the underlying ! * audio drivers. */ #ifdef PA19 ! err = Pa_OpenStream( ! &aStream->stream, ! (doRead ? &instreamparams : 0), /* MSP */ ! (doWrite ? &outstreamparams : 0), /* MSP */ ! sampleRate, ! framesperbuf, /* MSP */ ! paNoFlag, /* MSP -- portaudio will clip for us */ ! blockingIOCallback, ! aStream ); #else ! err = Pa_OpenStream( ! &aStream->stream, ! (doRead ? indeviceno : paNoDevice), /* MSP */ ! (doRead ? aStream->insamplesPerFrame : 0 ), ! format, ! NULL, ! (doWrite ? outdeviceno : paNoDevice), /* MSP */ ! (doWrite ? aStream->outsamplesPerFrame : 0 ), ! format, ! NULL, ! sampleRate, ! framesperbuf, /* MSP */ ! nbuffers, /* MSP */ ! paNoFlag, /* MSP -- portaudio will clip for us */ ! blockingIOCallback, ! aStream ); #endif ! if( err != paNoError ) goto error; ! err = Pa_StartStream( aStream->stream ); ! if( err != paNoError ) /* MSP */ ! { fprintf(stderr, "Pa_StartStream failed; closing audio stream...\n"); ! PD_CloseAudioStream( aStream ); goto error; } - *rwblPtr = aStream; return paNoError; - error: *rwblPtr = NULL; --- 264,286 ---- }
! /* Open a PortAudio stream that we will use to communicate with the underlying audio drivers. */ #ifdef PA19 ! err = Pa_OpenStream(&aStream->stream, (doRead ? &instreamparams : 0), (doWrite ? &outstreamparams : 0), ! sampleRate, framesperbuf, paNoFlag, blockingIOCallback, aStream); #else ! err = Pa_OpenStream(&aStream->stream, ! (doRead ? indeviceno : paNoDevice), (doRead ? aStream->insamplesPerFrame : 0 ), format, NULL, ! (doWrite ? outdeviceno : paNoDevice), (doWrite ? aStream->outsamplesPerFrame : 0 ), format, NULL, ! sampleRate, framesperbuf, nbuffers, paNoFlag, blockingIOCallback, aStream); #endif ! if (err != paNoError) goto error; err = Pa_StartStream( aStream->stream ); ! if (err != paNoError) { fprintf(stderr, "Pa_StartStream failed; closing audio stream...\n"); ! PD_CloseAudioStream(aStream); goto error; } *rwblPtr = aStream; return paNoError; error: *rwblPtr = NULL; *************** *** 378,408 ****
/************************************************************/ ! PaError PD_CloseAudioStream( PABLIO_Stream *aStream ) ! { PaError err; int bytesEmpty; int byteSize = aStream->outFIFO.bufferSize; - /* If we are writing data, make sure we play everything written. */ ! if( byteSize > 0 ) ! { bytesEmpty = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); ! while( bytesEmpty < byteSize ) ! { NPa_Sleep( 10 ); /* MSP */ bytesEmpty = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); } } ! ! err = Pa_StopStream( aStream->stream ); ! if( err != paNoError ) goto error; ! err = Pa_CloseStream( aStream->stream ); ! if( err != paNoError ) goto error; Pa_Terminate(); - error: ! PABLIO_TermFIFO( &aStream->inFIFO ); ! PABLIO_TermFIFO( &aStream->outFIFO ); ! free( aStream ); return err; } --- 289,311 ----
/************************************************************/ ! PaError PD_CloseAudioStream(PABLIO_Stream *aStream) { PaError err; int bytesEmpty; int byteSize = aStream->outFIFO.bufferSize; /* If we are writing data, make sure we play everything written. */ ! if (byteSize>0) { bytesEmpty = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); ! while (bytesEmpty<byteSize) { NPa_Sleep( 10 ); /* MSP */ bytesEmpty = PD_RingBuffer_GetWriteAvailable( &aStream->outFIFO ); } } ! err = Pa_StopStream(aStream->stream); if(err != paNoError) goto error; ! err = Pa_CloseStream(aStream->stream); if(err != paNoError) goto error; Pa_Terminate(); error: ! PABLIO_TermFIFO(&aStream->inFIFO); ! PABLIO_TermFIFO(&aStream->outFIFO); ! free(aStream); return err; }