mirror of
https://github.com/libretro/RetroArch
synced 2025-02-11 06:40:48 +00:00
(Audio) Update
This commit is contained in:
parent
a6b114e423
commit
6cfe0ea77c
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user