From 0103a33f7ef628709389c85fee74b6c5fcd57c74 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 11 Jan 2022 18:20:40 +0000 Subject: player: reduce syscalls when splicing to single target splice(2) alone does not give enough information as to whether the source or destination is blocking. However, as far as audio playback chain goes, the sink should ALWAYS be the limiting factor as decoder sources need to be able to produce data at least as fast as the audio is being played (otherwise there'll be audible drops). Thus, we bias the select(2) into waiting on a targets on if we splice(2) less than the data we requested. --- lib/dtas/buffer/fiddle_splice.rb | 3 ++- lib/dtas/buffer/splice.rb | 3 ++- test/test_buffer.rb | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/dtas/buffer/fiddle_splice.rb b/lib/dtas/buffer/fiddle_splice.rb index ad007eb..d9232cd 100644 --- a/lib/dtas/buffer/fiddle_splice.rb +++ b/lib/dtas/buffer/fiddle_splice.rb @@ -84,7 +84,8 @@ module DTAS::Buffer::FiddleSplice # :nodoc: targets # our one and only target blocked on write else @bytes_xfer += s - :wait_readable # we want to read more from @to_io soon + # s < limit means targets[0] is full + s < limit ? targets : :wait_readable end rescue Errno::EPIPE, IOError => e __dst_error(targets[0], e) diff --git a/lib/dtas/buffer/splice.rb b/lib/dtas/buffer/splice.rb index e5d17ab..b9957ce 100644 --- a/lib/dtas/buffer/splice.rb +++ b/lib/dtas/buffer/splice.rb @@ -39,7 +39,8 @@ module DTAS::Buffer::Splice # :nodoc: targets # our one and only target blocked on write else @bytes_xfer += s - :wait_readable # we want to read more from @to_io soon + # s < limit means targets[0] is full + s < limit ? targets : :wait_readable end rescue Errno::EPIPE, IOError => e __dst_error(targets[0], e) diff --git a/test/test_buffer.rb b/test/test_buffer.rb index 54ee584..b89a090 100644 --- a/test/test_buffer.rb +++ b/test/test_buffer.rb @@ -62,7 +62,7 @@ class TestBuffer < Testcase buf = new_buffer r, w = IO.pipe buf.wr.write "HIHI" - assert_equal :wait_readable, buf.broadcast([w]) + assert_equal [w], buf.broadcast([w]) assert_equal 4, buf.bytes_xfer tmp = [w] r.close -- cgit v1.2.3-24-ge0c7