seal 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/README.md +1 -1
  2. data/include/seal/buf.h +13 -8
  3. data/include/seal/core.h +1 -5
  4. data/include/seal/efs.h +22 -22
  5. data/include/seal/err.h +3 -8
  6. data/include/seal/fmt.h +1 -6
  7. data/include/seal/listener.h +7 -6
  8. data/include/seal/raw.h +2 -6
  9. data/include/seal/rvb.h +12 -6
  10. data/include/seal/src.h +27 -10
  11. data/include/seal/stream.h +12 -5
  12. data/mpg123/build/config.guess +0 -0
  13. data/mpg123/build/config.sub +0 -0
  14. data/mpg123/build/depcomp +0 -0
  15. data/mpg123/build/install-sh +0 -0
  16. data/mpg123/build/missing +0 -0
  17. data/mpg123/configure +0 -0
  18. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj +5 -0
  19. data/mpg123/ports/MSVC++/2010/libmpg123/yasm.exe +0 -0
  20. data/mpg123/scripts/benchmark-cpu.pl +0 -0
  21. data/mpg123/src/win32_net.c +0 -0
  22. data/mpg123/src/win32_support.c +0 -0
  23. data/mpg123/src/win32_support.h +0 -0
  24. data/mpg123/windows-builds.sh +0 -0
  25. data/spec/seal/core_spec.rb +1 -1
  26. data/spec/seal/effect_slot_spec.rb +5 -8
  27. data/spec/seal/reverb_spec.rb +10 -9
  28. data/spec/seal/source_spec.rb +23 -10
  29. data/spec/seal/stream_spec.rb +7 -0
  30. data/spec/spec_helper.rb +2 -1
  31. data/spec/support/boolean_reader_aliases.rb +9 -0
  32. data/src/rubyext.c +115 -67
  33. data/src/seal/buf.c +0 -6
  34. data/src/seal/core.c +1 -7
  35. data/src/seal/efs.c +0 -9
  36. data/src/seal/err.c +0 -6
  37. data/src/seal/fmt.c +0 -6
  38. data/src/seal/listener.c +0 -6
  39. data/src/seal/mpg.c +0 -6
  40. data/src/seal/mpg.h +0 -4
  41. data/src/seal/ov.c +0 -6
  42. data/src/seal/ov.h +1 -5
  43. data/src/seal/raw.c +0 -6
  44. data/src/seal/reader.c +4 -11
  45. data/src/seal/reader.h +1 -5
  46. data/src/seal/src.c +9 -6
  47. data/src/seal/stream.c +0 -6
  48. data/src/seal/threading.c +0 -6
  49. data/src/seal/threading.h +1 -6
  50. data/src/seal/wav.c +1 -8
  51. data/src/seal/wav.h +2 -6
  52. metadata +5 -3
  53. data/src/win32api.rb +0 -29
data/README.md CHANGED
@@ -71,7 +71,7 @@ Apply a reverberation effect to the sound source:
71
71
  # Allocate an effect slot and associate a specific reverb object.
72
72
  slot = EffectSlot.new(Reverb.new(Reverb::Preset::FOREST))
73
73
  # Start feeding the slot.
74
- slot.feed(0, source)
74
+ source.feed(slot, 0)
75
75
  ```
76
76
 
77
77
  Uninitialize Seal:
@@ -1,13 +1,15 @@
1
1
  /*
2
- * buf.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
2
+ * Interfaces for manipulating buffers. Buffers are essentially abstract
3
+ * representations of (raw) audio data and are used by sources. Buffers are
4
+ * most suitable for small-sized sound effect which can be efficiently loaded
5
+ * to memory at once. Streams, on the other hand, are more suitable for massive
6
+ * audio such as background music.
5
7
  *
6
- * buf.h wraps up the abstract data type `seal_buf_t'. Buffers are essentially
7
- * abstract representations of the (raw) audio data and are used by sources.
8
- * Buffers are most suitable for small-sized sound effect which can be
9
- * efficiently loaded to memory at once. Streams, on the other hand, are more
10
- * suitable for long audio such as background music.
8
+ * In order to have 3D sound effect on the buffer, the audio file needs to have
9
+ * mono-channel. If the audio file has multi-channel, the sound will not be
10
+ * positioned in a 3D space. Multi-channel audio (a.k.a. stereo) is already
11
+ * designed to have illusion of directionality and audible perspective. Most
12
+ * sound effect should be monophonic.
11
13
  */
12
14
 
13
15
  #ifndef _SEAL_BUF_H_
@@ -28,6 +30,9 @@ extern "C" {
28
30
  * Initializes a new buffer. If the buffer is no longer needed, call
29
31
  * `seal_destroy_buf' to release the resources used by the buffer.
30
32
  *
33
+ * There is a limit on the number of allocated buffer. This function returns an
34
+ * error if it is exceeding the limit.
35
+ *
31
36
  * @param buf the buffer to initialize
32
37
  */
33
38
  seal_err_t seal_init_buf(seal_buf_t*);
@@ -1,9 +1,5 @@
1
1
  /*
2
- * core.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * core.h defines interfaces for low-level Seal operations.
2
+ * Interfaces for global Seal operations.
7
3
  */
8
4
 
9
5
  #ifndef _SEAL_CORE_H_
@@ -1,25 +1,33 @@
1
1
  /*
2
- * efs.h is part of the Scorched End Audio Library (SEAL) and is
3
- * licensed under the terms of the GNU Lesser General Public License. See
4
- * COPYING attached with the library.
2
+ * Interfaces for manipulating effect slots, which are containers for effect
3
+ * objects. Effect slots can attach effect objects (such as reverb objects) and
4
+ * then be fed with a mix of audio from different sources, essentially
5
+ * filtering the rendering of the sound sources and output to the mixer based
6
+ * on the attached effect object. For example, if a reverb object is attached
7
+ * to an effect slot and one source is feeding the slot, the sound of that
8
+ * source will have the reverberation effect defined by the reverb object.
9
+
10
+ * Multiple sources can feed the same effect slot, but conversely there is a
11
+ * limit on the number of effect slots a source can feed concurrently. See the
12
+ * documentation for EffectSlot#feed for more details.
5
13
  *
6
- * efs.h defines the effect slot type, which is the container type for
7
- * effects. A source can mix an effect in an effect slot to filter the output
8
- * sound.
14
+ * For more infomation about effect slots, check out the OpenAL effect
15
+ * extension guide at: http://zhang.su/seal/EffectsExtensionGuide.pdf
9
16
  */
10
17
 
11
18
  #ifndef _SEAL_EFS_H_
12
19
  #define _SEAL_EFS_H_
13
20
 
14
- #include "src.h"
15
21
  #include "err.h"
16
22
 
17
23
  typedef struct seal_efs_t seal_efs_t;
18
24
 
19
25
  /*
20
26
  * Initializes a new effect slot. If the effect slot is no longer needed, call
21
- * `seal_destroy_efs' to release the resources used by the effect
22
- * slot.
27
+ * `seal_destroy_efs' to release the resources used by the effect slot.
28
+ *
29
+ * There is a limit on the number of allocated effect slots. This function
30
+ * returns an error if it is exceeding the limit.
23
31
  *
24
32
  * @param efs the effect slot to initialize
25
33
  */
@@ -34,25 +42,17 @@ seal_err_t seal_destroy_efs(seal_efs_t*);
34
42
 
35
43
  /*
36
44
  * Fills an effect slot with an effect object, then the effect Slot will
37
- * become ready to be mixed with sources. Pass 0 to unfill the slot.
45
+ * become ready to be fed by sources. Pass 0 to unfill the slot.
46
+ *
47
+ * Changing the parameters of the effect object after it is attached to the
48
+ * slot will not change the sound effect provided by the slot. To update the
49
+ * sound effect, the effect object must be re-attached to the slot.
38
50
  *
39
51
  * @param efs the effect slot to fill
40
52
  * @param effect the effect to fill the effect slot with
41
53
  */
42
54
  seal_err_t seal_set_efs_effect(seal_efs_t*, void* /*effect*/);
43
55
 
44
- /*
45
- * Mixes a sound effect loaded into an effect slot with a source's output.
46
- * Later calls to this function with a different effect slot and the same
47
- * index will override the old effect slot association.
48
- *
49
- * @see seal_get_neffects_per_src
50
- * @param efs the slot that contains the effect to mix
51
- * @param index the zero-based index of the effect
52
- * @param src the source that feeds the effect slot
53
- */
54
- seal_err_t seal_feed_efs(seal_efs_t*, int /*index*/, seal_src_t*);
55
-
56
56
  /*
57
57
  * Sets the output level of an effect Slot in the interval [0.0f, 1.0f]. A
58
58
  * value of 0.0 mutes the output.
@@ -1,12 +1,7 @@
1
1
  /*
2
- * err.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * err.h defines Seal errors and provides subroutines for clearing and
7
- * retriving errors. Seal functions will set a thread-local error flag when
8
- * error strikes, so if the last Seal function call returns 0, the exact error
9
- * and detailed error message can be retrieved using functions in this module.
2
+ * Seal errors and interfaces for retriving error messages. Most Seal functions
3
+ * return an error code which can be used to retrieve the corresponding error
4
+ * message.
10
5
  */
11
6
 
12
7
  #ifndef _SEAL_ERR_H_
@@ -1,10 +1,5 @@
1
1
  /*
2
- * fmt.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * fmt.h defines all the supported audio file format and provides utilities
7
- * to deal with them.
2
+ * Supported audio file formats and utilities to deal with them.
8
3
  */
9
4
 
10
5
  #ifndef _SEAL_FMT_H_
@@ -1,10 +1,11 @@
1
1
  /*
2
- * listener.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * listener.h wraps up the listener singleton object, which is the abstract
7
- * representation of the sole listener who hears the sound.
2
+ * Interfaces for manipulating the listener singleton object. The listener
3
+ * object abstractly represents the main object in a sound application which
4
+ * "hears" all the sound. For example, the listener object can be used to
5
+ * represent the main character moving around on the map in a role-playing
6
+ * game. The properties of the listener (position, velocity, etc.) combined
7
+ * with those of the existing sources determine how the sound should be
8
+ * rendered.
8
9
  */
9
10
 
10
11
  #ifndef _SEAL_LISTENER_H_
@@ -1,10 +1,6 @@
1
1
  /*
2
- * raw.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * raw.h defines the the data structure `seal_raw_t' that represents raw PCM
7
- * data as well as a series of operations on them.
2
+ * Interfaces for manipulating the data structure `seal_raw_t' which contains
3
+ * raw PCM data.
8
4
  */
9
5
 
10
6
  #ifndef _SEAL_RAW_H_
@@ -1,10 +1,13 @@
1
1
  /*
2
- * rvb.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * rvb.h defines the reverberation effect type and its parameters. Effect
7
- * objects can be put into an effect slot for sources to use.
2
+ * Interfaces for manipulating reverberation effect objects which can be loaded
3
+ * into effect slots. The reverberation parameters can be customized to
4
+ * emulate reverberations in different environment or can be loaded from
5
+ * presets. The preset constants suggest the reverberation environment, for
6
+ * example, `SEAL_ICEPALACE_LONGPASSAGE_REVERB` emulates the reverberation in
7
+ * a long passage of an ice palace.
8
+ *
9
+ * For more infomation about reverberations, check out the OpenAL effect
10
+ * extension guide at: http://zhang.su/seal/EffectsExtensionGuide.pdf
8
11
  */
9
12
 
10
13
  #ifndef _SEAL_RVB_H_
@@ -169,6 +172,9 @@ extern "C" {
169
172
  * Initializes a new reverb effect. If the reverb is no longer needed, call
170
173
  * `seal_destroy_rvb' to release the resources used by the reverb.
171
174
  *
175
+ * There is a limit on the number of allocated reverbs. This function returns
176
+ * an error if it is exceeding the limit.
177
+ *
172
178
  * @param reverb the reverb object to initialize
173
179
  */
174
180
  seal_err_t seal_init_rvb(seal_rvb_t*);
@@ -1,10 +1,8 @@
1
1
  /*
2
- * src.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
5
- *
6
- * src.h wraps up the abstract data type `seal_src_t'. Sources are abstract
7
- * representations of sound sources which emit sound in Euclidean space.
2
+ * Interfaces for manipulating sources. Sources are abstract representations of
3
+ * sound sources which emit sound in a Euclidean space. The sound comes from
4
+ * its attached buffer or stream. Its properties combined with those of the
5
+ * listener singleton object determine how the sound should be rendered.
8
6
  */
9
7
 
10
8
  #ifndef _SEAL_SRC_H_
@@ -13,13 +11,13 @@
13
11
  #include <stddef.h>
14
12
  #include "buf.h"
15
13
  #include "stream.h"
14
+ #include "efs.h"
16
15
  #include "err.h"
17
16
 
18
17
  /*
19
- * A just-initialized source is of the `SEAL_UNDETERMINED' type. A source that
20
- * attaches a buffer through `seal_set_src_buf' will become the `SEAL_STATIC'
21
- * type. A source that streams audio from file through `seal_set_src_stream'
22
- * will become the `SEAL_STREAMING' type.
18
+ * A source not attached to anything is of the `SEAL_UNDETERMINED` type. A
19
+ * source that is attached to a buffer will become the `SEAL_STATIC` type.
20
+ * A source that is attached to a stream will become the `SEAL_STREAMING` type.
23
21
  */
24
22
  enum seal_src_type_t
25
23
  {
@@ -55,6 +53,9 @@ extern "C" {
55
53
  * Initializes a new source. If the source is no longer needed, call
56
54
  * `seal_destroy_source' to release any resource used by the source.
57
55
  *
56
+ * There is a limit on the number of allocated sources. This function returns
57
+ * an error if it is exceeding the limit.
58
+ *
58
59
  * @param src the source to initialize
59
60
  */
60
61
  seal_err_t seal_init_src(seal_src_t*);
@@ -140,6 +141,22 @@ seal_err_t seal_set_src_buf(seal_src_t*, seal_buf_t*);
140
141
  */
141
142
  seal_err_t seal_set_src_stream(seal_src_t*, seal_stream_t*);
142
143
 
144
+ /*
145
+ * Feeds an effect slot with the output of a source so the output is filtered
146
+ * based on the effect attached to the slot. Later calls to this function with
147
+ * a different effect slot and the same source and index will override the old
148
+ * association.
149
+ *
150
+ * @see seal_get_per_src_effect_limit
151
+ * @param src the source that feeds the effect slot
152
+ * @param efs the effect slot to feed
153
+ * @param index the zero-based index for the effect; each different effect
154
+ * slot that the source is feeding must have a unique
155
+ * corresponding index; the max is the return value of
156
+ * seal_get_per_src_effect_limit - 1.
157
+ */
158
+ seal_err_t seal_feed_efs(seal_src_t*, seal_efs_t*, int /*index*/);
159
+
143
160
  /*
144
161
  * Updates a streaming source. If the source is not up-to-date, the playback
145
162
  * will end before the end of the stream is reached. Does nothing if the
@@ -1,10 +1,17 @@
1
1
  /*
2
- * stream.h is part of the Scorched End Audio Library (SEAL) and is licensed
3
- * under the terms of the GNU Lesser General Public License. See COPYING
4
- * attached with the library.
2
+ * Interfaces for manipulating streams used by streaming sources. Streams are
3
+ * usually necessary when the audio data is too massive to fit into main
4
+ * memory as a whole (such as a background music, which can eat up to dozens of
5
+ * megabytes of memory after decoding), in which case buffers are not suitable.
5
6
  *
6
- * stream.h wraps up the `seal_stream_t' data type used by streaming sources.
7
- * It is the front end for various decoders.
7
+ * Streams often contain multi-channel audio (since most of the time they are
8
+ * used to play background music, and background music files are often
9
+ * multi-channel already), which means that they often contain sound that are
10
+ * not positioned, i.e., not processed by the 3D sound rendering pipeline. That
11
+ * fact is totally fine for background music since they are usually not
12
+ * associated to any object in the application. If positioned streams are
13
+ * needed and the audio file has multi-channel, the audio file need to be
14
+ * converted to mono-channel.
8
15
  */
9
16
 
10
17
  #ifndef _SEAL_STREAM_H_
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -340,6 +340,8 @@ yasm -a x86 -p gas -r raw -f win32 -g null -m x86 -o "$(ProjectDir)..\libmpg123\
340
340
  <AdditionalDependencies>dct36_3dnow.o;dct36_3dnowext.o;dct64_3dnow.o;dct64_3dnowext.o;dct64_mmx.o;dct64_sse.o;dct64_sse_float.o;equalizer_3dnow.o;getcpuflags.o;synth_3dnow.o;synth_3dnowext.o;synth_i586.o;synth_mmx.o;synth_sse.o;synth_sse_float.o;synth_stereo_sse_float.o;tabinit_mmx.o;synth_sse_accurate.o;synth_sse_s32.o;synth_stereo_sse_accurate.o;synth_stereo_sse_s32.o;%(AdditionalDependencies)</AdditionalDependencies>
341
341
  <OutputFile>$(ProjectDir)Debug\$(ProjectName).lib</OutputFile>
342
342
  <AdditionalLibraryDirectories>$(ProjectDir)\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
343
+ <IgnoreAllDefaultLibraries>
344
+ </IgnoreAllDefaultLibraries>
343
345
  </Lib>
344
346
  </ItemDefinitionGroup>
345
347
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_x86|Win32'">
@@ -434,6 +436,9 @@ yasm -a x86 -p gas -r raw -f win32 -g null -m x86 -o "$(ProjectDir)..\libmpg123\
434
436
  <OutputFile>$(ProjectDir)Release\$(ProjectName).lib</OutputFile>
435
437
  <AdditionalLibraryDirectories>$(ProjectDir)\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
436
438
  </Lib>
439
+ <PreBuildEvent>
440
+ <Command>del "$(ProjectDir)..\..\..\..\src\libmpg123\mpg123.h"</Command>
441
+ </PreBuildEvent>
437
442
  </ItemDefinitionGroup>
438
443
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_x86_Dll|Win32'">
439
444
  <ClCompile>
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -16,7 +16,7 @@ describe Seal do
16
16
  Seal.listener.should be Seal.listener
17
17
  Seal.listener.should be_a Listener
18
18
  expect { Seal::Listener.new }.to raise_error NoMethodError
19
- expect { Seal::Listener.allocate }.to raise_error TypeError
19
+ expect { Seal::Listener.allocate }.to raise_error
20
20
  end
21
21
 
22
22
  it 'defines a limit on the number of effect slots per source' do
@@ -11,6 +11,7 @@ describe EffectSlot do
11
11
 
12
12
  it_validates 'the boolean attribute', :auto
13
13
  it_validates 'the float attribute', :gain, "[0, 1]"
14
+ it_defines 'boolean reader aliases', [:auto]
14
15
 
15
16
  it 'can initialize with an effect' do
16
17
  reverb = Reverb.new
@@ -25,14 +26,10 @@ describe EffectSlot do
25
26
  effect_slot.effect.should be reverb
26
27
  end
27
28
 
28
- it 'has a limited number of sources it can feed concurrently' do
29
- effect_slot = subject
30
- sources = []
31
- Seal.per_source_effect_limit.times do |i|
32
- sources << Source.new
33
- effect_slot.feed(i, sources[-1])
29
+ it 'can be fed by multiple sources' do
30
+ 23.times do
31
+ source = Source.new
32
+ source.feed(subject, 0)
34
33
  end
35
- expect { effect_slot.feed(sources.size, Source.new) }.to raise_error \
36
- /Invalid parameter value/
37
34
  end
38
35
  end
@@ -30,15 +30,16 @@ describe Reverb do
30
30
  it_validates 'the float attribute', :reflections_delay, '[0, 0.3]'
31
31
  it_validates 'the float attribute', :reflections_gain, '[0, 3.16]'
32
32
  it_validates 'the float attribute', :room_rolloff_factor, '[0, 10]'
33
+ it_defines 'boolean reader aliases', [:hfdecay_limited]
33
34
 
34
- it 'can load different reverb presets' do
35
- test_load_presets = -> a_module do
36
- a_module.constants.each do |const_sym|
37
- constant = a_module.const_get const_sym
38
- case constant
39
- when Module
40
- test_load_presets.call(constant)
41
- else
35
+ specify_preset_loading = -> mod do
36
+ mod.constants.each do |const_sym|
37
+ constant = mod.const_get(const_sym)
38
+ case constant
39
+ when Module
40
+ specify_preset_loading.(constant)
41
+ else
42
+ it "can load preset #{mod}::#{const_sym}" do
42
43
  expect do
43
44
  reverb = Reverb.new(constant)
44
45
  reverb.load(constant)
@@ -46,6 +47,6 @@ describe Reverb do
46
47
  end
47
48
  end
48
49
  end
49
- test_load_presets.call(Reverb::Preset)
50
50
  end
51
+ specify_preset_loading.(Reverb::Preset)
51
52
  end
@@ -11,7 +11,7 @@ describe Source do
11
11
  it_behaves_like 'a movable object'
12
12
 
13
13
  describe 'by default' do
14
- its(:auto?) { should be_true }
14
+ its(:auto) { should be_true }
15
15
  its(:buffer) { should be_nil }
16
16
  its(:chunk_size) { should eq 36864 }
17
17
  its(:gain) { should be_within(TOLERANCE).of(1.0) }
@@ -21,13 +21,14 @@ describe Source do
21
21
  its(:relative) { should be_false }
22
22
  its(:state) { should be INITIAL }
23
23
  its(:stream) { should be_nil }
24
- its (:type) { should be UNDETERMINED }
24
+ its(:type) { should be UNDETERMINED }
25
25
  end
26
26
 
27
27
  it_validates 'the boolean attribute', :relative
28
28
  it_validates 'the boolean attribute', :auto
29
29
  it_validates 'the float attribute', :pitch, "[0, +inf.)"
30
30
  it_validates 'the float attribute', :gain, "[0, +inf.)"
31
+ it_defines 'boolean reader aliases', [:auto, :relative, :looping]
31
32
 
32
33
  it 'validates its queue size is in [2, 63]' do
33
34
  error_pattern = /Invalid parameter value/
@@ -180,6 +181,18 @@ describe Source do
180
181
  end
181
182
  end
182
183
 
184
+ describe 'feeding effect slots' do
185
+ it 'can only feed a limited number concurrently' do
186
+ effect_slot = nil
187
+ Seal.per_source_effect_limit.times do |i|
188
+ effect_slot = EffectSlot.new
189
+ source.feed(effect_slot, i)
190
+ end
191
+ expect { source.feed(effect_slot, Seal.per_source_effect_limit) }.to \
192
+ raise_error /Invalid parameter value/
193
+ end
194
+ end
195
+
183
196
  describe 'automatic streaming' do
184
197
  let(:source) do
185
198
  Source.new.tap do |source|
@@ -209,31 +222,31 @@ describe Source do
209
222
 
210
223
  describe 'looping' do
211
224
  example 'as undetermined type' do
212
- source.looping?.should be_false
225
+ source.looping.should be_false
213
226
  source.looping = true
214
227
  source.looping.should be_true
215
228
  source.looping = false
216
- source.looping?.should be_false
229
+ source.looping.should be_false
217
230
  end
218
231
 
219
232
  example 'as streaming type' do
220
233
  source.looping = true
221
234
  source.stream = stream
222
- source.looping?.should be_true
235
+ source.looping.should be_true
223
236
  source.looping = false
224
- source.looping?.should be_false
237
+ source.looping.should be_false
225
238
  source.looping = true
226
- source.looping?.should be_true
239
+ source.looping.should be_true
227
240
  end
228
241
 
229
242
  example 'as static type' do
230
243
  source.looping = true
231
244
  source.buffer = buffer
232
- source.looping?.should be_true
245
+ source.looping.should be_true
233
246
  source.looping = false
234
- source.looping?.should be_false
247
+ source.looping.should be_false
235
248
  source.looping = true
236
- source.looping?.should be_true
249
+ source.looping.should be_true
237
250
  end
238
251
 
239
252
  # This example depends on the length of the test audio file.