voicemeeter_api_ruby 4.1.1 → 4.1.4

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/button.rb CHANGED
@@ -1,23 +1,23 @@
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
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 CHANGED
@@ -1,128 +1,125 @@
1
- require 'ffi'
2
- require_relative 'inst'
1
+ require "ffi"
2
+ require_relative "inst"
3
3
 
4
4
  include InstallationFunctions
5
5
 
6
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
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?
25
109
  end
110
+ @retval = retval
111
+ end
26
112
 
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,
71
- :VBVMR_GetLevel,
72
- %i[long long pointer],
73
- :long
74
-
75
- attach_function :vm_get_num_indevices,
76
- :VBVMR_Input_GetDeviceNumber, [], :long
77
- attach_function :vm_get_desc_indevices,
78
- :VBVMR_Input_GetDeviceDescA, %i[long pointer pointer pointer],
79
- :long
80
-
81
- attach_function :vm_get_num_outdevices,
82
- :VBVMR_Output_GetDeviceNumber, [], :long
83
- attach_function :vm_get_desc_outdevices,
84
- :VBVMR_Output_GetDeviceDescA, %i[long pointer pointer pointer],
85
- :long
86
-
87
-
88
- @@cdll =
89
- lambda do |func, *args|
90
- self.retval = [send("vm_#{func}", *args), func]
91
- end
92
-
93
- def clear_polling() = while pdirty? || mdirty?; end
94
-
95
- def polling(func, **kwargs)
96
- params = {
97
- 'get_parameter' => kwargs[:name],
98
- 'get_buttonstatus' => "mb_#{kwargs[:id]}_#{kwargs[:mode]}",
99
- }
100
- return @cache.delete(params[func]) if @cache.key? params[func]
101
-
102
- clear_polling if @sync
103
-
104
- yield
105
- end
113
+ public
106
114
 
107
- def retval=(values)
108
- ' Writer validation for CAPI calls '
109
- retval, func = *values
110
- unless [:get_num_indevices, :get_num_outdevices].include? func
111
- raise CAPIErrors.new(retval, func) if retval&.nonzero?
112
- end
113
- @retval = retval
114
- end
115
-
116
- public
115
+ def pdirty? = vm_pdirty&.nonzero?
117
116
 
118
- def pdirty?() = vm_pdirty&.nonzero?
117
+ def mdirty? = vm_mdirty&.nonzero?
119
118
 
120
- def mdirty?() = vm_mdirty&.nonzero?
121
-
122
- def ldirty?
123
- @strip_buf, @bus_buf = _get_levels
124
- return !(
125
- @cache['strip_level'] == @strip_buf && @cache['bus_level'] == @bus_buf
126
- )
127
- end
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
128
125
  end
data/lib/command.rb CHANGED
@@ -1,36 +1,36 @@
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
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
data/lib/configs.rb CHANGED
@@ -1,81 +1,80 @@
1
- require 'kinds'
2
- require 'toml'
3
-
4
- module Configs
5
- private
6
-
7
- @@configs = Hash.new
8
-
9
- class TOMLStrBuilder
10
- def initialize(kind)
11
- @p_in, @v_in = kind[:layout][:strip].values
12
- @p_out, @v_out = kind[:layout][:bus].values
13
- @vs_params =
14
- ['mute = false', 'mono = false', 'solo = false', 'gain = 0.0'] +
15
- (1..@p_out).map { |i| "A#{i} = false" } +
16
- (1..@v_out).map { |i| "B#{i} = false" }
17
-
18
- @ps_params = @vs_params + ['comp = 0.0', 'gate = 0.0']
19
- @bus_params = ['mono = false', 'eq = false', 'mute = false']
20
- end
21
-
22
- def build
23
- '
24
- Builds a TOML script for the parser
25
- '
26
- @ps = (0...@p_in).map { |i| ["[strip_#{i}]"] + @ps_params }
27
- @ps.map! { |a| a.map { |s| s.gsub('B1 = false', 'B1 = true') } }
28
- @vs =
29
- (@p_in...(@p_in + @v_in)).map do |i|
30
- ["[strip_#{i}]"] + @vs_params
31
- end
32
- @vs.map! { |a| a.map { |s| s.gsub('A1 = false', 'A1 = true') } }
33
-
34
- @b =
35
- (0...(@p_out + @v_out)).map { |i| ["[bus_#{i}]"] + @bus_params }
36
-
37
- [@ps + @vs + @b].join("\n")
38
- end
39
- end
40
-
41
- def parser(data)
42
- TOML::Parser.new(data).parsed
43
- end
44
-
45
- def get_configs(kind_id)
46
- file_pattern =
47
- File.join(File.dirname(__dir__), 'configs', "#{kind_id}", '*.toml')
48
-
49
- Dir
50
- .glob(file_pattern)
51
- .to_h do |toml_file|
52
- filename = File.basename(toml_file, '.toml')
53
- puts "loading config #{kind_id}/#{filename} into memory"
54
- [filename, parser(File.read(toml_file))]
55
- end
56
- end
57
-
58
- def loader
59
- if @@configs.empty?
60
- builder = TOMLStrBuilder.new(@kind)
61
- puts 'loading config reset into memory'
62
- @@configs['reset'] = parser(builder.build)
63
- @@configs.merge!(get_configs(@kind.name.to_s))
64
- end
65
- end
66
-
67
- public
68
-
69
- def set_config(value)
70
- loader
71
- unless @@configs.key? value
72
- raise VMRemoteErrors.new("No profile with name #{value} was loaded")
73
- end
74
-
75
- self.send('set_multi', @@configs[value])
76
- puts "config #{@kind.name}/#{value} applied!"
77
- sleep(@delay)
78
- end
79
-
80
- alias_method 'apply_config', :set_config
81
- end
1
+ require "kinds"
2
+ require "toml"
3
+
4
+ module Configs
5
+ private
6
+
7
+ @@configs = Hash.new
8
+
9
+ class TOMLStrBuilder
10
+ def initialize(kind)
11
+ @p_in, @v_in = kind[:layout][:strip].values
12
+ @p_out, @v_out = kind[:layout][:bus].values
13
+ @vs_params =
14
+ ["mute = false", "mono = false", "solo = false", "gain = 0.0"] +
15
+ (1..@p_out).map { |i| "A#{i} = false" } +
16
+ (1..@v_out).map { |i| "B#{i} = false" }
17
+
18
+ @ps_params = @vs_params + ["comp = 0.0", "gate = 0.0"]
19
+ @bus_params = ["mono = false", "eq = false", "mute = false"]
20
+ end
21
+
22
+ def build
23
+ "
24
+ Builds a TOML script for the parser
25
+ "
26
+ @ps = (0...@p_in).map { |i| ["[strip_#{i}]"] + @ps_params }
27
+ @ps.map! { |a| a.map { |s| s.gsub("B1 = false", "B1 = true") } }
28
+ @vs = (@p_in...(@p_in + @v_in)).map { |i| ["[strip_#{i}]"] + @vs_params }
29
+ @vs.map! { |a| a.map { |s| s.gsub("A1 = false", "A1 = true") } }
30
+
31
+ @b = (0...(@p_out + @v_out)).map { |i| ["[bus_#{i}]"] + @bus_params }
32
+
33
+ [@ps + @vs + @b].join("\n")
34
+ end
35
+ end
36
+
37
+ def parser(data)
38
+ TOML::Parser.new(data).parsed
39
+ end
40
+
41
+ def get_configs(kind_id)
42
+ file_path = File.join(Dir.pwd, "configs", "#{kind_id}")
43
+
44
+ if Dir.exist?(file_path)
45
+ Dir
46
+ .glob(File.join(file_path, "*.toml"))
47
+ .to_h do |toml_file|
48
+ filename = File.basename(toml_file, ".toml")
49
+ puts "loading config #{kind_id}/#{filename} into memory"
50
+ [filename, parser(File.read(toml_file))]
51
+ end
52
+ end
53
+ end
54
+
55
+ def loader
56
+ if @@configs.empty?
57
+ builder = TOMLStrBuilder.new(@kind)
58
+ puts "loading config reset into memory"
59
+ @@configs["reset"] = parser(builder.build)
60
+ configs = get_configs(@kind.name.to_s)
61
+
62
+ @@configs.merge!(configs) unless configs.nil?
63
+ end
64
+ end
65
+
66
+ public
67
+
68
+ def set_config(value)
69
+ loader
70
+ unless @@configs.key? value
71
+ raise VMRemoteErrors.new("No profile with name #{value} was loaded")
72
+ end
73
+
74
+ self.send("set_multi", @@configs[value])
75
+ puts "config #{@kind.name}/#{value} applied!"
76
+ sleep(@delay)
77
+ end
78
+
79
+ alias_method "apply_config", :set_config
80
+ end
data/lib/device.rb CHANGED
@@ -1,24 +1,24 @@
1
- require_relative 'iremote'
2
- require_relative 'meta'
1
+ require_relative "iremote"
2
+ require_relative "meta"
3
3
 
4
4
  class Device
5
- def initialize(remote)
6
- @remote = remote
7
- end
5
+ def initialize(remote)
6
+ @remote = remote
7
+ end
8
8
 
9
- def getter(**kwargs)
10
- return @remote.get_num_devices(kwargs[:direction]) if kwargs[:index].nil?
9
+ def getter(**kwargs)
10
+ return @remote.get_num_devices(kwargs[:direction]) if kwargs[:index].nil?
11
11
 
12
- vals = @remote.get_device_description(kwargs[:index], kwargs[:direction])
13
- types = { 1 => 'mme', 3 => 'wdm', 4 => 'ks', 5 => 'asio' }
14
- { 'name': vals[0], 'type': types[vals[1]], 'id': vals[2] }
15
- end
12
+ vals = @remote.get_device_description(kwargs[:index], kwargs[:direction])
13
+ types = { 1 => "mme", 3 => "wdm", 4 => "ks", 5 => "asio" }
14
+ { name: vals[0], type: types[vals[1]], id: vals[2] }
15
+ end
16
16
 
17
- def ins() = getter(direction: 'in')
17
+ def ins = getter(direction: "in")
18
18
 
19
- def outs() = getter(direction: 'out')
19
+ def outs = getter(direction: "out")
20
20
 
21
- def input(i) = getter(index: i, direction: 'in')
21
+ def input(i) = getter(index: i, direction: "in")
22
22
 
23
- def output(i) = getter(index: i, direction: 'out')
23
+ def output(i) = getter(index: i, direction: "out")
24
24
  end
data/lib/errors.rb CHANGED
@@ -1,39 +1,41 @@
1
1
  module Errors
2
- class VMRemoteErrors < StandardError
3
- end
2
+ class VMRemoteErrors < StandardError
3
+ end
4
4
 
5
- class InstallErrors < VMRemoteErrors
6
- end
5
+ class InstallErrors < VMRemoteErrors
6
+ end
7
7
 
8
- class CAPIErrors < VMRemoteErrors
9
- attr_accessor :value, :func
8
+ class CAPIErrors < VMRemoteErrors
9
+ attr_accessor :value, :func
10
10
 
11
- def initialize(value, func)
12
- self.value = value
13
- self.func = func
14
- end
11
+ def initialize(value, func)
12
+ self.value = value
13
+ self.func = func
14
+ end
15
15
 
16
- def message
17
- "When attempting to run function #{@func} the
18
- C API returned value #{@value}. See documentation for further info"
19
- end
16
+ def message
17
+ "
18
+ When attempting to run function #{@func} the
19
+ C API returned value #{@value}. See documentation for further info
20
+ "
20
21
  end
22
+ end
21
23
 
22
- class OutOfBoundsErrors < VMRemoteErrors
23
- attr_accessor :range
24
+ class OutOfBoundsErrors < VMRemoteErrors
25
+ attr_accessor :range
24
26
 
25
- def initialize(range)
26
- self.range = range
27
- end
27
+ def initialize(range)
28
+ self.range = range
29
+ end
28
30
 
29
- def message
30
- if @range.kind_of?(Range)
31
- "Value error, expected value in range (#{range.first}..#{range.last})"
32
- elsif @range.kind_of?(Array)
33
- "Value error, expected one of: #{@range}"
34
- else
35
- "Value error, expected #{@range}"
36
- end
37
- end
31
+ def message
32
+ if @range.kind_of?(Range)
33
+ "Value error, expected value in range (#{range.first}..#{range.last})"
34
+ elsif @range.kind_of?(Array)
35
+ "Value error, expected one of: #{@range}"
36
+ else
37
+ "Value error, expected #{@range}"
38
+ end
38
39
  end
40
+ end
39
41
  end