diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 8f7aa424df..52f77bb28a 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -552,7 +552,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch globals.read_frame.datalen = samples * 2; globals.read_frame.samples = samples; - switch_core_timer_check(&globals.timer, SWITCH_TRUE); + //switch_core_timer_check(&globals.timer, SWITCH_TRUE); *frame = &globals.read_frame; if (!switch_test_flag((&globals), GFLAG_MOUTH)) { diff --git a/src/mod/endpoints/mod_portaudio/pablio.c b/src/mod/endpoints/mod_portaudio/pablio.c index b88b7eed4e..ab1d907e02 100644 --- a/src/mod/endpoints/mod_portaudio/pablio.c +++ b/src/mod/endpoints/mod_portaudio/pablio.c @@ -145,20 +145,36 @@ long ReadAudioStream(PABLIO_Stream * aStream, void *data, long numFrames, switch { long bytesRead; char *p = (char *) data; - long numBytes = aStream->bytesPerFrame * numFrames; + long avail, readBytes = 0, numBytes = aStream->bytesPerFrame * numFrames; while (numBytes > 0) { - bytesRead = PaUtil_ReadRingBuffer(&aStream->inFIFO, p, numBytes); - numBytes -= bytesRead; + avail = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFO); + + if (avail >= numBytes * 10) { + PaUtil_FlushRingBuffer(&aStream->inFIFO); + avail = 0; + } + + if (avail >= numBytes) { + bytesRead = PaUtil_ReadRingBuffer(&aStream->inFIFO, p, numBytes); + numBytes -= bytesRead; + readBytes += bytesRead; + } + if (numBytes > 0) { if (switch_core_timer_check(timer, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { - PaUtil_FlushRingBuffer(&aStream->inFIFO); - return 0; + break; } switch_yield(1000); + p += bytesRead; } } - return numFrames; + + if (readBytes) { + switch_core_timer_sync(timer); + } + + return readBytes / aStream->bytesPerFrame; } /************************************************************