Author: anthm Date: Thu May 8 12:20:15 2008 New Revision: 8305 Modified: freeswitch/trunk/src/mod/endpoints/mod_portaudio/pa_ringbuffer.c freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c Log: ok this has to fix the issue with crappy sound cards 100% soft timer Modified: freeswitch/trunk/src/mod/endpoints/mod_portaudio/pa_ringbuffer.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_portaudio/pa_ringbuffer.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_portaudio/pa_ringbuffer.c Thu May 8 12:20:15 2008 @@ -70,7 +70,7 @@ * PaUtil_WriteMemoryBarrier() * ****************/ - +#define __VIA_HACK__ #if defined(__VIA_HACK__) #define NO_BARRIER #endif Modified: freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c Thu May 8 12:20:15 2008 @@ -145,36 +145,35 @@ { long bytesRead = 0; char *p = (char *) data; - long avail, readBytes = 0, numBytes = aStream->bytesPerFrame * numFrames; + long avail, totalBytes = 0, neededBytes = aStream->bytesPerFrame * numFrames; - while (numBytes > 0) { + for(;;) { avail = PaUtil_GetRingBufferReadAvailable(&aStream->inFIFO); - - if (avail >= numBytes * 10) { + + if (switch_core_timer_check(timer, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { + break; + } + + if (avail >= neededBytes * 6) { PaUtil_FlushRingBuffer(&aStream->inFIFO); avail = 0; } - if (avail >= numBytes * 2) { - bytesRead = PaUtil_ReadRingBuffer(&aStream->inFIFO, p, numBytes); - numBytes -= bytesRead; - readBytes += bytesRead; + bytesRead = 0; + + if (totalBytes < neededBytes && avail >= neededBytes) { + bytesRead = PaUtil_ReadRingBuffer(&aStream->inFIFO, p, neededBytes); + totalBytes += bytesRead; } - if (numBytes > 0) { - if (switch_core_timer_check(timer, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { - break; - } - switch_yield(1000); + if (bytesRead) { p += bytesRead; + } else { + switch_yield(1000); } } - if (readBytes) { - switch_core_timer_sync(timer); - } - - return readBytes / aStream->bytesPerFrame; + return totalBytes / aStream->bytesPerFrame; } /************************************************************