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
@@ -1,5 +1,8 @@
1
1
 
2
2
  module FMOD
3
+
4
+ ##
5
+ # Represents a connection between two DSP units
3
6
  class DspConnection < Handle
4
7
 
5
8
  ##
@@ -1,38 +1,52 @@
1
1
 
2
- require_relative 'effects/channel_mix.rb'
3
- require_relative 'effects/chorus.rb'
4
- require_relative 'effects/compressor.rb'
5
- require_relative 'effects/convolution_reverb.rb'
6
- require_relative 'effects/delay.rb'
7
- require_relative 'effects/distortion.rb'
8
- require_relative 'effects/dsps.rb'
9
- require_relative 'effects/echo.rb'
10
- require_relative 'effects/envelope_follower.rb'
11
- require_relative 'effects/fader.rb'
12
- require_relative 'effects/fft.rb'
13
- require_relative 'effects/flange.rb'
14
- require_relative 'effects/high_pass.rb'
15
- require_relative 'effects/high_pass_simple.rb'
16
- require_relative 'effects/it_echo.rb'
17
- require_relative 'effects/it_lowpass.rb'
18
- require_relative 'effects/ladspa_plugin.rb'
19
- require_relative 'effects/limiter.rb'
20
- require_relative 'effects/loudness_meter.rb'
21
- require_relative 'effects/low_pass.rb'
22
- require_relative 'effects/low_pass_simple.rb'
23
- require_relative 'effects/mixer.rb'
24
- require_relative 'effects/multiband_eq.rb'
25
- require_relative 'effects/normalize.rb'
26
- require_relative 'effects/object_pan.rb'
27
- require_relative 'effects/oscillator.rb'
28
- require_relative 'effects/pan.rb'
29
- require_relative 'effects/param_eq.rb'
30
- require_relative 'effects/pitch_shift.rb'
31
- require_relative 'effects/return.rb'
32
- require_relative 'effects/send.rb'
33
- require_relative 'effects/sfx_reverb.rb'
34
- require_relative 'effects/three_eq.rb'
35
- require_relative 'effects/transceiver.rb'
36
- require_relative 'effects/tremolo.rb'
37
- require_relative 'effects/vst_plugin.rb'
38
- require_relative 'effects/winamp_plugin.rb'
2
+ module FMOD
3
+
4
+ ##
5
+ # Namespace containing all of the built-in DSP effects.
6
+ module Effects
7
+
8
+ require_relative 'effects/channel_mix.rb'
9
+ require_relative 'effects/chorus.rb'
10
+ require_relative 'effects/compressor.rb'
11
+ require_relative 'effects/convolution_reverb.rb'
12
+ require_relative 'effects/delay.rb'
13
+ require_relative 'effects/distortion.rb'
14
+ require_relative 'effects/dsps.rb'
15
+ require_relative 'effects/echo.rb'
16
+ require_relative 'effects/envelope_follower.rb'
17
+ require_relative 'effects/fader.rb'
18
+ require_relative 'effects/fft.rb'
19
+ require_relative 'effects/flange.rb'
20
+ require_relative 'effects/high_pass.rb'
21
+ require_relative 'effects/high_pass_simple.rb'
22
+ require_relative 'effects/it_echo.rb'
23
+ require_relative 'effects/it_lowpass.rb'
24
+ require_relative 'effects/ladspa_plugin.rb'
25
+ require_relative 'effects/limiter.rb'
26
+ require_relative 'effects/loudness_meter.rb'
27
+ require_relative 'effects/low_pass.rb'
28
+ require_relative 'effects/low_pass_simple.rb'
29
+ require_relative 'effects/mixer.rb'
30
+ require_relative 'effects/multiband_eq.rb'
31
+ require_relative 'effects/normalize.rb'
32
+ require_relative 'effects/object_pan.rb'
33
+ require_relative 'effects/oscillator.rb'
34
+ require_relative 'effects/pan.rb'
35
+ require_relative 'effects/param_eq.rb'
36
+ require_relative 'effects/pitch_shift.rb'
37
+ require_relative 'effects/return.rb'
38
+ require_relative 'effects/send.rb'
39
+ require_relative 'effects/sfx_reverb.rb'
40
+ require_relative 'effects/three_eq.rb'
41
+ require_relative 'effects/transceiver.rb'
42
+ require_relative 'effects/tremolo.rb'
43
+ require_relative 'effects/vst_plugin.rb'
44
+ require_relative 'effects/winamp_plugin.rb'
45
+
46
+ deprecate_constant :HighPass
47
+ deprecate_constant :HighPassSimple
48
+ deprecate_constant :LowPass
49
+ deprecate_constant :LowPassSimple
50
+ deprecate_constant :LadspaPlugin
51
+ end
52
+ end
@@ -1,4 +1,7 @@
1
1
  module FMOD
2
+
3
+ ##
4
+ # Exception class for FMOD errors.
2
5
  class Error < StandardError
3
6
 
4
7
  include FMOD::Core
@@ -1,5 +1,12 @@
1
1
 
2
2
  module FMOD
3
+
4
+ ##
5
+ # FMOD supports the supply of polygon mesh data, that can be processed in
6
+ # realtime to create the effect of occlusion in a real 3D world. In real world
7
+ # terms, the user can stop sounds travelling through walls, or even confine
8
+ # reverb inside a geometric volume so that it doesn't leak out into other
9
+ # areas.
3
10
  class Geometry < Handle
4
11
 
5
12
  include Enumerable
@@ -2,16 +2,28 @@ require 'fiddle'
2
2
  require 'fiddle/import'
3
3
 
4
4
  module FMOD
5
+
6
+ ##
7
+ # @abstract The superclass for all core FMOD classes.
8
+ # Contains a reference handle to an unmanaged object, and as such it is
9
+ # crucial to call {#release} on any derived class to prevent memory leaks.
5
10
  class Handle < Fiddle::Pointer
6
11
 
7
12
  include Fiddle
8
13
  include FMOD::Core
9
14
 
15
+ ##
16
+ # @param address [Pointer, Integer, String] The address of a native FMOD
17
+ # pointer.
10
18
  def initialize(address)
11
19
  address = address.unpack1('J') if address.is_a?(String)
12
20
  super(address.to_i)
13
21
  end
14
22
 
23
+ ##
24
+ # Releases the native handle.
25
+ # Failure to call this function may result in memory leaks.
26
+ # @return [void]
15
27
  def release
16
28
  case self
17
29
  when Sound then FMOD.invoke(:Sound_Release, self)
@@ -26,6 +38,9 @@ module FMOD
26
38
 
27
39
  alias_method :dispose, :release
28
40
 
41
+ # @!attribute user_data
42
+ # @return [Pointer] a user value stored within the object.
43
+
29
44
  def user_data
30
45
  pointer = int_ptr
31
46
  case self
@@ -71,16 +86,30 @@ module FMOD
71
86
  pointer
72
87
  end
73
88
 
89
+ ##
90
+ # @return [String] the string representation of the object.
74
91
  def to_s
75
92
  inspect # TODO
76
93
  end
77
94
 
95
+ ##
96
+ # @return [String] an empty string buffer the size of the platforms pointer
97
+ # size.
78
98
  def int_ptr
79
99
  "\0" * SIZEOF_INTPTR_T
80
100
  end
81
101
 
82
102
  private
83
103
 
104
+ ##
105
+ # Dynamically links a Ruby method to get a boolean value from a native
106
+ # FMOD function.
107
+ #
108
+ # @param name [Symbol] The Ruby method name to be defined.
109
+ # @param function [Symbol] The native FMOD function to import.
110
+ # The "FMOD_" prefix may be omitted.
111
+ #
112
+ # @return [void]
84
113
  def self.bool_reader(name, function)
85
114
  self.send(:define_method, name) do
86
115
  FMOD.invoke(function, self, buffer = "\0" * SIZEOF_INT)
@@ -88,12 +117,30 @@ module FMOD
88
117
  end
89
118
  end
90
119
 
120
+ ##
121
+ # Dynamically links a Ruby method to set a boolean value in a native
122
+ # FMOD function.
123
+ #
124
+ # @param name [Symbol] The Ruby method name to be defined.
125
+ # @param function [Symbol] The native FMOD function to import.
126
+ # The "FMOD_" prefix can be omitted.
127
+ #
128
+ # @return [void]
91
129
  def self.bool_writer(name, function)
92
130
  self.send(:define_method, name) do |bool|
93
131
  FMOD.invoke(function, self, bool.to_i)
94
132
  end
95
133
  end
96
134
 
135
+ ##
136
+ # Dynamically links a Ruby method to get an integer value from a native
137
+ # FMOD function.
138
+ #
139
+ # @param name [Symbol] The Ruby method name to be defined.
140
+ # @param function [Symbol] The native FMOD function to import.
141
+ # The "FMOD_" prefix may be omitted.
142
+ #
143
+ # @return [void]
97
144
  def self.integer_reader(name, function)
98
145
  self.send(:define_method, name) do
99
146
  FMOD.invoke(function, self, buffer = "\0" * SIZEOF_INT)
@@ -101,6 +148,19 @@ module FMOD
101
148
  end
102
149
  end
103
150
 
151
+ ##
152
+ # Dynamically links a Ruby method to set an integer value in a native
153
+ # FMOD function.
154
+ #
155
+ # @param name [Symbol] The Ruby method name to be defined.
156
+ # @param function [Symbol] The native FMOD function to import.
157
+ # The "FMOD_" prefix can be omitted.
158
+ # @param min [Numeric] The minimum permitted value that can be passed to
159
+ # the defined method. Values out of range will be clamped.
160
+ # @param max [Numeric] The maximum permitted value that can be passed to
161
+ # the defined method. Values out of range will be clamped.
162
+ #
163
+ # @return [void]
104
164
  def self.integer_writer(name, function, min = nil, max = nil)
105
165
  self.send(:define_method, name) do |int|
106
166
  int = min if min && int < min
@@ -110,6 +170,15 @@ module FMOD
110
170
  end
111
171
  end
112
172
 
173
+ ##
174
+ # Dynamically links a Ruby method to get a float value from a native
175
+ # FMOD function.
176
+ #
177
+ # @param name [Symbol] The Ruby method name to be defined.
178
+ # @param function [Symbol] The native FMOD function to import.
179
+ # The "FMOD_" prefix may be omitted.
180
+ #
181
+ # @return [void]
113
182
  def self.float_reader(name, function)
114
183
  self.send(:define_method, name) do
115
184
  FMOD.invoke(function, self, buffer = "\0" * SIZEOF_FLOAT)
@@ -117,6 +186,19 @@ module FMOD
117
186
  end
118
187
  end
119
188
 
189
+ ##
190
+ # Dynamically links a Ruby method to set a float value in a native
191
+ # FMOD function.
192
+ #
193
+ # @param name [Symbol] The Ruby method name to be defined.
194
+ # @param function [Symbol] The native FMOD function to import.
195
+ # The "FMOD_" prefix can be omitted.
196
+ # @param min [Numeric] The minimum permitted value that can be passed to
197
+ # the defined method. Values out of range will be clamped.
198
+ # @param max [Numeric] The maximum permitted value that can be passed to
199
+ # the defined method. Values out of range will be clamped.
200
+ #
201
+ # @return [void]
120
202
  def self.float_writer(name, function, min = nil, max = nil)
121
203
  self.send(:define_method, name) do |float|
122
204
  float = min if min && float < min
@@ -15,32 +15,6 @@ module FMOD
15
15
  # setting is set to the default ambient reverb setting.
16
16
  class Reverb3D < Handle
17
17
 
18
- ##
19
- # @!attribute properties
20
- # Gets or sets the reverb parameters for the current reverb object.
21
- # @return [Reverb]
22
-
23
- ##
24
- # @!attribute position
25
- # A {Vector} containing the 3D position of the center of the reverb in 3D
26
- # space.
27
- # * *Default:* {Vector.zero}
28
- # @return [Vector]
29
-
30
- ##
31
- # @!attribute min_distance
32
- # The distance from the center-point that the reverb will have full effect
33
- # at.
34
- # * *Default:* 0.0
35
- # @return [Float]
36
-
37
- ##
38
- # @!attribute max_distance
39
- # The distance from the center-point that the reverb will not have any
40
- # effect.
41
- # * *Default:* 0.0
42
- # @return [Float]
43
-
44
18
  ##
45
19
  # @!attribute active
46
20
  # Gets or sets the a state to disable or enable a reverb object so that it
@@ -50,6 +24,13 @@ module FMOD
50
24
  bool_reader(:active, :Reverb3D_GetActive)
51
25
  bool_writer(:active=, :Reverb3D_SetActive)
52
26
 
27
+ ##
28
+ # @!attribute min_distance
29
+ # The distance from the center-point that the reverb will have full effect
30
+ # at.
31
+ # * *Default:* 0.0
32
+ # @return [Float]
33
+
53
34
  def min_distance
54
35
  buffer = "\0" * SIZEOF_FLOAT
55
36
  FMOD.invoke(:Reverb3D_Get3DAttributes, self, nil, buffer, nil)
@@ -61,6 +42,13 @@ module FMOD
61
42
  distance, max_distance )
62
43
  end
63
44
 
45
+ ##
46
+ # @!attribute max_distance
47
+ # The distance from the center-point that the reverb will not have any
48
+ # effect.
49
+ # * *Default:* 0.0
50
+ # @return [Float]
51
+
64
52
  def max_distance
65
53
  buffer = "\0" * SIZEOF_FLOAT
66
54
  FMOD.invoke(:Reverb3D_Get3DAttributes, self, nil, nil, buffer)
@@ -72,6 +60,13 @@ module FMOD
72
60
  min_distance, distance )
73
61
  end
74
62
 
63
+ ##
64
+ # @!attribute position
65
+ # A {Vector} containing the 3D position of the center of the reverb in 3D
66
+ # space.
67
+ # * *Default:* {Vector.zero}
68
+ # @return [Vector]
69
+
75
70
  def position
76
71
  vector = Vector.zero
77
72
  FMOD.invoke(:Reverb3D_Get3DAttributes, self, vector, nil, nil)
@@ -84,6 +79,10 @@ module FMOD
84
79
  min_distance, max_distance )
85
80
  end
86
81
 
82
+ ##
83
+ # @!attribute properties
84
+ # @return [Reverb] the reverb parameters for the current reverb object.
85
+
87
86
  def properties
88
87
  FMOD.invoke(:Reverb3D_GetProperties, self, reverb = Reverb.new)
89
88
  reverb
@@ -1,5 +1,8 @@
1
1
 
2
2
  module FMOD
3
+
4
+ ##
5
+ # Represents the actual data source of audio, usually an audio file or stream.
3
6
  class Sound < Handle
4
7
 
5
8
  ##
@@ -764,7 +767,8 @@ module FMOD
764
767
  parent.play_sound(self, group, false)
765
768
  end
766
769
 
767
-
770
+ ##
771
+ # Emulates an Array-type container of a {Tag}'s objects within a {Sound}.
768
772
  class TagCollection
769
773
 
770
774
  include Enumerable
@@ -781,6 +785,9 @@ module FMOD
781
785
  self
782
786
  end
783
787
 
788
+ ##
789
+ # @!attribute [r] count
790
+ # @return [Integer] the number of tags in the collection.
784
791
  def count
785
792
  buffer = "\0" * Fiddle::SIZEOF_INT
786
793
  FMOD.invoke(:Sound_GetNumTags, @sound, buffer, nil)
@@ -789,12 +796,23 @@ module FMOD
789
796
 
790
797
  alias_method :size, :count
791
798
 
799
+ ##
800
+ # @!attribute [r] count
801
+ # @return [Integer] the number of updated tags in the collection since
802
+ # last time this value was checked.
792
803
  def updated_count
793
804
  buffer = "\0" * Fiddle::SIZEOF_INT
794
805
  FMOD.invoke(:Sound_GetNumTags, @sound, nil, buffer)
795
806
  buffer.unpack1('l')
796
807
  end
797
808
 
809
+ ##
810
+ # Retrieves a descriptive tag stored by the sound, to describe things like
811
+ # the song name, author etc.
812
+ #
813
+ # @param index [Integer] Index into the collection to retrieve the tag.
814
+ #
815
+ # @return [Tag, nil] the desired {Tag} or +nil+ if index is out of range.
798
816
  def [](index)
799
817
  tag = FMOD::Core::Tag.new
800
818
  if index.is_a?(Integer)
@@ -805,6 +823,8 @@ module FMOD
805
823
  end
806
824
  tag
807
825
  end
826
+
827
+ alias_method :tag, :[]
808
828
  end
809
829
  end
810
830
  end
@@ -1,52 +1,128 @@
1
1
 
2
2
  module FMOD
3
+
4
+ ##
5
+ # Represents a logical grouping of {Sound} objects that can be manipulated as
6
+ # one.
3
7
  class SoundGroup < Handle
4
8
 
5
9
  include Fiddle
6
10
  include Enumerable
7
11
 
12
+ ##
13
+ # @!attribute max_audible
14
+ # Limits the number of concurrent playbacks of sounds in a sound group to
15
+ # the specified value.
16
+ #
17
+ # After this, if the sounds in the sound group are playing this many times,
18
+ # any attempts to play more of the sounds in the sound group will by default
19
+ # fail an exception.
20
+ #
21
+ # Use {#behavior} to change the way the sound playback behaves when too many
22
+ # sounds are playing. Muting, failing and stealing behaviors can be
23
+ # specified.
24
+ #
25
+ # @return [Integer] the number of playbacks to be audible at once. -1 (the
26
+ # default) denotes unlimited.
8
27
  integer_reader(:max_audible, :SoundGroup_GetMaxAudible)
9
- integer_writer(:max_audible=, :SoundGroup_SetMaxAudible)
28
+ integer_writer(:max_audible=, :SoundGroup_SetMaxAudible, min: -1)
10
29
 
30
+ ##
31
+ # @!attribute behavior
32
+ # Determines the way the sound playback behaves when too many sounds are
33
+ # playing in a sound group. Muting, failing and stealing behaviors can be
34
+ # specified.
35
+ #
36
+ # @return [Integer] the current behavior.
37
+ # @see SoundGroupBehavior
11
38
  integer_reader(:behavior, :SoundGroup_GetMaxAudibleBehavior)
12
39
  integer_writer(:behavior=, :SoundGroup_SetMaxAudibleBehavior)
13
40
 
41
+ ##
42
+ # @!attribute volume
43
+ # The volume for a sound group, affecting all channels playing the sounds in
44
+ # this sound group.
45
+ #
46
+ # 0.0 is silent, 1.0 is full volume, though negative values and
47
+ # amplification are supported.
48
+ #
49
+ # @return [Float] the sound group volume.
14
50
  float_reader(:volume, :SoundGroup_GetVolume)
15
51
  float_writer(:volume=, :SoundGroup_SetVolume)
16
52
 
53
+ ##
54
+ # @!attribute fade_speed
55
+ # @return [Float] the time in seconds to fade with when {#behavior} is set
56
+ # to {SoundGroupBehavior::MUTE}. By default there is no fade.
17
57
  float_reader(:fade_speed, :SoundGroup_GetMuteFadeSpeed)
18
58
  float_writer(:fade_speed=, :SoundGroup_SetMuteFadeSpeed)
19
59
 
20
- integer_reader(:count, :SoundGroup_GetNumSounds)
60
+ ##
61
+ # @!attribute [r] playing_count
62
+ # @return [Integer] e number of currently playing channels for the group.
21
63
  integer_reader(:playing_count, :SoundGroup_GetNumPlaying)
22
64
 
65
+ ##
66
+ # @!attribute [r] count
67
+ # @return [Integer] the current number of sounds in this sound group.
68
+ integer_reader(:count, :SoundGroup_GetNumSounds)
69
+
23
70
  alias_method :size, :count
24
71
 
72
+ ##
73
+ # @!attribute [r] name
74
+ # @return [String] the name of the sound group.
25
75
  def name
26
76
  buffer = "\0" * 512
27
77
  FMOD.invoke(:SoundGroup_GetName, self, buffer, 512)
28
78
  buffer.delete("\0")
29
79
  end
30
80
 
81
+ ##
82
+ # Enumerates the sounds contained within the sound group.
83
+ #
84
+ # @overload each
85
+ # When called with block, yields each {Sound within the object before
86
+ # returning self.
87
+ # @yield [sound] Yields a sound to the block.
88
+ # @yieldparam sound [Sound] The current enumerated polygon.
89
+ # @return [self]
90
+ # @overload each
91
+ # When no block specified, returns an Enumerator for the {SoundGroup}.
92
+ # @return [Enumerator]
31
93
  def each
32
94
  return to_enum(:each) unless block_given?
33
95
  (0...count).each { |i| yield self[i] }
34
96
  self
35
97
  end
36
98
 
99
+ ##
100
+ # Retrieves a sound from within a sound group.
101
+ #
102
+ # @param index [Integer] Index of the sound that is to be retrieved.
103
+ #
104
+ # @return [Sound, nil] the desired Sound object, or +nil+ if index was out
105
+ # of range.
37
106
  def [](index)
38
- FMOD.valid_range?(0, 0, count - 1)
107
+ return nil unless FMOD.valid_range?(0, 0, count - 1, false)
39
108
  FMOD.invoke(:SoundGroup_GetSound, self, index, sound = int_ptr)
40
109
  Sound.new(sound)
41
110
  end
42
111
 
43
112
  alias_method :sound, :[]
44
113
 
114
+ ##
115
+ # @!attribute [r] parent
116
+ # @return [System] the parent {System} object that was used to create this
117
+ # object.
45
118
  def parent
46
119
  FMOD.invoke(:SoundGroup_GetSystemObject, self, system = int_ptr)
47
120
  System.new(system)
48
121
  end
49
122
 
123
+ ##
124
+ # Stops all sounds within this sound group.
125
+ # @return [void]
50
126
  def stop
51
127
  FMOD.invoke(:SoundGroup_Stop, self)
52
128
  end