voicemeeter-rb/lib/voicemeeter/configs.rb

120 lines
3.3 KiB
Ruby
Raw Normal View History

2023-07-09 05:47:37 +01:00
module Voicemeeter
module Configs
class TOMLConfBuilder
def self.run(kind)
aouts = (0...kind.phys_out).to_h { |i| ["A#{i + 1}".to_sym, false] }
bouts = (0...kind.virt_out).to_h { |i| ["B#{i + 1}".to_sym, false] }
strip_bools = %i[mute mono solo].to_h { |param| [param, false] }
2023-07-14 01:48:11 +01:00
gain = [:gain].to_h { |param| [param, 0.0] }
2023-07-09 05:47:37 +01:00
phys_float =
%i[comp gate denoiser].to_h { |param| [param, {knob: 0.0}] }
2023-07-14 12:01:41 +01:00
eq = [:eq].to_h { |param| [param, {on: false}] }
2023-07-09 19:44:43 +01:00
2023-07-14 12:01:41 +01:00
overrides = {B1: true}
2023-07-09 05:47:37 +01:00
# physical strip params
phys_strip =
(0...kind.phys_in).to_h do |i|
2023-07-09 05:47:37 +01:00
[
2023-07-16 22:33:50 +01:00
"strip-#{i}".to_sym,
2023-07-14 01:48:11 +01:00
{**aouts, **bouts, **strip_bools, **gain, **phys_float, **eq, **overrides}
2023-07-09 05:47:37 +01:00
]
end
2023-07-09 19:44:43 +01:00
2023-07-14 12:01:41 +01:00
overrides = {A1: true}
2023-07-09 05:47:37 +01:00
# virtual strip params
virt_strip =
(kind.phys_in...kind.phys_in + kind.virt_in).to_h do |i|
2023-07-09 19:44:43 +01:00
[
2023-07-16 22:33:50 +01:00
"strip-#{i}".to_sym,
2023-07-14 12:01:41 +01:00
{**aouts, **bouts, **strip_bools, **gain, **overrides}
2023-07-09 19:44:43 +01:00
]
2023-07-09 05:47:37 +01:00
end
2023-07-09 19:44:43 +01:00
2023-07-14 01:48:11 +01:00
bus_bools = %i[mute mono].to_h { |param| [param, false] }
2023-07-09 19:44:43 +01:00
bus =
(0...kind.num_bus).to_h do |i|
2023-07-16 22:33:50 +01:00
["bus-#{i}".to_sym, {**bus_bools, **gain, **eq}]
2023-07-09 19:44:43 +01:00
end
2023-07-14 12:01:41 +01:00
{**phys_strip, **virt_strip, **bus}
2023-07-09 19:44:43 +01:00
end
end
class FileReader
include Logging
def initialize(kind)
@configpaths = [
Pathname.getwd.join("configs", kind.name.to_s),
Pathname.new(Dir.home).join(".config", "voicemeeter-rb", kind.name.to_s),
Pathname.new(Dir.home).join("Documents", "Voicemeeter", "configs", kind.name.to_s)
2023-07-09 19:44:43 +01:00
]
end
def each
@configpaths.each do |configpath|
2023-07-14 01:48:11 +01:00
if configpath.exist?
logger.debug "checking #{configpath} for configs"
2023-08-02 14:15:21 +01:00
filepaths = configpath.glob("*.{yaml,yml}")
2023-07-14 01:48:11 +01:00
filepaths.each do |filepath|
@filename = (filepath.basename.sub_ext "").to_s.to_sym
yield @filename, YAML.load_file(
filepath,
symbolize_names: true
)
end
2023-07-09 19:44:43 +01:00
end
end
rescue Psych::SyntaxError => e
logger.error "#{e.class.name}: #{e.message}"
2023-07-09 05:47:37 +01:00
end
end
class Loader
include Logging
attr_reader :configs
2023-07-09 05:47:37 +01:00
def initialize(kind)
@kind = kind
@configs = Hash.new do |hash, key|
2023-08-09 17:45:50 +01:00
raise Errors::VMError.new "unknown config '#{key}'. known configs: #{hash.keys}"
end
@filereader = FileReader.new(kind)
end
2023-07-16 22:33:50 +01:00
def to_s
"Loader #{@kind}"
end
def run
logger.debug "Running #{self}"
configs[:reset] = TOMLConfBuilder.run(@kind)
@filereader.each(&method(:register))
self
end
private def register(identifier, data)
if configs.key? identifier
logger.debug "config with name '#{identifier}' already in memory, skipping..."
return
end
2023-07-09 05:47:37 +01:00
configs[identifier] = data
logger.info "#{@kind.name}/#{identifier} loaded into memory"
2023-07-09 05:47:37 +01:00
end
end
2023-07-09 05:47:37 +01:00
2023-07-09 19:44:43 +01:00
def get(kind_id)
2023-07-22 16:44:24 +01:00
unless defined? @loaders
@loaders = Kinds::ALL.to_h { |kind| [kind.name, Loader.new(kind).run] }
2023-07-09 05:47:37 +01:00
end
@loaders[kind_id].configs
end
2023-07-09 19:44:43 +01:00
module_function :get
2023-07-09 05:47:37 +01:00
end
end