voicemeeter 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 638c89f56d0d2dbffe4ce78ca575cc9c23101509c721ccbd4009ee191575881e
4
- data.tar.gz: 9da9196098ac5a6f248d5febadee8e49fa8d43b9b23f663923c35ba200b58ed7
3
+ metadata.gz: 0f55435d4652f6d91df3f6255a410ab906989c2f996159e9f3dca99af4a5e56d
4
+ data.tar.gz: 9b65ecc40b287b9d6dc65a9becfb89cb5f210b9c34aa2b18408cf2741045ada0
5
5
  SHA512:
6
- metadata.gz: f81571b7ed2f35373e68d8c398d84ff6f375c819e1ec648b338df4296f7fe352d711b6ae3d419fec21eb9e2928e88b9070246da69d628149b3ea2defbe984ec6
7
- data.tar.gz: 4aac33247a3dcc5cf1debaa29dc243569034aa4c2c345bd2714b3097265f6ef22f1dccb91537963902fc9ebe19e9decd7229848318443c0bfcaef55b86fcffcf
6
+ metadata.gz: 6beffc9ce32f955be64359cbed4203dcef40ba8eac7a2a04770f1a74debd34123ac309e6688edf859f2a5e4b2b2df13c3a2b0a1ab97bbf9b2f0b4a1397b39d83
7
+ data.tar.gz: 2d72c6b775c0dcf87bba24e98a189f07b7e3f71a661cd278a860f428a0895436651003f7a76fe6159dad73f338a3ec94a9469b36d6c67dc04eb8ba89fbeb02e7
data/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Before any major/minor/patch is released all unit tests will be run to verify they pass.
9
+
10
+ ## [Unreleased] - These changes have not been added to RubyGems yet
11
+
12
+ - [ ]
13
+
14
+ ## [1.0.0] - 2023-09-01
15
+
16
+ ### Added
17
+
18
+ - Bindings and abstraction classes are implemented
19
+ - An event system:
20
+ - `pdirty`: parameter updates on the main Voicemeeter GUI
21
+ - `mdirty`: macrobutton updates
22
+ - `midi`: incoming data from a connected midi device
23
+ - `ldirty`: channel level updates
24
+ - An entry point for fetching a Remote class for each kind of Voicemeeter (basic, banana, potato)
25
+ - Logging system for reading messages sent by getters and setters.
26
+ - Strip class refinement in util.rb. It's scope should be limited to the CBindings module.
27
+ - rbs type signatures but some of them need updating.
28
+ - example user profile configs included with repo.
data/README.md CHANGED
@@ -491,7 +491,7 @@ vm.patch.postfxinsert = false
491
491
 
492
492
  ##### asio[i]
493
493
 
494
- - `get()`: int
494
+ - `get`: int
495
495
  - `set(patch_in)`: int, valid range determined by connected device.
496
496
 
497
497
  example:
@@ -504,7 +504,7 @@ i, from 0 to 10
504
504
 
505
505
  ##### A2[i] - A5[i]
506
506
 
507
- - `get()`: int
507
+ - `get`: int
508
508
  - `set(patch_out)`: int, valid range determined by connected device.
509
509
 
510
510
  example:
@@ -517,7 +517,7 @@ i, from 0 to 8.
517
517
 
518
518
  ##### composite[i]
519
519
 
520
- - `get()`: int
520
+ - `get`: int
521
521
  - `set(channel)`: int, from 0 up to number of channels depending on version.
522
522
 
523
523
  example:
@@ -572,7 +572,7 @@ vm.option.buffer.wdm = 512
572
572
 
573
573
  ##### delay[i]
574
574
 
575
- - `get()`: int
575
+ - `get`: int
576
576
  - `set(delay)`: int, from 0 to 500
577
577
 
578
578
  example:
@@ -702,9 +702,9 @@ The following methods are available:
702
702
  example:
703
703
 
704
704
  ```ruby
705
- vm.event.add(%w[pdirty mdirty midi ldirty])
705
+ vm.event.add(%i[pdirty mdirty midi ldirty])
706
706
 
707
- vm.event.remove(%w[pdirty mdirty midi ldirty])
707
+ vm.event.remove(%i[pdirty mdirty midi ldirty])
708
708
 
709
709
  # get a list of currently subscribed
710
710
  p vm.event.get
@@ -712,8 +712,6 @@ p vm.event.get
712
712
 
713
713
  ## `Voicemeeter Module`
714
714
 
715
- ### Remote class
716
-
717
715
  #### Voicemeeter::Remote
718
716
 
719
717
  You may pass the following optional keyword arguments:
@@ -745,9 +743,13 @@ vm.set("Strip[0].Gain", -3.6)
745
743
 
746
744
  ### Errors
747
745
 
748
- - `Errors::VMError`: Error raised when general errors occur.
749
- - `Errors::VMCAPIError`: Error raised when the C-API returns error values.
750
- - Error codes are stored in {Error Class}.code. For a full list of error codes [check the VoicemeeterRemote header file][voicemeeter remote header].
746
+ - `Errors::VMError`: Base Voicemeeter error class.
747
+ - `Errors::VMInstallError`: Raised when errors occur during installation.
748
+ - `Errors::VMCAPIError`: Raised when the C-API returns error codes.
749
+ - The following attributes are available:
750
+ - `fn_name`: name of the C-API function that failed.
751
+ - `code`: error code.
752
+ - For a full list of error codes [check the VoicemeeterRemote header file][voicemeeter remote header].
751
753
 
752
754
  ### Logging
753
755
 
@@ -207,9 +207,9 @@ module Voicemeeter
207
207
  data.each do |key, hash|
208
208
  case key.to_s.split("-")
209
209
  in [/strip|bus|button/ => kls, /^[0-9]+$/ => index]
210
- target = send(kls)
210
+ target = public_send(kls)
211
211
  in ["vban", /in|instream|out|oustream/ => dir, /^[0-9]+$/ => index]
212
- target = vban.send("#{dir.chomp("stream")}stream")
212
+ target = vban.public_send("#{dir.chomp("stream")}stream")
213
213
  else
214
214
  raise KeyError, "invalid config key '#{key}'"
215
215
  end
@@ -5,8 +5,12 @@ module Voicemeeter
5
5
  include IRemote
6
6
  include Mixins::Fades
7
7
  include Mixins::Return
8
+ extend MetaFunctions
8
9
 
9
10
  attr_reader :eq, :mode, :levels
11
+ attr_accessor_bool :mute, :mono, :sel, :monitor
12
+ attr_accessor_float :gain
13
+ attr_accessor_string :label
10
14
 
11
15
  def self.make(remote, i)
12
16
  (i < remote.kind.phys_out) ? PhysicalBus.new(remote, i) : VirtualBus.new(remote, i)
@@ -14,10 +18,6 @@ module Voicemeeter
14
18
 
15
19
  def initialize(remote, i)
16
20
  super
17
- make_accessor_bool :mute, :mono, :sel, :monitor
18
- make_accessor_float :gain
19
- make_accessor_string :label
20
-
21
21
  @eq = BusEq.new(remote, i)
22
22
  @mode = BusModes.new(remote, i)
23
23
  @levels = BusLevels.new(remote, i)
@@ -36,11 +36,9 @@ module Voicemeeter
36
36
 
37
37
  class BusEq
38
38
  include IRemote
39
+ extend MetaFunctions
39
40
 
40
- def initialize(remote, i)
41
- super
42
- make_accessor_bool :on, :ab
43
- end
41
+ attr_accessor_bool :on, :ab
44
42
 
45
43
  def identifier
46
44
  "bus[#{@index}].eq"
@@ -49,22 +47,20 @@ module Voicemeeter
49
47
 
50
48
  class BusModes
51
49
  include IRemote
52
-
53
- def initialize(remote, i)
54
- super
55
- make_accessor_bool :normal,
56
- :amix,
57
- :bmix,
58
- :repeat,
59
- :composite,
60
- :tvmix,
61
- :upmix21,
62
- :upmix41,
63
- :upmix61,
64
- :centeronly,
65
- :lfeonly,
66
- :rearonly
67
- end
50
+ extend MetaFunctions
51
+
52
+ attr_accessor_bool :normal,
53
+ :amix,
54
+ :bmix,
55
+ :repeat,
56
+ :composite,
57
+ :tvmix,
58
+ :upmix21,
59
+ :upmix41,
60
+ :upmix61,
61
+ :centeronly,
62
+ :lfeonly,
63
+ :rearonly
68
64
 
69
65
  def identifier
70
66
  "bus[#{@index}].mode"
@@ -115,12 +111,11 @@ module Voicemeeter
115
111
 
116
112
  class BusDevice
117
113
  include IRemote
114
+ extend MetaFunctions
118
115
 
119
- def initialize(remote, i)
120
- super
121
- make_reader_only :name, :sr
122
- make_writer_only :wdm, :ks, :mme, :asio
123
- end
116
+ attr_reader_int :sr
117
+ attr_reader_string :name
118
+ attr_writer_string :wdm, :ks, :mme, :asio
124
119
 
125
120
  def identifier
126
121
  "bus[#{@index}].device"
@@ -1,12 +1,10 @@
1
1
  module Voicemeeter
2
2
  class Command
3
3
  include IRemote
4
+ extend MetaFunctions
4
5
 
5
- def initialize(remote)
6
- super
7
- make_action_method :show, :restart, :shutdown
8
- make_writer_bool :showvbanchat, :lock
9
- end
6
+ attr_action_method :show, :restart, :shutdown
7
+ attr_writer_bool :showvbanchat, :lock
10
8
 
11
9
  def identifier
12
10
  :command
@@ -27,11 +27,22 @@ module Voicemeeter
27
27
  class Tracker
28
28
  include Logging
29
29
 
30
- attr_reader :pdirty, :mdirty, :midi, :ldirty
30
+ class << self
31
+ private def attr_accessor_events(*params)
32
+ params.each do |param|
33
+ attr_reader param
31
34
 
32
- def initialize(**kwargs)
33
- make_writer_methods :pdirty, :mdirty, :midi, :ldirty
35
+ define_method("#{param}=") do |value|
36
+ instance_variable_set("@#{param}", value)
37
+ info("#{param} #{value ? "added to" : "removed from"}")
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ attr_accessor_events :pdirty, :mdirty, :midi, :ldirty
34
44
 
45
+ def initialize(**kwargs)
35
46
  kwargs.each do |key, value|
36
47
  instance_variable_set("@#{key}", value || false)
37
48
  end
@@ -51,15 +62,6 @@ module Voicemeeter
51
62
  logger.info info_msg.join(" ")
52
63
  end
53
64
 
54
- private def make_writer_methods(*params)
55
- params.each do |param|
56
- define_singleton_method("#{param}=") do |value|
57
- instance_variable_set("@#{param}", value)
58
- info("#{param} #{value ? "added to" : "removed from"}")
59
- end
60
- end
61
- end
62
-
63
65
  def get
64
66
  %i[pdirty mdirty midi ldirty].reject { |ev| !send(ev) }
65
67
  end
@@ -1,6 +1,8 @@
1
1
  module Voicemeeter
2
2
  class Fx
3
3
  include IRemote
4
+ extend MetaFunctions
5
+
4
6
  attr_reader :reverb, :delay
5
7
 
6
8
  def initialize(remote)
@@ -16,11 +18,9 @@ module Voicemeeter
16
18
 
17
19
  class FxReverb
18
20
  include IRemote
21
+ extend MetaFunctions
19
22
 
20
- def initialize(remote)
21
- super
22
- make_accessor_bool :on, :ab
23
- end
23
+ attr_accessor_bool :on, :ab
24
24
 
25
25
  def identifier
26
26
  "fx.reverb"
@@ -29,11 +29,9 @@ module Voicemeeter
29
29
 
30
30
  class FxDelay
31
31
  include IRemote
32
+ extend MetaFunctions
32
33
 
33
- def initialize(remote)
34
- super
35
- make_accessor_bool :on, :ab
36
- end
34
+ attr_accessor_bool :on, :ab
37
35
 
38
36
  def identifier
39
37
  "fx.delay"
@@ -2,7 +2,6 @@ module Voicemeeter
2
2
  # Common interface with the base Remote class.
3
3
  module IRemote
4
4
  include Logging
5
- include MetaFunctions
6
5
 
7
6
  def initialize(remote, i = nil)
8
7
  @remote = remote
@@ -38,12 +37,12 @@ module Voicemeeter
38
37
  def apply(params)
39
38
  params.each do |key, val|
40
39
  if val.is_a? Hash
41
- target = send(key)
40
+ target = public_send(key)
42
41
  target.apply(val)
43
42
  elsif key == :mode
44
- mode.send("#{val}=", true)
43
+ mode.public_send("#{val}=", true)
45
44
  else
46
- send("#{key}=", val)
45
+ public_send("#{key}=", val)
47
46
  end
48
47
  end
49
48
  end
@@ -3,72 +3,72 @@ module Voicemeeter
3
3
  private
4
4
 
5
5
  # Accessor methods
6
- def make_accessor_bool(*params)
6
+ def attr_accessor_bool(*params)
7
7
  params.each do |param|
8
- define_singleton_method(param) { getter(param).to_i == 1 }
8
+ define_method(param) { getter(param).to_i == 1 }
9
9
 
10
- define_singleton_method("#{param}=") do |value|
10
+ define_method("#{param}=") do |value|
11
11
  setter(param, value && 1 || 0)
12
12
  end
13
13
  end
14
14
  end
15
15
 
16
- def make_accessor_string(*params)
16
+ def attr_accessor_string(*params)
17
17
  params.each do |param|
18
- define_singleton_method(param) { getter(param, true) }
18
+ define_method(param) { getter(param, true) }
19
19
 
20
- define_singleton_method("#{param}=") { |value| setter(param, value) }
20
+ define_method("#{param}=") { |value| setter(param, value) }
21
21
  end
22
22
  end
23
23
 
24
- def make_accessor_int(*params)
24
+ def attr_accessor_int(*params)
25
25
  params.each do |param|
26
- define_singleton_method(param) { getter(param).to_i }
26
+ define_method(param) { getter(param).to_i }
27
27
 
28
- define_singleton_method("#{param}=") { |value| setter(param, value) }
28
+ define_method("#{param}=") { |value| setter(param, value) }
29
29
  end
30
30
  end
31
31
 
32
- def make_accessor_float(*params)
32
+ def attr_accessor_float(*params)
33
33
  params.each do |param|
34
- define_singleton_method(param) { getter(param) }
34
+ define_method(param) { getter(param) }
35
35
 
36
- define_singleton_method("#{param}=") { |value| setter(param, value) }
36
+ define_method("#{param}=") { |value| setter(param, value) }
37
37
  end
38
38
  end
39
39
 
40
40
  # reader methods
41
- def make_reader_string(*params)
41
+ def attr_reader_string(*params)
42
42
  params.each do |param|
43
- define_singleton_method(param) { getter(param, true) }
43
+ define_method(param) { getter(param, true) }
44
44
  end
45
45
  end
46
46
 
47
- def make_reader_int(*params)
47
+ def attr_reader_int(*params)
48
48
  params.each do |param|
49
- define_singleton_method(param) { getter(param).to_i }
49
+ define_method(param) { getter(param).to_i }
50
50
  end
51
51
  end
52
52
 
53
53
  # writer methods
54
- def make_writer_bool(*params)
54
+ def attr_writer_bool(*params)
55
55
  params.each do |param|
56
- define_singleton_method("#{param}=") do |value|
56
+ define_method("#{param}=") do |value|
57
57
  setter(param, value && 1 || 0)
58
58
  end
59
59
  end
60
60
  end
61
61
 
62
- def make_writer_string(*params)
62
+ def attr_writer_string(*params)
63
63
  params.each do |param|
64
- define_singleton_method("#{param}=") { |value| setter(param, value) }
64
+ define_method("#{param}=") { |value| setter(param, value) }
65
65
  end
66
66
  end
67
67
 
68
68
  # methods for performing certain actions as opposed to setting values
69
- def make_action_method(*params)
69
+ def attr_action_method(*params)
70
70
  params.each do |param|
71
- define_singleton_method(param) { setter(param, 1) }
71
+ define_method(param) { setter(param, 1) }
72
72
  end
73
73
  end
74
74
  end
@@ -13,10 +13,8 @@ module Voicemeeter
13
13
  end
14
14
 
15
15
  module Return
16
- def initialize(remote, i)
17
- super
18
- make_accessor_float :returnreverb, :returndelay, :returnfx1, :returnfx2
19
- end
16
+ extend MetaFunctions
17
+ attr_accessor_float :returnreverb, :returndelay, :returnfx1, :returnfx2
20
18
  end
21
19
 
22
20
  module Apps
@@ -30,47 +28,40 @@ module Voicemeeter
30
28
  end
31
29
 
32
30
  module Outputs
33
- def initialize(*args)
34
- super
35
- remote, *_ = args
36
- num_a, num_b = remote.kind.outs
37
- channels =
38
- (1..(num_a + num_b)).map do |i|
39
- (i <= num_a) ? "A#{i}" : "B#{i - num_a}"
31
+ def make_attr_outputs(num_a, num_b)
32
+ (1..(num_a + num_b)).each do |i|
33
+ param = (i <= num_a) ? :"A#{i}" : :"B#{i - num_a}"
34
+ define_singleton_method(param) do
35
+ getter(param).to_i == 1
36
+ end
37
+ define_singleton_method("#{param}=") do |value|
38
+ setter(param, value && 1 || 0)
40
39
  end
41
- make_accessor_bool(*channels)
40
+ end
42
41
  end
43
42
  end
44
43
 
45
44
  module Xy
46
45
  module Pan
47
- def initialize(remote, i)
48
- super
49
- make_accessor_float :pan_x, :pan_y
50
- end
46
+ extend MetaFunctions
47
+ attr_accessor_float :pan_x, :pan_y
51
48
  end
52
49
 
53
50
  module Color
54
- def initialize(remote, i)
55
- super
56
- make_accessor_float :color_x, :color_y
57
- end
51
+ extend MetaFunctions
52
+ attr_accessor_float :color_x, :color_y
58
53
  end
59
54
 
60
55
  module Fx
61
- def initialize(remote, i)
62
- super
63
- make_accessor_float :fx_x, :fx_y
64
- end
56
+ extend MetaFunctions
57
+ attr_accessor_float :fx_x, :fx_y
65
58
  end
66
59
  end
67
60
 
68
61
  module Fx
69
- def initialize(remote, i)
70
- super
71
- make_accessor_float :reverb, :delay, :fx1, :fx2
72
- make_accessor_bool :postreverb, :postdelay, :postfx1, :postfx2
73
- end
62
+ extend MetaFunctions
63
+ attr_accessor_float :reverb, :delay, :fx1, :fx2
64
+ attr_accessor_bool :postreverb, :postdelay, :postfx1, :postfx2
74
65
  end
75
66
 
76
67
  module LevelEnum
@@ -2,13 +2,14 @@ module Voicemeeter
2
2
  module Option
3
3
  class Base
4
4
  include IRemote
5
+ extend MetaFunctions
6
+
5
7
  attr_reader :delay, :buffer, :mode
8
+ attr_accessor_int :sr
9
+ attr_accessor_bool :asiosr, :monitoronsel, :slidermode
6
10
 
7
11
  def initialize(remote)
8
12
  super
9
- make_accessor_int :sr
10
- make_accessor_bool :asiosr, :monitoronsel, :slidermode
11
-
12
13
  @delay = (0...remote.kind.phys_out).map { OptionDelay.new(remote, _1) }
13
14
  @buffer = OptionBuffer.new(remote)
14
15
  @mode = OptionMode.new(remote)
@@ -21,11 +22,9 @@ module Voicemeeter
21
22
 
22
23
  class OptionDelay
23
24
  include IRemote
25
+ extend MetaFunctions
24
26
 
25
- def initialize(remote, i)
26
- super
27
- make_accessor_bool :on, :ab
28
- end
27
+ attr_accessor_bool :on, :ab
29
28
 
30
29
  def identifier
31
30
  "option.delay"
@@ -42,11 +41,9 @@ module Voicemeeter
42
41
 
43
42
  class OptionBuffer
44
43
  include IRemote
44
+ extend MetaFunctions
45
45
 
46
- def initialize(remote)
47
- super
48
- make_accessor_int :mme, :wdm, :ks, :asio
49
- end
46
+ attr_accessor_int :mme, :wdm, :ks, :asio
50
47
 
51
48
  def identifier
52
49
  "option.buffer"
@@ -55,11 +52,9 @@ module Voicemeeter
55
52
 
56
53
  class OptionMode
57
54
  include IRemote
55
+ extend MetaFunctions
58
56
 
59
- def initialize(remote)
60
- super
61
- make_accessor_bool :exclusif, :swift
62
- end
57
+ attr_accessor_bool :exclusif, :swift
63
58
 
64
59
  def identifier
65
60
  "option.mode"
@@ -3,12 +3,13 @@ module Voicemeeter
3
3
  # Base class for Patch
4
4
  class Base
5
5
  include IRemote
6
+ extend MetaFunctions
7
+
6
8
  attr_reader :asio, :A2, :A3, :A4, :A5, :composite, :insert
9
+ attr_accessor_bool :postfadercomposite, :postfxinsert
7
10
 
8
11
  def initialize(remote)
9
12
  super
10
- make_accessor_bool :postfadercomposite, :postfxinsert
11
-
12
13
  asio_in, asio_out = remote.kind.asio
13
14
  @asio = (0...asio_in).map { PatchAsioIn.new(remote, _1) }
14
15
  %i[A2 A3 A4 A5].each do |param|
@@ -11,15 +11,16 @@ module Voicemeeter
11
11
  class Base
12
12
  include IRemote
13
13
  include Mixins::Outputs
14
+ extend MetaFunctions
14
15
 
15
16
  attr_reader :mode, :armstrip, :armbus
17
+ attr_action_method :play, :stop, :pause, :replay, :record, :ff, :rew
18
+ attr_accessor_int :bitresolution, :channel, :kbps
19
+ attr_accessor_float :gain
16
20
 
17
21
  def initialize(remote)
18
22
  super
19
- make_action_method :play, :stop, :pause, :replay, :record, :ff, :rew
20
- make_accessor_int :bitresolution, :channel, :kbps
21
- make_accessor_float :gain
22
-
23
+ make_attr_outputs(*remote.kind.outs)
23
24
  @mode = RecorderMode.new(remote)
24
25
  @armstrip = (0...remote.kind.num_strip).map { RecorderArmStrip.new(remote, _1) }
25
26
  @armbus = (0...remote.kind.num_bus).map { RecorderArmBus.new(remote, _1) }
@@ -51,11 +52,9 @@ module Voicemeeter
51
52
 
52
53
  class RecorderMode
53
54
  include IRemote
55
+ extend MetaFunctions
54
56
 
55
- def initialize(remote)
56
- super
57
- make_accessor_bool :recbus, :playonload, :loop, :multitrack
58
- end
57
+ attr_accessor_bool :recbus, :playonload, :loop, :multitrack
59
58
 
60
59
  def identifier
61
60
  "recorder.mode"
@@ -54,10 +54,10 @@ module Voicemeeter
54
54
  end
55
55
  end
56
56
 
57
- # Represents a RemoteBasic type
57
+ # Represents a Basic Remote
58
58
  class RemoteBasic < Remote; end
59
59
 
60
- # Represents a RemoteBanana type
60
+ # Represents a Banana Remote
61
61
  class RemoteBanana < Remote
62
62
  public attr_reader :recorder, :patch
63
63
 
@@ -66,7 +66,7 @@ module Voicemeeter
66
66
  end
67
67
  end
68
68
 
69
- # Represents a RemotePotato type
69
+ # Represents a Potato Remote
70
70
  class RemotePotato < Remote
71
71
  public attr_reader :recorder, :patch, :fx
72
72
 
@@ -5,8 +5,13 @@ module Voicemeeter
5
5
  include IRemote
6
6
  include Mixins::Outputs
7
7
  include Mixins::Fades
8
+ extend MetaFunctions
8
9
 
9
10
  attr_reader :gainlayer, :levels
11
+ attr_accessor_bool :solo, :mute, :mono
12
+ attr_accessor_float :gain
13
+ attr_accessor_int :limit
14
+ attr_accessor_string :label
10
15
 
11
16
  def self.make(remote, i)
12
17
  (i < remote.kind.phys_in) ? PhysicalStrip.new(remote, i) : VirtualStrip.new(remote, i)
@@ -14,11 +19,7 @@ module Voicemeeter
14
19
 
15
20
  def initialize(remote, i)
16
21
  super
17
- make_accessor_bool :solo, :mute, :mono
18
- make_accessor_float :gain
19
- make_accessor_int :limit
20
- make_accessor_string :label
21
-
22
+ make_attr_outputs(*remote.kind.outs)
22
23
  @gainlayer = (0...8).map { GainLayer.new(remote, i, _1) }
23
24
  @levels = StripLevels.new(remote, i)
24
25
  end
@@ -34,13 +35,13 @@ module Voicemeeter
34
35
  include Mixins::Xy::Color
35
36
  include Mixins::Xy::Fx
36
37
  include Mixins::Fx
38
+ extend MetaFunctions
37
39
 
38
40
  attr_reader :comp, :gate, :denoiser, :eq, :device
41
+ attr_accessor_float :audibility
39
42
 
40
43
  def initialize(remote, i)
41
44
  super
42
- make_accessor_float :audibility
43
-
44
45
  @comp = StripComp.new(remote, i)
45
46
  @gate = StripGate.new(remote, i)
46
47
  @denoiser = StripDenoiser.new(remote, i)
@@ -51,18 +52,16 @@ module Voicemeeter
51
52
 
52
53
  class StripComp
53
54
  include IRemote
55
+ extend MetaFunctions
54
56
 
55
- def initialize(remote, i)
56
- super
57
- make_accessor_float :gainin,
58
- :ratio,
59
- :threshold,
60
- :attack,
61
- :release,
62
- :knee,
63
- :gainout
64
- make_accessor_bool :makeup
65
- end
57
+ attr_accessor_float :gainin,
58
+ :ratio,
59
+ :threshold,
60
+ :attack,
61
+ :release,
62
+ :knee,
63
+ :gainout
64
+ attr_accessor_bool :makeup
66
65
 
67
66
  def identifier
68
67
  "strip[#{@index}].comp"
@@ -79,12 +78,10 @@ module Voicemeeter
79
78
 
80
79
  class StripGate
81
80
  include IRemote
81
+ extend MetaFunctions
82
82
 
83
- def initialize(remote, i)
84
- super
85
- make_accessor_float :threshold, :damping, :attack, :hold, :release
86
- make_accessor_int :bpsidechain
87
- end
83
+ attr_accessor_float :threshold, :damping, :attack, :hold, :release
84
+ attr_accessor_int :bpsidechain
88
85
 
89
86
  def identifier
90
87
  "strip[#{@index}].gate"
@@ -117,11 +114,9 @@ module Voicemeeter
117
114
 
118
115
  class StripEq
119
116
  include IRemote
117
+ extend MetaFunctions
120
118
 
121
- def initialize(remote, i)
122
- super
123
- make_accessor_bool :on, :ab
124
- end
119
+ attr_accessor_bool :on, :ab
125
120
 
126
121
  def identifier
127
122
  "strip[#{@index}].eq"
@@ -130,13 +125,11 @@ module Voicemeeter
130
125
 
131
126
  class StripDevice
132
127
  include IRemote
128
+ extend MetaFunctions
133
129
 
134
- def initialize(remote, i)
135
- super
136
- make_reader_int :sr
137
- make_reader_string :name
138
- make_writer_string :wdm, :ks, :mme, :asio
139
- end
130
+ attr_reader_int :sr
131
+ attr_reader_string :name
132
+ attr_writer_string :wdm, :ks, :mme, :asio
140
133
 
141
134
  def identifier
142
135
  "strip[#{@index}].device"
@@ -147,12 +140,10 @@ module Voicemeeter
147
140
  class VirtualStrip < Base
148
141
  include Mixins::Xy::Pan
149
142
  include Mixins::Apps
143
+ extend MetaFunctions
150
144
 
151
- def initialize(remote, i)
152
- super
153
- make_accessor_bool :mc
154
- make_accessor_int :karaoke
155
- end
145
+ attr_accessor_bool :mc
146
+ attr_accessor_int :karaoke
156
147
 
157
148
  def bass
158
149
  round(getter("EQGain1"), 1)
@@ -3,13 +3,11 @@ module Voicemeeter
3
3
  # Base class for Vban In/Out Streams
4
4
  class VbanStream
5
5
  include IRemote
6
+ extend MetaFunctions
6
7
 
7
- def initialize(remote, i)
8
- super
9
- make_accessor_bool :on
10
- make_accessor_string :name, :ip
11
- make_accessor_int :quality, :route
12
- end
8
+ attr_accessor_bool :on
9
+ attr_accessor_string :name, :ip
10
+ attr_accessor_int :quality, :route
13
11
 
14
12
  def identifier
15
13
  "vban.#{direction}stream[#{@index}]"
@@ -22,10 +20,7 @@ module Voicemeeter
22
20
 
23
21
  # Represents a Vban InStream
24
22
  class VbanInstream < VbanStream
25
- def initialize(remote, i)
26
- super
27
- make_reader_int :sr, :channel, :bit
28
- end
23
+ attr_reader_int :sr, :channel, :bit
29
24
 
30
25
  def direction
31
26
  :in
@@ -43,10 +38,7 @@ module Voicemeeter
43
38
 
44
39
  # Represents a Vban OutStream
45
40
  class VbanOutstream < VbanStream
46
- def initialize(remote, i)
47
- super
48
- make_accessor_int :sr, :channel, :bit
49
- end
41
+ attr_accessor_int :sr, :channel, :bit
50
42
 
51
43
  def direction
52
44
  :out
@@ -3,7 +3,7 @@ module Voicemeeter
3
3
  module_function
4
4
 
5
5
  def major
6
- 0
6
+ 1
7
7
  end
8
8
 
9
9
  def minor
@@ -11,7 +11,7 @@ module Voicemeeter
11
11
  end
12
12
 
13
13
  def patch
14
- 1
14
+ 0
15
15
  end
16
16
 
17
17
  def to_a
@@ -7,8 +7,7 @@ module Voicemeeter
7
7
  def init_producer(que)
8
8
  @producer = Thread.new do
9
9
  Thread.current.name = "producer"
10
- Thread.current[:running] = true
11
- while Thread.current[:running]
10
+ while @running
12
11
  que << :pdirty if event.pdirty
13
12
  que << :mdirty if event.mdirty
14
13
  que << :midi if event.midi
@@ -16,7 +15,7 @@ module Voicemeeter
16
15
  sleep(@ratelimit)
17
16
  end
18
17
  logger.debug "closing #{Thread.current.name} thread"
19
- que << Thread.current[:running]
18
+ que << @running
20
19
  end
21
20
  end
22
21
 
@@ -51,12 +50,13 @@ module Voicemeeter
51
50
 
52
51
  def init_event_threads
53
52
  que = Queue.new
53
+ @running = true
54
54
  init_worker(que) and init_producer(que)
55
55
  end
56
56
 
57
57
  def end_event_threads
58
58
  if running?
59
- @producer[:running] = false
59
+ @running = false
60
60
  @producer.join
61
61
  end
62
62
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voicemeeter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.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: 2023-08-29 00:00:00.000000000 Z
11
+ date: 2023-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -92,8 +92,10 @@ executables: []
92
92
  extensions: []
93
93
  extra_rdoc_files:
94
94
  - README.md
95
+ - CHANGELOG.md
95
96
  - LICENSE
96
97
  files:
98
+ - CHANGELOG.md
97
99
  - LICENSE
98
100
  - README.md
99
101
  - lib/voicemeeter.rb