fmod 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.txt +23 -1
  3. data/README.md +1 -3
  4. data/Rakefile +2 -1
  5. data/bin/console +1 -0
  6. data/fmod.gemspec +1 -2
  7. data/lib/fmod/channel_control.rb +47 -0
  8. data/lib/fmod/core.rb +1 -0
  9. data/lib/fmod/core/bool_description.rb +9 -4
  10. data/lib/fmod/core/channel_mask.rb +61 -0
  11. data/lib/fmod/core/data_description.rb +44 -0
  12. data/lib/fmod/core/dsp_description.rb +172 -1
  13. data/lib/fmod/core/dsp_index.rb +13 -0
  14. data/lib/fmod/core/dsp_type.rb +154 -0
  15. data/lib/fmod/core/extensions.rb +19 -0
  16. data/lib/fmod/core/file_system.rb +1 -0
  17. data/lib/fmod/core/filter_type.rb +62 -0
  18. data/lib/fmod/core/float_description.rb +38 -0
  19. data/lib/fmod/core/guid.rb +27 -0
  20. data/lib/fmod/core/init_flags.rb +66 -0
  21. data/lib/fmod/core/integer_description.rb +22 -2
  22. data/lib/fmod/core/output_type.rb +81 -2
  23. data/lib/fmod/core/parameter_info.rb +36 -0
  24. data/lib/fmod/core/parameter_type.rb +15 -0
  25. data/lib/fmod/core/reverb.rb +113 -2
  26. data/lib/fmod/core/reverb_index.rb +105 -0
  27. data/lib/fmod/core/sound_ex_info.rb +4 -0
  28. data/lib/fmod/core/sound_group_behavior.rb +14 -0
  29. data/lib/fmod/core/sound_type.rb +1 -0
  30. data/lib/fmod/core/spectrum_data.rb +35 -0
  31. data/lib/fmod/core/structures.rb +10 -4
  32. data/lib/fmod/core/tag.rb +72 -11
  33. data/lib/fmod/core/tag_data_type.rb +30 -0
  34. data/lib/fmod/core/tag_type.rb +55 -0
  35. data/lib/fmod/core/time_unit.rb +3 -0
  36. data/lib/fmod/core/vector.rb +40 -3
  37. data/lib/fmod/core/window_type.rb +46 -0
  38. data/lib/fmod/dsp.rb +427 -98
  39. data/lib/fmod/dsp_connection.rb +3 -0
  40. data/lib/fmod/effects.rb +51 -37
  41. data/lib/fmod/error.rb +3 -0
  42. data/lib/fmod/geometry.rb +7 -0
  43. data/lib/fmod/handle.rb +82 -0
  44. data/lib/fmod/reverb3D.rb +25 -26
  45. data/lib/fmod/sound.rb +21 -1
  46. data/lib/fmod/sound_group.rb +79 -3
  47. data/lib/fmod/system.rb +301 -154
  48. data/lib/fmod/version.rb +4 -1
  49. metadata +6 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d2902236224e5d663766bcc5b5fb7c48147aa20
4
- data.tar.gz: a8b3106722a1da66d22ec30902a24bedaacec0ab
3
+ metadata.gz: ab0b3cff45deeb4271467582cab4249c7841e315
4
+ data.tar.gz: d087b00bd2bfecea2864e9eddb927104ce5ffe96
5
5
  SHA512:
6
- metadata.gz: 1c651d58f0ae40f3c5f615e9bb0a1435b43f07f8d86f0c8dae6441cf8b704a35bdfa3a74a39b08b2ca9ad50000f278a0582ff8a31a5dda0a704be1826fe9651b
7
- data.tar.gz: b77425a784f7f48c5687f693f013aab28c48ebd9267664a90b74a43f9c67254534af7ac71479793d135b2a51a70809f7c8cf322e9e35d91dd327c4f6b8d059f3
6
+ metadata.gz: 7dbef60ec374a31a856f152ba889c61c508888556c7219aafd1eb3c851f88753e59b195aa3a6a1eb50ce038d69c5f3e946aee66e94942e21f7ca9771ab1e67ae
7
+ data.tar.gz: bac72c7849c3cd063f5260c05fe771ac0a6e078279c4cf9a71f200f4fc6bdce68fd0f6d8beaca54b88ce011962a6d40b4ec83cedd8aa6a1735f743945651a0c0
@@ -1,4 +1,26 @@
1
- === 0.9.1 / 2018-07-10
1
+ === 0.9.2 / 2018/07/11
2
+
3
+ * Added ReverbIndex class
4
+
5
+ * Added .from_index class function to Reverb class
6
+
7
+ * Implemented skeleton DspDescription structure
8
+
9
+ * Deprecated constants in DspType:
10
+ * LOW_PASS
11
+ * LOW_PASS_SIMPLE
12
+ * HIGH_PASS
13
+ * HIGH_PASS_SIMPLE
14
+ * LADSPA_PLUGIN
15
+
16
+ * Deprecated constants in Effects:
17
+ * LowPass
18
+ * LowPassSimple
19
+ * HighPass
20
+ * HighPassSimple
21
+ * LadspaPlugin
22
+
23
+ === 0.9.1 / 2018-07-10
2
24
 
3
25
  * Added Features
4
26
  * Expanded methods to FMOD::Core::Structure
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # FMOD
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/fmod.svg)](https://badge.fury.io/rb/fmod) ![Documentation](https://img.shields.io/badge/Documentation-71%25-orange.svg)
3
+ [![Gem Version](https://badge.fury.io/rb/fmod.svg)](https://badge.fury.io/rb/fmod) ![Documentation](https://img.shields.io/badge/Documentation-99.22%25-green.svg)
4
4
 
5
5
 
6
6
  A full-featured (*complete* Ruby wrapper) of the ultra-powerful FMOD Low-Level API. Uses the built-in Fiddle library (Ruby 2.0+), and has no external gem dependencies, all that is needed is the native FMOD platform-specific native FMOD libraries.
@@ -72,8 +72,6 @@ Each get/set method in the FMOD API has been converted to an "attribute" that ca
72
72
 
73
73
  ## Future Releases
74
74
 
75
- As of the current release, only slightly better than 71% of documentation is complete. The scripts are highly technical, and good documentation takes time, but it is actively being updated, and will be completed at the highest priority level. If you are using version `1.0.0`, you will have to rely more heavily upon the included FMOD Low-Level API Reference that is included in the `./extras` folder.
76
-
77
75
  There is still yet to be a few areas that need completed, and are in active development. Included are the following known issues:
78
76
  * FMOD plugin support (including 3rd party codecs)
79
77
  * Loading custom sound formats (related to plugin support)
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
- require "bundler/gem_tasks"
1
+ require "bundler/gem_tasks"
2
+
@@ -4,6 +4,7 @@ require 'bundler/setup'
4
4
  require 'fmod'
5
5
  require 'irb'
6
6
 
7
+
7
8
  # You can add fixtures and/or initialization code here to make experimenting
8
9
  # with your gem easier. You can also use a different console, if you like.
9
10
 
@@ -9,8 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['Eric "ForeverZer0" Freed']
10
10
  spec.email = ['efreed09@gmail.com']
11
11
  spec.summary = %q{Ruby wrapper around the high performance, cross-platform FMOD low-level sound library. You get all the benefits of the FMOD library, but in the object-oriented Ruby way!}
12
- spec.description = %q{A full-featured (complete Ruby wrapper) of the ultra-powerful FMOD Low-Level API. Uses the built-in Fiddle library (Ruby 2.0+), and has no external gem dependencies, all that is needed is the FMOD platform-specific libraries (included). FMOD supports a host of audio formats including .aiff, .asf, .asx, .dls, .flac, .fsb, .it, .m3u, .mid, .midi, .mod, .mp2, .mp3, .ogg .pls, .s3m , vag, .wav, .wax, .wma, .xm, and.xma.}
13
-
12
+ spec.description = %q{A full-featured (complete Ruby wrapper) of the ultra-powerful FMOD Low-Level API. Uses the built-in Fiddle library (Ruby 2.0+), and has no external gem dependencies, all that is needed is the FMOD platform-specific libraries (included). FMOD supports a host of audio formats including .aiff, .asf, .asx, .dls, .flac, .fsb, .it, .m3u, .mid, .midi, .mod, .mp2, .mp3, .ogg .pls, .s3m , vag, .wav, .wax, .wma, .xm, and .xma.}
14
13
  spec.homepage = 'https://github.com/ForeverZer0/fmod'
15
14
  spec.license = 'MIT'
16
15
  spec.has_rdoc = 'yard'
@@ -6,6 +6,16 @@ module FMOD
6
6
  # The base class for both {Channel} and {ChannelGroup} objects.
7
7
  class ChannelControl < Handle
8
8
 
9
+ ##
10
+ # Describes a volume point to fade from or towards, using a clock offset and
11
+ # 0.0 to 1.0 volume level.
12
+ #
13
+ # @attr clock [Integer] DSP clock of the parent channel group to set the
14
+ # fade point volume.
15
+ # @attr volume [Float] lume level where 0.0 is silent and 1.0 is normal
16
+ # volume. Amplification is supported.
17
+ FadePoint = Struct.new(:clock, :volume)
18
+
9
19
  ##
10
20
  # Emulates an Array-type container of a {ChannelControl}'s DSP chain.
11
21
  class DspChain
@@ -520,6 +530,43 @@ module FMOD
520
530
  vector
521
531
  end
522
532
 
533
+ ##
534
+ # @!attribute cone_settings
535
+ # The angles that define the sound projection cone including the volume when
536
+ # outside the cone.
537
+ # @since 0.9.2
538
+ # @return [ConeSettings] the sound projection cone.
539
+ def cone_settings
540
+ args = ["\0" * SIZEOF_FLOAT, "\0" * SIZEOF_FLOAT, "\0" * SIZEOF_FLOAT]
541
+ FMOD.invoke(:ChannelGroup_Get3DConeSettings, self, *args)
542
+ ConeSettings.new(*args.map { |arg| arg.unpack1('f') } )
543
+ end
544
+
545
+ def cone_settings=(settings)
546
+ FMOD.type?(settings, ConeSettings)
547
+ set_cone(*settings.values)
548
+ settings
549
+ end
550
+
551
+ ##
552
+ # Sets the angles that define the sound projection cone including the volume
553
+ # when outside the cone.
554
+ # @param inside_angle [Float] Inside cone angle, in degrees. This is the
555
+ # angle within which the sound is at its normal volume.
556
+ # @param outside_angle [Float] Outside cone angle, in degrees. This is the
557
+ # angle outside of which the sound is at its outside volume.
558
+ # @param outside_volume [Float] Cone outside volume.
559
+ # @since 0.9.2
560
+ # @return [void]
561
+ def set_cone(inside_angle, outside_angle, outside_volume)
562
+ if outside_angle < inside_angle
563
+ raise Error, 'Outside angle must be greater than inside angle.'
564
+ end
565
+ FMOD.invoke(:ChaennlGroup_Set3DConeSettings, self, inside_angle,
566
+ outside_angle, outside_volume)
567
+ self
568
+ end
569
+
523
570
  # @!endgroup
524
571
 
525
572
  ##
@@ -27,6 +27,7 @@ module FMOD
27
27
  require_relative './core/parameter_info'
28
28
  require_relative './core/parameter_type'
29
29
  require_relative './core/result'
30
+ require_relative './core/reverb_index'
30
31
  require_relative './core/reverb'
31
32
  require_relative './core/sound_ex_info'
32
33
  require_relative './core/sound_format'
@@ -1,18 +1,23 @@
1
1
  module FMOD
2
2
  module Core
3
+
4
+ ##
5
+ # Structure describing a boolean parameter for a DSP unit.
3
6
  class BoolDescription < Structure
4
7
 
8
+ ##
9
+ # @param address [Pointer, Integer, String, nil] The address in memory
10
+ # where the structure will be created from. If no address is given, new
11
+ # memory will be allocated.
5
12
  def initialize(address = nil)
6
13
  super(address, [TYPE_INT, TYPE_VOIDP], [:default, :names])
7
14
  end
8
15
 
16
+ # @!attribute [r] default
17
+ # @return [Boolean] the default value for the parameter.
9
18
  def default
10
19
  self[:default] != 0
11
20
  end
12
-
13
- def names
14
- %w(true false)
15
- end
16
21
  end
17
22
  end
18
23
  end
@@ -1,23 +1,84 @@
1
1
  module FMOD
2
2
  module Core
3
+
4
+ ##
5
+ # These are bit-fields to describe for a certain number of channels in a
6
+ # signal, which channels are being represented.
7
+ #
8
+ # For example, a signal could be 1 channel, but contain the LFE channel
9
+ # only.
3
10
  module ChannelMask
11
+
12
+ ##
13
+ # Front-left
4
14
  FRONT_LEFT = 0x00000001
15
+
16
+ ##
17
+ # Front-right
5
18
  FRONT_RIGHT = 0x00000002
19
+
20
+ ##
21
+ # Front-center
6
22
  FRONT_CENTER = 0x00000004
23
+
24
+ ##
25
+ # Low-frequency or sub-woofer
7
26
  LOW_FREQUENCY = 0x00000008
27
+
28
+ ##
29
+ # Surround-left
8
30
  SURROUND_LEFT = 0x00000010
31
+
32
+ ##
33
+ # Surround-right
9
34
  SURROUND_RIGHT = 0x00000020
35
+
36
+ ##
37
+ # Back-left
10
38
  BACK_LEFT = 0x00000040
39
+
40
+ ##
41
+ # Back-right
11
42
  BACK_RIGHT = 0x00000080
43
+
44
+ ##
45
+ # Back-center
12
46
  BACK_CENTER = 0x00000100
47
+
48
+ ##
49
+ # Mono, single speaker
13
50
  MONO = FRONT_LEFT
51
+
52
+ ##
53
+ # Stereo
14
54
  STEREO = FRONT_LEFT | FRONT_RIGHT
55
+
56
+ ##
57
+ # Left-Right-Center
15
58
  LRC = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER
59
+
60
+ ##
61
+ # Quads
16
62
  QUAD = FRONT_LEFT | FRONT_RIGHT | SURROUND_LEFT | SURROUND_RIGHT
63
+
64
+ ##
65
+ # Surround
17
66
  SURROUND = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT
67
+
68
+ ##
69
+ # 5.1
18
70
  FIVE_POINT_ONE = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT
71
+
72
+ ##
73
+ # 5.1 with Rears
19
74
  FIVE_POINT_ONE_REARS = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | BACK_LEFT | BACK_RIGHT
75
+
76
+ ##
77
+ # 7.0 Surround
20
78
  SEVEN_POINT_ZERO = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT
79
+
80
+ ##
81
+ # 7.1 Surround
21
82
  SEVEN_POINT_ONE = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT
22
83
  end
23
84
  end
@@ -1,11 +1,55 @@
1
1
  module FMOD
2
2
  module Core
3
+
4
+ ##
5
+ # Structure describing a data parameter for a DSP unit.
3
6
  class DataDescription < Structure
4
7
 
8
+ ##
9
+ # The default data type. All user data types should be 0 or above.
10
+ TYPE_USER = 0
11
+
12
+ ##
13
+ # The data type for overall-gain parameters. There should a maximum of one
14
+ # per DSP.
15
+ TYPE_OVERALLGAIN = 1
16
+
17
+ ##
18
+ # The data type for 3D attribute parameters. There should a maximum of one
19
+ # per DSP.
20
+ TYPE_3DATTRIBUTES = 2
21
+
22
+ ##
23
+ # The data type for side-chain parameters. There should a maximum of one
24
+ # per DSP.
25
+ TYPE_SIDECHAIN = 3
26
+
27
+ ##
28
+ # The data type for FFT parameters. There should a maximum of one per DSP.
29
+ TYPE_FFT = 4
30
+
31
+ ##
32
+ # The data type for multiple 3D attribute parameters. There should a
33
+ # maximum of one per DSP.
34
+ TYPE_3DATTRIBUTES_MULTI = 5
35
+
36
+ ##
37
+ # @param address [Pointer, Integer, String, nil] The address in memory
38
+ # where the structure will be created from. If no address is given, new
39
+ # memory will be allocated.
5
40
  def initialize(address = nil)
6
41
  super(address, [TYPE_INT], [:data_type])
7
42
  end
8
43
 
44
+ ##
45
+ # The type of data for this parameter. Use 0 or above for custom types or
46
+ # set to one of the following are possible values:
47
+ # * {TYPE_USER}
48
+ # * {TYPE_OVERALLGAIN}
49
+ # * {TYPE_3DATTRIBUTES}
50
+ # * {TYPE_SIDECHAIN}
51
+ # * {TYPE_FFT}
52
+ # * {TYPE_3DATTRIBUTES_MULTI}
9
53
  def data_type
10
54
  self[:data_type]
11
55
  end
@@ -1,7 +1,178 @@
1
1
  module FMOD
2
2
  module Core
3
+
4
+ ##
5
+ # When creating a DSP unit, declare one of these and provide the relevant
6
+ # callbacks and name for FMOD to use when it creates and uses a DSP unit of
7
+ # this type.
8
+ # @since 0.9.2
3
9
  class DspDescription < Structure
4
- # TODO
10
+
11
+ # @param address [Pointer, Integer, String, nil] The address in memory
12
+ # where the structure will be created from. If no address is given, new
13
+ # memory will be allocated.
14
+ def initialize(address)
15
+ types = [:plugin_sdk_version, :name, :version, :input_buffers,
16
+ :output_buffers, :create, :release, :reset, :read, :process,
17
+ :set_position, :parameter_count, :parameter_description,
18
+ :set_param_float, :set_param_int, :set_param_bool,
19
+ :set_param_data, :get_param_float, :get_param_int,
20
+ :get_param_bool, :get_param_data, :should_process, :user_data,
21
+ :register, :deregister, :mix]
22
+ members = [TYPE_INT, [TYPE_CHAR, 32], TYPE_INT, TYPE_INT, TYPE_INT,
23
+ TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP,
24
+ TYPE_VOIDP, TYPE_INT, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP,
25
+ TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP,
26
+ TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP, TYPE_VOIDP,
27
+ TYPE_VOIDP]
28
+ super(address, types, members)
29
+ end
30
+
31
+ [:plugin_sdk_version, :name, :version, :input_buffers, :output_buffers,
32
+ :create, :release, :reset, :read, :process, :set_position,
33
+ :parameter_count, :parameter_description, :set_param_float,
34
+ :set_param_int, :set_param_bool, :set_param_data, :get_param_float,
35
+ :get_param_int, :get_param_bool, :get_param_data, :should_process,
36
+ :user_data, :register, :deregister, :mix].each do |symbol|
37
+
38
+ define_method(symbol) { self[symbol] }
39
+ define_method("#{symbol}=") { |value| self[symbol] = value }
40
+ end
41
+
42
+ ##
43
+ # @!attribute plugin_sdk_version
44
+ # @return [Integer] the plugin SDK version this plugin is built for.
45
+
46
+ ##
47
+ # @!attribute name
48
+ # @return [String] the identifier of the DSP. This will also be used as
49
+ # the name of DSP and shouldn't change between versions.
50
+
51
+ def name
52
+ self[:name].join.delete("\0")
53
+ end
54
+
55
+ def name=(name)
56
+ chars = name.chars.slice(0, 32)
57
+ chars << "\0" while chars.size < 32
58
+ self[:name] = chars
59
+ end
60
+
61
+ ##
62
+ # @!attribute version
63
+ # @return [Integer] the plugin writer's version number.
64
+
65
+ # @!attribute input_buffers
66
+ # @return [Integer] the number of input buffers to process. Use 0 for DSPs
67
+ # that only generate sound and 1 for effects that process incoming sound
68
+
69
+ ##
70
+ # @!attribute output_buffers
71
+ # @return [Integer] the number of audio output buffers. Only one output
72
+ # buffer is currently supported.
73
+
74
+ ##
75
+ # @!attribute create
76
+ # @return [Closure] Create callback. This is called when DSP unit is
77
+ # created.
78
+
79
+ ##
80
+ # @!attribute release
81
+ # @return [Closure] Release callback. This is called just before the unit
82
+ # is freed so the user can do any cleanup needed for the unit.
83
+
84
+ ##
85
+ # @!attribute reset
86
+ # @return [Closure] Reset callback. This is called by the user to reset
87
+ # any history buffers that may need resetting for a filter, when it is
88
+ # to be used or re-used for the first time to its initial clean state.
89
+ # Use to avoid clicks or artifacts.
90
+
91
+ ##
92
+ # @!attribute read
93
+ # @return [Closure] Read callback. Processing is done here.
94
+
95
+ ##
96
+ # @!attribute process
97
+ # @return [Closure] Process callback. Can be specified instead of the read
98
+ # callback if any channel format changes occur between input and output.
99
+ # This also replaces {#should_process} and should return an error if the
100
+ # effect is to be bypassed.
101
+
102
+ ##
103
+ # @!attribute set_position
104
+ # @return [Closure] Set position callback. This is called if the unit
105
+ # wants to update its position info but not process data, or reset a
106
+ # cursor position internally if it is reading data from a certain
107
+ # source.
108
+
109
+ ##
110
+ # @!attribute parameter_count
111
+ # @return [Integer] the of parameters used in this filter.
112
+
113
+ ##
114
+ # @!attribute parameter_description
115
+ # @return [Pointer] a variable number of parameter structures.
116
+
117
+ ##
118
+ # @!attribute set_param_float
119
+ # @return [Closure] Called when the user sets a float parameter.
120
+
121
+ ##
122
+ # @!attribute set_param_int
123
+ # @return [Closure] Called when the user sets an integer parameter.
124
+
125
+ ##
126
+ # @!attribute set_param_bool
127
+ # @return [Closure] Called when the user sets a boolean parameter.
128
+
129
+ ##
130
+ # @!attribute set_param_data
131
+ # @return [Closure] Called when the user sets a data parameter.
132
+
133
+ ##
134
+ # @!attribute get_param_float
135
+ # @return [Closure] Called when the user gets a float parameter.
136
+
137
+ ##
138
+ # @!attribute get_param_int
139
+ # @return [Closure] Called when the user gets an integer parameter.
140
+
141
+ ##
142
+ # @!attribute get_param_bool
143
+ # @return [Closure] Called when the user sets a boolean parameter.
144
+
145
+ ##
146
+ # @!attribute get_param_data
147
+ # @return [Closure] Called when the user sets a data parameter.
148
+
149
+ ##
150
+ # @!attribute should_process
151
+ # @return [Closure] This is called before processing. You can detect if
152
+ # inputs are idle and return Result::OK to process, or any other error
153
+ # code to avoid processing the effect. Use a count down timer to allow
154
+ # effect tails to process before idling!
155
+
156
+ ##
157
+ # @!attribute user_data
158
+ # @return [Pointer] the user data to be attached to the DSP unit during
159
+ # creation.
160
+
161
+ # @!attribute register
162
+ # @return [Closure] Register callback. This is called when DSP unit is
163
+ # loaded/registered. Useful for 'global'/per system object init for
164
+ # plugin.
165
+
166
+ # @!attribute register
167
+ # @return [Closure] Deregister callback. This is called when DSP unit is
168
+ # unloaded/deregistered. Useful as 'global'/per system object shutdown
169
+ # for plugin.
170
+
171
+ # @!attribute register
172
+ # @return [Closure] System mix stage callback. This is called when the
173
+ # mixer starts to execute or is just finishing executing. Useful for
174
+ # 'global'/per system object once a mix update calls for a plugin.
175
+
5
176
  end
6
177
  end
7
178
  end