]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
mod_portaudio: update to support multiple io buffers
authorMoises Silva <moises.silva@gmail.com>
Sat, 19 Mar 2011 17:24:02 +0000 (13:24 -0400)
committerMoises Silva <moises.silva@gmail.com>
Sat, 19 Mar 2011 17:24:02 +0000 (13:24 -0400)
src/mod/endpoints/mod_portaudio/mod_portaudio.c
src/mod/endpoints/mod_portaudio/pablio.c
src/mod/endpoints/mod_portaudio/pablio.h

index d02a3ead07eb8092f59febbdab1832821b317495..b7140e987cf6ebcc507e642262ba524c67011a4a 100644 (file)
@@ -98,41 +98,36 @@ struct private_object {
 typedef struct private_object private_t;
 
 struct audio_stream {
+       /*! Sampling rate */
+       int sample_rate;
+       /*! Buffer packetization (and therefore timing) */
+       int codec_ms;
+       /*! The PA input device */
        int indev;
+       /*! The PA output device */
        int outdev;
+       /*! The io stream helper to buffer audio */
        PABLIO_Stream *stream;
+       /*! How often to write */
        switch_timer_t write_timer;
+       /*! Next stream */
        struct audio_stream *next;
 };
 typedef struct audio_stream audio_stream_t;
 
-typedef struct _pa_shared_device {
-       /*! Sampling rate */
-       int sample_rate;
-       /*! */
-       int codec_ms;
-       /*! Device number */
-       int devno;
-       /*! Running stream (if a stream is already running for devno) */
-       audio_stream_t *stream;
-       /*! The actual portaudio device number */
-       /*! It's a shared device after all */
-       switch_mutex_t *mutex;
-} pa_shared_device_t;
-
-typedef struct _pa_endpoint {
-       /*! Input device for this endpoint */
-       pa_shared_device_t *indev;
+typedef struct audio_endpoint {
+       /*! Input stream for this endpoint */
+       audio_stream_t *in_stream;
 
-       /*! Output device for this endpoint */
-       pa_shared_device_t *outdev;
+       /*! Output stream for this endpoint */
+       audio_stream_t *out_stream;
 
-       /*! Channel index within the input device stream */
+       /*! Channel index within the input stream where we get the audio for this endpoint */
        int inchan;
 
-       /*! Channel index within the input device stream */
+       /*! Channel index within the output stream where we get the audio for this endpoint */
        int outchan;
-} pa_endpoint_t;
+} audio_endpoint_t;
 
 static struct {
        int debug;
index b994d21c2a3df3f73699f183c7dd901774ea49a3..e65851a61e27f687c415ebffda5de83d321f5b64 100644 (file)
@@ -83,9 +83,9 @@ static int iblockingIOCallback(const void *inputBuffer, void *outputBuffer,
 
        /* This may get called with NULL inputBuffer during initial setup. */
        if (inputBuffer != NULL) {
-               if (PaUtil_WriteRingBuffer(&data->inFIFO, inputBuffer, numBytes) != numBytes) {
-                       PaUtil_FlushRingBuffer(&data->inFIFO);
-                       PaUtil_WriteRingBuffer(&data->inFIFO, inputBuffer, numBytes);
+               if (PaUtil_WriteRingBuffer(&data->inFIFOs[0], inputBuffer, numBytes) != numBytes) {
+                       PaUtil_FlushRingBuffer(&data->inFIFOs[0]);
+                       PaUtil_WriteRingBuffer(&data->inFIFOs[0], inputBuffer, numBytes);
                }
        }
 
@@ -100,7 +100,7 @@ static int oblockingIOCallback(const void *inputBuffer, void *outputBuffer,
 
        if (outputBuffer != NULL) {
                int i;
-               int numRead = PaUtil_ReadRingBuffer(&data->outFIFO, outputBuffer, numBytes);
+               int numRead = PaUtil_ReadRingBuffer(&data->outFIFOs[0], outputBuffer, numBytes);
                /* Zero out remainder of buffer if we run out of data. */
                for (i = numRead; i < numBytes; i++) {
                        ((char *) outputBuffer)[i] = 0;
@@ -151,12 +151,12 @@ long WriteAudioStream(PABLIO_Stream * aStream, void *data, long numFrames, switc
 
        switch_core_timer_next(timer);
 
-       bytesWritten = PaUtil_WriteRingBuffer(&aStream->outFIFO, p, numBytes);
+       bytesWritten = PaUtil_WriteRingBuffer(&aStream->outFIFOs[0], p, numBytes);
        numBytes -= bytesWritten;
        p += bytesWritten;
 
        if (numBytes > 0) {
-               PaUtil_FlushRingBuffer(&aStream->outFIFO);
+               PaUtil_FlushRingBuffer(&aStream->outFIFOs[0]);
                return 0;
        }
        return numFrames;
@@ -177,17 +177,17 @@ long ReadAudioStream(PABLIO_Stream * aStream, void *data, long numFrames, switch
 
        while (totalBytes < neededBytes && --max > 0) {
 
-               avail = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFO);
+               avail = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFOs[0]);
                //printf("AVAILABLE BYTES %ld pass %d\n", avail, 5000 - max);
                if (avail >= neededBytes * 6) {
-                       PaUtil_FlushRingBuffer(&aStream->inFIFO);
+                       PaUtil_FlushRingBuffer(&aStream->inFIFOs[0]);
                        avail = 0;
                } else {
 
                        bytesRead = 0;
 
                        if (totalBytes < neededBytes && avail >= neededBytes) {
-                               bytesRead = PaUtil_ReadRingBuffer(&aStream->inFIFO, p, neededBytes);
+                               bytesRead = PaUtil_ReadRingBuffer(&aStream->inFIFOs[0], p, neededBytes);
                                totalBytes += bytesRead;
                        }
 
@@ -208,7 +208,7 @@ long ReadAudioStream(PABLIO_Stream * aStream, void *data, long numFrames, switch
  */
 long GetAudioStreamWriteable(PABLIO_Stream * aStream)
 {
-       int bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
+       int bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFOs[0]);
        return bytesEmpty / aStream->bytesPerFrame;
 }
 
@@ -218,7 +218,7 @@ long GetAudioStreamWriteable(PABLIO_Stream * aStream)
  */
 long GetAudioStreamReadable(PABLIO_Stream * aStream)
 {
-       int bytesFull = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFO);
+       int bytesFull = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFOs[0]);
        return bytesFull / aStream->bytesPerFrame;
 }
 
@@ -274,7 +274,7 @@ PaError OpenAudioStream(PABLIO_Stream ** rwblPtr,
        /* Initialize Ring Buffers */
 
        if (inputParameters) {
-               err = PABLIO_InitFIFO(&aStream->inFIFO, numFrames, aStream->bytesPerFrame);
+               err = PABLIO_InitFIFO(&aStream->inFIFOs[0], numFrames, aStream->bytesPerFrame);
                if (err != paNoError) {
                        goto error;
                }
@@ -282,7 +282,7 @@ PaError OpenAudioStream(PABLIO_Stream ** rwblPtr,
        }
 
        if (outputParameters) {
-               err = PABLIO_InitFIFO(&aStream->outFIFO, numFrames, aStream->bytesPerFrame);
+               err = PABLIO_InitFIFO(&aStream->outFIFOs[0], numFrames, aStream->bytesPerFrame);
                if (err != paNoError) {
                        goto error;
                }
@@ -355,15 +355,15 @@ PaError CloseAudioStream(PABLIO_Stream * aStream)
        int byteSize;
 
 
-       byteSize = aStream->outFIFO.bufferSize;
+       byteSize = aStream->outFIFOs[0].bufferSize;
 
        if (aStream->has_out) {
                /* If we are writing data, make sure we play everything written. */
                if (byteSize > 0) {
-                       bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
+                       bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFOs[0]);
                        while (bytesEmpty < byteSize) {
                                Pa_Sleep(10);
-                               bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
+                               bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFOs[0]);
                        }
                }
        }
@@ -399,11 +399,11 @@ PaError CloseAudioStream(PABLIO_Stream * aStream)
        }
 
        if (aStream->has_in) {
-               PABLIO_TermFIFO(&aStream->inFIFO);
+               PABLIO_TermFIFO(&aStream->inFIFOs[0]);
        }
 
        if (aStream->has_out) {
-               PABLIO_TermFIFO(&aStream->outFIFO);
+               PABLIO_TermFIFO(&aStream->outFIFOs[0]);
        }
 
        free(aStream);
index 6d99d2f01203c77d3ee7d1852487d4ee388f7307..a30863bbd4af82b3133215ef5c50b9158c95f74c 100644 (file)
@@ -65,8 +65,8 @@ typedef struct {
        int do_dual;
        int has_in;
        int has_out;
-       PaUtilRingBuffer inFIFOs[2]
-       PaUtilRingBuffer outFIFOs[2]
+       PaUtilRingBuffer inFIFOs[2];
+       PaUtilRingBuffer outFIFOs[2];
        int channelCount;
 } PABLIO_Stream;