mirror of
https://github.com/onyx-and-iris/voicemeeter-rb.git
synced 2024-11-25 11:20:48 +00:00
onyx-and-iris
eaa9436081
observers should now be registered directly onto vm object example updated to reflect changes
85 lines
2.0 KiB
Ruby
85 lines
2.0 KiB
Ruby
require_relative "logger"
|
|
|
|
module Voicemeeter
|
|
module Events
|
|
module Callback
|
|
private def callbacks
|
|
@callbacks ||= []
|
|
end
|
|
|
|
def register(*cbs)
|
|
cbs.each { |cb| callbacks << cb unless callbacks.include? cb }
|
|
end
|
|
|
|
def deregister(*cbs)
|
|
callbacks.reject! { |cb| cbs.include? cb }
|
|
end
|
|
|
|
private def trigger(event)
|
|
callbacks.each do |callback|
|
|
if callback.is_a? Method
|
|
callback.call if callback.name == event
|
|
elsif callback.respond_to? :on_update
|
|
callback.on_update event.to_s[3..]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
class Tracker
|
|
include Logging
|
|
|
|
attr_reader :pdirty, :mdirty, :midi, :ldirty
|
|
|
|
def initialize(**kwargs)
|
|
make_writer_methods :pdirty, :mdirty, :midi, :ldirty
|
|
|
|
kwargs.each do |key, value|
|
|
instance_variable_set("@#{key}", value || false)
|
|
end
|
|
end
|
|
|
|
def to_s
|
|
self.class.name.split("::").last.to_s
|
|
end
|
|
|
|
def info(msg = nil)
|
|
info_msg = msg ? ["#{msg} events."] : []
|
|
info_msg += if any?
|
|
["Now listening for #{get.join(", ")} events"]
|
|
else
|
|
["Not listening for any events"]
|
|
end
|
|
logger.info(info_msg.join(" "))
|
|
end
|
|
|
|
private def make_writer_methods(*params)
|
|
params.each do |param|
|
|
define_singleton_method("#{param}=") do |value|
|
|
instance_variable_set("@#{param}", value)
|
|
info("#{param} #{send(param) ? "added to" : "removed from"}")
|
|
end
|
|
end
|
|
end
|
|
|
|
def get
|
|
%i[pdirty mdirty midi ldirty].reject { |ev| !send(ev) }
|
|
end
|
|
|
|
def any?
|
|
[pdirty, mdirty, midi, ldirty].any?
|
|
end
|
|
|
|
def add(events)
|
|
events = [events] unless events.respond_to? :each
|
|
events.each { |e| send("#{e}=", true) }
|
|
end
|
|
|
|
def remove(events)
|
|
events = [events] unless events.respond_to? :each
|
|
events.each { |e| send("#{e}=", false) }
|
|
end
|
|
end
|
|
end
|
|
end
|