static size_t write_buffer(jack_t *jd, const float *buf, size_t size) { jack_default_audio_sample_t out_deinterleaved_buffer[2][AUDIO_CHUNK_SIZE_NONBLOCKING]; for (int i = 0; i < 2; i++) for (size_t j = 0; j < FRAMES(size); j++) out_deinterleaved_buffer[i][j] = buf[j * 2 + i]; size_t frames = FRAMES(size); size_t written = 0; while (written < frames) { if (jd->shutdown) return 0; size_t avail[2] = { jack_ringbuffer_write_space(jd->buffer[0]), jack_ringbuffer_write_space(jd->buffer[1]), }; size_t min_avail = avail[0] < avail[1] ? avail[0] : avail[1]; min_avail /= sizeof(float); size_t write_frames = frames - written > min_avail ? min_avail : frames - written; if (write_frames > 0) { for (int i = 0; i < 2; i++) { jack_ringbuffer_write(jd->buffer[i], (const char*)&out_deinterleaved_buffer[i][written], write_frames * sizeof(jack_default_audio_sample_t)); } written += write_frames; } else { pthread_mutex_lock(&jd->cond_lock); pthread_cond_wait(&jd->cond, &jd->cond_lock); pthread_mutex_unlock(&jd->cond_lock); } if (jd->nonblock) break; } return written * sizeof(float) * 2; }
static size_t write_buffer(jack_t *jd, const float *buf, size_t size) { int i; size_t j, frames, written = 0; jack_default_audio_sample_t out_deinterleaved_buffer[2][AUDIO_CHUNK_SIZE_NONBLOCKING * AUDIO_MAX_RATIO]; frames = FRAMES(size); /* Avoid buffer overflow if a DSP plugin generated a huge number of frames. */ if (frames > AUDIO_CHUNK_SIZE_NONBLOCKING * AUDIO_MAX_RATIO) frames = AUDIO_CHUNK_SIZE_NONBLOCKING * AUDIO_MAX_RATIO; for (i = 0; i < 2; i++) for (j = 0; j < frames; j++) out_deinterleaved_buffer[i][j] = buf[j * 2 + i]; while (written < frames) { size_t avail[2], min_avail, write_frames; if (jd->shutdown) return 0; avail[0] = jack_ringbuffer_write_space(jd->buffer[0]); avail[1] = jack_ringbuffer_write_space(jd->buffer[1]); min_avail = avail[0] < avail[1] ? avail[0] : avail[1]; min_avail /= sizeof(float); write_frames = frames - written > min_avail ? min_avail : frames - written; if (write_frames > 0) { for (i = 0; i < 2; i++) { jack_ringbuffer_write(jd->buffer[i], (const char*)&out_deinterleaved_buffer[i][written], write_frames * sizeof(jack_default_audio_sample_t)); } written += write_frames; } #ifdef HAVE_THREADS else { slock_lock(jd->cond_lock); scond_wait(jd->cond, jd->cond_lock); slock_unlock(jd->cond_lock); } #endif if (jd->nonblock) break; } return written * sizeof(float) * 2; }