voicemeeter_api_ruby 2.0.2 → 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 -132
- data/lib/bus.rb +64 -31
- data/lib/button.rb +36 -35
- data/lib/cbindings.rb +103 -0
- data/lib/channel.rb +46 -25
- data/lib/command.rb +41 -41
- data/lib/errors.rb +39 -37
- data/lib/inst.rb +38 -40
- data/lib/kinds.rb +77 -0
- data/lib/meta.rb +274 -242
- data/lib/profiles.rb +28 -0
- data/lib/recorder.rb +37 -40
- data/lib/runvm.rb +29 -20
- data/lib/strip.rb +80 -49
- data/lib/vban.rb +103 -92
- data/lib/version.rb +3 -3
- data/lib/voicemeeter.rb +73 -30
- metadata +22 -26
- data/lib/routines.rb +0 -128
data/lib/runvm.rb
CHANGED
@@ -1,20 +1,29 @@
|
|
1
|
-
|
2
|
-
require_relative '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
-
(0...(p_in + v_in)).map do |i|
|
17
|
-
i < p_in
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
self.
|
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,92 +1,103 @@
|
|
1
|
-
require_relative 'meta'
|
2
|
-
require_relative 'errors'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def initialize(remote, index)
|
11
|
-
|
12
|
-
|
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
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def direction
|
28
|
-
raise
|
29
|
-
end
|
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
|
-
self.
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
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,30 +1,73 @@
|
|
1
|
-
require_relative '
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
@@ -31,61 +31,57 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 1.9.10
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: toml
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
40
|
-
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: 13.0.3
|
43
|
-
type: :development
|
39
|
+
version: 0.3.0
|
40
|
+
type: :runtime
|
44
41
|
prerelease: false
|
45
42
|
version_requirements: !ruby/object:Gem::Requirement
|
46
43
|
requirements:
|
47
44
|
- - "~>"
|
48
45
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
50
|
-
- - ">="
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: 13.0.3
|
46
|
+
version: 0.3.0
|
53
47
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
48
|
+
name: rspec
|
55
49
|
requirement: !ruby/object:Gem::Requirement
|
56
50
|
requirements:
|
57
51
|
- - "~>"
|
58
52
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 5.14.4
|
53
|
+
version: '3.4'
|
63
54
|
type: :development
|
64
55
|
prerelease: false
|
65
56
|
version_requirements: !ruby/object:Gem::Requirement
|
66
57
|
requirements:
|
67
58
|
- - "~>"
|
68
59
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 5.14.4
|
60
|
+
version: '3.4'
|
73
61
|
description: A wrapper for Voicemeeter virtual mixer API in Ruby
|
74
62
|
email: code@onyxandiris.online
|
75
63
|
executables: []
|
76
64
|
extensions: []
|
77
|
-
extra_rdoc_files:
|
65
|
+
extra_rdoc_files:
|
66
|
+
- README.md
|
67
|
+
- CHANGELOG.md
|
68
|
+
- LICENSE
|
78
69
|
files:
|
70
|
+
- CHANGELOG.md
|
71
|
+
- LICENSE
|
72
|
+
- README.md
|
79
73
|
- lib/base.rb
|
80
74
|
- lib/bus.rb
|
81
75
|
- lib/button.rb
|
76
|
+
- lib/cbindings.rb
|
82
77
|
- lib/channel.rb
|
83
78
|
- lib/command.rb
|
84
79
|
- lib/errors.rb
|
85
80
|
- lib/inst.rb
|
81
|
+
- lib/kinds.rb
|
86
82
|
- lib/meta.rb
|
83
|
+
- lib/profiles.rb
|
87
84
|
- lib/recorder.rb
|
88
|
-
- lib/routines.rb
|
89
85
|
- lib/runvm.rb
|
90
86
|
- lib/strip.rb
|
91
87
|
- lib/vban.rb
|
@@ -93,7 +89,7 @@ files:
|
|
93
89
|
- lib/voicemeeter.rb
|
94
90
|
homepage: https://rubygems.org/gems/voicemeeter_api_ruby
|
95
91
|
licenses:
|
96
|
-
-
|
92
|
+
- MIT
|
97
93
|
metadata:
|
98
94
|
source_code_uri: https://github.com/onyx-and-iris/voicemeeter-api-ruby.git
|
99
95
|
post_install_message:
|
@@ -104,14 +100,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
100
|
requirements:
|
105
101
|
- - ">="
|
106
102
|
- !ruby/object:Gem::Version
|
107
|
-
version: '
|
103
|
+
version: '3.0'
|
108
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
105
|
requirements:
|
110
106
|
- - ">="
|
111
107
|
- !ruby/object:Gem::Version
|
112
108
|
version: '0'
|
113
109
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
110
|
+
rubygems_version: 3.3.7
|
115
111
|
signing_key:
|
116
112
|
specification_version: 4
|
117
113
|
summary: Voicemeeter API wrapper
|