diff --git a/audio/drivers/coreaudio.c b/audio/drivers/coreaudio.c index 0a8ca82971..e0ea70249b 100644 --- a/audio/drivers/coreaudio.c +++ b/audio/drivers/coreaudio.c @@ -52,7 +52,9 @@ typedef struct coreaudio size_t buffer_size; } coreaudio_t; -static bool g_interrupted; +#if TARGET_OS_IOS +static bool g_interrupted = false; +#endif static void coreaudio_free(void *data) { @@ -344,36 +346,61 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t size) const uint8_t *buf = (const uint8_t*)buf_; size_t written = 0; - while (!g_interrupted && size > 0) + if (dev->nonblock) { - size_t write_avail; - - slock_lock(dev->lock); - - write_avail = fifo_write_avail(dev->buffer); - if (write_avail > size) - write_avail = size; - - fifo_write(dev->buffer, buf, write_avail); - buf += write_avail; - written += write_avail; - size -= write_avail; - - if (dev->nonblock) + bool cond = size > 0; +#if TARGET_OS_IOS + cond = cond && !g_interrupted; +#endif + if (cond) { + size_t write_avail; + + slock_lock(dev->lock); + + write_avail = fifo_write_avail(dev->buffer); + if (write_avail > size) + write_avail = size; + + fifo_write(dev->buffer, buf, write_avail); + buf += write_avail; + written += write_avail; + size -= write_avail; + slock_unlock(dev->lock); - break; } + } + else + { +#if TARGET_OS_IOS + while (!g_interrupted && size > 0) +#else + while (size > 0) +#endif + { + size_t write_avail; + + slock_lock(dev->lock); + + write_avail = fifo_write_avail(dev->buffer); + if (write_avail > size) + write_avail = size; + + fifo_write(dev->buffer, buf, write_avail); + buf += write_avail; + written += write_avail; + size -= write_avail; #if TARGET_OS_IPHONE - if (write_avail == 0 && !scond_wait_timeout( - dev->cond, dev->lock, 3000000)) - g_interrupted = true; + if (write_avail == 0 && !scond_wait_timeout( + dev->cond, dev->lock, 3000000)) + g_interrupted = true; #else - if (write_avail == 0) - scond_wait(dev->cond, dev->lock); + if (write_avail == 0) + scond_wait(dev->cond, dev->lock); #endif - slock_unlock(dev->lock); + slock_unlock(dev->lock); + } } return written; diff --git a/audio/drivers/dsound.c b/audio/drivers/dsound.c index 948792c460..df1ff11118 100644 --- a/audio/drivers/dsound.c +++ b/audio/drivers/dsound.c @@ -496,27 +496,49 @@ static ssize_t dsound_write(void *data, const void *buf_, size_t size) if (!ds->thread_alive) return -1; - while (size > 0) + if (ds->nonblock) { - size_t avail; + if (size > 0) + { + size_t avail; - EnterCriticalSection(&ds->crit); - avail = fifo_write_avail(ds->buffer); - if (avail > size) - avail = size; + EnterCriticalSection(&ds->crit); + avail = fifo_write_avail(ds->buffer); + if (avail > size) + avail = size; - fifo_write(ds->buffer, buf, avail); - LeaveCriticalSection(&ds->crit); + fifo_write(ds->buffer, buf, avail); + LeaveCriticalSection(&ds->crit); - buf += avail; - size -= avail; - written += avail; + buf += avail; + size -= avail; + written += avail; + } + } + else + { + while (size > 0) + { + size_t avail; - if (ds->nonblock || !ds->thread_alive) - break; + EnterCriticalSection(&ds->crit); + avail = fifo_write_avail(ds->buffer); + if (avail > size) + avail = size; - if (avail == 0) - WaitForSingleObject(ds->event, INFINITE); + fifo_write(ds->buffer, buf, avail); + LeaveCriticalSection(&ds->crit); + + buf += avail; + size -= avail; + written += avail; + + if (!ds->thread_alive) + break; + + if (avail == 0) + WaitForSingleObject(ds->event, INFINITE); + } } return written;