voicemeeter_api_ruby 2.0.2 → 3.0.0

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,20 +1,29 @@
1
- require 'open3'
2
- require_relative 'errors'
3
- require_relative 'base'
4
-
5
- module RunVM
6
- include Base
7
-
8
- def run_voicemeeter
9
- if VM_PATH.join(@properties[:exe]).executable?
10
- exe_path = String(VM_PATH.join(@properties[:exe]))
11
- else
12
- raise InstallErrors.new("Could not find Voicemeeter exe file")
13
- end
14
-
15
- Open3.popen3(exe_path, '')
16
- sleep(1)
17
-
18
- clear_polling
19
- end
20
- 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 == '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
data/lib/strip.rb CHANGED
@@ -1,49 +1,80 @@
1
- require_relative 'channel'
2
-
3
-
4
- class Strip < IChannel
5
- attr_reader :num_A, :num_B
6
-
7
- def self.make(remote, layout_strip, out_channels)
8
- "
9
- Factory function for Strip classes.
10
- "
11
- p_in = layout_strip[:p_in]
12
- v_in = layout_strip[:v_in]
13
- num_A = out_channels[:p_out]
14
- num_B = out_channels[:v_out]
15
-
16
- (0...(p_in + v_in)).map do |i|
17
- i < p_in ? \
18
- PhysicalStrip.new(remote, i, num_A, num_B) : \
19
- VirtualStrip.new(remote, i, num_A, num_B)
20
- end
21
- end
22
-
23
- def initialize(remote, i, num_A, num_B)
24
- super(remote, i)
25
- self.make_accessor_bool :solo, :mute, :mono
26
- self.make_accessor_float :gain
27
- self._make_channel_props(num_A, num_B)
28
- end
29
-
30
- def cmd
31
- return "Strip[#{@index}]"
32
- end
33
- end
34
-
35
- class PhysicalStrip < Strip
36
- def initialize(remote, i, num_A, num_B)
37
- super
38
- self.make_accessor_float :comp, :gate
39
- self.make_accessor_int :limit
40
- self.make_reader_only :device, :sr
41
- end
42
- end
43
-
44
- class VirtualStrip < Strip
45
- def initialize(remote, i, num_A, num_B)
46
- super
47
- self.make_accessor_bool :mc, :k
48
- end
49
- end
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
data/lib/vban.rb CHANGED
@@ -1,92 +1,103 @@
1
- require_relative 'meta'
2
- require_relative 'errors'
3
-
4
-
5
- class IVban
6
- include Vban_Meta_Functions
7
-
8
- attr_accessor :remote, :index
9
-
10
- def initialize(remote, index)
11
- self.remote = remote
12
- self.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
- return "vban.#{self.direction}stream[#{@index}]"
25
- end
26
-
27
- def direction
28
- raise NotImplementedError
29
- end
30
- end
31
-
32
-
33
- class Vban < IVban
34
- def self.make(remote, vban_streams)
35
- "
36
- Factory function for Vban class.
37
-
38
- Returns a mixin of instream/outstream subclasses
39
- "
40
- class << self
41
- attr_accessor :instream, :outstream, :remote
42
-
43
- def enable
44
- @remote.set_parameter("vban.enable", 1)
45
- end
46
- def disable
47
- @remote.set_parameter("vban.enable", 0)
48
- end
49
- end
50
-
51
- self.instream =
52
- (0...vban_streams[:instream]).map do |i|
53
- VbanInstream.new(remote, i)
54
- end
55
- self.outstream =
56
- (0...vban_streams[:outstream]).map do |i|
57
- VbanOutstream.new(remote, i)
58
- end
59
-
60
- self.remote = remote
61
- return self
62
- end
63
-
64
- def initialize(remote, i)
65
- super
66
- self.make_accessor_bool :on
67
- self.make_accessor_string :name, :ip
68
- self.make_accessor_int :quality, :route
69
- end
70
- end
71
-
72
- class VbanInstream < Vban
73
- def initialize(remote, i)
74
- super
75
- self.make_reader_int :sr, :channel, :bit
76
- end
77
-
78
- def direction
79
- return "in"
80
- end
81
- end
82
-
83
- class VbanOutstream < Vban
84
- def initialize(remote, i)
85
- super
86
- self.make_accessor_int :sr, :channel, :bit
87
- end
88
-
89
- def direction
90
- return "out"
91
- end
92
- end
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
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module Voicemeeter_API_Ruby
2
- VERSION = '2.0.2'
3
- end
1
+ module Voicemeeter_API_Ruby
2
+ VERSION = '3.0.0'
3
+ end
data/lib/voicemeeter.rb CHANGED
@@ -1,30 +1,73 @@
1
- require_relative 'routines'
2
- require_relative 'errors'
3
-
4
- module Voicemeeter
5
- class Remote < Routines
6
- def self.make
7
- ["basic", "banana", "potato"].to_h do |kind|
8
- [kind, Remote.new(kind)]
9
- end
10
- end
11
-
12
- def run
13
- if block_given?
14
- yield
15
-
16
- logout
17
- end
18
- end
19
- end
20
-
21
- def remote(kind)
22
- _remotes = Remote.make
23
-
24
- raise VMRemoteErrors.new("Unknown Voicemeeter Kind") unless _remotes[kind]
25
- _remotes[kind].login
26
- return _remotes[kind]
27
- end
28
-
29
- module_function :remote
30
- end
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
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: 2.0.2
4
+ version: 3.0.0
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-01-18 00:00:00.000000000 Z
11
+ date: 2022-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -31,61 +31,57 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.9.10
33
33
  - !ruby/object:Gem::Dependency
34
- name: rake
34
+ name: toml
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '13.0'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 13.0.3
43
- type: :development
39
+ version: 0.3.0
40
+ type: :runtime
44
41
  prerelease: false
45
42
  version_requirements: !ruby/object:Gem::Requirement
46
43
  requirements:
47
44
  - - "~>"
48
45
  - !ruby/object:Gem::Version
49
- version: '13.0'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 13.0.3
46
+ version: 0.3.0
53
47
  - !ruby/object:Gem::Dependency
54
- name: minitest
48
+ name: rspec
55
49
  requirement: !ruby/object:Gem::Requirement
56
50
  requirements:
57
51
  - - "~>"
58
52
  - !ruby/object:Gem::Version
59
- version: '5.14'
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 5.14.4
53
+ version: '3.4'
63
54
  type: :development
64
55
  prerelease: false
65
56
  version_requirements: !ruby/object:Gem::Requirement
66
57
  requirements:
67
58
  - - "~>"
68
59
  - !ruby/object:Gem::Version
69
- version: '5.14'
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- version: 5.14.4
60
+ version: '3.4'
73
61
  description: A wrapper for Voicemeeter virtual mixer API in Ruby
74
62
  email: code@onyxandiris.online
75
63
  executables: []
76
64
  extensions: []
77
- extra_rdoc_files: []
65
+ extra_rdoc_files:
66
+ - README.md
67
+ - CHANGELOG.md
68
+ - LICENSE
78
69
  files:
70
+ - CHANGELOG.md
71
+ - LICENSE
72
+ - README.md
79
73
  - lib/base.rb
80
74
  - lib/bus.rb
81
75
  - lib/button.rb
76
+ - lib/cbindings.rb
82
77
  - lib/channel.rb
83
78
  - lib/command.rb
84
79
  - lib/errors.rb
85
80
  - lib/inst.rb
81
+ - lib/kinds.rb
86
82
  - lib/meta.rb
83
+ - lib/profiles.rb
87
84
  - lib/recorder.rb
88
- - lib/routines.rb
89
85
  - lib/runvm.rb
90
86
  - lib/strip.rb
91
87
  - lib/vban.rb
@@ -93,7 +89,7 @@ files:
93
89
  - lib/voicemeeter.rb
94
90
  homepage: https://rubygems.org/gems/voicemeeter_api_ruby
95
91
  licenses:
96
- - NGPL
92
+ - MIT
97
93
  metadata:
98
94
  source_code_uri: https://github.com/onyx-and-iris/voicemeeter-api-ruby.git
99
95
  post_install_message:
@@ -104,14 +100,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
100
  requirements:
105
101
  - - ">="
106
102
  - !ruby/object:Gem::Version
107
- version: '2.7'
103
+ version: '3.0'
108
104
  required_rubygems_version: !ruby/object:Gem::Requirement
109
105
  requirements:
110
106
  - - ">="
111
107
  - !ruby/object:Gem::Version
112
108
  version: '0'
113
109
  requirements: []
114
- rubygems_version: 3.1.4
110
+ rubygems_version: 3.3.7
115
111
  signing_key:
116
112
  specification_version: 4
117
113
  summary: Voicemeeter API wrapper