voicemeeter_api_ruby 4.1.2 → 4.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3cd92424de9feeec41ef5367eae28c9dfe4c5db4c62f3944e14e9fd4c632390d
4
- data.tar.gz: e9dc4356b8b2fcb54337a6eea85c62e73f3c9259be339abd25bba00a805b42c3
3
+ metadata.gz: 29df5251a1e4d779dd265a785112c0c8907b89f5f9a30a45a9e50985ed2400e7
4
+ data.tar.gz: c4a9acbbbe3330aca966d4470373b9ec9f9fe3bcefa0b1f6e60ed665b853c712
5
5
  SHA512:
6
- metadata.gz: 2f77f65c9099f66c1a1938c8b40658b3fb1e8ab00b1914819b4d6e99a21bd87ee94ae20043bd52e381e314864b272d65ba03773550dc25765b10caa3490f6661
7
- data.tar.gz: 345b8c4b80b8fe8e2bfe62b729eba3c2067f550017c3d4de15425a6368384fdb698d2bd4d01f04324ef3d33f3c5e3c8450ea97c880114d8fddb79c3af0a2bbce
6
+ metadata.gz: c9e8f17bd773dbbbb9980f5bb91283b0f97be75acff6f2bf0c2315721fdfc9916509ec86a0a28e6db3d548fadbb161c3b40da9cbd8639b4fc98719fe309d1e27
7
+ data.tar.gz: 12d256fb220ab60c3492d65855ed6cdf714af851f1a7dfcb2d6b3297e2c844a9776162ff600351c9f4baeb71a3a2e99492e19388a588f459301ed1aff4259d7d
data/README.md CHANGED
@@ -339,11 +339,11 @@ vm.run { (0...vm.device.ins).each { |i| puts vm.device.input(i) } }
339
339
 
340
340
  ### Multiple parameters
341
341
 
342
- - `set_multi`
342
+ - `apply`
343
343
  Set many strip/bus/macrobutton/vban parameters at once, for example:
344
344
 
345
345
  ```ruby
346
- vm.set_multi(
346
+ vm.apply(
347
347
  {
348
348
  strip_0: {
349
349
  mute: true,
@@ -368,13 +368,13 @@ vm.set_multi(
368
368
  Or for each class you may do:
369
369
 
370
370
  ```ruby
371
- vm.strip[0].set_multi(mute: true, gain: 3.2, A1: true)
372
- vm.vban.outstream[0].set_multi(on: true, name: 'streamname', bit: 24)
371
+ vm.strip[0].apply(mute: true, gain: 3.2, A1: true)
372
+ vm.vban.outstream[0].apply(on: true, name: 'streamname', bit: 24)
373
373
  ```
374
374
 
375
375
  ## Config Files
376
376
 
377
- `vm.set_config(<configname>)`
377
+ `vm.apply_config(<configname>)`
378
378
 
379
379
  You may load config files in TOML format.
380
380
  Three example configs have been included with the package. Remember to save
@@ -383,10 +383,10 @@ current settings before loading a config. To set one you may do:
383
383
  ```ruby
384
384
  require 'voicemeeter'
385
385
  vm = Voicemeeter.remote('banana')
386
- vm.run { vm.set_config('example') }
386
+ vm.run { vm.apply_config('example') }
387
387
  ```
388
388
 
389
- will load a config file at configs/banana/example.toml for Voicemeeter Banana.
389
+ will load a config file at mydir/configs/banana/example.toml for Voicemeeter Banana.
390
390
 
391
391
  ## `Voicemeeter Module`
392
392
 
data/lib/base.rb CHANGED
@@ -1,221 +1,220 @@
1
- require 'observer'
2
-
3
- require_relative 'runvm'
4
- require_relative 'configs'
5
- require_relative 'errors'
6
-
7
- class Base
8
- '
9
- Base class responsible for wrapping the C Remote API
10
-
11
- Mixin required modules
12
- '
13
- include Observable
14
- include Configs
15
- include RunVM
16
-
17
- attr_accessor :strip, :bus, :button, :vban, :command, :recorder, :device
18
- attr_accessor :strip_mode
19
-
20
- attr_reader :kind, :p_in, :v_in, :p_out, :v_out, :retval, :cache
21
- attr_reader :running, :_strip_comp, :_bus_comp
22
-
23
- DELAY = 0.001
24
- SYNC = false
25
- RATELIMIT = 0.033
26
- SIZE = 1
27
-
28
- def initialize(kind, **kwargs)
29
- @kind = kind
30
- @p_in, @v_in = kind.layout[:strip].values
31
- @p_out, @v_out = kind.layout[:bus].values
32
- @cache = Hash.new
33
- @sync = kwargs[:sync] || SYNC
34
- @ratelimit = kwargs[:ratelimit] || RATELIMIT
35
- @running = false
36
- @strip_mode = 0
37
- @delay = DELAY
38
- end
39
-
40
- def init_thread
41
- @running = true
42
- @cache['strip_level'], @cache['bus_level'] = _get_levels
43
- Thread.new do
44
- loop do
45
- Thread.stop if !@running
46
- if pdirty?
47
- changed
48
- notify_observers('pdirty')
49
- end
50
- if mdirty?
51
- changed
52
- notify_observers('mdirty')
53
- end
54
- if ldirty?
55
- changed
56
- @_strip_comp =
57
- @cache['strip_level'].map.with_index do |x, i|
58
- !(x == @strip_buf[i])
59
- end
60
- @_bus_comp =
61
- @cache['bus_level'].map.with_index do |x, i|
62
- !(x == @bus_buf[i])
63
- end
64
- @cache['strip_level'] = @strip_buf
65
- @cache['bus_level'] = @bus_buf
66
- notify_observers('ldirty')
67
- end
68
- sleep(@ratelimit)
69
- end
70
- end
71
- end
72
-
73
- def end_thread
74
- @running = false
75
- end
76
-
77
- def login
78
- @@cdll.call(:login)
79
- clear_polling
80
- rescue CAPIErrors => error
81
- case
82
- when error.value == 1
83
- self.start(@kind.name)
84
- clear_polling
85
- when error.value < 0
86
- raise
87
- end
88
- end
89
-
90
- def logout
91
- clear_polling
92
- sleep(0.1)
93
- @@cdll.call(:logout)
94
- end
95
-
96
- def type
97
- c_type = FFI::MemoryPointer.new(:long, SIZE)
98
- @@cdll.call(:vmtype, c_type)
99
- types = { 1 => 'basic', 2 => 'banana', 3 => 'potato' }
100
- types[c_type.read_long]
101
- end
102
-
103
- def version
104
- c_ver = FFI::MemoryPointer.new(:long, SIZE)
105
- @@cdll.call(:vmversion, c_ver)
106
- v1 = (c_ver.read_long & 0xFF000000) >> 24
107
- v2 = (c_ver.read_long & 0x00FF0000) >> 16
108
- v3 = (c_ver.read_long & 0x0000FF00) >> 8
109
- v4 = c_ver.read_long & 0x000000FF
110
- "#{v1}.#{v2}.#{v3}.#{v4}"
111
- end
112
-
113
- def get_parameter(name, is_string = false)
114
- self.polling('get_parameter', name: name) do
115
- if is_string
116
- c_get = FFI::MemoryPointer.new(:string, 512, true)
117
- @@cdll.call(:get_parameter_string, name, c_get)
118
- c_get.read_string
119
- else
120
- c_get = FFI::MemoryPointer.new(:float, SIZE)
121
- @@cdll.call(:get_parameter_float, name, c_get)
122
- c_get.read_float.round(1)
123
- end
124
- end
125
- end
126
-
127
- def set_parameter(name, value)
128
- if value.is_a? String
129
- @@cdll.call(:set_parameter_string, name, value)
130
- else
131
- @@cdll.call(:set_parameter_float, name, value.to_f)
132
- end
133
- @cache.store(name, value)
134
- end
135
-
136
- def get_buttonstatus(id, mode)
137
- self.polling('get_buttonstatus', id: id, mode: mode) do
138
- c_get = FFI::MemoryPointer.new(:float, SIZE)
139
- @@cdll.call(:get_buttonstatus, id, c_get, mode)
140
- c_get.read_float.to_i
141
- end
142
- end
143
-
144
- def set_buttonstatus(id, state, mode)
145
- @@cdll.call(:set_buttonstatus, id, state, mode)
146
- @cache.store("mb_#{id}_#{mode}", state)
147
- end
148
-
149
- def set_parameter_multi(param_hash)
150
- param_hash.each do |(key, val)|
151
- prop, m2, m3, *rem = key.to_s.split('_')
152
- if m2.to_i.to_s == m2
153
- m2 = m2.to_i
154
- elsif m3.to_i.to_s == m3
155
- m3 = m3.to_i
156
- end
157
-
158
- case prop
159
- when 'strip'
160
- self.strip[m2].set_multi(val)
161
- when 'bus'
162
- self.bus[m2].set_multi(val)
163
- when 'button', 'mb'
164
- self.button[m2].set_multi(val)
165
- when 'vban'
166
- if %w[instream in].include? m2
167
- self.vban.instream[m3].set_multi(val)
168
- elsif %w[outstream out].include? m2
169
- self.vban.outstream[m3].set_multi(val)
170
- end
171
- end
172
- sleep(DELAY)
173
- end
174
- end
175
-
176
- def get_level(type, index)
177
- c_get = FFI::MemoryPointer.new(:float, SIZE)
178
- @@cdll.call(:get_level, type, index, c_get)
179
- c_get.read_float
180
- end
181
-
182
- def _get_levels
183
- s = (0...(2 * @p_in + 8 * @v_in)).map { |i| get_level(@strip_mode, i) }
184
- b = (0...(8 * (@p_out + @v_out))).map { |i| get_level(3, i) }
185
- [s, b]
186
- end
187
-
188
- def get_num_devices(direction)
189
- unless %w[in out].include? direction
190
- raise VMRemoteErrors.new('expected in or out')
191
- end
192
- if direction == 'in'
193
- val = @@cdll.call(:get_num_indevices)
194
- else
195
- val = @@cdll.call(:get_num_outdevices)
196
- end
197
- val[0]
198
- end
199
-
200
- def get_device_description(index, direction)
201
- unless %w[in out].include? direction
202
- raise VMRemoteErrors.new('expected in or out')
203
- end
204
- c_type = FFI::MemoryPointer.new(:long, SIZE)
205
- c_name = FFI::MemoryPointer.new(:string, 256, true)
206
- c_hwid = FFI::MemoryPointer.new(:string, 256, true)
207
- if direction == 'in'
208
- @@cdll.call(:get_desc_indevices, index, c_type, c_name, c_hwid)
209
- else
210
- @@cdll.call(:get_desc_outdevices, index, c_type, c_name, c_hwid)
211
- end
212
- [c_name.read_string, c_type.read_long, c_hwid.read_string]
213
- end
214
-
215
- alias_method 'set_multi', :set_parameter_multi
216
- alias_method 'get', :get_parameter
217
- alias_method 'set', :set_parameter
218
- alias_method 'pdirty', :pdirty?
219
- alias_method 'mdirty', :mdirty?
220
- alias_method 'ldirty', :ldirty?
221
- end
1
+ require "observer"
2
+
3
+ require_relative "runvm"
4
+ require_relative "configs"
5
+ require_relative "errors"
6
+
7
+ class Base
8
+ "
9
+ Base class responsible for wrapping the C Remote API
10
+
11
+ Mixin required modules
12
+ "
13
+ include Observable
14
+ include Configs
15
+ include RunVM
16
+
17
+ attr_accessor :strip, :bus, :button, :vban, :command, :recorder, :device
18
+ attr_accessor :strip_mode
19
+
20
+ attr_reader :kind, :p_in, :v_in, :p_out, :v_out, :retval, :cache
21
+ attr_reader :running, :_strip_comp, :_bus_comp, :delay
22
+
23
+ DELAY = 0.001
24
+ SYNC = false
25
+ RATELIMIT = 0.033
26
+ SIZE = 1
27
+
28
+ def initialize(kind, **kwargs)
29
+ @kind = kind
30
+ @p_in, @v_in = kind.layout[:strip].values
31
+ @p_out, @v_out = kind.layout[:bus].values
32
+ @cache = Hash.new
33
+ @sync = kwargs[:sync] || SYNC
34
+ @ratelimit = kwargs[:ratelimit] || RATELIMIT
35
+ @running = false
36
+ @strip_mode = 0
37
+ @delay = DELAY
38
+ end
39
+
40
+ def init_thread
41
+ @running = true
42
+ @cache["strip_level"], @cache["bus_level"] = _get_levels
43
+ Thread.new do
44
+ loop do
45
+ Thread.stop if !@running
46
+ if pdirty?
47
+ changed
48
+ notify_observers("pdirty")
49
+ end
50
+ if mdirty?
51
+ changed
52
+ notify_observers("mdirty")
53
+ end
54
+ if ldirty?
55
+ changed
56
+ @_strip_comp =
57
+ @cache["strip_level"].map.with_index do |x, i|
58
+ !(x == @strip_buf[i])
59
+ end
60
+ @_bus_comp =
61
+ @cache["bus_level"].map.with_index { |x, i| !(x == @bus_buf[i]) }
62
+ @cache["strip_level"] = @strip_buf
63
+ @cache["bus_level"] = @bus_buf
64
+ notify_observers("ldirty")
65
+ end
66
+ sleep(@ratelimit)
67
+ end
68
+ end
69
+ end
70
+
71
+ def end_thread
72
+ @running = false
73
+ end
74
+
75
+ def login
76
+ @@cdll.call(:login)
77
+ clear_polling
78
+ rescue CAPIErrors => error
79
+ case
80
+ when error.value == 1
81
+ self.start(@kind.name)
82
+ clear_polling
83
+ when error.value < 0
84
+ raise
85
+ end
86
+ end
87
+
88
+ def logout
89
+ clear_polling
90
+ sleep(0.1)
91
+ @@cdll.call(:logout)
92
+ end
93
+
94
+ def type
95
+ c_type = FFI::MemoryPointer.new(:long, SIZE)
96
+ @@cdll.call(:vmtype, c_type)
97
+ types = { 1 => "basic", 2 => "banana", 3 => "potato" }
98
+ types[c_type.read_long]
99
+ end
100
+
101
+ def version
102
+ c_ver = FFI::MemoryPointer.new(:long, SIZE)
103
+ @@cdll.call(:vmversion, c_ver)
104
+ v1 = (c_ver.read_long & 0xFF000000) >> 24
105
+ v2 = (c_ver.read_long & 0x00FF0000) >> 16
106
+ v3 = (c_ver.read_long & 0x0000FF00) >> 8
107
+ v4 = c_ver.read_long & 0x000000FF
108
+ "#{v1}.#{v2}.#{v3}.#{v4}"
109
+ end
110
+
111
+ def get_parameter(name, is_string = false)
112
+ self.polling("get_parameter", name: name) do
113
+ if is_string
114
+ c_get = FFI::MemoryPointer.new(:string, 512, true)
115
+ @@cdll.call(:get_parameter_string, name, c_get)
116
+ c_get.read_string
117
+ else
118
+ c_get = FFI::MemoryPointer.new(:float, SIZE)
119
+ @@cdll.call(:get_parameter_float, name, c_get)
120
+ c_get.read_float.round(1)
121
+ end
122
+ end
123
+ end
124
+
125
+ def set_parameter(name, value)
126
+ if value.is_a? String
127
+ @@cdll.call(:set_parameter_string, name, value)
128
+ else
129
+ @@cdll.call(:set_parameter_float, name, value.to_f)
130
+ end
131
+ @cache.store(name, value)
132
+ end
133
+
134
+ def get_buttonstatus(id, mode)
135
+ self.polling("get_buttonstatus", id: id, mode: mode) do
136
+ c_get = FFI::MemoryPointer.new(:float, SIZE)
137
+ @@cdll.call(:get_buttonstatus, id, c_get, mode)
138
+ c_get.read_float.to_i
139
+ end
140
+ end
141
+
142
+ def set_buttonstatus(id, state, mode)
143
+ @@cdll.call(:set_buttonstatus, id, state, mode)
144
+ @cache.store("mb_#{id}_#{mode}", state)
145
+ end
146
+
147
+ def set_parameter_multi(param_hash)
148
+ param_hash.each do |(key, val)|
149
+ prop, m2, m3, *rem = key.to_s.split("_")
150
+ if m2.to_i.to_s == m2
151
+ m2 = m2.to_i
152
+ elsif m3.to_i.to_s == m3
153
+ m3 = m3.to_i
154
+ end
155
+
156
+ case prop
157
+ when "strip"
158
+ self.strip[m2].set_multi(val)
159
+ when "bus"
160
+ self.bus[m2].set_multi(val)
161
+ when "button", "mb"
162
+ self.button[m2].set_multi(val)
163
+ when "vban"
164
+ if %w[instream in].include? m2
165
+ self.vban.instream[m3].set_multi(val)
166
+ elsif %w[outstream out].include? m2
167
+ self.vban.outstream[m3].set_multi(val)
168
+ end
169
+ end
170
+ sleep(DELAY)
171
+ end
172
+ end
173
+
174
+ def get_level(type, index)
175
+ c_get = FFI::MemoryPointer.new(:float, SIZE)
176
+ @@cdll.call(:get_level, type, index, c_get)
177
+ c_get.read_float
178
+ end
179
+
180
+ def _get_levels
181
+ s = (0...(2 * @p_in + 8 * @v_in)).map { |i| get_level(@strip_mode, i) }
182
+ b = (0...(8 * (@p_out + @v_out))).map { |i| get_level(3, i) }
183
+ [s, b]
184
+ end
185
+
186
+ def get_num_devices(direction)
187
+ unless %w[in out].include? direction
188
+ raise VMRemoteErrors.new("expected in or out")
189
+ end
190
+ if direction == "in"
191
+ val = @@cdll.call(:get_num_indevices)
192
+ else
193
+ val = @@cdll.call(:get_num_outdevices)
194
+ end
195
+ val[0]
196
+ end
197
+
198
+ def get_device_description(index, direction)
199
+ unless %w[in out].include? direction
200
+ raise VMRemoteErrors.new("expected in or out")
201
+ end
202
+ c_type = FFI::MemoryPointer.new(:long, SIZE)
203
+ c_name = FFI::MemoryPointer.new(:string, 256, true)
204
+ c_hwid = FFI::MemoryPointer.new(:string, 256, true)
205
+ if direction == "in"
206
+ @@cdll.call(:get_desc_indevices, index, c_type, c_name, c_hwid)
207
+ else
208
+ @@cdll.call(:get_desc_outdevices, index, c_type, c_name, c_hwid)
209
+ end
210
+ [c_name.read_string, c_type.read_long, c_hwid.read_string]
211
+ end
212
+
213
+ alias_method "set_multi", :set_parameter_multi
214
+ alias_method "apply", :set_parameter_multi
215
+ alias_method "get", :get_parameter
216
+ alias_method "set", :set_parameter
217
+ alias_method "pdirty", :pdirty?
218
+ alias_method "mdirty", :mdirty?
219
+ alias_method "ldirty", :ldirty?
220
+ end