voicemeeter_api_ruby 4.1.3 → 4.2.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.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/lib/voicemeeter/base.rb +223 -0
- data/lib/voicemeeter/bus.rb +107 -0
- data/lib/voicemeeter/button.rb +25 -0
- data/lib/voicemeeter/cbindings.rb +126 -0
- data/lib/voicemeeter/command.rb +38 -0
- data/lib/voicemeeter/configs.rb +83 -0
- data/lib/voicemeeter/device.rb +26 -0
- data/lib/voicemeeter/errors.rb +43 -0
- data/lib/voicemeeter/inst.rb +27 -0
- data/lib/voicemeeter/iremote.rb +34 -0
- data/lib/{kinds.rb → voicemeeter/kinds.rb} +0 -0
- data/lib/{meta.rb → voicemeeter/meta.rb} +4 -26
- data/lib/voicemeeter/recorder.rb +22 -0
- data/lib/{runvm.rb → voicemeeter/runvm.rb} +3 -3
- data/lib/voicemeeter/strip.rb +137 -0
- data/lib/voicemeeter/vban.rb +80 -0
- data/lib/{version.rb → voicemeeter/version.rb} +1 -1
- data/lib/voicemeeter.rb +8 -8
- metadata +19 -20
- data/lib/base.rb +0 -219
- data/lib/bus.rb +0 -97
- data/lib/button.rb +0 -23
- data/lib/cbindings.rb +0 -125
- data/lib/command.rb +0 -36
- data/lib/configs.rb +0 -80
- data/lib/device.rb +0 -24
- data/lib/errors.rb +0 -41
- data/lib/inst.rb +0 -27
- data/lib/iremote.rb +0 -30
- data/lib/mixin.rb +0 -11
- data/lib/recorder.rb +0 -20
- data/lib/strip.rb +0 -127
- data/lib/vban.rb +0 -78
@@ -0,0 +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
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "win32/registry"
|
2
|
+
require "pathname"
|
3
|
+
require "voicemeeter/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
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "voicemeeter/meta"
|
2
|
+
require "voicemeeter/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
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require "voicemeeter/errors"
|
2
2
|
|
3
3
|
module Conversions
|
4
4
|
module_function
|
@@ -37,6 +37,7 @@ module Meta_Functions
|
|
37
37
|
define_singleton_method("#{param}") do
|
38
38
|
return self.getter("#{param}").to_i
|
39
39
|
end
|
40
|
+
|
40
41
|
define_singleton_method("#{param}=") do |value|
|
41
42
|
self.setter("#{param}", value)
|
42
43
|
end
|
@@ -46,6 +47,7 @@ module Meta_Functions
|
|
46
47
|
def make_accessor_float(*params)
|
47
48
|
params.each do |param|
|
48
49
|
define_singleton_method("#{param}") { return self.getter("#{param}") }
|
50
|
+
|
49
51
|
define_singleton_method("#{param}=") do |value|
|
50
52
|
self.setter("#{param}", value)
|
51
53
|
end
|
@@ -57,6 +59,7 @@ module Meta_Functions
|
|
57
59
|
define_singleton_method("#{param}") do
|
58
60
|
return self.getter("#{param}", true)
|
59
61
|
end
|
62
|
+
|
60
63
|
define_singleton_method("#{param}=") do |value|
|
61
64
|
self.setter("#{param}", value)
|
62
65
|
end
|
@@ -91,7 +94,6 @@ end
|
|
91
94
|
module Channel_Meta_Functions
|
92
95
|
private
|
93
96
|
|
94
|
-
include Conversions
|
95
97
|
include Meta_Functions
|
96
98
|
|
97
99
|
def make_accessor_bool(*params)
|
@@ -113,28 +115,6 @@ module Channel_Meta_Functions
|
|
113
115
|
end
|
114
116
|
end
|
115
117
|
|
116
|
-
def make_accessor_float(*params)
|
117
|
-
params.each do |param|
|
118
|
-
define_singleton_method("#{param}") { return self.getter("#{param}") }
|
119
|
-
|
120
|
-
define_singleton_method("#{param}=") do |value|
|
121
|
-
self.setter("#{param}", value)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def make_accessor_int(*params)
|
127
|
-
params.each do |param|
|
128
|
-
define_singleton_method("#{param}") do
|
129
|
-
return self.getter("#{param}").to_i
|
130
|
-
end
|
131
|
-
|
132
|
-
define_singleton_method("#{param}=") do |value|
|
133
|
-
self.setter("#{param}", value)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
118
|
def make_reader_only(*params)
|
139
119
|
params.each do |param|
|
140
120
|
cmds = { device: "device.name", sr: "device.sr" }
|
@@ -172,7 +152,6 @@ end
|
|
172
152
|
module Vban_Meta_Functions
|
173
153
|
private
|
174
154
|
|
175
|
-
include Conversions
|
176
155
|
include Meta_Functions
|
177
156
|
|
178
157
|
def make_reader_int(*params)
|
@@ -256,7 +235,6 @@ end
|
|
256
235
|
module Commands_Meta_Functions
|
257
236
|
private
|
258
237
|
|
259
|
-
include Conversions
|
260
238
|
include Meta_Functions
|
261
239
|
def make_writer_bool(*params)
|
262
240
|
params.each do |param|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "voicemeeter/iremote"
|
2
|
+
require "voicemeeter/meta"
|
3
|
+
|
4
|
+
module Voicemeeter
|
5
|
+
class Recorder < IRemote
|
6
|
+
"
|
7
|
+
Concrete Recorder class
|
8
|
+
"
|
9
|
+
|
10
|
+
def initialize(remote)
|
11
|
+
super
|
12
|
+
self.make_action_prop :play, :stop, :record, :ff, :rew
|
13
|
+
|
14
|
+
num_A, num_B = remote.kind.layout[:bus].values
|
15
|
+
self.make_accessor_bool *make_channel_props(num_A, num_B)
|
16
|
+
end
|
17
|
+
|
18
|
+
def identifier
|
19
|
+
:recorder
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require "voicemeeter/iremote"
|
2
|
+
|
3
|
+
module Voicemeeter
|
4
|
+
class Strip < IRemote
|
5
|
+
"
|
6
|
+
Concrete Strip class
|
7
|
+
"
|
8
|
+
include Channel_Meta_Functions
|
9
|
+
|
10
|
+
attr_accessor :gainlayer, :levels
|
11
|
+
|
12
|
+
def self.make(remote, layout_strip)
|
13
|
+
"
|
14
|
+
Factory function for Strip classes.
|
15
|
+
"
|
16
|
+
p_in, v_in = layout_strip.values
|
17
|
+
(0...(p_in + v_in)).map do |i|
|
18
|
+
i < p_in ? PhysicalStrip.new(remote, i) : VirtualStrip.new(remote, i)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(remote, i)
|
23
|
+
super
|
24
|
+
self.make_accessor_bool :solo, :mute, :mono
|
25
|
+
self.make_accessor_float :gain
|
26
|
+
self.make_accessor_int :limit
|
27
|
+
self.make_accessor_string :label
|
28
|
+
|
29
|
+
num_A, num_B = remote.kind.layout[:bus].values
|
30
|
+
self.make_accessor_bool *make_channel_props(num_A, num_B)
|
31
|
+
|
32
|
+
@gainlayer = (0...8).map { |j| GainLayer.new(remote, i, j) }
|
33
|
+
@levels = StripLevels.new(remote, i)
|
34
|
+
end
|
35
|
+
|
36
|
+
def identifier
|
37
|
+
"strip[#{@index}]"
|
38
|
+
end
|
39
|
+
|
40
|
+
def fadeto(target, time)
|
41
|
+
self.setter("FadeTo", "(#{target}, #{time})")
|
42
|
+
sleep(@remote.delay)
|
43
|
+
end
|
44
|
+
|
45
|
+
def fadeby(change, time)
|
46
|
+
self.setter("FadeBy", "(#{change}, #{time})")
|
47
|
+
sleep(@remote.delay)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class PhysicalStrip < Strip
|
52
|
+
def initialize(remote, i)
|
53
|
+
super
|
54
|
+
self.make_accessor_float :comp, :gate, :audibility
|
55
|
+
self.make_reader_only :device, :sr
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class VirtualStrip < Strip
|
60
|
+
def initialize(remote, i)
|
61
|
+
super
|
62
|
+
self.make_accessor_bool :mc
|
63
|
+
self.make_accessor_int :k
|
64
|
+
self.make_accessor_float :bass, :mid, :treble
|
65
|
+
end
|
66
|
+
|
67
|
+
def appgain(name, gain)
|
68
|
+
self.setter("AppGain", "(\"#{name}\", #{gain})")
|
69
|
+
end
|
70
|
+
|
71
|
+
def appmute(name, mute)
|
72
|
+
self.setter("AppMute", "(\"#{name}\", #{mute ? 1 : 0})")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class GainLayer < IRemote
|
77
|
+
def initialize(remote, i, j)
|
78
|
+
super(remote, i)
|
79
|
+
@j = j
|
80
|
+
end
|
81
|
+
|
82
|
+
def identifier
|
83
|
+
"strip[#{@index}]"
|
84
|
+
end
|
85
|
+
|
86
|
+
def gain
|
87
|
+
self.getter("gainlayer[#{@j}]")
|
88
|
+
end
|
89
|
+
|
90
|
+
def gain=(value)
|
91
|
+
self.setter("gainlayer[#{@j}]", value)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class StripLevels < IRemote
|
96
|
+
def initialize(remote, i)
|
97
|
+
super
|
98
|
+
if i < @remote.p_in
|
99
|
+
@init = i * 2
|
100
|
+
@offset = 2
|
101
|
+
else
|
102
|
+
@init = (@remote.p_in * 2) + ((i - @remote.p_in) * 8)
|
103
|
+
@offset = 8
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def identifier
|
108
|
+
"strip[#{@index}]"
|
109
|
+
end
|
110
|
+
|
111
|
+
def get_level(mode)
|
112
|
+
if @remote.running
|
113
|
+
vals = @remote.cache["strip_level"][@init, @offset]
|
114
|
+
else
|
115
|
+
vals = (@init...@offset).map { |i| get_level(mode, i) }
|
116
|
+
end
|
117
|
+
vals.map { |x| x > 0 ? (20 * Math.log(x, 10)).round(1) : -200.0 }
|
118
|
+
end
|
119
|
+
|
120
|
+
def prefader
|
121
|
+
@remote.strip_mode = 0
|
122
|
+
get_level(0)
|
123
|
+
end
|
124
|
+
|
125
|
+
def postfader
|
126
|
+
@remote.strip_mode = 1
|
127
|
+
get_level(1)
|
128
|
+
end
|
129
|
+
|
130
|
+
def postmute
|
131
|
+
@remote.strip_mode = 2
|
132
|
+
get_level(2)
|
133
|
+
end
|
134
|
+
|
135
|
+
def isdirty? = @remote._strip_comp[@init, @offset].any?
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "voicemeeter/iremote"
|
2
|
+
require "voicemeeter/meta"
|
3
|
+
require "voicemeeter/errors"
|
4
|
+
|
5
|
+
module Voicemeeter
|
6
|
+
class VbanStream < IRemote
|
7
|
+
"
|
8
|
+
A class representing a VBAN stream
|
9
|
+
"
|
10
|
+
include Vban_Meta_Functions
|
11
|
+
|
12
|
+
def initialize(remote, i)
|
13
|
+
super
|
14
|
+
self.make_accessor_bool :on
|
15
|
+
self.make_accessor_string :name, :ip
|
16
|
+
self.make_accessor_int :quality, :route
|
17
|
+
end
|
18
|
+
|
19
|
+
def identifier
|
20
|
+
"vban.#{self.direction}stream[#{@index}]"
|
21
|
+
end
|
22
|
+
|
23
|
+
def direction
|
24
|
+
raise "Called abstract mehod: direction"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class VbanInstream < VbanStream
|
29
|
+
"
|
30
|
+
A subclass representing a VBAN Instream
|
31
|
+
"
|
32
|
+
def initialize(remote, i)
|
33
|
+
super
|
34
|
+
self.make_reader_int :sr, :channel, :bit
|
35
|
+
end
|
36
|
+
|
37
|
+
def direction
|
38
|
+
:in
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class VbanOutstream < VbanStream
|
43
|
+
"
|
44
|
+
A subclass representing a VBAN Outstream
|
45
|
+
"
|
46
|
+
def initialize(remote, i)
|
47
|
+
super
|
48
|
+
self.make_accessor_int :sr, :channel, :bit
|
49
|
+
end
|
50
|
+
|
51
|
+
def direction
|
52
|
+
:out
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class Vban
|
57
|
+
attr_accessor :instream, :outstream
|
58
|
+
|
59
|
+
def initialize(remote, vban_streams)
|
60
|
+
"
|
61
|
+
Initializes a Vban class
|
62
|
+
|
63
|
+
Creates an array for each in/out stream
|
64
|
+
"
|
65
|
+
vban_in, vban_out = vban_streams.values
|
66
|
+
self.instream = (0...vban_in).map { |i| VbanInstream.new(remote, i) }
|
67
|
+
self.outstream = (0...vban_out).map { |i| VbanOutstream.new(remote, i) }
|
68
|
+
|
69
|
+
@remote = remote
|
70
|
+
end
|
71
|
+
|
72
|
+
def enable
|
73
|
+
@remote.set_parameter("vban.enable", 1)
|
74
|
+
end
|
75
|
+
|
76
|
+
def disable
|
77
|
+
@remote.set_parameter("vban.enable", 0)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/voicemeeter.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
require "voicemeeter/base"
|
2
|
+
require "voicemeeter/strip"
|
3
|
+
require "voicemeeter/bus"
|
4
|
+
require "voicemeeter/button"
|
5
|
+
require "voicemeeter/vban"
|
6
|
+
require "voicemeeter/command"
|
7
|
+
require "voicemeeter/recorder"
|
8
|
+
require "voicemeeter/device"
|
9
9
|
|
10
10
|
module Voicemeeter
|
11
11
|
include RunVM
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voicemeeter_api_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- onyx_online
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-07-
|
11
|
+
date: 2022-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -84,25 +84,24 @@ files:
|
|
84
84
|
- CHANGELOG.md
|
85
85
|
- LICENSE
|
86
86
|
- README.md
|
87
|
-
- lib/base.rb
|
88
|
-
- lib/bus.rb
|
89
|
-
- lib/button.rb
|
90
|
-
- lib/cbindings.rb
|
91
|
-
- lib/command.rb
|
92
|
-
- lib/configs.rb
|
93
|
-
- lib/device.rb
|
94
|
-
- lib/errors.rb
|
95
|
-
- lib/inst.rb
|
96
|
-
- lib/iremote.rb
|
97
|
-
- lib/kinds.rb
|
98
|
-
- lib/meta.rb
|
99
|
-
- lib/mixin.rb
|
100
|
-
- lib/recorder.rb
|
101
|
-
- lib/runvm.rb
|
102
|
-
- lib/strip.rb
|
103
|
-
- lib/vban.rb
|
104
|
-
- lib/version.rb
|
105
87
|
- lib/voicemeeter.rb
|
88
|
+
- lib/voicemeeter/base.rb
|
89
|
+
- lib/voicemeeter/bus.rb
|
90
|
+
- lib/voicemeeter/button.rb
|
91
|
+
- lib/voicemeeter/cbindings.rb
|
92
|
+
- lib/voicemeeter/command.rb
|
93
|
+
- lib/voicemeeter/configs.rb
|
94
|
+
- lib/voicemeeter/device.rb
|
95
|
+
- lib/voicemeeter/errors.rb
|
96
|
+
- lib/voicemeeter/inst.rb
|
97
|
+
- lib/voicemeeter/iremote.rb
|
98
|
+
- lib/voicemeeter/kinds.rb
|
99
|
+
- lib/voicemeeter/meta.rb
|
100
|
+
- lib/voicemeeter/recorder.rb
|
101
|
+
- lib/voicemeeter/runvm.rb
|
102
|
+
- lib/voicemeeter/strip.rb
|
103
|
+
- lib/voicemeeter/vban.rb
|
104
|
+
- lib/voicemeeter/version.rb
|
106
105
|
homepage: https://rubygems.org/gems/voicemeeter_api_ruby
|
107
106
|
licenses:
|
108
107
|
- MIT
|