output/jack: use jack_ringbuffer_get_write_vector()
Reduce number of libjack calls.
This commit is contained in:
parent
8928cd53bf
commit
c4c2da06b7
1
NEWS
1
NEWS
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue