voicemeeter_api_ruby 4.4.0 → 4.4.2
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.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/lib/voicemeeter/base.rb +211 -255
- data/lib/voicemeeter/button.rb +25 -25
- data/lib/voicemeeter/command.rb +38 -38
- data/lib/voicemeeter/configs.rb +79 -83
- data/lib/voicemeeter/errors.rb +43 -43
- data/lib/voicemeeter/inst.rb +27 -27
- data/lib/voicemeeter/iremote.rb +34 -34
- data/lib/voicemeeter/kinds.rb +79 -79
- data/lib/voicemeeter/meta.rb +251 -251
- data/lib/voicemeeter/recorder.rb +20 -20
- data/lib/voicemeeter/remote.rb +77 -0
- data/lib/voicemeeter/runvm.rb +31 -31
- data/lib/voicemeeter/vban.rb +80 -80
- data/lib/voicemeeter/version.rb +25 -25
- data/lib/voicemeeter/worker.rb +43 -0
- data/lib/voicemeeter.rb +9 -86
- metadata +7 -5
data/lib/voicemeeter/configs.rb
CHANGED
@@ -1,83 +1,79 @@
|
|
1
|
-
require "
|
2
|
-
require_relative "kinds"
|
3
|
-
|
4
|
-
module Voicemeeter
|
5
|
-
module Configs
|
6
|
-
private
|
7
|
-
|
8
|
-
@@configs = Hash.new
|
9
|
-
|
10
|
-
class TOMLStrBuilder
|
11
|
-
def initialize(kind)
|
12
|
-
@p_in, @v_in = kind[:layout][:strip].values
|
13
|
-
@p_out, @v_out = kind[:layout][:bus].values
|
14
|
-
@vs_params =
|
15
|
-
["mute = false", "mono = false", "solo = false", "gain = 0.0"] +
|
16
|
-
(1..@p_out).map { |i| "A#{i} = false" } +
|
17
|
-
(1..@v_out).map { |i| "B#{i} = false" }
|
18
|
-
|
19
|
-
@ps_params = @vs_params + ["comp = 0.0", "gate = 0.0"]
|
20
|
-
@bus_params = ["mono = false", "eq = false", "mute = false"]
|
21
|
-
end
|
22
|
-
|
23
|
-
def build
|
24
|
-
"
|
25
|
-
Builds a TOML script for the parser
|
26
|
-
"
|
27
|
-
@ps = (0...@p_in).map { |i| ["[strip_#{i}]"] + @ps_params }
|
28
|
-
@ps.map! { |a| a.map { |s| s.gsub("B1 = false", "B1 = true") } }
|
29
|
-
@vs =
|
30
|
-
(@p_in...(@p_in + @v_in)).map { |i| ["[strip_#{i}]"] + @vs_params }
|
31
|
-
@vs.map! { |a| a.map { |s| s.gsub("A1 = false", "A1 = true") } }
|
32
|
-
|
33
|
-
@b = (0...(@p_out + @v_out)).map { |i| ["[bus_#{i}]"] + @bus_params }
|
34
|
-
|
35
|
-
[@ps + @vs + @b].join("\n")
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
alias_method "apply_config", :set_config
|
82
|
-
end
|
83
|
-
end
|
1
|
+
require "perfect_toml"
|
2
|
+
require_relative "kinds"
|
3
|
+
|
4
|
+
module Voicemeeter
|
5
|
+
module Configs
|
6
|
+
private
|
7
|
+
|
8
|
+
@@configs = Hash.new
|
9
|
+
|
10
|
+
class TOMLStrBuilder
|
11
|
+
def initialize(kind)
|
12
|
+
@p_in, @v_in = kind[:layout][:strip].values
|
13
|
+
@p_out, @v_out = kind[:layout][:bus].values
|
14
|
+
@vs_params =
|
15
|
+
["mute = false", "mono = false", "solo = false", "gain = 0.0"] +
|
16
|
+
(1..@p_out).map { |i| "A#{i} = false" } +
|
17
|
+
(1..@v_out).map { |i| "B#{i} = false" }
|
18
|
+
|
19
|
+
@ps_params = @vs_params + ["comp = 0.0", "gate = 0.0"]
|
20
|
+
@bus_params = ["mono = false", "eq = false", "mute = false"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def build
|
24
|
+
"
|
25
|
+
Builds a TOML script for the parser
|
26
|
+
"
|
27
|
+
@ps = (0...@p_in).map { |i| ["[strip_#{i}]"] + @ps_params }
|
28
|
+
@ps.map! { |a| a.map { |s| s.gsub("B1 = false", "B1 = true") } }
|
29
|
+
@vs =
|
30
|
+
(@p_in...(@p_in + @v_in)).map { |i| ["[strip_#{i}]"] + @vs_params }
|
31
|
+
@vs.map! { |a| a.map { |s| s.gsub("A1 = false", "A1 = true") } }
|
32
|
+
|
33
|
+
@b = (0...(@p_out + @v_out)).map { |i| ["[bus_#{i}]"] + @bus_params }
|
34
|
+
|
35
|
+
[@ps + @vs + @b].join("\n")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_configs(kind_id)
|
40
|
+
file_path = File.join(Dir.pwd, "configs", "#{kind_id}")
|
41
|
+
|
42
|
+
if Dir.exist?(file_path)
|
43
|
+
Dir
|
44
|
+
.glob(File.join(file_path, "*.toml"))
|
45
|
+
.to_h do |toml_file|
|
46
|
+
filename = File.basename(toml_file, ".toml")
|
47
|
+
puts "loading config #{kind_id}/#{filename} into memory"
|
48
|
+
[filename, PerfectTOML.load_file(toml_file)]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def loader
|
54
|
+
if @@configs.empty?
|
55
|
+
builder = TOMLStrBuilder.new(@kind)
|
56
|
+
puts "loading config reset into memory"
|
57
|
+
@@configs["reset"] = PerfectTOML.parse(builder.build)
|
58
|
+
configs = get_configs(@kind.name.to_s)
|
59
|
+
|
60
|
+
@@configs.merge!(configs) unless configs.nil?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
public
|
65
|
+
|
66
|
+
def set_config(value)
|
67
|
+
loader
|
68
|
+
unless @@configs.key? value
|
69
|
+
raise VMRemoteErrors.new("No profile with name #{value} was loaded")
|
70
|
+
end
|
71
|
+
|
72
|
+
self.send("set_multi", @@configs[value])
|
73
|
+
puts "config #{@kind.name}/#{value} applied!"
|
74
|
+
sleep(@delay)
|
75
|
+
end
|
76
|
+
|
77
|
+
alias_method "apply_config", :set_config
|
78
|
+
end
|
79
|
+
end
|
data/lib/voicemeeter/errors.rb
CHANGED
@@ -1,43 +1,43 @@
|
|
1
|
-
module Voicemeeter
|
2
|
-
module Errors
|
3
|
-
class VMRemoteErrors < StandardError
|
4
|
-
end
|
5
|
-
|
6
|
-
class InstallErrors < VMRemoteErrors
|
7
|
-
end
|
8
|
-
|
9
|
-
class CAPIErrors < VMRemoteErrors
|
10
|
-
attr_accessor :value, :func
|
11
|
-
|
12
|
-
def initialize(value, func)
|
13
|
-
self.value = value
|
14
|
-
self.func = func
|
15
|
-
end
|
16
|
-
|
17
|
-
def message
|
18
|
-
"
|
19
|
-
When attempting to run function #{@func} the
|
20
|
-
C API returned value #{@value}. See documentation for further info
|
21
|
-
"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class OutOfBoundsErrors < VMRemoteErrors
|
26
|
-
attr_accessor :range
|
27
|
-
|
28
|
-
def initialize(range)
|
29
|
-
self.range = range
|
30
|
-
end
|
31
|
-
|
32
|
-
def message
|
33
|
-
if @range.kind_of?(Range)
|
34
|
-
"Value error, expected value in range (#{range.first}..#{range.last})"
|
35
|
-
elsif @range.kind_of?(Array)
|
36
|
-
"Value error, expected one of: #{@range}"
|
37
|
-
else
|
38
|
-
"Value error, expected #{@range}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
1
|
+
module Voicemeeter
|
2
|
+
module Errors
|
3
|
+
class VMRemoteErrors < StandardError
|
4
|
+
end
|
5
|
+
|
6
|
+
class InstallErrors < VMRemoteErrors
|
7
|
+
end
|
8
|
+
|
9
|
+
class CAPIErrors < VMRemoteErrors
|
10
|
+
attr_accessor :value, :func
|
11
|
+
|
12
|
+
def initialize(value, func)
|
13
|
+
self.value = value
|
14
|
+
self.func = func
|
15
|
+
end
|
16
|
+
|
17
|
+
def message
|
18
|
+
"
|
19
|
+
When attempting to run function #{@func} the
|
20
|
+
C API returned value #{@value}. See documentation for further info
|
21
|
+
"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class OutOfBoundsErrors < VMRemoteErrors
|
26
|
+
attr_accessor :range
|
27
|
+
|
28
|
+
def initialize(range)
|
29
|
+
self.range = range
|
30
|
+
end
|
31
|
+
|
32
|
+
def message
|
33
|
+
if @range.kind_of?(Range)
|
34
|
+
"Value error, expected value in range (#{range.first}..#{range.last})"
|
35
|
+
elsif @range.kind_of?(Array)
|
36
|
+
"Value error, expected one of: #{@range}"
|
37
|
+
else
|
38
|
+
"Value error, expected #{@range}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/voicemeeter/inst.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
require "win32/registry"
|
2
|
-
require "pathname"
|
3
|
-
require_relative "errors"
|
4
|
-
|
5
|
-
module Voicemeeter
|
6
|
-
module InstallationFunctions
|
7
|
-
private
|
8
|
-
|
9
|
-
def get_vmpath(os_bits)
|
10
|
-
vm_key = "VB:Voicemeeter {17359A74-1236-5467}"
|
11
|
-
reg_key =
|
12
|
-
"Software#{os_bits == 64 ? "\\WOW6432Node" : ""}\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
|
13
|
-
Win32::Registry::HKEY_LOCAL_MACHINE.open(reg_key + vm_key) do |reg|
|
14
|
-
value = reg["UninstallString"]
|
15
|
-
|
16
|
-
pn = Pathname.new(value)
|
17
|
-
return pn.dirname
|
18
|
-
end
|
19
|
-
raise InstallErrors.new("Could not get the Voicemeeter path")
|
20
|
-
end
|
21
|
-
|
22
|
-
def vm_dll=(value)
|
23
|
-
raise InstallErrors.new("Could not fetch the dll file") unless value.file?
|
24
|
-
@vm_dll = value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
1
|
+
require "win32/registry"
|
2
|
+
require "pathname"
|
3
|
+
require_relative "errors"
|
4
|
+
|
5
|
+
module Voicemeeter
|
6
|
+
module InstallationFunctions
|
7
|
+
private
|
8
|
+
|
9
|
+
def get_vmpath(os_bits)
|
10
|
+
vm_key = "VB:Voicemeeter {17359A74-1236-5467}"
|
11
|
+
reg_key =
|
12
|
+
"Software#{os_bits == 64 ? "\\WOW6432Node" : ""}\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
|
13
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open(reg_key + vm_key) do |reg|
|
14
|
+
value = reg["UninstallString"]
|
15
|
+
|
16
|
+
pn = Pathname.new(value)
|
17
|
+
return pn.dirname
|
18
|
+
end
|
19
|
+
raise InstallErrors.new("Could not get the Voicemeeter path")
|
20
|
+
end
|
21
|
+
|
22
|
+
def vm_dll=(value)
|
23
|
+
raise InstallErrors.new("Could not fetch the dll file") unless value.file?
|
24
|
+
@vm_dll = value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/voicemeeter/iremote.rb
CHANGED
@@ -1,34 +1,34 @@
|
|
1
|
-
require_relative "meta"
|
2
|
-
require_relative "errors"
|
3
|
-
|
4
|
-
module Voicemeeter
|
5
|
-
class IRemote
|
6
|
-
"
|
7
|
-
Common interface between base class and higher classes.
|
8
|
-
"
|
9
|
-
include Meta_Functions
|
10
|
-
|
11
|
-
def initialize(remote, i = nil)
|
12
|
-
@remote = remote
|
13
|
-
@index = i
|
14
|
-
end
|
15
|
-
|
16
|
-
def getter(param, is_string = false)
|
17
|
-
@remote.get_parameter("#{self.identifier}.#{param}", is_string)
|
18
|
-
end
|
19
|
-
|
20
|
-
def setter(param, value)
|
21
|
-
@remote.set_parameter("#{self.identifier}.#{param}", value)
|
22
|
-
end
|
23
|
-
|
24
|
-
def identifier
|
25
|
-
raise "Called abstract method: identifier"
|
26
|
-
end
|
27
|
-
|
28
|
-
def set_multi(param_hash)
|
29
|
-
param_hash.each { |(key, val)| self.send("#{key}=", val) }
|
30
|
-
end
|
31
|
-
|
32
|
-
alias_method "apply", :set_multi
|
33
|
-
end
|
34
|
-
end
|
1
|
+
require_relative "meta"
|
2
|
+
require_relative "errors"
|
3
|
+
|
4
|
+
module Voicemeeter
|
5
|
+
class IRemote
|
6
|
+
"
|
7
|
+
Common interface between base class and higher classes.
|
8
|
+
"
|
9
|
+
include Meta_Functions
|
10
|
+
|
11
|
+
def initialize(remote, i = nil)
|
12
|
+
@remote = remote
|
13
|
+
@index = i
|
14
|
+
end
|
15
|
+
|
16
|
+
def getter(param, is_string = false)
|
17
|
+
@remote.get_parameter("#{self.identifier}.#{param}", is_string)
|
18
|
+
end
|
19
|
+
|
20
|
+
def setter(param, value)
|
21
|
+
@remote.set_parameter("#{self.identifier}.#{param}", value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def identifier
|
25
|
+
raise "Called abstract method: identifier"
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_multi(param_hash)
|
29
|
+
param_hash.each { |(key, val)| self.send("#{key}=", val) }
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method "apply", :set_multi
|
33
|
+
end
|
34
|
+
end
|
data/lib/voicemeeter/kinds.rb
CHANGED
@@ -1,79 +1,79 @@
|
|
1
|
-
module Voicemeeter
|
2
|
-
module Kinds
|
3
|
-
"
|
4
|
-
A Kind struct for each version of Voicemeeter
|
5
|
-
"
|
6
|
-
attr_reader :kind_map, :kinds_all
|
7
|
-
|
8
|
-
Kind = Struct.new(:name, :layout)
|
9
|
-
basic =
|
10
|
-
Kind.new(
|
11
|
-
"basic",
|
12
|
-
{
|
13
|
-
strip: {
|
14
|
-
p_in: 2,
|
15
|
-
v_in: 1
|
16
|
-
},
|
17
|
-
bus: {
|
18
|
-
p_out: 1,
|
19
|
-
v_out: 1
|
20
|
-
},
|
21
|
-
vban: {
|
22
|
-
instream: 4,
|
23
|
-
outstream: 4
|
24
|
-
},
|
25
|
-
mb: 80
|
26
|
-
}
|
27
|
-
)
|
28
|
-
|
29
|
-
banana =
|
30
|
-
Kind.new(
|
31
|
-
"banana",
|
32
|
-
{
|
33
|
-
strip: {
|
34
|
-
p_in: 3,
|
35
|
-
v_in: 2
|
36
|
-
},
|
37
|
-
bus: {
|
38
|
-
p_out: 3,
|
39
|
-
v_out: 2
|
40
|
-
},
|
41
|
-
vban: {
|
42
|
-
instream: 8,
|
43
|
-
outstream: 8
|
44
|
-
},
|
45
|
-
mb: 80
|
46
|
-
}
|
47
|
-
)
|
48
|
-
|
49
|
-
potato =
|
50
|
-
Kind.new(
|
51
|
-
"potato",
|
52
|
-
{
|
53
|
-
strip: {
|
54
|
-
p_in: 5,
|
55
|
-
v_in: 3
|
56
|
-
},
|
57
|
-
bus: {
|
58
|
-
p_out: 5,
|
59
|
-
v_out: 3
|
60
|
-
},
|
61
|
-
vban: {
|
62
|
-
instream: 8,
|
63
|
-
outstream: 8
|
64
|
-
},
|
65
|
-
mb: 80
|
66
|
-
}
|
67
|
-
)
|
68
|
-
|
69
|
-
@kind_map = [basic, banana, potato].to_h { |kind| [kind.name, kind] }
|
70
|
-
|
71
|
-
def get_kind(kind_id)
|
72
|
-
@kind_map[kind_id]
|
73
|
-
end
|
74
|
-
|
75
|
-
@kinds_all = @kind_map.values
|
76
|
-
|
77
|
-
module_function :get_kind, :kind_map, :kinds_all
|
78
|
-
end
|
79
|
-
end
|
1
|
+
module Voicemeeter
|
2
|
+
module Kinds
|
3
|
+
"
|
4
|
+
A Kind struct for each version of Voicemeeter
|
5
|
+
"
|
6
|
+
attr_reader :kind_map, :kinds_all
|
7
|
+
|
8
|
+
Kind = Struct.new(:name, :layout)
|
9
|
+
basic =
|
10
|
+
Kind.new(
|
11
|
+
"basic",
|
12
|
+
{
|
13
|
+
strip: {
|
14
|
+
p_in: 2,
|
15
|
+
v_in: 1
|
16
|
+
},
|
17
|
+
bus: {
|
18
|
+
p_out: 1,
|
19
|
+
v_out: 1
|
20
|
+
},
|
21
|
+
vban: {
|
22
|
+
instream: 4,
|
23
|
+
outstream: 4
|
24
|
+
},
|
25
|
+
mb: 80
|
26
|
+
}
|
27
|
+
)
|
28
|
+
|
29
|
+
banana =
|
30
|
+
Kind.new(
|
31
|
+
"banana",
|
32
|
+
{
|
33
|
+
strip: {
|
34
|
+
p_in: 3,
|
35
|
+
v_in: 2
|
36
|
+
},
|
37
|
+
bus: {
|
38
|
+
p_out: 3,
|
39
|
+
v_out: 2
|
40
|
+
},
|
41
|
+
vban: {
|
42
|
+
instream: 8,
|
43
|
+
outstream: 8
|
44
|
+
},
|
45
|
+
mb: 80
|
46
|
+
}
|
47
|
+
)
|
48
|
+
|
49
|
+
potato =
|
50
|
+
Kind.new(
|
51
|
+
"potato",
|
52
|
+
{
|
53
|
+
strip: {
|
54
|
+
p_in: 5,
|
55
|
+
v_in: 3
|
56
|
+
},
|
57
|
+
bus: {
|
58
|
+
p_out: 5,
|
59
|
+
v_out: 3
|
60
|
+
},
|
61
|
+
vban: {
|
62
|
+
instream: 8,
|
63
|
+
outstream: 8
|
64
|
+
},
|
65
|
+
mb: 80
|
66
|
+
}
|
67
|
+
)
|
68
|
+
|
69
|
+
@kind_map = [basic, banana, potato].to_h { |kind| [kind.name, kind] }
|
70
|
+
|
71
|
+
def get_kind(kind_id)
|
72
|
+
@kind_map[kind_id]
|
73
|
+
end
|
74
|
+
|
75
|
+
@kinds_all = @kind_map.values
|
76
|
+
|
77
|
+
module_function :get_kind, :kind_map, :kinds_all
|
78
|
+
end
|
79
|
+
end
|