static ssize_t ps3_audio_write(void *data, const void *buf, size_t size) { ps3_audio_t *aud = data; if (aud->nonblocking) { if (fifo_write_avail(aud->buffer) < size) return 0; } while (fifo_write_avail(aud->buffer) < size) sys_lwcond_wait(&aud->cond, 0); sys_lwmutex_lock(&aud->lock, SYS_NO_TIMEOUT); fifo_write(aud->buffer, buf, size); sys_lwmutex_unlock(&aud->lock); return size; }
static int32_t audioport_write(cell_audio_handle_t handle, const int16_t *data, uint32_t samples) { int32_t ret = samples; uint32_t bytes = samples * sizeof(int16_t); audioport_t *port = handle; while (bytes) { sys_lwmutex_lock(&port->lock, SYS_NO_TIMEOUT); uint32_t avail = fifo_write_avail(port->buffer); sys_lwmutex_unlock(&port->lock); uint32_t to_write = avail < bytes ? avail : bytes; if (to_write) { sys_lwmutex_lock(&port->lock, SYS_NO_TIMEOUT); fifo_write(port->buffer, data, to_write); sys_lwmutex_unlock(&port->lock); bytes -= to_write; data += to_write >> 1; } else sys_lwcond_wait(&port->cond, 0); }