(DSound) Optimize codepaths
(CoreAudio) Only iOS uses g_interrupted flag, put it behind ifdefs
This commit is contained in:
parent
688629d108
commit
40a6c978ce
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue