[PD-cvs] pd/src s_audio_pablio.c,1.1.4.2.2.4,1.1.4.2.2.4.2.1

Mathieu Bouchard matju at users.sourceforge.net
Tue Jul 31 00:16:29 CEST 2007


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





More information about the Pd-cvs mailing list