seal 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +15 -3
- data/ext/seal/extconf.rb +1 -1
- data/include/seal.h +0 -4
- data/include/seal/src.h +9 -4
- data/spec/seal/core_spec.rb +20 -8
- data/spec/seal/effect_slot_spec.rb +1 -1
- data/spec/seal/reverb_spec.rb +1 -1
- data/spec/seal/source_spec.rb +1 -1
- data/src/rubyext.c +15 -3
- data/src/seal/core.c +1 -1
- data/src/seal/src.c +89 -19
- metadata +27 -38
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6a4ec328c05b480d1e4771accd5feddc120359f0
|
4
|
+
data.tar.gz: 5006a20741965f24f45f4e0f1d1f5ccc41859956
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: be6c6509925a48baddd68cf0089becceaff0d84394c85cae4e68c6b485a5037728dabac4b5492555ea833ad8c0fd95c895bbbf0145ce31b68a6fa33074549806
|
7
|
+
data.tar.gz: 589899ce37a1f214815c3aa5860752cecf1398cf39e0236104bd4ce2d9dc4b0a3d8760e91febd767608c9bd302d80baac74bac7baa69f319773c67edc725bd7f
|
data/README.md
CHANGED
@@ -3,10 +3,17 @@
|
|
3
3
|
Seal is a C library with Ruby binding for audio rendering and manipulation,
|
4
4
|
such as direction and distance attenuation, the simulation of the Doppler
|
5
5
|
effect and reverberation, in a 3D space. It is built on top of [OpenAL]
|
6
|
-
(http://connect.creativelabs.com/openal/default.aspx)
|
7
|
-
audio streaming and audio formats like Ogg Vorbis, MPEG Audio and WAVE.
|
6
|
+
(http://connect.creativelabs.com/openal/default.aspx).
|
8
7
|
|
9
|
-
##
|
8
|
+
## Why Seal? Why not Simply Use OpenAL?
|
9
|
+
|
10
|
+
0. Seal has a Ruby binding and many syntactic sugars.
|
11
|
+
1. Seal supports audio formats like Ogg Vorbis, MPEG Audio and WAVE.
|
12
|
+
2. Seal abstracts automatic audio streaming (also preventing problems like
|
13
|
+
discontinued stream due to I/O stress).
|
14
|
+
3. More stuff in the future...
|
15
|
+
|
16
|
+
## Basic Usage
|
10
17
|
|
11
18
|
Initialize Seal:
|
12
19
|
|
@@ -167,6 +174,11 @@ CC=/usr/bin/gcc-4.2 cmake -DCMAKE_BUILD_TYPE=Release ..
|
|
167
174
|
After OpenAL is installed, you can start building Seal. Seal will dynamically
|
168
175
|
link OpenAL.
|
169
176
|
|
177
|
+
Note that depending on where OpenAL's `make install` installs the actual
|
178
|
+
shared library, you may need to add the lib path to `LD_LIBRARY_PATH` in
|
179
|
+
order for Seal to find the shared `libopenal.so` file.
|
180
|
+
|
181
|
+
|
170
182
|
### Install as a Gem (in a sane environment)
|
171
183
|
|
172
184
|
```Bash
|
data/ext/seal/extconf.rb
CHANGED
@@ -12,7 +12,7 @@ mpg123_dir = File.join root_dir, 'mpg123'
|
|
12
12
|
mpg123_src_dir = File.join mpg123_dir, 'src'
|
13
13
|
mpg123_lib_dir = File.join mpg123_src_dir, 'libmpg123', '.libs'
|
14
14
|
|
15
|
-
$defs << '-DNDEBUG'
|
15
|
+
$defs << '-DNDEBUG' << '-DMPG123_NO_LARGENAME'
|
16
16
|
$LDFLAGS << ' -s'
|
17
17
|
|
18
18
|
unless File.exists?(File.join(mpg123_src_dir, 'config.h'))
|
data/include/seal.h
CHANGED
@@ -1,8 +1,4 @@
|
|
1
1
|
/*
|
2
|
-
* seal.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
2
|
* seal.h is the master header file for the Scorched End Audio Library. By
|
7
3
|
* including seal.h, there will be no need to include the inidividual modules'
|
8
4
|
* header files.
|
data/include/seal/src.h
CHANGED
@@ -166,10 +166,14 @@ seal_err_t SEAL_API seal_set_src_stream(seal_src_t*, seal_stream_t*);
|
|
166
166
|
seal_err_t SEAL_API seal_feed_efs(seal_src_t*, seal_efs_t*, int /*index*/);
|
167
167
|
|
168
168
|
/*
|
169
|
-
* Updates a streaming source
|
170
|
-
*
|
171
|
-
*
|
172
|
-
* update is on.
|
169
|
+
* Updates a streaming source by filling up the audio queue until it is full.
|
170
|
+
* If the source is not up-to-date, the playback will end before the end of
|
171
|
+
* the stream is reached. Does nothing if the passed-in source is not a
|
172
|
+
* streaming source. Also does nothing if auto update is on. When auto update
|
173
|
+
* is off, it is the caller's responsibility to handle cases where the consumer
|
174
|
+
* (OpenAL) consumes faster than the producer (the caller) produces and causes
|
175
|
+
* the playback to stop. Automatic sources automatically resume playing in such
|
176
|
+
* cases.
|
173
177
|
*
|
174
178
|
* @param src the source to update
|
175
179
|
*/
|
@@ -453,6 +457,7 @@ struct seal_src_t
|
|
453
457
|
size_t queue_size : 6;
|
454
458
|
unsigned int looping : 1;
|
455
459
|
unsigned int automatic : 1;
|
460
|
+
unsigned int early_stop : 1;
|
456
461
|
};
|
457
462
|
|
458
463
|
#endif /* _SEAL_SRC_H_ */
|
data/spec/seal/core_spec.rb
CHANGED
@@ -1,15 +1,27 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Seal do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
context 'initially' do
|
5
|
+
# Examples in this group needs to call Seal.startup themselves instead of
|
6
|
+
# relying on it being implicitly called by the global before hook.
|
7
|
+
# Therefore, Seal must be finalized in order to avoid double startup, which
|
8
|
+
# may fail for some devices due to opening an already opened, busy device.
|
9
|
+
before { Seal.cleanup }
|
10
|
+
# Since there is a global after hook for Seal.cleanup, we insert this after
|
11
|
+
# hook before the global one so the global one will then cleans up
|
12
|
+
# properly.
|
13
|
+
prepend_after { Seal.startup }
|
14
|
+
|
15
|
+
it 'starts up and cleans up properly on default device' do
|
16
|
+
expect do
|
17
|
+
Seal.startup
|
18
|
+
Seal.cleanup
|
19
|
+
end.to_not raise_error
|
20
|
+
end
|
10
21
|
|
11
|
-
|
12
|
-
|
22
|
+
it 'fails when trying to start up on non-existing device' do
|
23
|
+
expect { Seal.startup 'foo42' }.to raise_error SealError
|
24
|
+
end
|
13
25
|
end
|
14
26
|
|
15
27
|
it 'has only one instance of Listener' do
|
@@ -11,7 +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',
|
14
|
+
it_defines 'boolean reader aliases', %i(auto)
|
15
15
|
|
16
16
|
it 'can initialize with an effect' do
|
17
17
|
reverb = Reverb.new
|
data/spec/seal/reverb_spec.rb
CHANGED
@@ -30,7 +30,7 @@ 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',
|
33
|
+
it_defines 'boolean reader aliases', %i(hfdecay_limited)
|
34
34
|
|
35
35
|
specify_preset_loading = -> mod do
|
36
36
|
mod.constants.each do |const_sym|
|
data/spec/seal/source_spec.rb
CHANGED
@@ -28,7 +28,7 @@ describe Source do
|
|
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',
|
31
|
+
it_defines 'boolean reader aliases', %i(auto relative looping)
|
32
32
|
|
33
33
|
it 'validates its queue size is in [2, 63]' do
|
34
34
|
error_pattern = /Invalid parameter value/
|
data/src/rubyext.c
CHANGED
@@ -773,9 +773,13 @@ feed_efs(VALUE rsrc, VALUE rslot, VALUE rindex)
|
|
773
773
|
* call-seq:
|
774
774
|
* source.update -> source
|
775
775
|
*
|
776
|
-
* Updates
|
777
|
-
*
|
778
|
-
*
|
776
|
+
* Updates a streaming _source_ by filling up the audio queue until it is full.
|
777
|
+
* If _source_ is not up-to-date, the playback will end before the end of the
|
778
|
+
* stream is reached. Does nothing if _source_ is not a streaming source. Also
|
779
|
+
* does nothing if auto update is on. When auto update is off, it is the
|
780
|
+
* caller's responsibility to handle cases where the consumer (OpenAL) consumes
|
781
|
+
* faster than the producer (the caller) produces and causes the playback to
|
782
|
+
* stop. Automatic sources automatically resume playing in such cases.
|
779
783
|
*/
|
780
784
|
static
|
781
785
|
VALUE update_src(VALUE rsrc)
|
@@ -1701,6 +1705,14 @@ get_listener()
|
|
1701
1705
|
return rb_const_get(mSeal, rb_intern("LISTENER"));
|
1702
1706
|
}
|
1703
1707
|
|
1708
|
+
/*
|
1709
|
+
* call-seq:
|
1710
|
+
* listener.move -> listener
|
1711
|
+
*
|
1712
|
+
* Moves the listener (changes the position) based on the source velocity. This
|
1713
|
+
* is a syntactic sugar for adding the velocity vector and position vector. See
|
1714
|
+
* Source#move.
|
1715
|
+
*/
|
1704
1716
|
static
|
1705
1717
|
VALUE
|
1706
1718
|
move_listener(VALUE rlistener)
|
data/src/seal/core.c
CHANGED
data/src/seal/src.c
CHANGED
@@ -27,6 +27,9 @@ static const size_t DEFAULT_CHUNK_SIZE = MIN_CHUNK_SIZE << 2;
|
|
27
27
|
static const size_t MAX_CHUNK_SIZE = CHUNK_STORAGE_CAP -
|
28
28
|
CHUNK_STORAGE_CAP % MIN_CHUNK_SIZE;
|
29
29
|
|
30
|
+
/*
|
31
|
+
* Checks if `val` is in the closed interval [`lower_bound`, `upper_bound`].
|
32
|
+
*/
|
30
33
|
static
|
31
34
|
seal_err_t
|
32
35
|
check_val_limit(int val, int lower_bound, int upper_bound)
|
@@ -39,13 +42,42 @@ check_val_limit(int val, int lower_bound, int upper_bound)
|
|
39
42
|
return SEAL_OK;
|
40
43
|
}
|
41
44
|
|
45
|
+
/*
|
46
|
+
* Called when the state of a source is preemptively changed by a caller.
|
47
|
+
*/
|
42
48
|
static
|
43
49
|
seal_err_t
|
44
|
-
|
50
|
+
on_preemptive_state_change(seal_src_t* src)
|
45
51
|
{
|
52
|
+
seal_err_t err;
|
53
|
+
seal_src_state_t state;
|
54
|
+
|
55
|
+
if ((err = seal_get_src_state(src, &state)) != SEAL_OK)
|
56
|
+
return err;
|
57
|
+
|
58
|
+
/* Set `early_stop` to true after playing so it will only be set to false
|
59
|
+
* when playback ended with the end of stream reached or the state is
|
60
|
+
* preemptively changed.
|
61
|
+
*/
|
62
|
+
src->early_stop = state == SEAL_PLAYING ? 1 : 0;
|
63
|
+
|
64
|
+
return SEAL_OK;
|
65
|
+
}
|
66
|
+
|
67
|
+
/*
|
68
|
+
* Changes the source state by calling one of the four operations on a source.
|
69
|
+
*/
|
70
|
+
static
|
71
|
+
seal_err_t
|
72
|
+
change_state(seal_src_t* src, void (*op)(unsigned int))
|
73
|
+
{
|
74
|
+
seal_err_t err;
|
75
|
+
|
46
76
|
op(src->id);
|
77
|
+
if ((err = _seal_get_openal_err()) != SEAL_OK)
|
78
|
+
return err;
|
47
79
|
|
48
|
-
return
|
80
|
+
return on_preemptive_state_change(src);
|
49
81
|
}
|
50
82
|
|
51
83
|
static
|
@@ -76,6 +108,9 @@ wait4updater(seal_src_t* src)
|
|
76
108
|
}
|
77
109
|
}
|
78
110
|
|
111
|
+
/*
|
112
|
+
* The main routine for updater threads.
|
113
|
+
*/
|
79
114
|
static
|
80
115
|
void*
|
81
116
|
update(void* args)
|
@@ -85,11 +120,22 @@ update(void* args)
|
|
85
120
|
|
86
121
|
while (alIsSource(src->id)) {
|
87
122
|
seal_src_state_t state;
|
88
|
-
|
89
|
-
|
90
|
-
|
123
|
+
|
124
|
+
/* Check source state before checking if interrupted by caller. */
|
125
|
+
if ((err = seal_get_src_state(src, &state)) != SEAL_OK)
|
126
|
+
break;
|
127
|
+
if (state != SEAL_PLAYING) {
|
128
|
+
/* Early stopping, most likely due to I/O load. Restart playing. */
|
129
|
+
if (src->early_stop) {
|
130
|
+
if ((err = change_state(src, alSourcePlay)) != SEAL_OK)
|
131
|
+
break;
|
132
|
+
} else {
|
133
|
+
break;
|
134
|
+
}
|
135
|
+
}
|
91
136
|
if ((err = seal_update_src(src)) != SEAL_OK)
|
92
137
|
break;
|
138
|
+
|
93
139
|
_seal_sleep(50);
|
94
140
|
}
|
95
141
|
|
@@ -119,6 +165,10 @@ unqueue_bufs(seal_src_t* src, int nbufs, unsigned int* bufs)
|
|
119
165
|
return queue_op(src, nbufs, bufs, alSourceUnqueueBuffers);
|
120
166
|
}
|
121
167
|
|
168
|
+
/*
|
169
|
+
* Cleans the queue and free any allocated buffers in the queue. This function
|
170
|
+
* assumes the source is stopped at the time of calling.
|
171
|
+
*/
|
122
172
|
static
|
123
173
|
seal_err_t
|
124
174
|
clean_queue(seal_src_t* src)
|
@@ -151,8 +201,9 @@ clean_queue(seal_src_t* src)
|
|
151
201
|
}
|
152
202
|
|
153
203
|
/*
|
154
|
-
*
|
155
|
-
* they can be unqueued.
|
204
|
+
* Cleans the queue after stopping the source. A stopped source will have all
|
205
|
+
* the buffers in its queue marked as processed so that they can be unqueued.
|
206
|
+
* This function assumes the source is playing at the time of calling.
|
156
207
|
*/
|
157
208
|
static
|
158
209
|
seal_err_t
|
@@ -160,7 +211,7 @@ stop_then_clean_queue(seal_src_t* src)
|
|
160
211
|
{
|
161
212
|
seal_err_t err;
|
162
213
|
|
163
|
-
if ((err =
|
214
|
+
if ((err = change_state(src, alSourceStop)) != SEAL_OK)
|
164
215
|
return err;
|
165
216
|
|
166
217
|
return clean_queue(src);
|
@@ -178,6 +229,10 @@ restart_queuing(seal_src_t* src)
|
|
178
229
|
return seal_rewind_stream(src->stream);
|
179
230
|
}
|
180
231
|
|
232
|
+
/*
|
233
|
+
* This does the same thing as `stop_then_clean_queue` except it works for
|
234
|
+
* sources in any state at the time of calling.
|
235
|
+
*/
|
181
236
|
static
|
182
237
|
seal_err_t
|
183
238
|
empty_queue(seal_src_t* src)
|
@@ -185,7 +240,7 @@ empty_queue(seal_src_t* src)
|
|
185
240
|
seal_err_t err;
|
186
241
|
|
187
242
|
/* Need to be playing first in order to become stopped. */
|
188
|
-
if ((err =
|
243
|
+
if ((err = change_state(src, alSourcePlay)) != SEAL_OK)
|
189
244
|
return err;
|
190
245
|
|
191
246
|
return stop_then_clean_queue(src);
|
@@ -210,11 +265,13 @@ seal_init_src(seal_src_t* src)
|
|
210
265
|
if (err == SEAL_OK) {
|
211
266
|
src->buf = 0;
|
212
267
|
src->stream = 0;
|
268
|
+
/* The id of the thread that is updating the source. */
|
213
269
|
src->updater = 0;
|
214
270
|
src->chunk_size = DEFAULT_CHUNK_SIZE;
|
215
271
|
src->queue_size = DEFAULT_QUEUE_SIZE;
|
216
272
|
src->looping = 0;
|
217
273
|
src->automatic = 1;
|
274
|
+
src->early_stop = 0;
|
218
275
|
}
|
219
276
|
|
220
277
|
return err;
|
@@ -257,18 +314,23 @@ seal_play_src(seal_src_t* src)
|
|
257
314
|
/* Stream some data so plackback can start immediately. */
|
258
315
|
if ((err = seal_update_src(src)) != SEAL_OK)
|
259
316
|
return err;
|
317
|
+
/* Actually start playing. */
|
318
|
+
if ((err = change_state(src, alSourcePlay)) != SEAL_OK)
|
319
|
+
return err;
|
320
|
+
/* Create background updater for automatic sources. */
|
260
321
|
if (src->automatic)
|
261
322
|
src->updater = _seal_create_thread(update, src);
|
323
|
+
return SEAL_OK;
|
324
|
+
} else {
|
325
|
+
return change_state(src, alSourcePlay);
|
262
326
|
}
|
263
|
-
|
264
|
-
return operate(src, alSourcePlay);
|
265
327
|
}
|
266
328
|
|
267
329
|
seal_err_t
|
268
330
|
SEAL_API
|
269
331
|
seal_pause_src(seal_src_t* src)
|
270
332
|
{
|
271
|
-
return
|
333
|
+
return change_state(src, alSourcePause);
|
272
334
|
}
|
273
335
|
|
274
336
|
seal_err_t
|
@@ -277,7 +339,10 @@ seal_stop_src(seal_src_t* src)
|
|
277
339
|
{
|
278
340
|
seal_err_t err;
|
279
341
|
|
280
|
-
if ((err =
|
342
|
+
if ((err = change_state(src, alSourceStop)) != SEAL_OK)
|
343
|
+
return err;
|
344
|
+
|
345
|
+
if (src->stream != 0)
|
281
346
|
/* Already stopped so all buffers are proccessed. */
|
282
347
|
if ((err = clean_queue(src)) == SEAL_OK)
|
283
348
|
err = seal_rewind_stream(src->stream);
|
@@ -299,7 +364,7 @@ seal_rewind_src(seal_src_t* src)
|
|
299
364
|
return err;
|
300
365
|
}
|
301
366
|
|
302
|
-
return
|
367
|
+
return change_state(src, alSourceRewind);
|
303
368
|
}
|
304
369
|
|
305
370
|
seal_err_t
|
@@ -312,13 +377,17 @@ seal_detach_src_audio(seal_src_t* src)
|
|
312
377
|
return err;
|
313
378
|
|
314
379
|
/* Sets the state to `SEAL_INITIAL' for consistency. */
|
315
|
-
if ((err =
|
380
|
+
if ((err = change_state(src, alSourceRewind)) != SEAL_OK)
|
316
381
|
return err;
|
317
382
|
|
318
|
-
if ((err = _seal_seti(src, AL_BUFFER, AL_NONE, alSourcei))
|
319
|
-
|
320
|
-
|
321
|
-
|
383
|
+
if ((err = _seal_seti(src, AL_BUFFER, AL_NONE, alSourcei)) != SEAL_OK)
|
384
|
+
return err;
|
385
|
+
|
386
|
+
if ((err = on_preemptive_state_change(src)) != SEAL_OK)
|
387
|
+
return err;
|
388
|
+
|
389
|
+
src->buf = 0;
|
390
|
+
src->stream = 0;
|
322
391
|
|
323
392
|
return err;
|
324
393
|
}
|
@@ -486,6 +555,7 @@ start_streaming:
|
|
486
555
|
goto start_streaming;
|
487
556
|
/* End of stream reached. */
|
488
557
|
} else {
|
558
|
+
src->early_stop = 0;
|
489
559
|
break;
|
490
560
|
}
|
491
561
|
} /* for (;;) */
|
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Su Zhang
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-06-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake-compiler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,55 +41,51 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: guard-rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: yard
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rb-inotify
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
|
-
description:
|
95
|
-
|
96
|
-
|
97
|
-
|
83
|
+
description: |2
|
84
|
+
Seal is a library for 3D audio rendering and manipulation, supporting
|
85
|
+
effects such as direction and distance attenuation, the simulation of the
|
86
|
+
Doppler effect and reverberation. It is built on top of OpenAL, adding
|
87
|
+
support for audio streaming and audio formats like Ogg Vorbis, MPEG Audio
|
88
|
+
and WAVE.
|
98
89
|
email: me@zhang.su
|
99
90
|
executables: []
|
100
91
|
extensions:
|
@@ -525,41 +516,39 @@ files:
|
|
525
516
|
homepage: https://github.com/zhangsu/seal
|
526
517
|
licenses:
|
527
518
|
- WTFPL
|
519
|
+
metadata: {}
|
528
520
|
post_install_message: Enjoy!
|
529
521
|
rdoc_options: []
|
530
522
|
require_paths:
|
531
523
|
- lib
|
532
524
|
required_ruby_version: !ruby/object:Gem::Requirement
|
533
|
-
none: false
|
534
525
|
requirements:
|
535
|
-
- -
|
526
|
+
- - '>='
|
536
527
|
- !ruby/object:Gem::Version
|
537
|
-
version:
|
528
|
+
version: 1.9.2
|
538
529
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
539
|
-
none: false
|
540
530
|
requirements:
|
541
|
-
- -
|
531
|
+
- - '>='
|
542
532
|
- !ruby/object:Gem::Version
|
543
533
|
version: '0'
|
544
534
|
requirements:
|
545
535
|
- libopenal
|
546
536
|
- a sound card
|
547
537
|
rubyforge_project:
|
548
|
-
rubygems_version:
|
538
|
+
rubygems_version: 2.0.0
|
549
539
|
signing_key:
|
550
|
-
specification_version:
|
540
|
+
specification_version: 4
|
551
541
|
summary: An OpenAL-based 3D audio library
|
552
542
|
test_files:
|
553
543
|
- spec/seal/buffer_spec.rb
|
554
544
|
- spec/seal/core_spec.rb
|
555
|
-
- spec/seal/
|
545
|
+
- spec/seal/effect_slot_spec.rb
|
556
546
|
- spec/seal/listener_spec.rb
|
557
547
|
- spec/seal/reverb_spec.rb
|
558
|
-
- spec/seal/effect_slot_spec.rb
|
559
548
|
- spec/seal/source_spec.rb
|
560
|
-
- spec/
|
549
|
+
- spec/seal/stream_spec.rb
|
550
|
+
- spec/spec_helper.rb
|
551
|
+
- spec/support/attribute_examples.rb
|
561
552
|
- spec/support/audio_object_with_format.rb
|
562
553
|
- spec/support/boolean_reader_aliases.rb
|
563
|
-
- spec/support/
|
564
|
-
- spec/spec_helper.rb
|
565
|
-
has_rdoc: yard
|
554
|
+
- spec/support/movable_object.rb
|