(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;
} 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;

View File

@ -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;