voicemeeter_api_ruby 2.0.4 → 4.1.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/recorder.rb CHANGED
@@ -1,45 +1,20 @@
1
+ require_relative 'iremote'
1
2
  require_relative 'meta'
2
3
 
4
+ class Recorder < IRemote
5
+ '
6
+ Concrete Recorder class
7
+ '
3
8
 
4
- class IRecorder
5
- """
6
- Base class for Recorder object
7
- """
8
- include Meta_Functions
9
-
10
- attr_accessor :remote
11
-
12
- def initialize(remote)
13
- self.remote = remote
14
- end
15
-
16
- def getter(param)
17
- @remote.get_parameter("#{self.cmd}.#{param}")
18
- end
19
-
20
- def setter(param, value)
21
- @remote.set_parameter("#{self.cmd}.#{param}", value)
22
- end
23
-
24
- def cmd
25
- raise NotImplementedError
26
- end
27
- end
28
-
29
-
30
- class Recorder < IRecorder
31
- """
32
- Concrete class for recorder
33
- """
34
9
  def initialize(remote)
35
- super(remote)
36
- self.make_writer_only :play, :stop, :record, :ff, :rew
10
+ super
11
+ self.make_action_prop :play, :stop, :record, :ff, :rew
37
12
 
38
- num_A, num_B = remote.layout[:bus].map { |k, v| v }
13
+ num_A, num_B = remote.kind.layout[:bus].values
39
14
  self.make_accessor_bool *make_channel_props(num_A, num_B)
40
15
  end
41
16
 
42
- def cmd
43
- return "recorder"
17
+ def identifier
18
+ :recorder
44
19
  end
45
20
  end
data/lib/runvm.rb CHANGED
@@ -1,18 +1,29 @@
1
- require_relative 'base'
1
+ require_relative 'cbindings'
2
+ require_relative 'kinds'
2
3
 
3
- include Base
4
+ include CBindings
5
+ include Kinds
4
6
 
5
7
  module RunVM
6
- """
8
+ '
7
9
  Starts Voicemeeter of the Kind requested.
8
- """
9
- def start(kind)
10
- enums = $kinds_all.map.with_index do |val, i|
11
- get_arch == 64 && val == "potato" ? [val, i+4] : [val, i+1]
10
+ '
11
+ def start(kind_id)
12
+ unless Kinds.kind_map.key? kind_id
13
+ raise VMRemoteErrors.new('Unknown Voicemeeter Kind.')
12
14
  end
15
+
16
+ enums =
17
+ Kinds.kinds_all.map.with_index do |kind, i|
18
+ if OS_BITS == 64 && kind.name.to_s == 'potato'
19
+ [kind.name.to_s, i + 4]
20
+ else
21
+ [kind.name.to_s, i + 1]
22
+ end
23
+ end
13
24
  exes = enums.to_h { |k, v| [k, v.to_i] }
14
25
 
15
- run_as('runvm', exes[kind])
26
+ send(:vm_runvm, exes[kind_id])
16
27
  sleep(1)
17
28
  end
18
29
  end
data/lib/strip.rb CHANGED
@@ -1,19 +1,26 @@
1
- require_relative 'channel'
1
+ require_relative 'iremote'
2
+ require_relative 'mixin'
2
3
 
4
+ class Strip < IRemote
5
+ '
6
+ Concrete Strip class
7
+ '
8
+ include Channel_Meta_Functions
9
+ include Fades
10
+
11
+ attr_accessor :gainlayer, :levels
3
12
 
4
- class Strip < IChannel
5
- """
6
- Concrete class for Strip objects
7
- """
8
13
  def self.make(remote, layout_strip)
9
- "
14
+ '
10
15
  Factory function for Strip classes.
11
- "
12
- p_in, v_in = layout_strip.map { |k, v| v }
16
+ '
17
+ p_in, v_in = layout_strip.values
13
18
  (0...(p_in + v_in)).map do |i|
14
- i < p_in ? \
15
- PhysicalStrip.new(remote, i) : \
16
- VirtualStrip.new(remote, i)
19
+ if i < p_in
20
+ PhysicalStrip.new(remote, i)
21
+ else
22
+ VirtualStrip.new(remote, i)
23
+ end
17
24
  end
18
25
  end
19
26
 
@@ -21,22 +28,25 @@ class Strip < IChannel
21
28
  super
22
29
  self.make_accessor_bool :solo, :mute, :mono
23
30
  self.make_accessor_float :gain
31
+ self.make_accessor_int :limit
24
32
  self.make_accessor_string :label
25
33
 
26
- num_A, num_B = remote.layout[:bus].map { |k, v| v }
34
+ num_A, num_B = remote.kind.layout[:bus].values
27
35
  self.make_accessor_bool *make_channel_props(num_A, num_B)
36
+
37
+ @gainlayer = (0...8).map { |j| GainLayer.new(remote, i, j) }
38
+ @levels = StripLevels.new(remote, i)
28
39
  end
29
40
 
30
- def cmd
31
- return "Strip[#{@index}]"
41
+ def identifier
42
+ "strip[#{@index}]"
32
43
  end
33
44
  end
34
45
 
35
46
  class PhysicalStrip < Strip
36
47
  def initialize(remote, i)
37
48
  super
38
- self.make_accessor_float :comp, :gate
39
- self.make_accessor_int :limit
49
+ self.make_accessor_float :comp, :gate, :audibility
40
50
  self.make_reader_only :device, :sr
41
51
  end
42
52
  end
@@ -44,6 +54,78 @@ end
44
54
  class VirtualStrip < Strip
45
55
  def initialize(remote, i)
46
56
  super
47
- self.make_accessor_bool :mc, :k
57
+ self.make_accessor_bool :mc
58
+ self.make_accessor_int :k
59
+ self.make_accessor_float :bass, :mid, :treble
60
+ end
61
+
62
+ def appgain(name, gain)
63
+ self.setter('AppGain', "(\"#{name}\", #{gain})")
64
+ end
65
+
66
+ def appmute(name, mute)
67
+ self.setter('AppMute', "(\"#{name}\", #{mute ? 1 : 0})")
68
+ end
69
+ end
70
+
71
+ class GainLayer < IRemote
72
+ def initialize(remote, i, j)
73
+ super(remote, i)
74
+ @j = j
48
75
  end
76
+
77
+ def identifier
78
+ "strip[#{@index}]"
79
+ end
80
+
81
+ def gain
82
+ self.getter("gainlayer[#{@j}]")
83
+ end
84
+
85
+ def gain=(value)
86
+ self.setter("gainlayer[#{@j}]", value)
87
+ end
88
+ end
89
+
90
+ class StripLevels < IRemote
91
+ def initialize(remote, i)
92
+ super
93
+ if i < @remote.p_in
94
+ @init = i * 2
95
+ @offset = 2
96
+ else
97
+ @init = (@remote.p_in * 2) + ((i - @remote.p_in) * 8)
98
+ @offset = 8
99
+ end
100
+ end
101
+
102
+ def identifier
103
+ "strip[#{@index}]"
104
+ end
105
+
106
+ def get_level(mode)
107
+ if @remote.running
108
+ vals = @remote.cache['strip_level'][@init, @offset]
109
+ else
110
+ vals = (@init...@offset).map { |i| get_level(mode, i) }
111
+ end
112
+ vals.map { |x| x > 0 ? (20 * Math.log(x, 10)).round(1) : -200.0 }
113
+ end
114
+
115
+ def prefader
116
+ @remote.strip_mode = 0
117
+ get_level(0)
118
+ end
119
+
120
+ def postfader
121
+ @remote.strip_mode = 1
122
+ get_level(1)
123
+ end
124
+
125
+ def postmute
126
+ @remote.strip_mode = 2
127
+ get_level(2)
128
+ end
129
+
130
+ def isdirty?() = @remote._strip_comp[@init, @offset].any?
49
131
  end
data/lib/vban.rb CHANGED
@@ -1,106 +1,78 @@
1
+ require_relative 'iremote'
1
2
  require_relative 'meta'
2
3
  require_relative 'errors'
3
4
 
4
-
5
- class IVban
6
- """
7
- Base class for Vban objects
8
- """
5
+ class VbanStream < IRemote
6
+ '
7
+ A class representing a VBAN stream
8
+ '
9
9
  include Vban_Meta_Functions
10
10
 
11
- attr_accessor :remote, :index
12
-
13
- def initialize(remote, index)
14
- self.remote = remote
15
- self.index = index
16
- end
17
-
18
- def getter(param, is_string=false)
19
- @remote.get_parameter("#{self.cmd}.#{param}", is_string)
20
- end
21
-
22
- def setter(param, value)
23
- @remote.set_parameter("#{self.cmd}.#{param}", value)
11
+ def initialize(remote, i)
12
+ super
13
+ self.make_accessor_bool :on
14
+ self.make_accessor_string :name, :ip
15
+ self.make_accessor_int :quality, :route
24
16
  end
25
17
 
26
- def cmd
27
- return "vban.#{self.direction}stream[#{@index}]"
18
+ def identifier
19
+ "vban.#{self.direction}stream[#{@index}]"
28
20
  end
29
21
 
30
22
  def direction
31
- raise NotImplementedError
32
- end
33
-
34
- def set_multi(param_hash)
35
- param_hash.each do |(key,val)|
36
- self.send("#{key}=", val)
37
- end
23
+ raise 'Called abstract mehod: direction'
38
24
  end
39
25
  end
40
26
 
41
-
42
- class Vban < IVban
43
- """
44
- Concrete class for Vban objects
45
- """
46
- def self.make(remote, vban_streams)
47
- "
48
- Factory function for Vban class.
49
-
50
- Returns a mixin of instream/outstream subclasses
51
- "
52
- class << self
53
- attr_accessor :instream, :outstream, :remote
54
-
55
- def enable
56
- @remote.set_parameter("vban.enable", 1)
57
- end
58
- def disable
59
- @remote.set_parameter("vban.enable", 0)
60
- end
61
- end
62
-
63
- self.instream =
64
- (0...vban_streams[:instream]).map do |i|
65
- VbanInstream.new(remote, i)
66
- end
67
- self.outstream =
68
- (0...vban_streams[:outstream]).map do |i|
69
- VbanOutstream.new(remote, i)
70
- end
71
-
72
- self.remote = remote
73
- return self
74
- end
75
-
27
+ class VbanInstream < VbanStream
28
+ '
29
+ A subclass representing a VBAN Instream
30
+ '
76
31
  def initialize(remote, i)
77
32
  super
78
- self.make_accessor_bool :on
79
- self.make_accessor_string :name, :ip
80
- self.make_accessor_int :quality, :route
33
+ self.make_reader_int :sr, :channel, :bit
81
34
  end
82
- end
83
35
 
36
+ def direction
37
+ :in
38
+ end
39
+ end
84
40
 
85
- class VbanInstream < Vban
41
+ class VbanOutstream < VbanStream
42
+ '
43
+ A subclass representing a VBAN Outstream
44
+ '
86
45
  def initialize(remote, i)
87
46
  super
88
- self.make_reader_int :sr, :channel, :bit
47
+ self.make_accessor_int :sr, :channel, :bit
89
48
  end
90
49
 
91
50
  def direction
92
- return "in"
51
+ :out
93
52
  end
94
53
  end
95
54
 
55
+ class Vban
56
+ attr_accessor :instream, :outstream
96
57
 
97
- class VbanOutstream < Vban
98
- def initialize(remote, i)
99
- super
100
- self.make_accessor_int :sr, :channel, :bit
58
+ def initialize(remote, vban_streams)
59
+ '
60
+ Initializes a Vban class
61
+
62
+ Creates an array for each in/out stream
63
+ '
64
+ vban_in, vban_out = vban_streams.values
65
+ self.instream = (0...vban_in).map { |i| VbanInstream.new(remote, i) }
66
+ self.outstream = (0...vban_out).map { |i| VbanOutstream.new(remote, i) }
67
+
68
+ @remote = remote
101
69
  end
102
70
 
103
- def direction
104
- return "out"
71
+ def enable
72
+ @remote.set_parameter('vban.enable', 1)
73
+ end
74
+
75
+ def disable
76
+ @remote.set_parameter('vban.enable', 0)
105
77
  end
106
78
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Voicemeeter_API_Ruby
2
- VERSION = '2.0.4'
2
+ VERSION = '4.1.0'
3
3
  end
data/lib/voicemeeter.rb CHANGED
@@ -1,60 +1,86 @@
1
- require_relative 'routines'
2
- require_relative 'errors'
3
-
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'
4
9
 
5
10
  module Voicemeeter
6
11
  include RunVM
7
12
 
8
13
  private
9
- class Remote < Routines
10
- """
11
- Remote class, subclasses Routines
12
14
 
13
- Console layout built according to version definition.
15
+ class Remote < Base
16
+ include Kinds
17
+ '
18
+ Remote class, subclasses Base
14
19
 
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_all.to_h do |kind|
24
- [kind, Remote.new(kind, **kwargs)]
25
- end
26
- end
20
+ Console layout built according to a kind
27
21
 
28
- def initialize(kind)
22
+ Offers a run method for resource closure.
23
+ '
24
+ def initialize(kind, **kwargs)
29
25
  super
30
- self.strip = Strip.make(self, @layout[:strip])
31
- self.bus = Bus.make(self, @layout[:bus])
32
- self.button = MacroButton.make(self, @layout[:mb])
33
- self.vban = Vban.make(self, @layout[:vban])
26
+ self.strip = Strip.make(self, kind.layout[:strip])
27
+ self.bus = Bus.make(self, kind.layout[:bus])
28
+ self.button = MacroButton.make(self, kind.layout[:mb])
29
+ self.vban = Vban.new(self, kind.layout[:vban])
34
30
  self.command = Command.new(self)
35
31
  self.recorder = Recorder.new(self)
32
+ self.device = Device.new(self)
36
33
  end
37
34
 
38
35
  def run
36
+ '
37
+ Handles login/logout
38
+
39
+ Starts/stops the observable thread.
40
+ '
41
+ login
42
+ init_thread
43
+
39
44
  yield if block_given?
40
-
41
45
  ensure
46
+ end_thread
42
47
  logout
43
48
  end
44
49
  end
45
50
 
46
51
  public
47
- def remote(kind, **kwargs)
48
- """
49
- Request a Remote for a specific kind and login to the API
50
- """
51
- _remotes = Remote.make(**kwargs)
52
52
 
53
- raise VMRemoteErrors.new("Unknown Voicemeeter Kind.") unless _remotes.key? kind
53
+ def self.remote(kind_id, **kwargs)
54
+ '
55
+ Factory method for remotes.
56
+
57
+ Creates a hash of remote classes, one for each kind.
58
+
59
+ Handles kind_id request errors.
60
+
61
+ Returns a remote class of the kind requested.
62
+ '
63
+ _remotes =
64
+ Kinds.kinds_all.to_h do |kind|
65
+ [kind.name.to_s, Remote.new(kind, **kwargs)]
66
+ end
67
+
68
+ unless _remotes.key? kind_id
69
+ raise VMRemoteErrors.new('Unknown Voicemeeter Kind.')
70
+ end
71
+ _remotes[kind_id]
72
+ end
73
+
74
+ def self.testing
75
+ '
76
+ Returns a random Remote class
77
+ '
78
+ unless ENV['RACK_ENV'] == 'dev'
79
+ raise VMRemoteErrors.new('Not in developer mode')
80
+ end
54
81
 
55
- _remotes[kind].login
56
- return _remotes[kind]
82
+ Remote.new(Kinds.kinds_all.sample)
57
83
  end
58
84
 
59
- module_function :remote, :start
85
+ module_function :start
60
86
  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.4
4
+ version: 4.1.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-24 00:00:00.000000000 Z
11
+ date: 2022-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -45,61 +45,59 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: 0.3.0
47
47
  - !ruby/object:Gem::Dependency
48
- name: rake
48
+ name: observer
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '13.0'
54
51
  - - ">="
55
52
  - !ruby/object:Gem::Version
56
- version: 13.0.3
57
- type: :development
53
+ version: '0'
54
+ type: :runtime
58
55
  prerelease: false
59
56
  version_requirements: !ruby/object:Gem::Requirement
60
57
  requirements:
61
- - - "~>"
62
- - !ruby/object:Gem::Version
63
- version: '13.0'
64
58
  - - ">="
65
59
  - !ruby/object:Gem::Version
66
- version: 13.0.3
60
+ version: '0'
67
61
  - !ruby/object:Gem::Dependency
68
- name: minitest
62
+ name: rspec
69
63
  requirement: !ruby/object:Gem::Requirement
70
64
  requirements:
71
65
  - - "~>"
72
66
  - !ruby/object:Gem::Version
73
- version: '5.14'
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: 5.14.4
67
+ version: '3.4'
77
68
  type: :development
78
69
  prerelease: false
79
70
  version_requirements: !ruby/object:Gem::Requirement
80
71
  requirements:
81
72
  - - "~>"
82
73
  - !ruby/object:Gem::Version
83
- version: '5.14'
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- version: 5.14.4
74
+ version: '3.4'
87
75
  description: A wrapper for Voicemeeter virtual mixer API in Ruby
88
76
  email: code@onyxandiris.online
89
77
  executables: []
90
78
  extensions: []
91
- extra_rdoc_files: []
79
+ extra_rdoc_files:
80
+ - README.md
81
+ - CHANGELOG.md
82
+ - LICENSE
92
83
  files:
84
+ - CHANGELOG.md
85
+ - LICENSE
86
+ - README.md
93
87
  - lib/base.rb
94
88
  - lib/bus.rb
95
89
  - lib/button.rb
96
- - lib/channel.rb
90
+ - lib/cbindings.rb
97
91
  - lib/command.rb
92
+ - lib/configs.rb
93
+ - lib/device.rb
98
94
  - lib/errors.rb
99
95
  - lib/inst.rb
96
+ - lib/iremote.rb
97
+ - lib/kinds.rb
100
98
  - lib/meta.rb
99
+ - lib/mixin.rb
101
100
  - lib/recorder.rb
102
- - lib/routines.rb
103
101
  - lib/runvm.rb
104
102
  - lib/strip.rb
105
103
  - lib/vban.rb
@@ -107,7 +105,7 @@ files:
107
105
  - lib/voicemeeter.rb
108
106
  homepage: https://rubygems.org/gems/voicemeeter_api_ruby
109
107
  licenses:
110
- - NGPL
108
+ - MIT
111
109
  metadata:
112
110
  source_code_uri: https://github.com/onyx-and-iris/voicemeeter-api-ruby.git
113
111
  post_install_message:
@@ -118,14 +116,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
116
  requirements:
119
117
  - - ">="
120
118
  - !ruby/object:Gem::Version
121
- version: '2.7'
119
+ version: '3.0'
122
120
  required_rubygems_version: !ruby/object:Gem::Requirement
123
121
  requirements:
124
122
  - - ">="
125
123
  - !ruby/object:Gem::Version
126
124
  version: '0'
127
125
  requirements: []
128
- rubygems_version: 3.1.4
126
+ rubygems_version: 3.3.12
129
127
  signing_key:
130
128
  specification_version: 4
131
129
  summary: Voicemeeter API wrapper
data/lib/channel.rb DELETED
@@ -1,34 +0,0 @@
1
- require_relative 'meta'
2
- require_relative 'errors'
3
-
4
- class IChannel
5
- """
6
- Base class for audio channels
7
- """
8
- include Channel_Meta_Functions
9
-
10
- attr_accessor :remote, :index
11
-
12
- def initialize(remote, i)
13
- self.remote = remote
14
- self.index = i
15
- end
16
-
17
- def getter(param, is_string=false)
18
- @remote.get_parameter("#{self.cmd}.#{param}", is_string)
19
- end
20
-
21
- def setter(param, value)
22
- @remote.set_parameter("#{self.cmd}.#{param}", value)
23
- end
24
-
25
- def cmd
26
- raise NotImplementedError
27
- end
28
-
29
- def set_multi(param_hash)
30
- param_hash.each do |(key,val)|
31
- self.send("#{key}=", val)
32
- end
33
- end
34
- end