aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/output/plugins/JackOutputPlugin.cxx40
1 files changed, 21 insertions, 19 deletions
diff --git a/src/output/plugins/JackOutputPlugin.cxx b/src/output/plugins/JackOutputPlugin.cxx
index c10d76b7e..653a73328 100644
--- a/src/output/plugins/JackOutputPlugin.cxx
+++ b/src/output/plugins/JackOutputPlugin.cxx
@@ -643,8 +643,24 @@ mpd_jack_delay(AudioOutput *ao)
inline size_t
JackOutput::WriteSamples(const float *src, size_t n_frames)
{
+ assert(n_frames > 0);
+
const unsigned n_channels = audio_format.channels;
- const size_t result = n_frames;
+
+ 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)
+ /* send data symmetrically */
+ space = space1;
+ }
+
+ space /= jack_sample_size;
+ if (space == 0)
+ return 0;
+
+ const size_t result = n_frames = std::min(space, n_frames);
while (n_frames-- > 0)
for (unsigned i = 0; i < n_channels; ++i, ++src)
@@ -664,7 +680,6 @@ JackOutput::Play(const void *chunk, size_t size, Error &error)
assert(size % frame_size == 0);
size /= frame_size;
- size_t space = 0;
while (true) {
if (shutdown) {
error.Set(jack_output_domain,
@@ -673,28 +688,15 @@ JackOutput::Play(const void *chunk, size_t size, Error &error)
return 0;
}
- space = jack_ringbuffer_write_space(ringbuffer[0]);
- for (unsigned i = 1; i < audio_format.channels; ++i) {
- unsigned space1 =
- jack_ringbuffer_write_space(ringbuffer[i]);
- if (space > space1)
- /* send data symmetrically */
- space = space1;
- }
-
- if (space >= jack_sample_size)
- break;
+ size_t frames_written =
+ WriteSamples((const float *)chunk, size);
+ if (frames_written > 0)
+ return frames_written * frame_size;
/* XXX do something more intelligent to
synchronize */
usleep(1000);
}
-
- space /= jack_sample_size;
- if (space < size)
- size = space;
-
- return WriteSamples((const float *)chunk, size) * frame_size;
}
static size_t