diff --git a/examples/events/main.rb b/examples/events/main.rb index 98ab905..69d04f7 100644 --- a/examples/events/main.rb +++ b/examples/events/main.rb @@ -1,13 +1,13 @@ require_relative "../../lib/voicemeeter" class Main - def initialize - @vm = Voicemeeter::Remote.new(:potato, pdirty: true, ldirty: true) - @vm.register(method(:on_pdirty), method(:on_ldirty)) + def initialize(vm) + @vm = vm + @vm.callback.register(method(:on_pdirty), method(:on_mdirty), method(:on_midi), method(:on_ldirty)) end def run - @vm.run { exit if gets.chomp.empty? } + exit if gets.chomp.empty? end def on_pdirty @@ -30,4 +30,8 @@ class Main end end -Main.new.run if $0 == __FILE__ +if $0 == __FILE__ + Voicemeeter::Remote.new(:potato, pdirty: true, mdirty: true, midi: true, ldirty: true).run do |vm| + Main.new(vm).run + end +end diff --git a/lib/voicemeeter/base.rb b/lib/voicemeeter/base.rb index ec27056..cd4d9cf 100644 --- a/lib/voicemeeter/base.rb +++ b/lib/voicemeeter/base.rb @@ -11,9 +11,8 @@ module Voicemeeter class Base include Logging include Worker - include Events::Callbacks - attr_reader :kind, :midi, :event, :running + attr_reader :kind, :midi, :event, :running, :callback attr_accessor :cache RATELIMIT = 0.033 @@ -27,7 +26,7 @@ module Voicemeeter Events::Tracker.new( **(kwargs.select { |k, _| %i[pdirty mdirty ldirty midi].include? k }) ) - @callbacks = [] + @callback = Events::Callback.new @que = Queue.new @cache = {strip_mode: 0} end diff --git a/lib/voicemeeter/event.rb b/lib/voicemeeter/event.rb index 57184e0..8afe81d 100644 --- a/lib/voicemeeter/event.rb +++ b/lib/voicemeeter/event.rb @@ -2,8 +2,10 @@ require_relative "logger" module Voicemeeter module Events - module Callbacks - attr_reader :callbacks + class Callback + def initialize + @callbacks = [] + end def register(*args) args.each { |callback| @callbacks.append callback } @@ -13,7 +15,7 @@ module Voicemeeter @callbacks.reject! { |c| args.include? c } end - def on_event(event) + def trigger(event) @callbacks.each do |callback| if callback.respond_to? :on_update callback.on_update { event.to_s[3..] } diff --git a/lib/voicemeeter/worker.rb b/lib/voicemeeter/worker.rb index 08d33e4..fe3c054 100644 --- a/lib/voicemeeter/worker.rb +++ b/lib/voicemeeter/worker.rb @@ -31,15 +31,15 @@ module Voicemeeter logger.debug("closing worker thread") break end - on_event :on_pdirty if e_from_que == :pdirty && pdirty? - on_event :on_mdirty if e_from_que == :mdirty && mdirty? - on_event :on_midi if e_from_que == :midi && get_midi_message + callback.trigger :on_pdirty if e_from_que == :pdirty && pdirty? + callback.trigger :on_mdirty if e_from_que == :mdirty && mdirty? + callback.trigger :on_midi if e_from_que == :midi && get_midi_message if e_from_que == :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] cache[:bus_level] = cache[:bus_buf] - on_event :on_ldirty + callback.trigger :on_ldirty end end end