(DSound) Optimize codepaths

(CoreAudio) Only iOS uses g_interrupted flag, put it behind ifdefs
This commit is contained in:
twinaphex 2020-01-04 09:46:27 +01:00
parent 688629d108
commit 40a6c978ce
2 changed files with 87 additions and 38 deletions

View File

@ -52,7 +52,9 @@ typedef struct coreaudio
size_t buffer_size; size_t buffer_size;
} coreaudio_t; } coreaudio_t;
static bool g_interrupted; #if TARGET_OS_IOS
static bool g_interrupted = false;
#endif
static void coreaudio_free(void *data) 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_; const uint8_t *buf = (const uint8_t*)buf_;
size_t written = 0; size_t written = 0;
while (!g_interrupted && size > 0) if (dev->nonblock)
{ {
size_t write_avail; bool cond = size > 0;
#if TARGET_OS_IOS
slock_lock(dev->lock); cond = cond && !g_interrupted;
#endif
write_avail = fifo_write_avail(dev->buffer); if (cond)
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)
{ {
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); 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 TARGET_OS_IPHONE
if (write_avail == 0 && !scond_wait_timeout( if (write_avail == 0 && !scond_wait_timeout(
dev->cond, dev->lock, 3000000)) dev->cond, dev->lock, 3000000))
g_interrupted = true; g_interrupted = true;
#else #else
if (write_avail == 0) if (write_avail == 0)
scond_wait(dev->cond, dev->lock); scond_wait(dev->cond, dev->lock);
#endif #endif
slock_unlock(dev->lock); slock_unlock(dev->lock);
}
} }
return written; return written;

View File

@ -496,27 +496,49 @@ static ssize_t dsound_write(void *data, const void *buf_, size_t size)
if (!ds->thread_alive) if (!ds->thread_alive)
return -1; return -1;
while (size > 0) if (ds->nonblock)
{ {
size_t avail; if (size > 0)
{
size_t avail;
EnterCriticalSection(&ds->crit); EnterCriticalSection(&ds->crit);
avail = fifo_write_avail(ds->buffer); avail = fifo_write_avail(ds->buffer);
if (avail > size) if (avail > size)
avail = size; avail = size;
fifo_write(ds->buffer, buf, avail); fifo_write(ds->buffer, buf, avail);
LeaveCriticalSection(&ds->crit); LeaveCriticalSection(&ds->crit);
buf += avail; buf += avail;
size -= avail; size -= avail;
written += avail; written += avail;
}
}
else
{
while (size > 0)
{
size_t avail;
if (ds->nonblock || !ds->thread_alive) EnterCriticalSection(&ds->crit);
break; avail = fifo_write_avail(ds->buffer);
if (avail > size)
avail = size;
if (avail == 0) fifo_write(ds->buffer, buf, avail);
WaitForSingleObject(ds->event, INFINITE); LeaveCriticalSection(&ds->crit);
buf += avail;
size -= avail;
written += avail;
if (!ds->thread_alive)
break;
if (avail == 0)
WaitForSingleObject(ds->event, INFINITE);
}
} }
return written; return written;