From a2386146b7132533f3b8e2041e85eceff4aeab84 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 14 Aug 2022 21:24:54 +0000 Subject: player: drain sinks completely before changing sink rate For users of the CPU-saving bypass mode (e.g. "format rate=bypass"), this fixes a bug when enqueueing a 44.1kHz immediately after a 48kHz file (or vice-versa). Note: gapless playback with different rates/channels between tracks has never been supported with bypass mode enabled. Bypass only allows opportunistic gapless when sequential tracks have the same format. --- lib/dtas/player.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/dtas/player.rb b/lib/dtas/player.rb index 06ba788..6ea3aba 100644 --- a/lib/dtas/player.rb +++ b/lib/dtas/player.rb @@ -37,6 +37,7 @@ class DTAS::Player # :nodoc: @paused = false @format = DTAS::Format.new @bypass = [] # %w(rate bits channels) (not worth Hash overhead) + @bypass_next = nil # source_spec @sinks = {} # { user-defined name => sink } @targets = [] # order matters @@ -331,6 +332,7 @@ class DTAS::Player # :nodoc: # called when the player is leaving idle state def spawn_sinks(source_spec) + @bypass_next = nil return true if @targets[0] @sinks.each_value do |sink| sink.active or next @@ -392,6 +394,8 @@ class DTAS::Player # :nodoc: if ! @bypass.empty? && pending.respond_to?(:format) new_fmt = bypass_match!(@format.dup, pending.format) if new_fmt != @format + @bypass_next = source_spec + return if @sink_buf.inflight > 0 stop_sinks # we may fail to start below format_update!(new_fmt) end @@ -434,6 +438,7 @@ class DTAS::Player # :nodoc: end def stop_sinks + @bypass_next = nil @targets.each { |t| drop_target(t) }.clear end @@ -458,7 +463,9 @@ class DTAS::Player # :nodoc: end # nothing left inflight, stop the sinks until we have a source + bn = @bypass_next stop_sinks + next_source(bn) if bn # are we restarting for bypass? :ignore end -- cgit v1.2.3-24-ge0c7