voicemeeter_api_ruby 4.1.5 → 4.3.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.
@@ -0,0 +1,80 @@
1
+ require_relative "iremote"
2
+ require_relative "meta"
3
+ require_relative "errors"
4
+
5
+ module Voicemeeter
6
+ class VbanStream < IRemote
7
+ "
8
+ A class representing a VBAN stream
9
+ "
10
+ include Vban_Meta_Functions
11
+
12
+ def initialize(remote, i)
13
+ super
14
+ self.make_accessor_bool :on
15
+ self.make_accessor_string :name, :ip
16
+ self.make_accessor_int :quality, :route
17
+ end
18
+
19
+ def identifier
20
+ "vban.#{self.direction}stream[#{@index}]"
21
+ end
22
+
23
+ def direction
24
+ raise "Called abstract mehod: direction"
25
+ end
26
+ end
27
+
28
+ class VbanInstream < VbanStream
29
+ "
30
+ A subclass representing a VBAN Instream
31
+ "
32
+ def initialize(remote, i)
33
+ super
34
+ self.make_reader_int :sr, :channel, :bit
35
+ end
36
+
37
+ def direction
38
+ :in
39
+ end
40
+ end
41
+
42
+ class VbanOutstream < VbanStream
43
+ "
44
+ A subclass representing a VBAN Outstream
45
+ "
46
+ def initialize(remote, i)
47
+ super
48
+ self.make_accessor_int :sr, :channel, :bit
49
+ end
50
+
51
+ def direction
52
+ :out
53
+ end
54
+ end
55
+
56
+ class Vban
57
+ attr_accessor :instream, :outstream
58
+
59
+ def initialize(remote, vban_streams)
60
+ "
61
+ Initializes a Vban class
62
+
63
+ Creates an array for each in/out stream
64
+ "
65
+ vban_in, vban_out = vban_streams.values
66
+ self.instream = (0...vban_in).map { |i| VbanInstream.new(remote, i) }
67
+ self.outstream = (0...vban_out).map { |i| VbanOutstream.new(remote, i) }
68
+
69
+ @remote = remote
70
+ end
71
+
72
+ def enable
73
+ @remote.set_parameter("vban.enable", 1)
74
+ end
75
+
76
+ def disable
77
+ @remote.set_parameter("vban.enable", 0)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,25 @@
1
+ module Voicemeeter
2
+ module Version
3
+ module_function
4
+
5
+ def major
6
+ 4
7
+ end
8
+
9
+ def minor
10
+ 3
11
+ end
12
+
13
+ def patch
14
+ 1
15
+ end
16
+
17
+ def to_a
18
+ [major, minor, patch]
19
+ end
20
+
21
+ def to_s
22
+ to_a.join(".")
23
+ end
24
+ end
25
+ end
data/lib/voicemeeter.rb CHANGED
@@ -1,11 +1,11 @@
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"
1
+ require_relative "voicemeeter/base"
2
+ require_relative "voicemeeter/strip"
3
+ require_relative "voicemeeter/bus"
4
+ require_relative "voicemeeter/button"
5
+ require_relative "voicemeeter/vban"
6
+ require_relative "voicemeeter/command"
7
+ require_relative "voicemeeter/recorder"
8
+ require_relative "voicemeeter/device"
9
9
 
10
10
  module Voicemeeter
11
11
  include RunVM
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.1.5
4
+ version: 4.3.1
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-07-22 00:00:00.000000000 Z
11
+ date: 2022-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -84,24 +84,25 @@ files:
84
84
  - CHANGELOG.md
85
85
  - LICENSE
86
86
  - README.md
87
- - lib/base.rb
88
- - lib/bus.rb
89
- - lib/button.rb
90
- - lib/cbindings.rb
91
- - lib/command.rb
92
- - lib/configs.rb
93
- - lib/device.rb
94
- - lib/errors.rb
95
- - lib/inst.rb
96
- - lib/iremote.rb
97
- - lib/kinds.rb
98
- - lib/meta.rb
99
- - lib/recorder.rb
100
- - lib/runvm.rb
101
- - lib/strip.rb
102
- - lib/vban.rb
103
- - lib/version.rb
104
87
  - lib/voicemeeter.rb
88
+ - lib/voicemeeter/base.rb
89
+ - lib/voicemeeter/bus.rb
90
+ - lib/voicemeeter/button.rb
91
+ - lib/voicemeeter/cbindings.rb
92
+ - lib/voicemeeter/command.rb
93
+ - lib/voicemeeter/configs.rb
94
+ - lib/voicemeeter/device.rb
95
+ - lib/voicemeeter/errors.rb
96
+ - lib/voicemeeter/inst.rb
97
+ - lib/voicemeeter/iremote.rb
98
+ - lib/voicemeeter/kinds.rb
99
+ - lib/voicemeeter/meta.rb
100
+ - lib/voicemeeter/mixin.rb
101
+ - lib/voicemeeter/recorder.rb
102
+ - lib/voicemeeter/runvm.rb
103
+ - lib/voicemeeter/strip.rb
104
+ - lib/voicemeeter/vban.rb
105
+ - lib/voicemeeter/version.rb
105
106
  homepage: https://rubygems.org/gems/voicemeeter_api_ruby
106
107
  licenses:
107
108
  - MIT
data/lib/base.rb DELETED
@@ -1,220 +0,0 @@
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
data/lib/bus.rb DELETED
@@ -1,105 +0,0 @@
1
- require_relative "iremote"
2
-
3
- class Bus < IRemote
4
- "
5
- Concrete Bus class
6
- "
7
- include Channel_Meta_Functions
8
-
9
- attr_accessor :mode, :levels
10
-
11
- def self.make(remote, layout_bus)
12
- "
13
- Factory function for Bus classes.
14
- "
15
- p_out, v_out = layout_bus.values
16
- (0...(p_out + v_out)).map do |i|
17
- i < p_out ? PhysicalBus.new(remote, i) : VirtualBus.new(remote, i)
18
- end
19
- end
20
-
21
- def initialize(remote, i)
22
- super
23
- self.make_accessor_bool :mute, :mono, :eq, :sel
24
- self.make_accessor_float :gain
25
- self.make_accessor_string :label
26
-
27
- @mode = BusModes.new(remote, i)
28
- @levels = BusLevels.new(remote, i)
29
- end
30
-
31
- def identifier
32
- "bus[#{@index}]"
33
- end
34
-
35
- def fadeto(target, time)
36
- self.setter("FadeTo", "(#{target}, #{time})")
37
- sleep(@remote.delay)
38
- end
39
-
40
- def fadeby(change, time)
41
- self.setter("FadeBy", "(#{change}, #{time})")
42
- sleep(@remote.delay)
43
- end
44
- end
45
-
46
- class PhysicalBus < Bus
47
- def initialize(remote, i)
48
- super
49
- self.make_reader_only :device, :sr
50
- end
51
- end
52
-
53
- class VirtualBus < Bus
54
- end
55
-
56
- class BusModes < IRemote
57
- include Channel_Meta_Functions
58
-
59
- def initialize(remote, i)
60
- super
61
- self.make_bus_modes :normal,
62
- :amix,
63
- :bmix,
64
- :repeat,
65
- :composite,
66
- :tvmix,
67
- :upmix21,
68
- :upmix41,
69
- :upmix61,
70
- :centeronly,
71
- :lfeonly,
72
- :rearonly
73
- end
74
-
75
- def identifier
76
- "bus[#{@index}].mode"
77
- end
78
- end
79
-
80
- class BusLevels < IRemote
81
- def initialize(remote, i)
82
- super
83
- @init = i * 8
84
- @offset = 8
85
- end
86
-
87
- def identifier
88
- "bus[#{@index}]"
89
- end
90
-
91
- def getter(mode)
92
- if @remote.running
93
- vals = @remote.cache["bus_level"][@init, @offset]
94
- else
95
- vals = (@init...@offset).map { |i| @remote.get_level(mode, i) }
96
- end
97
- vals.map { |x| x > 0 ? (20 * Math.log(x, 10)).round(1) : -200.0 }
98
- end
99
-
100
- def all
101
- getter(3)
102
- end
103
-
104
- def isdirty? = @remote._bus_comp[@init, @offset].any?
105
- end
data/lib/button.rb DELETED
@@ -1,23 +0,0 @@
1
- require_relative "iremote"
2
- require_relative "meta"
3
-
4
- class MacroButton < IRemote
5
- include MacroButton_Meta_Functions
6
-
7
- def self.make(remote, num_buttons)
8
- (0...num_buttons).map { |i| MacroButton.new(remote, i) }
9
- end
10
-
11
- def initialize(remote, i)
12
- super
13
- self.make_accessor_macrobutton :state, :stateonly, :trigger
14
- end
15
-
16
- def getter(mode)
17
- @remote.get_buttonstatus(@index, mode)
18
- end
19
-
20
- def setter(set, mode)
21
- @remote.set_buttonstatus(@index, set, mode)
22
- end
23
- end
data/lib/cbindings.rb DELETED
@@ -1,125 +0,0 @@
1
- require "ffi"
2
- require_relative "inst"
3
-
4
- include InstallationFunctions
5
-
6
- module CBindings
7
- "
8
- Creates Ruby bindings to the C DLL
9
-
10
- Performs other low level tasks
11
- "
12
- extend FFI::Library
13
-
14
- private
15
-
16
- begin
17
- OS_BITS = FFI::Platform::CPU.downcase == "x64" ? 64 : 32
18
- VM_PATH = get_vmpath(OS_BITS)
19
- DLL_NAME = "VoicemeeterRemote#{OS_BITS == 64 ? "64" : ""}.dll"
20
-
21
- self.vm_dll = VM_PATH.join(DLL_NAME)
22
- rescue InstallErrors => error
23
- puts "ERROR: #{error.message}"
24
- raise
25
- end
26
-
27
- ffi_lib @vm_dll
28
- ffi_convention :stdcall
29
-
30
- attach_function :vm_login, :VBVMR_Login, [], :long
31
- attach_function :vm_logout, :VBVMR_Logout, [], :long
32
- attach_function :vm_runvm, :VBVMR_RunVoicemeeter, [:long], :long
33
- attach_function :vm_vmtype, :VBVMR_GetVoicemeeterType, [:pointer], :long
34
- attach_function :vm_vmversion, :VBVMR_GetVoicemeeterVersion, [:pointer], :long
35
-
36
- attach_function :vm_mdirty, :VBVMR_MacroButton_IsDirty, [], :long
37
- attach_function :vm_get_buttonstatus,
38
- :VBVMR_MacroButton_GetStatus,
39
- %i[long pointer long],
40
- :long
41
- attach_function :vm_set_buttonstatus,
42
- :VBVMR_MacroButton_SetStatus,
43
- %i[long float long],
44
- :long
45
-
46
- attach_function :vm_pdirty, :VBVMR_IsParametersDirty, [], :long
47
- attach_function :vm_get_parameter_float,
48
- :VBVMR_GetParameterFloat,
49
- %i[string pointer],
50
- :long
51
- attach_function :vm_set_parameter_float,
52
- :VBVMR_SetParameterFloat,
53
- %i[string float],
54
- :long
55
-
56
- attach_function :vm_get_parameter_string,
57
- :VBVMR_GetParameterStringA,
58
- %i[string pointer],
59
- :long
60
- attach_function :vm_set_parameter_string,
61
- :VBVMR_SetParameterStringA,
62
- %i[string string],
63
- :long
64
-
65
- attach_function :vm_set_parameter_multi,
66
- :VBVMR_SetParameters,
67
- [:string],
68
- :long
69
-
70
- attach_function :vm_get_level, :VBVMR_GetLevel, %i[long long pointer], :long
71
-
72
- attach_function :vm_get_num_indevices, :VBVMR_Input_GetDeviceNumber, [], :long
73
- attach_function :vm_get_desc_indevices,
74
- :VBVMR_Input_GetDeviceDescA,
75
- %i[long pointer pointer pointer],
76
- :long
77
-
78
- attach_function :vm_get_num_outdevices,
79
- :VBVMR_Output_GetDeviceNumber,
80
- [],
81
- :long
82
- attach_function :vm_get_desc_outdevices,
83
- :VBVMR_Output_GetDeviceDescA,
84
- %i[long pointer pointer pointer],
85
- :long
86
-
87
- @@cdll =
88
- lambda { |func, *args| self.retval = [send("vm_#{func}", *args), func] }
89
-
90
- def clear_polling = while pdirty? || mdirty?; end
91
-
92
- def polling(func, **kwargs)
93
- params = {
94
- "get_parameter" => kwargs[:name],
95
- "get_buttonstatus" => "mb_#{kwargs[:id]}_#{kwargs[:mode]}"
96
- }
97
- return @cache.delete(params[func]) if @cache.key? params[func]
98
-
99
- clear_polling if @sync
100
-
101
- yield
102
- end
103
-
104
- def retval=(values)
105
- " Writer validation for CAPI calls "
106
- retval, func = *values
107
- unless %i[get_num_indevices get_num_outdevices].include? func
108
- raise CAPIErrors.new(retval, func) if retval&.nonzero?
109
- end
110
- @retval = retval
111
- end
112
-
113
- public
114
-
115
- def pdirty? = vm_pdirty&.nonzero?
116
-
117
- def mdirty? = vm_mdirty&.nonzero?
118
-
119
- def ldirty?
120
- @strip_buf, @bus_buf = _get_levels
121
- return(
122
- !(@cache["strip_level"] == @strip_buf && @cache["bus_level"] == @bus_buf)
123
- )
124
- end
125
- end
data/lib/command.rb DELETED
@@ -1,36 +0,0 @@
1
- require_relative "iremote"
2
- require_relative "meta"
3
-
4
- class Command < IRemote
5
- include Commands_Meta_Functions
6
-
7
- def initialize(remote)
8
- super
9
- self.make_action_prop :show, :restart, :shutdown
10
- self.make_writer_bool :showvbanchat, :lock
11
- end
12
-
13
- def identifier
14
- :command
15
- end
16
-
17
- def hide
18
- self.setter("show", 0)
19
- end
20
-
21
- def load(value)
22
- raise VMRemoteErrors.new("Expected a string") unless value.is_a? String
23
- self.setter("load", value)
24
- sleep(0.2)
25
- end
26
-
27
- def save(value)
28
- raise VMRemoteErrors.new("Expected a string") unless value.is_a? String
29
- self.setter("save", value)
30
- sleep(0.2)
31
- end
32
-
33
- def reset
34
- @remote.set_config("reset")
35
- end
36
- end