voicemeeter_api_ruby 3.0.0 → 4.1.1

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.
data/lib/runvm.rb CHANGED
@@ -1,29 +1,29 @@
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
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.to_s == 'potato'
19
+ [kind.name.to_s, i + 4]
20
+ else
21
+ [kind.name.to_s, i + 1]
22
+ end
23
+ end
24
+ exes = enums.to_h { |k, v| [k, v.to_i] }
25
+
26
+ send(:vm_runvm, exes[kind_id])
27
+ sleep(1)
28
+ end
29
+ end
data/lib/strip.rb CHANGED
@@ -1,80 +1,131 @@
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
1
+ require_relative 'iremote'
2
+ require_relative 'mixin'
3
+
4
+ class Strip < IRemote
5
+ '
6
+ Concrete Strip class
7
+ '
8
+ include Channel_Meta_Functions
9
+ include Fades
10
+
11
+ attr_accessor :gainlayer, :levels
12
+
13
+ def self.make(remote, layout_strip)
14
+ '
15
+ Factory function for Strip classes.
16
+ '
17
+ p_in, v_in = layout_strip.values
18
+ (0...(p_in + v_in)).map do |i|
19
+ if i < p_in
20
+ PhysicalStrip.new(remote, i)
21
+ else
22
+ VirtualStrip.new(remote, i)
23
+ end
24
+ end
25
+ end
26
+
27
+ def initialize(remote, i)
28
+ super
29
+ self.make_accessor_bool :solo, :mute, :mono
30
+ self.make_accessor_float :gain
31
+ self.make_accessor_int :limit
32
+ self.make_accessor_string :label
33
+
34
+ num_A, num_B = remote.kind.layout[:bus].values
35
+ self.make_accessor_bool *make_channel_props(num_A, num_B)
36
+
37
+ @gainlayer = (0...8).map { |j| GainLayer.new(remote, i, j) }
38
+ @levels = StripLevels.new(remote, i)
39
+ end
40
+
41
+ def identifier
42
+ "strip[#{@index}]"
43
+ end
44
+ end
45
+
46
+ class PhysicalStrip < Strip
47
+ def initialize(remote, i)
48
+ super
49
+ self.make_accessor_float :comp, :gate, :audibility
50
+ self.make_reader_only :device, :sr
51
+ end
52
+ end
53
+
54
+ class VirtualStrip < Strip
55
+ def initialize(remote, i)
56
+ super
57
+ self.make_accessor_bool :mc
58
+ self.make_accessor_int :k
59
+ self.make_accessor_float :bass, :mid, :treble
60
+ end
61
+
62
+ def appgain(name, gain)
63
+ self.setter('AppGain', "(\"#{name}\", #{gain})")
64
+ end
65
+
66
+ def appmute(name, mute)
67
+ self.setter('AppMute', "(\"#{name}\", #{mute ? 1 : 0})")
68
+ end
69
+ end
70
+
71
+ class GainLayer < IRemote
72
+ def initialize(remote, i, j)
73
+ super(remote, i)
74
+ @j = j
75
+ end
76
+
77
+ def identifier
78
+ "strip[#{@index}]"
79
+ end
80
+
81
+ def gain
82
+ self.getter("gainlayer[#{@j}]")
83
+ end
84
+
85
+ def gain=(value)
86
+ self.setter("gainlayer[#{@j}]", value)
87
+ end
88
+ end
89
+
90
+ class StripLevels < IRemote
91
+ def initialize(remote, i)
92
+ super
93
+ if i < @remote.p_in
94
+ @init = i * 2
95
+ @offset = 2
96
+ else
97
+ @init = (@remote.p_in * 2) + ((i - @remote.p_in) * 8)
98
+ @offset = 8
99
+ end
100
+ end
101
+
102
+ def identifier
103
+ "strip[#{@index}]"
104
+ end
105
+
106
+ def get_level(mode)
107
+ if @remote.running
108
+ vals = @remote.cache['strip_level'][@init, @offset]
109
+ else
110
+ vals = (@init...@offset).map { |i| get_level(mode, i) }
111
+ end
112
+ vals.map { |x| x > 0 ? (20 * Math.log(x, 10)).round(1) : -200.0 }
113
+ end
114
+
115
+ def prefader
116
+ @remote.strip_mode = 0
117
+ get_level(0)
118
+ end
119
+
120
+ def postfader
121
+ @remote.strip_mode = 1
122
+ get_level(1)
123
+ end
124
+
125
+ def postmute
126
+ @remote.strip_mode = 2
127
+ get_level(2)
128
+ end
129
+
130
+ def isdirty?() = @remote._strip_comp[@init, @offset].any?
131
+ end
data/lib/vban.rb CHANGED
@@ -1,103 +1,78 @@
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
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.0.0'
3
- end
1
+ module Voicemeeter_API_Ruby
2
+ VERSION = '4.1.1'
3
+ end
data/lib/voicemeeter.rb CHANGED
@@ -1,73 +1,86 @@
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
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
+ Remote.new(Kinds.kinds_all.sample)
83
+ end
84
+
85
+ module_function :start
86
+ end