voicemeeter_api_ruby 2.0.4 → 3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +271 -0
- data/LICENSE +21 -0
- data/README.md +308 -0
- data/lib/base.rb +151 -171
- data/lib/bus.rb +64 -33
- data/lib/button.rb +36 -42
- data/lib/cbindings.rb +103 -0
- data/lib/channel.rb +46 -34
- data/lib/command.rb +41 -41
- data/lib/errors.rb +39 -37
- data/lib/inst.rb +38 -36
- data/lib/kinds.rb +77 -0
- data/lib/meta.rb +274 -252
- data/lib/profiles.rb +28 -0
- data/lib/recorder.rb +37 -45
- data/lib/runvm.rb +29 -18
- data/lib/strip.rb +80 -49
- data/lib/vban.rb +103 -106
- data/lib/version.rb +3 -3
- data/lib/voicemeeter.rb +73 -60
- metadata +18 -36
- data/lib/routines.rb +0 -123
data/lib/runvm.rb
CHANGED
@@ -1,18 +1,29 @@
|
|
1
|
-
require_relative '
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
require_relative 'cbindings'
|
2
|
+
require_relative 'kinds'
|
3
|
+
|
4
|
+
include CBindings
|
5
|
+
include Kinds
|
6
|
+
|
7
|
+
module RunVM
|
8
|
+
'
|
9
|
+
Starts Voicemeeter of the Kind requested.
|
10
|
+
'
|
11
|
+
def start(kind_id)
|
12
|
+
unless Kinds.kind_map.key? kind_id
|
13
|
+
raise VMRemoteErrors.new('Unknown Voicemeeter Kind.')
|
14
|
+
end
|
15
|
+
|
16
|
+
enums =
|
17
|
+
Kinds.kinds_all.map.with_index do |kind, i|
|
18
|
+
if OS_BITS == 64 && kind.name == 'potato'
|
19
|
+
[kind.name, i + 4]
|
20
|
+
else
|
21
|
+
[kind.name, i + 1]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
exes = enums.to_h { |k, v| [k, v.to_i] }
|
25
|
+
|
26
|
+
send('vmr_runvm', exes[kind_id])
|
27
|
+
sleep(1)
|
28
|
+
end
|
29
|
+
end
|
data/lib/strip.rb
CHANGED
@@ -1,49 +1,80 @@
|
|
1
|
-
require_relative 'channel'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
self.make_accessor_bool
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
self.
|
48
|
-
end
|
49
|
-
end
|
1
|
+
require_relative 'channel'
|
2
|
+
|
3
|
+
class Strip < IChannel
|
4
|
+
'
|
5
|
+
Concrete Strip class
|
6
|
+
'
|
7
|
+
include Fades
|
8
|
+
|
9
|
+
attr_accessor :gainlayer
|
10
|
+
|
11
|
+
def self.make(remote, layout_strip)
|
12
|
+
'
|
13
|
+
Factory function for Strip classes.
|
14
|
+
'
|
15
|
+
p_in, v_in = layout_strip.values
|
16
|
+
(0...(p_in + v_in)).map do |i|
|
17
|
+
if i < p_in
|
18
|
+
PhysicalStrip.new(remote, i)
|
19
|
+
else
|
20
|
+
VirtualStrip.new(remote, i)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(remote, i)
|
26
|
+
super
|
27
|
+
self.make_accessor_bool :solo, :mute, :mono
|
28
|
+
self.make_accessor_float :gain
|
29
|
+
self.make_accessor_int :limit
|
30
|
+
self.make_accessor_string :label
|
31
|
+
|
32
|
+
num_A, num_B = remote.kind.layout[:bus].values
|
33
|
+
self.make_accessor_bool *make_channel_props(num_A, num_B)
|
34
|
+
|
35
|
+
@gainlayer = (0...8).map { |j| GainLayer.new(remote, i, j) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def identifier
|
39
|
+
:strip
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class PhysicalStrip < Strip
|
44
|
+
def initialize(remote, i)
|
45
|
+
super
|
46
|
+
self.make_accessor_float :comp, :gate
|
47
|
+
self.make_reader_only :device, :sr
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class VirtualStrip < Strip
|
52
|
+
def initialize(remote, i)
|
53
|
+
super
|
54
|
+
self.make_accessor_bool :mc
|
55
|
+
self.make_accessor_int :k
|
56
|
+
end
|
57
|
+
|
58
|
+
def appgain(name, gain) = self.setter("AppGain", "(\"#{name}\", #{gain})")
|
59
|
+
|
60
|
+
def appmute(name, mute) = self.setter("AppMute", "(\"#{name}\", #{mute ? 1 : 0})")
|
61
|
+
end
|
62
|
+
|
63
|
+
class GainLayer < IChannel
|
64
|
+
def initialize(remote, i, j)
|
65
|
+
super(remote, i)
|
66
|
+
@j = j
|
67
|
+
end
|
68
|
+
|
69
|
+
def identifier
|
70
|
+
:strip
|
71
|
+
end
|
72
|
+
|
73
|
+
def gain
|
74
|
+
self.getter("gainlayer[#{@j}]")
|
75
|
+
end
|
76
|
+
|
77
|
+
def gain=(value)
|
78
|
+
self.setter("gainlayer[#{@j}]", value)
|
79
|
+
end
|
80
|
+
end
|
data/lib/vban.rb
CHANGED
@@ -1,106 +1,103 @@
|
|
1
|
-
require_relative 'meta'
|
2
|
-
require_relative 'errors'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
self.
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
def
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
return "out"
|
105
|
-
end
|
106
|
-
end
|
1
|
+
require_relative 'meta'
|
2
|
+
require_relative 'errors'
|
3
|
+
|
4
|
+
class IVban
|
5
|
+
'
|
6
|
+
Base Vban class
|
7
|
+
'
|
8
|
+
include Vban_Meta_Functions
|
9
|
+
|
10
|
+
def initialize(remote, index)
|
11
|
+
@remote = remote
|
12
|
+
@index = index
|
13
|
+
end
|
14
|
+
|
15
|
+
def getter(param, is_string = false)
|
16
|
+
@remote.get_parameter("#{self.cmd}.#{param}", is_string)
|
17
|
+
end
|
18
|
+
|
19
|
+
def setter(param, value)
|
20
|
+
@remote.set_parameter("#{self.cmd}.#{param}", value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cmd
|
24
|
+
"#{self.identifier}.#{self.direction}stream[#{@index}]"
|
25
|
+
end
|
26
|
+
|
27
|
+
def direction
|
28
|
+
raise 'Called abstract mehod: direction'
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_multi(param_hash)
|
32
|
+
param_hash.each { |(key, val)| self.send("#{key}=", val) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Vban < IVban
|
37
|
+
'
|
38
|
+
Concrete Vban class
|
39
|
+
'
|
40
|
+
def self.make(remote, vban_streams)
|
41
|
+
'
|
42
|
+
Factory function for Vban class.
|
43
|
+
|
44
|
+
Returns a mixin of instream/outstream subclasses
|
45
|
+
'
|
46
|
+
class << self
|
47
|
+
attr_accessor :instream, :outstream, :remote
|
48
|
+
|
49
|
+
def enable
|
50
|
+
@remote.set_parameter('vban.enable', 1)
|
51
|
+
end
|
52
|
+
def disable
|
53
|
+
@remote.set_parameter('vban.enable', 0)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
vban_in, vban_out = vban_streams.values
|
58
|
+
self.instream = (0...vban_in).map { |i| VbanInstream.new(remote, i) }
|
59
|
+
self.outstream = (0...vban_out).map { |i| VbanOutstream.new(remote, i) }
|
60
|
+
|
61
|
+
self.remote = remote
|
62
|
+
return self
|
63
|
+
end
|
64
|
+
|
65
|
+
def initialize(remote, i)
|
66
|
+
super
|
67
|
+
self.make_accessor_bool :on
|
68
|
+
self.make_accessor_string :name, :ip
|
69
|
+
self.make_accessor_int :quality, :route
|
70
|
+
end
|
71
|
+
|
72
|
+
def identifier
|
73
|
+
:vban
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class VbanInstream < Vban
|
78
|
+
'
|
79
|
+
A subclass representing a VBAN Instream
|
80
|
+
'
|
81
|
+
def initialize(remote, i)
|
82
|
+
super
|
83
|
+
self.make_reader_int :sr, :channel, :bit
|
84
|
+
end
|
85
|
+
|
86
|
+
def direction
|
87
|
+
:in
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class VbanOutstream < Vban
|
92
|
+
'
|
93
|
+
A subclass representing a VBAN Outstream
|
94
|
+
'
|
95
|
+
def initialize(remote, i)
|
96
|
+
super
|
97
|
+
self.make_accessor_int :sr, :channel, :bit
|
98
|
+
end
|
99
|
+
|
100
|
+
def direction
|
101
|
+
:out
|
102
|
+
end
|
103
|
+
end
|
data/lib/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Voicemeeter_API_Ruby
|
2
|
-
VERSION = '
|
3
|
-
end
|
1
|
+
module Voicemeeter_API_Ruby
|
2
|
+
VERSION = '3.0.0'
|
3
|
+
end
|
data/lib/voicemeeter.rb
CHANGED
@@ -1,60 +1,73 @@
|
|
1
|
-
require_relative '
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
Remote class, subclasses
|
12
|
-
|
13
|
-
Console layout built according to
|
14
|
-
|
15
|
-
Offers a run method for resource closure.
|
16
|
-
|
17
|
-
def self.make(**kwargs)
|
18
|
-
|
19
|
-
Factory function that generates a
|
20
|
-
|
21
|
-
Returns a hash of Remote classes.
|
22
|
-
|
23
|
-
|
24
|
-
[kind, Remote.new(kind, **kwargs)]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def initialize(kind)
|
29
|
-
super
|
30
|
-
self.strip = Strip.make(self,
|
31
|
-
self.bus = Bus.make(self,
|
32
|
-
self.button = MacroButton.make(self,
|
33
|
-
self.vban = Vban.make(self,
|
34
|
-
self.command = Command.new(self)
|
35
|
-
self.recorder = Recorder.new(self)
|
36
|
-
end
|
37
|
-
|
38
|
-
def run
|
39
|
-
yield if block_given?
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
def remote(
|
48
|
-
|
49
|
-
Request a Remote
|
50
|
-
|
51
|
-
_remotes = Remote.make(**kwargs)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Voicemeeter
|
4
|
+
include RunVM
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
class Remote < Base
|
9
|
+
include Kinds
|
10
|
+
'
|
11
|
+
Remote class, subclasses Base
|
12
|
+
|
13
|
+
Console layout built according to a kind
|
14
|
+
|
15
|
+
Offers a run method for resource closure.
|
16
|
+
'
|
17
|
+
def self.make(**kwargs)
|
18
|
+
'
|
19
|
+
Factory function that generates a Remote class for each kind.
|
20
|
+
|
21
|
+
Returns a hash of Remote classes.
|
22
|
+
'
|
23
|
+
Kinds.kinds_all.to_h do |kind|
|
24
|
+
[kind.name, Remote.new(kind, **kwargs)]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(kind)
|
29
|
+
super
|
30
|
+
self.strip = Strip.make(self, kind.layout[:strip])
|
31
|
+
self.bus = Bus.make(self, kind.layout[:bus])
|
32
|
+
self.button = MacroButton.make(self, kind.layout[:mb])
|
33
|
+
self.vban = Vban.make(self, kind.layout[:vban])
|
34
|
+
self.command = Command.new(self)
|
35
|
+
self.recorder = Recorder.new(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
def run
|
39
|
+
yield if block_given?
|
40
|
+
ensure
|
41
|
+
logout
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
public
|
46
|
+
|
47
|
+
def self.remote(kind_id, **kwargs)
|
48
|
+
'
|
49
|
+
Request a Remote class of a kind and login to the API
|
50
|
+
'
|
51
|
+
_remotes = Remote.make(**kwargs)
|
52
|
+
|
53
|
+
unless _remotes.key? kind_id
|
54
|
+
raise VMRemoteErrors.new('Unknown Voicemeeter Kind.')
|
55
|
+
end
|
56
|
+
|
57
|
+
_remotes[kind_id].login
|
58
|
+
return _remotes[kind_id]
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.testing
|
62
|
+
'
|
63
|
+
Returns a random Remote class
|
64
|
+
'
|
65
|
+
unless ENV['RACK_ENV'] == 'dev'
|
66
|
+
raise VMRemoteErrors.new('Not in developer mode')
|
67
|
+
end
|
68
|
+
|
69
|
+
return Remote.new(Kinds.kinds_all.sample)
|
70
|
+
end
|
71
|
+
|
72
|
+
module_function :start
|
73
|
+
end
|
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
|
+
version: 3.0.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-
|
11
|
+
date: 2022-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -45,61 +45,43 @@ dependencies:
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 0.3.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: rspec
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 13.0.3
|
53
|
+
version: '3.4'
|
57
54
|
type: :development
|
58
55
|
prerelease: false
|
59
56
|
version_requirements: !ruby/object:Gem::Requirement
|
60
57
|
requirements:
|
61
58
|
- - "~>"
|
62
59
|
- !ruby/object:Gem::Version
|
63
|
-
version: '
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 13.0.3
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
name: minitest
|
69
|
-
requirement: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - "~>"
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: '5.14'
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 5.14.4
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
80
|
-
requirements:
|
81
|
-
- - "~>"
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version: '5.14'
|
84
|
-
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 5.14.4
|
60
|
+
version: '3.4'
|
87
61
|
description: A wrapper for Voicemeeter virtual mixer API in Ruby
|
88
62
|
email: code@onyxandiris.online
|
89
63
|
executables: []
|
90
64
|
extensions: []
|
91
|
-
extra_rdoc_files:
|
65
|
+
extra_rdoc_files:
|
66
|
+
- README.md
|
67
|
+
- CHANGELOG.md
|
68
|
+
- LICENSE
|
92
69
|
files:
|
70
|
+
- CHANGELOG.md
|
71
|
+
- LICENSE
|
72
|
+
- README.md
|
93
73
|
- lib/base.rb
|
94
74
|
- lib/bus.rb
|
95
75
|
- lib/button.rb
|
76
|
+
- lib/cbindings.rb
|
96
77
|
- lib/channel.rb
|
97
78
|
- lib/command.rb
|
98
79
|
- lib/errors.rb
|
99
80
|
- lib/inst.rb
|
81
|
+
- lib/kinds.rb
|
100
82
|
- lib/meta.rb
|
83
|
+
- lib/profiles.rb
|
101
84
|
- lib/recorder.rb
|
102
|
-
- lib/routines.rb
|
103
85
|
- lib/runvm.rb
|
104
86
|
- lib/strip.rb
|
105
87
|
- lib/vban.rb
|
@@ -107,7 +89,7 @@ files:
|
|
107
89
|
- lib/voicemeeter.rb
|
108
90
|
homepage: https://rubygems.org/gems/voicemeeter_api_ruby
|
109
91
|
licenses:
|
110
|
-
-
|
92
|
+
- MIT
|
111
93
|
metadata:
|
112
94
|
source_code_uri: https://github.com/onyx-and-iris/voicemeeter-api-ruby.git
|
113
95
|
post_install_message:
|
@@ -118,14 +100,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
100
|
requirements:
|
119
101
|
- - ">="
|
120
102
|
- !ruby/object:Gem::Version
|
121
|
-
version: '
|
103
|
+
version: '3.0'
|
122
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
105
|
requirements:
|
124
106
|
- - ">="
|
125
107
|
- !ruby/object:Gem::Version
|
126
108
|
version: '0'
|
127
109
|
requirements: []
|
128
|
-
rubygems_version: 3.
|
110
|
+
rubygems_version: 3.3.7
|
129
111
|
signing_key:
|
130
112
|
specification_version: 4
|
131
113
|
summary: Voicemeeter API wrapper
|