voicemeeter_api_ruby 4.1.5 → 4.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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