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;
/* 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);
}
}
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;
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;
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;
}
*/
long GetAudioStreamWriteable(PABLIO_Stream * aStream)
{
- int bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
+ int bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFOs[0]);
return bytesEmpty / aStream->bytesPerFrame;
}
*/
long GetAudioStreamReadable(PABLIO_Stream * aStream)
{
- int bytesFull = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFO);
+ int bytesFull = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFOs[0]);
return bytesFull / aStream->bytesPerFrame;
}
/* 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;
}
}
if (outputParameters) {
- err = PABLIO_InitFIFO(&aStream->outFIFO, numFrames, aStream->bytesPerFrame);
+ err = PABLIO_InitFIFO(&aStream->outFIFOs[0], numFrames, aStream->bytesPerFrame);
if (err != paNoError) {
goto error;
}
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]);
}
}
}
}
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);