(Audio) Update

This commit is contained in:
twinaphex 2020-01-14 20:20:54 +01:00
parent a6b114e423
commit 6cfe0ea77c
2 changed files with 36 additions and 78 deletions

View File

@ -52,9 +52,7 @@ typedef struct coreaudio
size_t buffer_size; size_t buffer_size;
} coreaudio_t; } coreaudio_t;
#if TARGET_OS_IOS static bool g_interrupted;
static bool g_interrupted = false;
#endif
static void coreaudio_free(void *data) static void coreaudio_free(void *data)
{ {
@ -245,7 +243,7 @@ static void *coreaudio_init(const char *device,
#else #else
comp = AudioComponentFindNext(NULL, &desc); comp = AudioComponentFindNext(NULL, &desc);
#endif #endif
if (!comp) if (comp == NULL)
goto error; goto error;
#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) #if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
@ -346,61 +344,36 @@ 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;
if (dev->nonblock) while (!g_interrupted && size > 0)
{ {
bool cond = size > 0; size_t write_avail;
#if TARGET_OS_IOS
cond = cond && !g_interrupted; slock_lock(dev->lock);
#endif
if (cond) 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)
{ {
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

@ -260,37 +260,22 @@ static bool g_interrupted;
- (ssize_t)writeFloat:(const float *)data samples:(size_t)samples { - (ssize_t)writeFloat:(const float *)data samples:(size_t)samples {
size_t written = 0; size_t written = 0;
while (!g_interrupted && samples > 0)
if (_nonBlock)
{ {
if (!g_interrupted && samples > 0) size_t write_avail = rb_avail(&_rb);
{ if (write_avail > samples)
size_t write_avail = rb_avail(&_rb); write_avail = samples;
if (write_avail > samples)
write_avail = samples;
rb_write_data(&_rb, data, write_avail); rb_write_data(&_rb, data, write_avail);
data += write_avail; data += write_avail;
written += write_avail; written += write_avail;
samples -= write_avail; samples -= write_avail;
}
}
else
{
while (!g_interrupted && samples > 0)
{
size_t write_avail = rb_avail(&_rb);
if (write_avail > samples)
write_avail = samples;
rb_write_data(&_rb, data, write_avail); if (_nonBlock)
data += write_avail; break;
written += write_avail;
samples -= write_avail;
if (write_avail == 0) if (write_avail == 0)
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER); dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);
}
} }
return written; return written;