voicemeeter_api_ruby 2.0.3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/command.rb CHANGED
@@ -1,41 +1,36 @@
1
- require_relative 'meta'
2
-
3
-
4
- class ICommand
5
- include Commands_Meta_Functions
6
-
7
- attr_accessor :remote
8
-
9
- def initialize(remote)
10
- self.remote = remote
11
- end
12
-
13
- def setter(param, value)
14
- @remote.set_parameter("#{self.cmd}.#{param}", value)
15
- end
16
-
17
- def cmd
18
- return "command"
19
- end
20
- end
21
-
22
-
23
- class Command < ICommand
24
- def initialize(remote)
25
- super
26
- self.make_action_prop :show, :restart, :reset, :shutdown
27
- self.make_writer_bool :showvbanchat, :lock
28
- end
29
-
30
- def load(value)
31
- raise VMRemoteErrors.new("Expected a string") unless value.is_a? String
32
- self.setter("load", value)
33
- sleep(0.2)
34
- end
35
-
36
- def save(value)
37
- raise VMRemoteErrors.new("Expected a string") unless value.is_a? String
38
- self.setter("save", value)
39
- sleep(0.2)
40
- end
41
- end
1
+ require_relative 'iremote'
2
+ require_relative 'meta'
3
+
4
+ class Command < IRemote
5
+ include Commands_Meta_Functions
6
+
7
+ def initialize(remote)
8
+ super
9
+ self.make_action_prop :show, :restart, :shutdown
10
+ self.make_writer_bool :showvbanchat, :lock
11
+ end
12
+
13
+ def identifier
14
+ :command
15
+ end
16
+
17
+ def hide
18
+ self.setter('show', 0)
19
+ end
20
+
21
+ def load(value)
22
+ raise VMRemoteErrors.new('Expected a string') unless value.is_a? String
23
+ self.setter('load', value)
24
+ sleep(0.2)
25
+ end
26
+
27
+ def save(value)
28
+ raise VMRemoteErrors.new('Expected a string') unless value.is_a? String
29
+ self.setter('save', value)
30
+ sleep(0.2)
31
+ end
32
+
33
+ def reset
34
+ @remote.set_config('reset')
35
+ end
36
+ end
data/lib/configs.rb ADDED
@@ -0,0 +1,79 @@
1
+ require 'kinds'
2
+ require 'toml'
3
+
4
+ module Configs
5
+ private
6
+
7
+ @@configs = Hash.new
8
+
9
+ class TOMLStrBuilder
10
+ def initialize(kind)
11
+ @p_in, @v_in = kind[:layout][:strip].values
12
+ @p_out, @v_out = kind[:layout][:bus].values
13
+ @vs_params =
14
+ ['mute = false', 'mono = false', 'solo = false', 'gain = 0.0'] +
15
+ (1..@p_out).map { |i| "A#{i} = false" } +
16
+ (1..@v_out).map { |i| "B#{i} = false" }
17
+
18
+ @ps_params = @vs_params + ['comp = 0.0', 'gate = 0.0']
19
+ @bus_params = ['mono = false', 'eq = false', 'mute = false']
20
+ end
21
+
22
+ def build
23
+ '
24
+ Builds a TOML script for the parser
25
+ '
26
+ @ps = (0...@p_in).map { |i| ["[strip_#{i}]"] + @ps_params }
27
+ @ps.map! { |a| a.map { |s| s.gsub('B1 = false', 'B1 = true') } }
28
+ @vs =
29
+ (@p_in...(@p_in + @v_in)).map do |i|
30
+ ["[strip_#{i}]"] + @vs_params
31
+ end
32
+ @vs.map! { |a| a.map { |s| s.gsub('A1 = false', 'A1 = true') } }
33
+
34
+ @b =
35
+ (0...(@p_out + @v_out)).map { |i| ["[bus_#{i}]"] + @bus_params }
36
+
37
+ [@ps + @vs + @b].join("\n")
38
+ end
39
+ end
40
+
41
+ def parser(data)
42
+ TOML::Parser.new(data).parsed
43
+ end
44
+
45
+ def get_configs(kind_id)
46
+ file_pattern =
47
+ File.join(File.dirname(__dir__), 'configs', "#{kind_id}", '*.toml')
48
+
49
+ Dir
50
+ .glob(file_pattern)
51
+ .to_h do |toml_file|
52
+ filename = File.basename(toml_file, '.toml')
53
+ puts "loading config #{kind_id}/#{filename} into memory"
54
+ [filename, parser(File.read(toml_file))]
55
+ end
56
+ end
57
+
58
+ def loader
59
+ if @@configs.empty?
60
+ builder = TOMLStrBuilder.new(@kind)
61
+ puts 'loading config reset into memory'
62
+ @@configs['reset'] = parser(builder.build)
63
+ @@configs.merge!(get_configs(@kind.name.to_s))
64
+ end
65
+ end
66
+
67
+ public
68
+
69
+ def set_config(value)
70
+ loader
71
+ unless @@configs.key? value
72
+ raise VMRemoteErrors.new("No profile with name #{value} was loaded")
73
+ end
74
+
75
+ self.send('set_multi', @@configs[value])
76
+ puts "config #{@kind.name}/#{value} applied!"
77
+ sleep(@delay)
78
+ end
79
+ end
data/lib/device.rb ADDED
@@ -0,0 +1,24 @@
1
+ require_relative 'iremote'
2
+ require_relative 'meta'
3
+
4
+ class Device
5
+ def initialize(remote)
6
+ @remote = remote
7
+ end
8
+
9
+ def getter(**kwargs)
10
+ return @remote.get_num_devices(kwargs[:direction]) if kwargs[:index].nil?
11
+
12
+ vals = @remote.get_device_description(kwargs[:index], kwargs[:direction])
13
+ types = { 1 => 'mme', 3 => 'wdm', 4 => 'ks', 5 => 'asio' }
14
+ { 'name': vals[0], 'type': types[vals[1]], 'id': vals[2] }
15
+ end
16
+
17
+ def ins() = getter(direction: 'in')
18
+
19
+ def outs() = getter(direction: 'out')
20
+
21
+ def input(i) = getter(index: i, direction: 'in')
22
+
23
+ def output(i) = getter(index: i, direction: 'out')
24
+ end
data/lib/errors.rb CHANGED
@@ -1,37 +1,39 @@
1
- module Errors
2
- class VMRemoteErrors < StandardError; end
3
-
4
- class InstallErrors < VMRemoteErrors; end
5
-
6
- class CAPIErrors < VMRemoteErrors
7
- attr_accessor :value, :func
8
-
9
- def initialize(value, func)
10
- self.value = value
11
- self.func = func
12
- end
13
-
14
- def message
15
- "When attempting to run function #{@func} the
16
- C API returned value #{@value}. See documentation for further info"
17
- end
18
- end
19
-
20
- class OutOfBoundsErrors < VMRemoteErrors
21
- attr_accessor :range
22
-
23
- def initialize(range)
24
- self.range = range
25
- end
26
-
27
- def message
28
- if @range.kind_of?(Range)
29
- "Value error, expected value in range (#{range.first}..#{range.last})"
30
- elsif @range.kind_of?(Array)
31
- "Value error, expected one of: #{@range}"
32
- else
33
- "Value error, expected #{@range}"
34
- end
35
- end
36
- end
37
- end
1
+ module Errors
2
+ class VMRemoteErrors < StandardError
3
+ end
4
+
5
+ class InstallErrors < VMRemoteErrors
6
+ end
7
+
8
+ class CAPIErrors < VMRemoteErrors
9
+ attr_accessor :value, :func
10
+
11
+ def initialize(value, func)
12
+ self.value = value
13
+ self.func = func
14
+ end
15
+
16
+ def message
17
+ "When attempting to run function #{@func} the
18
+ C API returned value #{@value}. See documentation for further info"
19
+ end
20
+ end
21
+
22
+ class OutOfBoundsErrors < VMRemoteErrors
23
+ attr_accessor :range
24
+
25
+ def initialize(range)
26
+ self.range = range
27
+ end
28
+
29
+ def message
30
+ if @range.kind_of?(Range)
31
+ "Value error, expected value in range (#{range.first}..#{range.last})"
32
+ elsif @range.kind_of?(Array)
33
+ "Value error, expected one of: #{@range}"
34
+ else
35
+ "Value error, expected #{@range}"
36
+ end
37
+ end
38
+ end
39
+ end
data/lib/inst.rb CHANGED
@@ -1,40 +1,29 @@
1
- require 'win32/registry'
2
- require 'pathname'
3
- require_relative 'errors'
4
-
5
- include Errors
6
-
7
- BASIC = 1
8
- BANANA = 2
9
- POTATO = 3
10
-
11
- module InstallationFunctions
12
- def get_arch
13
- key = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
14
- Win32::Registry::HKEY_LOCAL_MACHINE.open(key) do |reg|
15
- os_bits = reg["PROCESSOR_ARCHITECTURE"]
16
- if os_bits.include? 64.to_s
17
- return 64
18
- end
19
- return 32
20
- end
21
- end
22
-
23
- def get_vmpath(os_bits)
24
- vm_key = "VB:Voicemeeter {17359A74-1236-5467}"
25
- reg_key = "Software#{os_bits == 64 ? "\\WOW6432Node" : ""}\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
26
-
27
- Win32::Registry::HKEY_LOCAL_MACHINE.open(reg_key + vm_key) do |reg|
28
- value = reg["UninstallString"]
29
-
30
- pn = Pathname.new(value)
31
- return pn.dirname
32
- end
33
- raise InstallErrors.new('Could not get the Voicemeeter path')
34
- end
35
-
36
- def vmr_dll=(value)
37
- raise InstallErrors.new('Could not fetch the dll file') unless value.file?
38
- @vmr_dll = value
39
- end
40
- end
1
+ require 'win32/registry'
2
+ require 'pathname'
3
+ require_relative 'errors'
4
+
5
+ include Errors
6
+
7
+ module InstallationFunctions
8
+ private
9
+
10
+ def get_vmpath(os_bits)
11
+ vm_key = 'VB:Voicemeeter {17359A74-1236-5467}'
12
+ reg_key =
13
+ "Software#{os_bits == 64 ? "\\WOW6432Node" : ''}\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
14
+ Win32::Registry::HKEY_LOCAL_MACHINE.open(reg_key + vm_key) do |reg|
15
+ value = reg['UninstallString']
16
+
17
+ pn = Pathname.new(value)
18
+ return pn.dirname
19
+ end
20
+ raise InstallErrors.new('Could not get the Voicemeeter path')
21
+ end
22
+
23
+ def vm_dll=(value)
24
+ unless value.file?
25
+ raise InstallErrors.new('Could not fetch the dll file')
26
+ end
27
+ @vm_dll = value
28
+ end
29
+ end
data/lib/iremote.rb ADDED
@@ -0,0 +1,42 @@
1
+ require_relative 'meta'
2
+ require_relative 'errors'
3
+
4
+ class IRemote
5
+ '
6
+ Common interface between base class and higher classes.
7
+ '
8
+ include Meta_Functions
9
+
10
+ def initialize(remote, i = nil)
11
+ @remote = remote
12
+ @index = i
13
+ end
14
+
15
+ def getter(param, is_string = false)
16
+ @remote.get_parameter("#{self.identifier}.#{param}", is_string)
17
+ end
18
+
19
+ def setter(param, value)
20
+ @remote.set_parameter("#{self.identifier}.#{param}", value)
21
+ end
22
+
23
+ def identifier
24
+ raise 'Called abstract method: identifier'
25
+ end
26
+
27
+ def set_multi(param_hash)
28
+ param_hash.each { |(key, val)| self.send("#{key}=", val) }
29
+ end
30
+ end
31
+
32
+ module Fades
33
+ def fadeto(target, time)
34
+ self.setter('FadeTo', "(#{target}, #{time})")
35
+ sleep(@remote.delay)
36
+ end
37
+
38
+ def fadeby(change, time)
39
+ self.setter('FadeBy', "(#{change}, #{time})")
40
+ sleep(@remote.delay)
41
+ end
42
+ end
data/lib/kinds.rb ADDED
@@ -0,0 +1,77 @@
1
+ module Kinds
2
+ '
3
+ A Kind struct for each version of Voicemeeter
4
+ '
5
+ attr_reader :kind_map, :kinds_all
6
+
7
+ Kind = Struct.new(:name, :layout)
8
+ basic =
9
+ Kind.new(
10
+ 'basic',
11
+ {
12
+ strip: {
13
+ p_in: 2,
14
+ v_in: 1,
15
+ },
16
+ bus: {
17
+ p_out: 1,
18
+ v_out: 1,
19
+ },
20
+ vban: {
21
+ instream: 4,
22
+ outstream: 4,
23
+ },
24
+ mb: 80,
25
+ },
26
+ )
27
+
28
+ banana =
29
+ Kind.new(
30
+ 'banana',
31
+ {
32
+ strip: {
33
+ p_in: 3,
34
+ v_in: 2,
35
+ },
36
+ bus: {
37
+ p_out: 3,
38
+ v_out: 2,
39
+ },
40
+ vban: {
41
+ instream: 8,
42
+ outstream: 8,
43
+ },
44
+ mb: 80,
45
+ },
46
+ )
47
+
48
+ potato =
49
+ Kind.new(
50
+ 'potato',
51
+ {
52
+ strip: {
53
+ p_in: 5,
54
+ v_in: 3,
55
+ },
56
+ bus: {
57
+ p_out: 5,
58
+ v_out: 3,
59
+ },
60
+ vban: {
61
+ instream: 8,
62
+ outstream: 8,
63
+ },
64
+ mb: 80,
65
+ },
66
+ )
67
+
68
+ @kind_map = [basic, banana, potato].to_h { |kind| [kind.name, kind] }
69
+
70
+ def get_kind(kind_id)
71
+ @kind_map[kind_id]
72
+ end
73
+
74
+ @kinds_all = @kind_map.values
75
+
76
+ module_function :get_kind
77
+ end