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