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;
}