voicemeeter-rb/lib/voicemeeter/bus.rb
onyx-and-iris d8baaf4758 LevelEnum added to Mixins
BusLevels, BusDevice classes added
2023-07-14 01:46:00 +01:00

118 lines
2.5 KiB
Ruby

require_relative "iremote"
require_relative "kinds"
require_relative "mixins"
module Voicemeeter
module Bus
class Bus < IRemote
include Mixins::Fades
include Mixins::Return
attr_reader :eq, :mode, :levels
def self.make(remote, i)
"
Factory function for Bus classes.
Returns a PhysicalBus or VirtualBus class
"
p_out = remote.kind.phys_out
i < p_out ? PhysicalBus.new(remote, i) : VirtualBus.new(remote, i)
end
def initialize(remote, i)
super
make_accessor_bool :mute, :mono, :sel, :monitor
make_accessor_float :gain
make_accessor_string :label
@eq = BusEq.new(remote, i)
@mode = BusModes.new(remote, i)
@levels = BusLevels.new(remote, i)
end
def identifier
"bus[#{@index}]"
end
end
class PhysicalBus < Bus
end
class VirtualBus < Bus
end
class BusEq < IRemote
def initialize(remote, i)
super
make_accessor_bool :on, :ab
end
def identifier
"bus[#{@index}].eq"
end
end
class BusModes < IRemote
def initialize(remote, i)
super
make_accessor_bool :normal,
:amix,
:bmix,
:repeat,
:composite,
:tvmix,
:upmix21,
:upmix41,
:upmix61,
:centeronly,
:lfeonly,
:rearonly
end
def identifier
"bus[#{@index}].mode"
end
end
end
class BusLevels < IRemote
def initialize(remote, i)
super
@init = i * 8
@offset = 8
end
def identifier
"bus[#{@index}]"
end
def getter(mode)
if @remote.running && @remote.event.ldirty
vals = @remote.cache[:bus_level][@init, @offset]
else
vals = (@init...@init + @offset).map { |i| @remote.get_level(mode, i) }
end
vals.map { |x| x > 0 ? (20 * Math.log(x, 10)).round(1) : -200.0 }
end
def all
getter(Mixins::LevelEnum::BUS)
end
def isdirty? = @remote.cache[:bus_comp][@init, @offset].any?
end
class BusDevice < IRemote
def initialize(remote, i)
super
make_reader_only :name, :sr
make_writer_only :wdm, :ks, :mme, :asio
end
def identifier
"bus[#{@index}].device"
end
end
end