Commit c4c2da06 authored by Max Kellermann's avatar Max Kellermann

output/jack: use jack_ringbuffer_get_write_vector()

Reduce number of libjack calls.
parent 8928cd53
......@@ -12,6 +12,7 @@ ver 0.20 (not yet released)
- ffmpeg: support ReplayGain and MixRamp
- ffmpeg: support stream tags
* output
- jack: reduce CPU usage
- pulse: set channel map to WAVE-EX
* mixer
- null: new plugin
......
......@@ -647,13 +647,20 @@ JackOutput::WriteSamples(const float *src, size_t n_frames)
const unsigned n_channels = audio_format.channels;
size_t space = jack_ringbuffer_write_space(ringbuffer[0]);
for (unsigned i = 1; i < n_channels; ++i) {
size_t space1 =
jack_ringbuffer_write_space(ringbuffer[i]);
if (space1 < space)
float *dest[MAX_CHANNELS];
size_t space = -1;
for (unsigned i = 0; i < n_channels; ++i) {
jack_ringbuffer_data_t d[2];
jack_ringbuffer_get_write_vector(ringbuffer[i], d);
/* choose the first non-empty writable area */
const jack_ringbuffer_data_t &e = d[d[0].len == 0];
if (e.len < space)
/* send data symmetrically */
space = space1;
space = e->len;
dest[i] = (float *)e.buf;
}
space /= jack_sample_size;
......@@ -663,10 +670,13 @@ JackOutput::WriteSamples(const float *src, size_t n_frames)
const size_t result = n_frames = std::min(space, n_frames);
while (n_frames-- > 0)
for (unsigned i = 0; i < n_channels; ++i, ++src)
jack_ringbuffer_write(ringbuffer[i],
(const char *)src,
sizeof(*src));
for (unsigned i = 0; i < n_channels; ++i)
*dest[i]++ = *src++;
const size_t per_channel_advance = result * jack_sample_size;
for (unsigned i = 0; i < n_channels; ++i)
jack_ringbuffer_write_advance(ringbuffer[i],
per_channel_advance);
return result;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment