From 00cc4c954789d5730da96f6464add5af0ae297f9 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Thu, 3 Aug 2023 18:45:42 +0100 Subject: [PATCH] push @running into que when terminating threads --- lib/voicemeeter/base.rb | 1 - lib/voicemeeter/worker.rb | 29 ++++++++++++++--------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/voicemeeter/base.rb b/lib/voicemeeter/base.rb index ac3b9f2..cc71701 100644 --- a/lib/voicemeeter/base.rb +++ b/lib/voicemeeter/base.rb @@ -31,7 +31,6 @@ module Voicemeeter **(kwargs.select { |k, _| %i[pdirty mdirty ldirty midi].include? k }) ) @midi = Midi.new - @que = Queue.new @cache = {strip_mode: 0} end diff --git a/lib/voicemeeter/worker.rb b/lib/voicemeeter/worker.rb index d48d33d..08e4abd 100644 --- a/lib/voicemeeter/worker.rb +++ b/lib/voicemeeter/worker.rb @@ -6,6 +6,8 @@ module Voicemeeter include Logging + private + def init_producer(que) @running = true Thread.new do @@ -18,7 +20,7 @@ module Voicemeeter sleep(@ratelimit) end logger.debug "closing #{Thread.current.name} thread" - que << :stop + que << @running end end @@ -29,16 +31,11 @@ module Voicemeeter @cache[:bus_comp] = Array.new(kind.num_bus_levels, false) Thread.new do Thread.current.name = "worker" - loop do - e_from_que = @que.pop - if e_from_que == :stop - logger.debug "closing #{Thread.current.name} thread" - break - end - trigger :pdirty if e_from_que == :pdirty && pdirty? - trigger :mdirty if e_from_que == :mdirty && mdirty? - trigger :midi if e_from_que == :midi && get_midi_message - if e_from_que == :ldirty && ldirty? + while (event = que.pop) + trigger :pdirty if event == :pdirty && pdirty? + trigger :mdirty if event == :mdirty && mdirty? + trigger :midi if event == :midi && get_midi_message + if event == :ldirty && ldirty? cache[:strip_comp] = cache[:strip_level].zip(cache[:strip_buf]).map { |a, b| a != b } cache[:bus_comp] = cache[:bus_level].zip(cache[:bus_buf]).map { |a, b| a != b } cache[:strip_level] = cache[:strip_buf] @@ -46,18 +43,20 @@ module Voicemeeter trigger :ldirty end end + logger.debug "closing #{Thread.current.name} thread" end end + public + def init_event_threads - init_worker(@que) - init_producer(@que) + que = Queue.new + init_worker(que) + init_producer(que) end def end_event_threads @running = false end - - module_function :init_event_threads, :end_event_threads end end