rubygame 2.3.0-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CREDITS +60 -0
- data/LICENSE +504 -0
- data/NEWS +252 -0
- data/README +123 -0
- data/ROADMAP +109 -0
- data/Rakefile +440 -0
- data/doc/extended_readme.rdoc +49 -0
- data/doc/getting_started.rdoc +47 -0
- data/doc/macosx_install.rdoc +70 -0
- data/doc/windows_install.rdoc +123 -0
- data/ext/rubygame/rubygame_core.so +0 -0
- data/ext/rubygame/rubygame_event.c +644 -0
- data/ext/rubygame/rubygame_event.h +48 -0
- data/ext/rubygame/rubygame_event.obj +0 -0
- data/ext/rubygame/rubygame_gfx.c +942 -0
- data/ext/rubygame/rubygame_gfx.h +101 -0
- data/ext/rubygame/rubygame_gfx.obj +0 -0
- data/ext/rubygame/rubygame_gfx.so +0 -0
- data/ext/rubygame/rubygame_gl.c +154 -0
- data/ext/rubygame/rubygame_gl.h +32 -0
- data/ext/rubygame/rubygame_gl.obj +0 -0
- data/ext/rubygame/rubygame_image.c +252 -0
- data/ext/rubygame/rubygame_image.h +41 -0
- data/ext/rubygame/rubygame_image.obj +0 -0
- data/ext/rubygame/rubygame_image.so +0 -0
- data/ext/rubygame/rubygame_joystick.c +247 -0
- data/ext/rubygame/rubygame_joystick.h +41 -0
- data/ext/rubygame/rubygame_joystick.obj +0 -0
- data/ext/rubygame/rubygame_main.c +155 -0
- data/ext/rubygame/rubygame_main.h +36 -0
- data/ext/rubygame/rubygame_main.obj +0 -0
- data/ext/rubygame/rubygame_mixer.c +1024 -0
- data/ext/rubygame/rubygame_mixer.h +36 -0
- data/ext/rubygame/rubygame_mixer.obj +0 -0
- data/ext/rubygame/rubygame_mixer.so +0 -0
- data/ext/rubygame/rubygame_music.c +1017 -0
- data/ext/rubygame/rubygame_music.h +29 -0
- data/ext/rubygame/rubygame_music.obj +0 -0
- data/ext/rubygame/rubygame_screen.c +448 -0
- data/ext/rubygame/rubygame_screen.h +43 -0
- data/ext/rubygame/rubygame_screen.obj +0 -0
- data/ext/rubygame/rubygame_shared.c +272 -0
- data/ext/rubygame/rubygame_shared.h +68 -0
- data/ext/rubygame/rubygame_shared.obj +0 -0
- data/ext/rubygame/rubygame_sound.c +863 -0
- data/ext/rubygame/rubygame_sound.h +29 -0
- data/ext/rubygame/rubygame_sound.obj +0 -0
- data/ext/rubygame/rubygame_surface.c +1151 -0
- data/ext/rubygame/rubygame_surface.h +62 -0
- data/ext/rubygame/rubygame_surface.obj +0 -0
- data/ext/rubygame/rubygame_time.c +183 -0
- data/ext/rubygame/rubygame_time.h +32 -0
- data/ext/rubygame/rubygame_time.obj +0 -0
- data/ext/rubygame/rubygame_ttf.c +599 -0
- data/ext/rubygame/rubygame_ttf.h +69 -0
- data/ext/rubygame/rubygame_ttf.obj +0 -0
- data/ext/rubygame/rubygame_ttf.so +0 -0
- data/lib/rubygame.rb +41 -0
- data/lib/rubygame/clock.rb +128 -0
- data/lib/rubygame/color.rb +79 -0
- data/lib/rubygame/color/models/base.rb +111 -0
- data/lib/rubygame/color/models/hsl.rb +153 -0
- data/lib/rubygame/color/models/hsv.rb +149 -0
- data/lib/rubygame/color/models/rgb.rb +78 -0
- data/lib/rubygame/color/palettes/css.rb +49 -0
- data/lib/rubygame/color/palettes/palette.rb +100 -0
- data/lib/rubygame/color/palettes/x11.rb +177 -0
- data/lib/rubygame/constants.rb +238 -0
- data/lib/rubygame/event.rb +313 -0
- data/lib/rubygame/ftor.rb +370 -0
- data/lib/rubygame/hotspot.rb +265 -0
- data/lib/rubygame/keyconstants.rb +237 -0
- data/lib/rubygame/mediabag.rb +94 -0
- data/lib/rubygame/named_resource.rb +254 -0
- data/lib/rubygame/queue.rb +288 -0
- data/lib/rubygame/rect.rb +612 -0
- data/lib/rubygame/sfont.rb +223 -0
- data/lib/rubygame/sprite.rb +511 -0
- data/samples/FreeSans.ttf +0 -0
- data/samples/GPL.txt +340 -0
- data/samples/README +40 -0
- data/samples/chimp.bmp +0 -0
- data/samples/chimp.rb +302 -0
- data/samples/demo_gl.rb +151 -0
- data/samples/demo_gl_tex.rb +197 -0
- data/samples/demo_music.rb +77 -0
- data/samples/demo_rubygame.rb +296 -0
- data/samples/demo_sfont.rb +52 -0
- data/samples/demo_ttf.rb +193 -0
- data/samples/demo_utf8.rb +53 -0
- data/samples/fist.bmp +0 -0
- data/samples/load_and_blit.rb +22 -0
- data/samples/panda.png +0 -0
- data/samples/punch.wav +0 -0
- data/samples/ruby.png +0 -0
- data/samples/song.ogg +0 -0
- data/samples/term16.png +0 -0
- data/samples/whiff.wav +0 -0
- metadata +164 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
/*
|
2
|
+
* Rubygame -- Ruby code and bindings to SDL to facilitate game creation
|
3
|
+
* Copyright (C) 2004-2007 John Croisant
|
4
|
+
*
|
5
|
+
* This library is free software; you can redistribute it and/or
|
6
|
+
* modify it under the terms of the GNU Lesser General Public
|
7
|
+
* License as published by the Free Software Foundation; either
|
8
|
+
* version 2.1 of the License, or (at your option) any later version.
|
9
|
+
*
|
10
|
+
* This library is distributed in the hope that it will be useful,
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
* Lesser General Public License for more details.
|
14
|
+
*
|
15
|
+
* You should have received a copy of the GNU Lesser General Public
|
16
|
+
* License along with this library; if not, write to the Free Software
|
17
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
|
21
|
+
#ifndef _RUBYGAME_H
|
22
|
+
#define _RUBYGAME_H
|
23
|
+
|
24
|
+
#ifndef RUBYGAME_MAJOR_VERSION
|
25
|
+
|
26
|
+
#define RUBYGAME_MAJOR_VERSION 0
|
27
|
+
#define RUBYGAME_MINOR_VERSION 0
|
28
|
+
#define RUBYGAME_PATCHLEVEL 0
|
29
|
+
|
30
|
+
#endif
|
31
|
+
|
32
|
+
extern VALUE rbgm_keyname(VALUE, VALUE);
|
33
|
+
extern VALUE rbgm_init(VALUE);
|
34
|
+
extern VALUE rbgm_quit(VALUE);
|
35
|
+
|
36
|
+
#endif
|
Binary file
|
@@ -0,0 +1,1024 @@
|
|
1
|
+
/*
|
2
|
+
* Interface to SDL_mixer, for audio playback and mixing.
|
3
|
+
*--
|
4
|
+
* Rubygame -- Ruby code and bindings to SDL to facilitate game creation
|
5
|
+
* Copyright (C) 2004-2007 John Croisant
|
6
|
+
*
|
7
|
+
* This library is free software; you can redistribute it and/or
|
8
|
+
* modify it under the terms of the GNU Lesser General Public
|
9
|
+
* License as published by the Free Software Foundation; either
|
10
|
+
* version 2.1 of the License, or (at your option) any later version.
|
11
|
+
*
|
12
|
+
* This library is distributed in the hope that it will be useful,
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
* Lesser General Public License for more details.
|
16
|
+
*
|
17
|
+
* You should have received a copy of the GNU Lesser General Public
|
18
|
+
* License along with this library; if not, write to the Free Software
|
19
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
+
*++
|
21
|
+
*/
|
22
|
+
|
23
|
+
#include "rubygame_shared.h"
|
24
|
+
#include "rubygame_mixer.h"
|
25
|
+
#include "rubygame_sound.h"
|
26
|
+
#include "rubygame_music.h"
|
27
|
+
|
28
|
+
|
29
|
+
VALUE mMixer;
|
30
|
+
VALUE cSample;
|
31
|
+
VALUE cOldMusic;
|
32
|
+
|
33
|
+
|
34
|
+
/* Return 1 if SDL_mixer audio is open, or 0 if it is not. */
|
35
|
+
int audio_is_open()
|
36
|
+
{
|
37
|
+
/* We don't actually care about these, but Mix_QuerySpec wants args. */
|
38
|
+
int frequency; Uint16 format; int channels;
|
39
|
+
|
40
|
+
int result = Mix_QuerySpec(&frequency, &format, &channels);
|
41
|
+
|
42
|
+
return ( (result > 0) ? 1 : 0 );
|
43
|
+
}
|
44
|
+
|
45
|
+
/*
|
46
|
+
* If SDL_mixer audio is not open, try to open it with the default
|
47
|
+
* arguments, and return the result. If it's already open, return 0
|
48
|
+
* without doing anything.
|
49
|
+
*/
|
50
|
+
int ensure_open_audio()
|
51
|
+
{
|
52
|
+
if( audio_is_open() )
|
53
|
+
{
|
54
|
+
return 0;
|
55
|
+
}
|
56
|
+
else
|
57
|
+
{
|
58
|
+
return Mix_OpenAudio( MIX_DEFAULT_FREQUENCY,
|
59
|
+
MIX_DEFAULT_FORMAT,
|
60
|
+
2,
|
61
|
+
1024 );
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
|
66
|
+
/* --
|
67
|
+
* SETUP AND INITIALIZATION
|
68
|
+
* ++
|
69
|
+
*/
|
70
|
+
|
71
|
+
/* call-seq:
|
72
|
+
* open_audio( frequency=nil, format=nil, channels=nil, buffer=nil)
|
73
|
+
*
|
74
|
+
* **NOTE:** This method is DEPRECATED and will be removed in
|
75
|
+
* Rubygame 3.0. Please use the Rubygame.open_audio instead.
|
76
|
+
*
|
77
|
+
* Initializes the audio device. You must call this before using the other
|
78
|
+
* mixer functions. See also #close_audio().
|
79
|
+
*
|
80
|
+
* Returns nil. May raise an SDLError if initialization fails.
|
81
|
+
*
|
82
|
+
* This method takes these arguments:
|
83
|
+
*
|
84
|
+
* frequency:: output sample rate in audio samples per second (Hz).
|
85
|
+
* Affects the quality of the sound output, at the expense of
|
86
|
+
* CPU usage. If nil, the default (22050) is used. 22050 is
|
87
|
+
* recommended for most games. For reference, 44100 is CD quality.
|
88
|
+
* The larger the value, the more processing required.
|
89
|
+
*
|
90
|
+
* format:: output sample format. If nil, the default recommended system
|
91
|
+
* format is used. It's _highly_ recommended you leave this nil!
|
92
|
+
*
|
93
|
+
* But if you're feeling reckless, you can use one of these
|
94
|
+
* constants located in the Rubygame::Mixer module:
|
95
|
+
*
|
96
|
+
* AUDIO_U16SYS:: unsigned 16-bit samples.
|
97
|
+
* AUDIO_S16SYS:: signed 16-bit samples.
|
98
|
+
* AUDIO_U8:: unsigned 8-bit samples.
|
99
|
+
* AUDIO_S8:: signed 8-bit samples.
|
100
|
+
*
|
101
|
+
* channels:: output sound channels. Use 2 for stereo, 1 for mono.
|
102
|
+
* If nil, the default (2) is used.
|
103
|
+
* This option is not related to mixing channels.
|
104
|
+
*
|
105
|
+
* buffer:: size of the sound buffer, in bytes. If nil, the default (1024)
|
106
|
+
* is used. Larger values have more delay before playing a
|
107
|
+
* sound, but require less CPU usage (and have less skipping
|
108
|
+
* on slow systems).
|
109
|
+
*
|
110
|
+
*/
|
111
|
+
VALUE rbgm_mixer_openaudio(int argc, VALUE *argv, VALUE module)
|
112
|
+
{
|
113
|
+
|
114
|
+
/* This feature will be removed in Rubygame 3.0. */
|
115
|
+
rg_deprecated("Rubygame::Mixer", "3.0");
|
116
|
+
|
117
|
+
VALUE vfreq, vformat, vchannels, vbuffer;
|
118
|
+
int freq = MIX_DEFAULT_FREQUENCY;
|
119
|
+
Uint16 format = MIX_DEFAULT_FORMAT;
|
120
|
+
int channels = 2;
|
121
|
+
int buffer = 1024;
|
122
|
+
|
123
|
+
rb_scan_args(argc, argv, "04", &vfreq, &vformat, &vchannels, &vbuffer);
|
124
|
+
|
125
|
+
if( RTEST(vfreq) )
|
126
|
+
{
|
127
|
+
freq = NUM2INT(vfreq);
|
128
|
+
}
|
129
|
+
|
130
|
+
if( RTEST(vformat) )
|
131
|
+
{
|
132
|
+
format = NUM2UINT(vformat);
|
133
|
+
}
|
134
|
+
|
135
|
+
if( RTEST(vchannels) )
|
136
|
+
{
|
137
|
+
channels = NUM2INT(vchannels);
|
138
|
+
}
|
139
|
+
|
140
|
+
if( RTEST(vbuffer) )
|
141
|
+
{
|
142
|
+
buffer = NUM2INT(vbuffer);
|
143
|
+
}
|
144
|
+
|
145
|
+
if ( Mix_OpenAudio(freq, format, channels, buffer) < 0 )
|
146
|
+
{
|
147
|
+
rb_raise(eSDLError, "Error initializing SDL_mixer: %s", Mix_GetError());
|
148
|
+
}
|
149
|
+
|
150
|
+
return Qnil;
|
151
|
+
}
|
152
|
+
|
153
|
+
/* call-seq:
|
154
|
+
* close_audio()
|
155
|
+
*
|
156
|
+
* **NOTE:** This method is DEPRECATED and will be removed in
|
157
|
+
* Rubygame 3.0. Please use the Rubygame.close_audio instead.
|
158
|
+
*
|
159
|
+
* Close the audio device being used by the mixer. You should not use any
|
160
|
+
* mixer functions after this function, unless you use #open_audio() to
|
161
|
+
* re-open the audio device. See also #open_audio().
|
162
|
+
*
|
163
|
+
* Returns nil.
|
164
|
+
*/
|
165
|
+
VALUE rbgm_mixer_closeaudio(VALUE module)
|
166
|
+
{
|
167
|
+
/* This feature will be removed in Rubygame 3.0. */
|
168
|
+
rg_deprecated("Rubygame::Mixer", "3.0");
|
169
|
+
|
170
|
+
Mix_CloseAudio();
|
171
|
+
return Qnil;
|
172
|
+
}
|
173
|
+
|
174
|
+
|
175
|
+
|
176
|
+
/* call-seq:
|
177
|
+
* open_audio( options={ :buffer => 1024, :channels => 2, :frequency => 22050 } ) -> true or false
|
178
|
+
*
|
179
|
+
* Initializes the audio device using the given settings.
|
180
|
+
*
|
181
|
+
* NOTE: Audio will be automatically opened when Rubygame::Sound or
|
182
|
+
* Rubygame::Music are first used. You only need to open audio
|
183
|
+
* manually if you want settings different from the default, or if
|
184
|
+
* you are using the older, deprecated Music and Sample classes from
|
185
|
+
* the Rubygame::Mixer module.
|
186
|
+
*
|
187
|
+
* If audio is already open, this method has no effect, and returns false.
|
188
|
+
* If you want to change audio settings, you must #close_audio() and
|
189
|
+
* then open it again.
|
190
|
+
*
|
191
|
+
* options:: A Hash of any of the following options. (Hash, optional)
|
192
|
+
*
|
193
|
+
* :frequency:: output sample rate in audio samples per second
|
194
|
+
* (Hz). Affects the quality of the sound output, at
|
195
|
+
* the expense of CPU usage. If omitted, the default
|
196
|
+
* (22050) is used. The default is recommended for
|
197
|
+
* most games.
|
198
|
+
*
|
199
|
+
* :channels:: output sound channels. Use 2 for stereo, 1 for mono.
|
200
|
+
* If omitted, the default (2) is used.
|
201
|
+
*
|
202
|
+
* :buffer:: size of the sound buffer, in bytes. Must be a
|
203
|
+
* power of 2 (e.g. 512, 1024, 2048). If omitted,
|
204
|
+
* the default (1024) is used. If your game is
|
205
|
+
* fast-paced, you may want to use a smaller value
|
206
|
+
* to reduce audio delay, the time between when you
|
207
|
+
* play a sound and when it is heard.
|
208
|
+
*
|
209
|
+
* Returns:: true if the audio was newly opened by this action, or
|
210
|
+
* false if it was already open before this action.
|
211
|
+
*
|
212
|
+
* May raise:: SDLError, if initialization fails.
|
213
|
+
* ArgumentError, if an invalid value is given for any option.
|
214
|
+
*
|
215
|
+
*
|
216
|
+
*/
|
217
|
+
VALUE rbgm_mixer_openaudio2(int argc, VALUE *argv, VALUE module)
|
218
|
+
{
|
219
|
+
VALUE options;
|
220
|
+
|
221
|
+
int buffer = 1024;
|
222
|
+
int channels = 2;
|
223
|
+
int frequency = MIX_DEFAULT_FREQUENCY;
|
224
|
+
|
225
|
+
/* In general, format should always be the default. */
|
226
|
+
Uint16 format = MIX_DEFAULT_FORMAT;
|
227
|
+
|
228
|
+
|
229
|
+
/* Does nothing if audio is already open. */
|
230
|
+
if( audio_is_open() )
|
231
|
+
{
|
232
|
+
return Qfalse;
|
233
|
+
}
|
234
|
+
|
235
|
+
|
236
|
+
rb_scan_args(argc, argv, "01", &options);
|
237
|
+
|
238
|
+
|
239
|
+
if( RTEST(options) )
|
240
|
+
{
|
241
|
+
/* Make sure options is a Hash table */
|
242
|
+
if( TYPE(options) != T_HASH )
|
243
|
+
{
|
244
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (expected Hash)",
|
245
|
+
rb_obj_classname(options));
|
246
|
+
}
|
247
|
+
|
248
|
+
VALUE temp;
|
249
|
+
|
250
|
+
/* Buffer size */
|
251
|
+
temp = rb_hash_aref(options, make_symbol("buffer"));
|
252
|
+
if( RTEST(temp) )
|
253
|
+
{
|
254
|
+
buffer = NUM2INT(temp);
|
255
|
+
|
256
|
+
if( buffer <= 0 )
|
257
|
+
{
|
258
|
+
rb_raise(rb_eArgError, "buffer size must be positive (got %d)", buffer);
|
259
|
+
}
|
260
|
+
|
261
|
+
/* Check to see if it's not a power of two */
|
262
|
+
if( buffer & (buffer - 1) != 0 )
|
263
|
+
{
|
264
|
+
rb_raise(rb_eArgError, "buffer size must be a power of 2 (e.g. 512, 1024) (got %d)", buffer);
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
/* Channels */
|
269
|
+
temp = rb_hash_aref(options, make_symbol("channels"));
|
270
|
+
if( RTEST(temp) )
|
271
|
+
{
|
272
|
+
channels = NUM2INT(temp);
|
273
|
+
|
274
|
+
if( channels != 1 && channels != 2 )
|
275
|
+
{
|
276
|
+
rb_raise(rb_eArgError, "channels must be 1 (mono) or 2 (stereo) (got %d)", channels);
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
/* Frequency */
|
281
|
+
temp = rb_hash_aref(options, make_symbol("frequency"));
|
282
|
+
if( RTEST(temp) )
|
283
|
+
{
|
284
|
+
frequency = NUM2INT(temp);
|
285
|
+
|
286
|
+
if( frequency <= 0 )
|
287
|
+
{
|
288
|
+
rb_raise(rb_eArgError, "frequency must be positive (got %d)", frequency);
|
289
|
+
}
|
290
|
+
}
|
291
|
+
}
|
292
|
+
|
293
|
+
int result = Mix_OpenAudio(frequency, format, channels, buffer);
|
294
|
+
|
295
|
+
if( result < 0 )
|
296
|
+
{
|
297
|
+
rb_raise(eSDLError, "Could not open audio: %s", Mix_GetError());
|
298
|
+
}
|
299
|
+
|
300
|
+
return Qtrue;
|
301
|
+
}
|
302
|
+
|
303
|
+
|
304
|
+
/* call-seq:
|
305
|
+
* close_audio() -> true or false
|
306
|
+
*
|
307
|
+
* Deinitializes and closes the audio device. If audio was not open,
|
308
|
+
* this method does nothing, and returns false. See also #open_audio().
|
309
|
+
*
|
310
|
+
* NOTE: The audio will be automatically closed when the program
|
311
|
+
* exits. You only need to close audio manually if you want to
|
312
|
+
* call #open_audio with different settings.
|
313
|
+
*
|
314
|
+
* Returns:: true if the audio changed from open to closed, or
|
315
|
+
* false if the audio was not open before this action.
|
316
|
+
*/
|
317
|
+
VALUE rbgm_mixer_closeaudio2(VALUE module)
|
318
|
+
{
|
319
|
+
if( audio_is_open() )
|
320
|
+
{
|
321
|
+
Mix_CloseAudio();
|
322
|
+
return Qtrue;
|
323
|
+
}
|
324
|
+
else
|
325
|
+
{
|
326
|
+
return Qfalse;
|
327
|
+
}
|
328
|
+
}
|
329
|
+
|
330
|
+
|
331
|
+
|
332
|
+
/* call-seq:
|
333
|
+
* #mix_channels() -> integer
|
334
|
+
*
|
335
|
+
* **NOTE:** This method is DEPRECATED and will be removed in
|
336
|
+
* Rubygame 3.0. Please use the Rubygame::Sound class instead.
|
337
|
+
*
|
338
|
+
* Returns the number of mixing channels currently allocated.
|
339
|
+
* See also #mix_channels=().
|
340
|
+
*/
|
341
|
+
VALUE rbgm_mixer_getmixchans(VALUE module)
|
342
|
+
{
|
343
|
+
/* This feature will be removed in Rubygame 3.0. */
|
344
|
+
rg_deprecated("Rubygame::Mixer", "3.0");
|
345
|
+
|
346
|
+
int result;
|
347
|
+
result = Mix_AllocateChannels(-1);
|
348
|
+
|
349
|
+
return INT2NUM(result);
|
350
|
+
}
|
351
|
+
|
352
|
+
/* call-seq:
|
353
|
+
* #mix_channels = num_channels
|
354
|
+
*
|
355
|
+
* **NOTE:** This method is DEPRECATED and will be removed in
|
356
|
+
* Rubygame 3.0. Please use the Rubygame::Sound class instead.
|
357
|
+
*
|
358
|
+
* Set the number of mixer channels, allocating or deallocating channels as
|
359
|
+
* needed. This can be called many times, even during audio playback. If this
|
360
|
+
* call reduces the number of channels allocated, the excess channels will
|
361
|
+
* be stopped automatically. See also #mix_channels()
|
362
|
+
*
|
363
|
+
* Returns the number of mixing channels allocated.
|
364
|
+
*
|
365
|
+
* Note that 8 mixing channels are allocated when #open_audio() is called.
|
366
|
+
* This method only needs to be called if you want a different number (either
|
367
|
+
* greater or fewer) of mixing channels.
|
368
|
+
*
|
369
|
+
* This method takes this argument:
|
370
|
+
* num_channels:: desired number of mixing channels, an integer.
|
371
|
+
* Negative values will cause this method to behave as
|
372
|
+
* #mix_channels(), returning the number of channels currently
|
373
|
+
* allocated, without changing it.
|
374
|
+
*/
|
375
|
+
VALUE rbgm_mixer_setmixchans(VALUE module, VALUE channelsv)
|
376
|
+
{
|
377
|
+
/* This feature will be removed in Rubygame 3.0. */
|
378
|
+
rg_deprecated("Rubygame::Mixer", "3.0");
|
379
|
+
|
380
|
+
int desired;
|
381
|
+
int allocated;
|
382
|
+
|
383
|
+
desired = NUM2INT(channelsv);
|
384
|
+
allocated = Mix_AllocateChannels(desired);
|
385
|
+
|
386
|
+
return INT2NUM(allocated);
|
387
|
+
}
|
388
|
+
|
389
|
+
/* call-seq:
|
390
|
+
* driver_name -> string
|
391
|
+
*
|
392
|
+
* **NOTE:** This method is DEPRECATED and will be removed in
|
393
|
+
* Rubygame 3.0. Please use the Rubygame.audio_driver instead.
|
394
|
+
*
|
395
|
+
* Returns the name of the audio driver that SDL is using.
|
396
|
+
*
|
397
|
+
* May raise an SDLError if initialization fails.
|
398
|
+
*/
|
399
|
+
|
400
|
+
VALUE rbgm_mixer_getdrivername(VALUE module)
|
401
|
+
{
|
402
|
+
/* This feature will be removed in Rubygame 3.0. */
|
403
|
+
rg_deprecated("Rubygame::Mixer", "3.0");
|
404
|
+
|
405
|
+
char driver_name[1024];
|
406
|
+
if(SDL_AudioDriverName(driver_name, sizeof(driver_name)) == NULL)
|
407
|
+
{
|
408
|
+
rb_raise(eSDLError, "Error fetching audio driver name: %s", SDL_GetError());
|
409
|
+
}
|
410
|
+
return rb_str_new2(driver_name);
|
411
|
+
}
|
412
|
+
|
413
|
+
/* call-seq:
|
414
|
+
* audio_driver -> string
|
415
|
+
*
|
416
|
+
* Returns the name of the audio driver that SDL is using.
|
417
|
+
*
|
418
|
+
* May raise an SDLError if initialization fails.
|
419
|
+
*/
|
420
|
+
|
421
|
+
VALUE rbgm_mixer_audiodriver(VALUE module)
|
422
|
+
{
|
423
|
+
if( ensure_open_audio() != 0 )
|
424
|
+
{
|
425
|
+
rb_raise(eSDLError, "Could not initialize audio: %s", Mix_GetError());
|
426
|
+
}
|
427
|
+
|
428
|
+
char driver_name[1024];
|
429
|
+
if(SDL_AudioDriverName(driver_name, sizeof(driver_name)) == NULL)
|
430
|
+
{
|
431
|
+
rb_raise(eSDLError, "Could not get audio driver name: %s", Mix_GetError());
|
432
|
+
}
|
433
|
+
return rb_str_new2(driver_name);
|
434
|
+
}
|
435
|
+
|
436
|
+
|
437
|
+
|
438
|
+
/* --
|
439
|
+
* SAMPLES
|
440
|
+
* ++
|
441
|
+
*/
|
442
|
+
|
443
|
+
/* call-seq:
|
444
|
+
* load_audio( filename ) -> Sample
|
445
|
+
*
|
446
|
+
* **NOTE:** Rubygame::Mixer::Sample is DEPRECATED and will be removed in
|
447
|
+
* Rubygame 3.0. Please use the Rubygame::Sound class instead.
|
448
|
+
*
|
449
|
+
* Load an audio sample (a "chunk", to use SDL_mixer's term) from a file.
|
450
|
+
* Only WAV files are supported at this time.
|
451
|
+
*
|
452
|
+
* Raises SDLError if the sample could not be loaded.
|
453
|
+
*/
|
454
|
+
VALUE rbgm_sample_new(VALUE class, VALUE filev)
|
455
|
+
{
|
456
|
+
/* This feature will be removed in Rubygame 3.0. */
|
457
|
+
rg_deprecated("Rubygame::Mixer::Sample", "3.0");
|
458
|
+
|
459
|
+
VALUE self;
|
460
|
+
Mix_Chunk* sample;
|
461
|
+
|
462
|
+
sample = Mix_LoadWAV( StringValuePtr(filev) );
|
463
|
+
|
464
|
+
if( sample == NULL )
|
465
|
+
{
|
466
|
+
rb_raise(eSDLError, "Error loading audio Sample from file `%s': %s",
|
467
|
+
StringValuePtr(filev), Mix_GetError());
|
468
|
+
}
|
469
|
+
self = Data_Wrap_Struct( cSample, 0, Mix_FreeChunk, sample );
|
470
|
+
|
471
|
+
//rb_obj_call_init(self,argc,argv);
|
472
|
+
|
473
|
+
return self;
|
474
|
+
}
|
475
|
+
|
476
|
+
/* call-seq:
|
477
|
+
* play(sample, channel_num, repeats ) -> integer
|
478
|
+
*
|
479
|
+
* **NOTE:** This method is DEPRECATED and will be removed in
|
480
|
+
* Rubygame 3.0. Please use the Rubygame::Sound class instead.
|
481
|
+
*
|
482
|
+
* Play an audio Sample on a mixing channel, repeating a certain number
|
483
|
+
* of extra times. Returns the number of the channel that the sample
|
484
|
+
* is being played on.
|
485
|
+
*
|
486
|
+
* Raises SDLError if something goes wrong.
|
487
|
+
*
|
488
|
+
* This method takes these arguments:
|
489
|
+
* sample:: what Sample to play
|
490
|
+
* channel_num:: which mixing channel to play the sample on.
|
491
|
+
* Use -1 to play on the first unreserved channel.
|
492
|
+
* repeats:: how many extra times to repeat the sample.
|
493
|
+
* Can be -1 to repeat forever until it is stopped.
|
494
|
+
*/
|
495
|
+
VALUE rbgm_mixchan_play( VALUE self, VALUE samplev, VALUE chanv, VALUE loopsv )
|
496
|
+
{
|
497
|
+
|
498
|
+
/* This feature will be removed in Rubygame 3.0. */
|
499
|
+
rg_deprecated("Rubygame::Mixer", "3.0");
|
500
|
+
|
501
|
+
Mix_Chunk* sample;
|
502
|
+
int loops, channel, result;
|
503
|
+
|
504
|
+
channel = NUM2INT(chanv);
|
505
|
+
Data_Get_Struct( samplev, Mix_Chunk, sample );
|
506
|
+
loops = NUM2INT(loopsv);
|
507
|
+
|
508
|
+
result = Mix_PlayChannel(channel, sample, loops);
|
509
|
+
|
510
|
+
if ( result < 0 )
|
511
|
+
{
|
512
|
+
rb_raise(eSDLError, "Error playing sample on channel %d: %s",
|
513
|
+
channel, Mix_GetError());
|
514
|
+
}
|
515
|
+
|
516
|
+
return INT2NUM( result );
|
517
|
+
}
|
518
|
+
|
519
|
+
/* call-seq:
|
520
|
+
* stop( channel_num )
|
521
|
+
*
|
522
|
+
* Stop playback of a playing or paused mixing channel.
|
523
|
+
* Unlike #pause, playback cannot be resumed from the current point.
|
524
|
+
* See also #play.
|
525
|
+
*/
|
526
|
+
VALUE rbgm_mixchan_stop( VALUE self, VALUE chanv )
|
527
|
+
{
|
528
|
+
Mix_HaltChannel(NUM2INT(chanv));
|
529
|
+
return Qnil;
|
530
|
+
}
|
531
|
+
|
532
|
+
/* call-seq:
|
533
|
+
* pause( channel_num )
|
534
|
+
*
|
535
|
+
* Pause playback of a currently-playing mixing channel.
|
536
|
+
* Playback can be resumed from the current point with #resume.
|
537
|
+
* See also #stop.
|
538
|
+
*/
|
539
|
+
VALUE rbgm_mixchan_pause( VALUE self, VALUE chanv )
|
540
|
+
{
|
541
|
+
Mix_Pause(NUM2INT(chanv));
|
542
|
+
return Qnil;
|
543
|
+
}
|
544
|
+
|
545
|
+
/* call-seq:
|
546
|
+
* resume( channel_num )
|
547
|
+
*
|
548
|
+
* Resume playback of a paused mixing channel. The channel must have been
|
549
|
+
* paused (via the #pause method) for this to have any effect. Playback will
|
550
|
+
* resume from the point where the channel was paused.
|
551
|
+
*
|
552
|
+
*/
|
553
|
+
VALUE rbgm_mixchan_resume( VALUE self, VALUE chanv )
|
554
|
+
{
|
555
|
+
Mix_Resume(NUM2INT(chanv));
|
556
|
+
return Qnil;
|
557
|
+
}
|
558
|
+
|
559
|
+
|
560
|
+
/* --
|
561
|
+
* MUSIC
|
562
|
+
* ++
|
563
|
+
*/
|
564
|
+
|
565
|
+
/* call-seq:
|
566
|
+
* set_music_command(command) -> integer
|
567
|
+
*
|
568
|
+
* Sets the external command used to play music.
|
569
|
+
*
|
570
|
+
* Raises SDLError if something goes wrong.
|
571
|
+
*
|
572
|
+
* This method takes these arguments:
|
573
|
+
* command:: what command to use to play the music.
|
574
|
+
*
|
575
|
+
*/
|
576
|
+
VALUE rbgm_mixmusic_setcommand(VALUE class, VALUE commandv)
|
577
|
+
{
|
578
|
+
int result;
|
579
|
+
result = Mix_SetMusicCMD(StringValuePtr(commandv));
|
580
|
+
if( result < 0 )
|
581
|
+
{
|
582
|
+
rb_raise(eSDLError, "Error setting music player commando to `%s': %s",
|
583
|
+
StringValuePtr(commandv), Mix_GetError());
|
584
|
+
}
|
585
|
+
return INT2NUM( result );
|
586
|
+
}
|
587
|
+
|
588
|
+
/* call-seq:
|
589
|
+
* load_audio( filename ) -> Music
|
590
|
+
*
|
591
|
+
* **NOTE:** Rubygame::Mixer::Music is DEPRECATED and will be removed
|
592
|
+
* in Rubygame 3.0. Please use the Rubygame::Music class instead.
|
593
|
+
*
|
594
|
+
* Load music from a file. Supports WAVE, MOD, MIDI, OGG, and MP3 formats.
|
595
|
+
*
|
596
|
+
* Raises SDLError if the music could not be loaded.
|
597
|
+
*/
|
598
|
+
VALUE rbgm_mixmusic_new(VALUE class, VALUE filev)
|
599
|
+
{
|
600
|
+
|
601
|
+
/* This feature will be removed in Rubygame 3.0. */
|
602
|
+
rg_deprecated("Rubygame::Mixer::Music", "3.0");
|
603
|
+
|
604
|
+
VALUE self;
|
605
|
+
Mix_Music* music;
|
606
|
+
|
607
|
+
music = Mix_LoadMUS( StringValuePtr(filev) );
|
608
|
+
|
609
|
+
if( music == NULL )
|
610
|
+
{
|
611
|
+
rb_raise(eSDLError, "Error loading audio music from file `%s': %s",
|
612
|
+
StringValuePtr(filev), Mix_GetError());
|
613
|
+
}
|
614
|
+
self = Data_Wrap_Struct( cOldMusic, 0, Mix_FreeMusic, music );
|
615
|
+
|
616
|
+
//rb_obj_call_init(self,argc,argv);
|
617
|
+
|
618
|
+
return self;
|
619
|
+
}
|
620
|
+
|
621
|
+
/* call-seq:
|
622
|
+
* play( repeats = 0 ) -> self
|
623
|
+
*
|
624
|
+
* Play music, repeating a certain number of extra times. If
|
625
|
+
* any music was already playing, that music will be stopped
|
626
|
+
* first, and this music will start.
|
627
|
+
*
|
628
|
+
* Raises SDLError if something goes wrong.
|
629
|
+
*
|
630
|
+
* This method takes these arguments:
|
631
|
+
* repeats:: how many extra times to play the music.
|
632
|
+
* Can be -1 to repeat forever until it is stopped.
|
633
|
+
*/
|
634
|
+
VALUE rbgm_mixmusic_play(int argc, VALUE *argv, VALUE self)
|
635
|
+
{
|
636
|
+
Mix_Music* music;
|
637
|
+
int reps, result;
|
638
|
+
VALUE repsv;
|
639
|
+
|
640
|
+
Data_Get_Struct( self, Mix_Music, music );
|
641
|
+
|
642
|
+
rb_scan_args(argc, argv, "01", &repsv);
|
643
|
+
|
644
|
+
if( RTEST(repsv) )
|
645
|
+
{
|
646
|
+
reps = NUM2INT(repsv);
|
647
|
+
}
|
648
|
+
else
|
649
|
+
{
|
650
|
+
reps = 0;
|
651
|
+
}
|
652
|
+
|
653
|
+
if( reps > -1 )
|
654
|
+
{
|
655
|
+
/* Adjust so repeats means the same as it does for Samples */
|
656
|
+
reps += 1;
|
657
|
+
}
|
658
|
+
|
659
|
+
result = Mix_PlayMusic(music, reps);
|
660
|
+
|
661
|
+
if ( result < 0 )
|
662
|
+
{
|
663
|
+
rb_raise(eSDLError, "Error playing music: %s",
|
664
|
+
Mix_GetError());
|
665
|
+
}
|
666
|
+
|
667
|
+
return self;
|
668
|
+
}
|
669
|
+
|
670
|
+
/* call-seq:
|
671
|
+
* stop() -> self
|
672
|
+
*
|
673
|
+
* Stop playback of music.
|
674
|
+
* See also #play
|
675
|
+
*/
|
676
|
+
VALUE rbgm_mixmusic_stop(VALUE self)
|
677
|
+
{
|
678
|
+
Mix_HaltMusic();
|
679
|
+
return self;
|
680
|
+
}
|
681
|
+
|
682
|
+
/* call-seq:
|
683
|
+
* pause() -> self
|
684
|
+
*
|
685
|
+
* Pause playback of the playing music. You can later #resume
|
686
|
+
* playback from the point where you paused.
|
687
|
+
* Safe to use on already-paused music.
|
688
|
+
* See also #play_music.
|
689
|
+
*/
|
690
|
+
VALUE rbgm_mixmusic_pause(VALUE self)
|
691
|
+
{
|
692
|
+
Mix_PauseMusic();
|
693
|
+
return self;
|
694
|
+
}
|
695
|
+
|
696
|
+
/* call-seq:
|
697
|
+
* resume() -> self
|
698
|
+
*
|
699
|
+
* Resume playback of paused music from the point it was paused.
|
700
|
+
* Safe to use on already-playing music.
|
701
|
+
* See also #play.
|
702
|
+
*/
|
703
|
+
VALUE rbgm_mixmusic_resume(VALUE self)
|
704
|
+
{
|
705
|
+
Mix_ResumeMusic();
|
706
|
+
return self;
|
707
|
+
}
|
708
|
+
|
709
|
+
/* call-seq:
|
710
|
+
* rewind() -> self
|
711
|
+
*
|
712
|
+
* Rewind the music to the start. This is safe to use on stopped, paused, and playing music.
|
713
|
+
* Only works for MOD, OGG, MP3, and MIDI (but not WAV).
|
714
|
+
*
|
715
|
+
*/
|
716
|
+
VALUE rbgm_mixmusic_rewind(VALUE self)
|
717
|
+
{
|
718
|
+
Mix_RewindMusic();
|
719
|
+
return self;
|
720
|
+
}
|
721
|
+
|
722
|
+
/* call-seq:
|
723
|
+
* jump( time ) -> self
|
724
|
+
*
|
725
|
+
* Jump to a certain time in the music.
|
726
|
+
* Only works when music is playing or paused (but not stopped).
|
727
|
+
* Only works for OGG and MP3 files.
|
728
|
+
*
|
729
|
+
* Raises SDLError if something goes wrong, or if the music type does not
|
730
|
+
* support setting the position.
|
731
|
+
*
|
732
|
+
* time:: Time to jump to, in seconds from the beginning.
|
733
|
+
*
|
734
|
+
*/
|
735
|
+
VALUE rbgm_mixmusic_jump(VALUE self, VALUE vtime)
|
736
|
+
{
|
737
|
+
double time = NUM2DBL(vtime);
|
738
|
+
|
739
|
+
switch( Mix_GetMusicType(NULL) )
|
740
|
+
{
|
741
|
+
case MUS_OGG:
|
742
|
+
case MUS_MP3:
|
743
|
+
Mix_RewindMusic(); // Needed for MP3, and OK with OGG
|
744
|
+
|
745
|
+
int result = Mix_SetMusicPosition(time);
|
746
|
+
if( result < 0 )
|
747
|
+
{
|
748
|
+
rb_raise(eSDLError, "Error jumping to time in music: %s", Mix_GetError());
|
749
|
+
}
|
750
|
+
|
751
|
+
return self;
|
752
|
+
|
753
|
+
case MUS_NONE:
|
754
|
+
rb_raise(eSDLError, "Cannot jump when no music is playing.");
|
755
|
+
|
756
|
+
default:
|
757
|
+
rb_raise(eSDLError, "Music type does not support jumping.");
|
758
|
+
}
|
759
|
+
}
|
760
|
+
|
761
|
+
/* call-seq:
|
762
|
+
* playing? -> true or false
|
763
|
+
*
|
764
|
+
* Returns true if the music is currently playing.
|
765
|
+
*
|
766
|
+
*/
|
767
|
+
VALUE rbgm_mixmusic_playing(VALUE self)
|
768
|
+
{
|
769
|
+
return Mix_PlayingMusic() ? Qtrue : Qfalse;
|
770
|
+
}
|
771
|
+
|
772
|
+
/* call-seq:
|
773
|
+
* paused? -> true or false
|
774
|
+
*
|
775
|
+
* Returns true if the music is currently paused.
|
776
|
+
*
|
777
|
+
*/
|
778
|
+
VALUE rbgm_mixmusic_paused(VALUE self)
|
779
|
+
{
|
780
|
+
return Mix_PausedMusic() ? Qtrue : Qfalse;
|
781
|
+
}
|
782
|
+
|
783
|
+
/* call-seq:
|
784
|
+
* volume
|
785
|
+
*
|
786
|
+
* Returns the current volume level of the music.
|
787
|
+
* 0.0 is total silence, 1.0 is maximum volume.
|
788
|
+
*/
|
789
|
+
VALUE rbgm_mixmusic_getvolume(VALUE self)
|
790
|
+
{
|
791
|
+
return rb_float_new( (double)(Mix_VolumeMusic(-1)) / MIX_MAX_VOLUME );
|
792
|
+
}
|
793
|
+
|
794
|
+
/* call-seq:
|
795
|
+
* volume = new_volume
|
796
|
+
*
|
797
|
+
* Sets the volume level of the music.
|
798
|
+
* 0.0 is total silence, 1.0 is maximum volume.
|
799
|
+
*/
|
800
|
+
VALUE rbgm_mixmusic_setvolume(VALUE self, VALUE volumev)
|
801
|
+
{
|
802
|
+
double volume = NUM2DBL(volumev);
|
803
|
+
Mix_VolumeMusic( (int)(volume * MIX_MAX_VOLUME) );
|
804
|
+
return volumev;
|
805
|
+
}
|
806
|
+
|
807
|
+
/* call-seq:
|
808
|
+
* fade_in( fade_time, repeats=0, start=0 ) -> self
|
809
|
+
*
|
810
|
+
* Play the music, fading in and repeating a certain number of times.
|
811
|
+
* See also #play.
|
812
|
+
*
|
813
|
+
* Raises SDLError if something goes wrong.
|
814
|
+
*
|
815
|
+
* fade_time:: Time in seconds for the fade-in effect to complete.
|
816
|
+
* repeats:: Number of extra times to play through the music.
|
817
|
+
* -1 plays the music forever until it is stopped.
|
818
|
+
* Defaults to 0, play only once (no repeats).
|
819
|
+
* start:: Time to start from, in seconds since the beginning.
|
820
|
+
* Defaults to 0, the beginning of the song.
|
821
|
+
* Non-zero values only work for OGG and MP3; other
|
822
|
+
* music types will raise SDLError.
|
823
|
+
*/
|
824
|
+
VALUE rbgm_mixmusic_fadein(int argc, VALUE *argv, VALUE self)
|
825
|
+
{
|
826
|
+
VALUE fadev, repsv, startv;
|
827
|
+
rb_scan_args(argc, argv, "12", &fadev, &repsv, &startv);
|
828
|
+
|
829
|
+
Mix_Music* music;
|
830
|
+
Data_Get_Struct( self, Mix_Music, music );
|
831
|
+
|
832
|
+
int fade, reps, result;
|
833
|
+
fade = (int)(NUM2DBL(fadev) * 1000); /* convert to milliseconds */
|
834
|
+
|
835
|
+
if( RTEST(repsv) )
|
836
|
+
{
|
837
|
+
reps = NUM2INT(repsv);
|
838
|
+
}
|
839
|
+
else
|
840
|
+
{
|
841
|
+
reps = 0;
|
842
|
+
}
|
843
|
+
|
844
|
+
if( reps > -1 )
|
845
|
+
{
|
846
|
+
/* Adjust so repeats means the same as it does for Samples */
|
847
|
+
reps += 1;
|
848
|
+
}
|
849
|
+
|
850
|
+
if( !RTEST(startv) || NUM2DBL(startv) == 0.0 )
|
851
|
+
{
|
852
|
+
result = Mix_FadeInMusic(music, reps, fade);
|
853
|
+
}
|
854
|
+
else
|
855
|
+
{
|
856
|
+
result = Mix_FadeInMusicPos(music, reps, fade, NUM2DBL(startv));
|
857
|
+
}
|
858
|
+
|
859
|
+
if( result < 0 )
|
860
|
+
{
|
861
|
+
rb_raise(eSDLError, "Error fading in music: %s", Mix_GetError());
|
862
|
+
}
|
863
|
+
|
864
|
+
return self;
|
865
|
+
}
|
866
|
+
|
867
|
+
/* call-seq:
|
868
|
+
* fade_out( fade_time ) -> self
|
869
|
+
*
|
870
|
+
* Gradually fade the music to silence over +fade_length+ seconds.
|
871
|
+
* After the fade is complete, the music will be automatically stopped.
|
872
|
+
*
|
873
|
+
* Raises SDLError if something goes wrong.
|
874
|
+
*
|
875
|
+
* fade_time:: Time until the music is totally silent, in seconds.
|
876
|
+
*/
|
877
|
+
VALUE rbgm_mixmusic_fadeout(VALUE self, VALUE fadev)
|
878
|
+
{
|
879
|
+
int fade = (int)(NUM2DBL(fadev) * 1000);
|
880
|
+
int result = Mix_FadeOutMusic(fade);
|
881
|
+
|
882
|
+
if ( result < 0 )
|
883
|
+
{
|
884
|
+
rb_raise(eSDLError, "Error fading out music: %s", Mix_GetError());
|
885
|
+
}
|
886
|
+
return self;
|
887
|
+
}
|
888
|
+
|
889
|
+
/* call-seq:
|
890
|
+
* fading?( direction = nil ) -> true or false
|
891
|
+
*
|
892
|
+
* True if the music is fading in or out (or either). You can
|
893
|
+
* specify +direction+ as :in/:out to check only fading in/out;
|
894
|
+
* otherwise, it will return true if it's fading either way.
|
895
|
+
*
|
896
|
+
* direction:: :in, :out, or nil if you don't care which.
|
897
|
+
* Returns:: true if the music is fading in the given direction.
|
898
|
+
*/
|
899
|
+
VALUE rbgm_mixmusic_fading(int argc, VALUE *argv, VALUE self)
|
900
|
+
{
|
901
|
+
VALUE dirv;
|
902
|
+
rb_scan_args(argc, argv, "01", &dirv);
|
903
|
+
|
904
|
+
if( dirv == make_symbol("in") )
|
905
|
+
{
|
906
|
+
return ( (Mix_FadingMusic() == MIX_FADING_IN) ? Qtrue : Qfalse );
|
907
|
+
}
|
908
|
+
else if( dirv == make_symbol("out") )
|
909
|
+
{
|
910
|
+
return ( (Mix_FadingMusic() == MIX_FADING_OUT) ? Qtrue : Qfalse );
|
911
|
+
}
|
912
|
+
else
|
913
|
+
{
|
914
|
+
return ( (Mix_FadingMusic() != MIX_NO_FADING) ? Qtrue : Qfalse );
|
915
|
+
}
|
916
|
+
}
|
917
|
+
|
918
|
+
|
919
|
+
void Init_rubygame_mixer()
|
920
|
+
{
|
921
|
+
|
922
|
+
#if 0
|
923
|
+
mRubygame = rb_define_module("Rubygame");
|
924
|
+
#endif
|
925
|
+
|
926
|
+
Init_rubygame_shared();
|
927
|
+
|
928
|
+
Rubygame_Init_Sound();
|
929
|
+
Rubygame_Init_Music();
|
930
|
+
|
931
|
+
rb_hash_aset(rb_ivar_get(mRubygame,rb_intern("VERSIONS")),
|
932
|
+
ID2SYM(rb_intern("sdl_mixer")),
|
933
|
+
rb_ary_new3(3,
|
934
|
+
INT2NUM(SDL_MIXER_MAJOR_VERSION),
|
935
|
+
INT2NUM(SDL_MIXER_MINOR_VERSION),
|
936
|
+
INT2NUM(SDL_MIXER_PATCHLEVEL)));
|
937
|
+
|
938
|
+
/*
|
939
|
+
* Moving these to be under Rubygame module instead of Mixer.
|
940
|
+
*/
|
941
|
+
rb_define_module_function(mRubygame,"open_audio", rbgm_mixer_openaudio2, -1);
|
942
|
+
rb_define_module_function(mRubygame,"close_audio", rbgm_mixer_closeaudio2, 0);
|
943
|
+
rb_define_module_function(mRubygame,"audio_driver",rbgm_mixer_audiodriver, 0);
|
944
|
+
|
945
|
+
|
946
|
+
|
947
|
+
/*
|
948
|
+
* **NOTE:** This module is DEPRECATED and will be removed in Rubygame 3.0.
|
949
|
+
* Please use Rubygame.open_audio, Rubygame.close_audio, Rubygame::Sound,
|
950
|
+
* and Rubygame::Music instead.
|
951
|
+
*
|
952
|
+
* The Mixer module provides access to the SDL_mixer library for audio
|
953
|
+
* playback and mixing. This module is still very basic, but it is
|
954
|
+
* good enough to load and play WAV files on multiple mix channels.
|
955
|
+
*
|
956
|
+
* See the Sample class for loading audio files.
|
957
|
+
* See the Music class for streaming music from a file.
|
958
|
+
*/
|
959
|
+
mMixer = rb_define_module_under(mRubygame, "Mixer");
|
960
|
+
|
961
|
+
rb_define_const(mMixer,"AUDIO_U8", INT2NUM(AUDIO_U8));
|
962
|
+
rb_define_const(mMixer,"AUDIO_S8", INT2NUM(AUDIO_S8));
|
963
|
+
rb_define_const(mMixer,"AUDIO_U16SYS", INT2NUM(AUDIO_U16SYS));
|
964
|
+
rb_define_const(mMixer,"AUDIO_S16SYS", INT2NUM(AUDIO_S16SYS));
|
965
|
+
|
966
|
+
rb_define_module_function(mMixer,"open_audio",rbgm_mixer_openaudio, -1);
|
967
|
+
rb_define_module_function(mMixer,"close_audio",rbgm_mixer_closeaudio, 0);
|
968
|
+
rb_define_module_function(mMixer,"mix_channels",rbgm_mixer_getmixchans, 0);
|
969
|
+
rb_define_module_function(mMixer,"mix_channels=",rbgm_mixer_setmixchans, 1);
|
970
|
+
rb_define_module_function(mMixer,"driver_name", rbgm_mixer_getdrivername, 0);
|
971
|
+
|
972
|
+
|
973
|
+
/*
|
974
|
+
* **NOTE:** This class is DEPRECATED and will be removed in Rubygame 3.0.
|
975
|
+
* Please use the Rubygame::Sound class instead.
|
976
|
+
*
|
977
|
+
* Stores audio data to play with Mixer.play()
|
978
|
+
*/
|
979
|
+
cSample = rb_define_class_under(mMixer, "Sample", rb_cObject);
|
980
|
+
rb_define_singleton_method(cSample, "load_audio", rbgm_sample_new, 1);
|
981
|
+
rb_define_module_function(mMixer,"play", rbgm_mixchan_play, 3);
|
982
|
+
rb_define_module_function(mMixer,"stop", rbgm_mixchan_stop, 1);
|
983
|
+
rb_define_module_function(mMixer,"pause", rbgm_mixchan_pause, 1);
|
984
|
+
rb_define_module_function(mMixer,"resume", rbgm_mixchan_resume, 1);
|
985
|
+
|
986
|
+
|
987
|
+
/*
|
988
|
+
* **NOTE:** This class is DEPRECATED and will be removed in Rubygame 3.0.
|
989
|
+
* Please use the Rubygame::Music class instead.
|
990
|
+
*
|
991
|
+
* The Music class is used for playing music from a file. It supports
|
992
|
+
* WAVE, MOD, MIDI, OGG, and MP3 files. There are two important differences
|
993
|
+
* between Music and Sample:
|
994
|
+
*
|
995
|
+
* 1. Music streams the music from disk, which means it can start faster and
|
996
|
+
* uses less memory than Sample, which loads the entire file into memory.
|
997
|
+
* This is especially important for music files, which are often several
|
998
|
+
* minutes long.
|
999
|
+
* 2. There can only be one Music instance playing at once, while there can
|
1000
|
+
* be many Samples playing at once. If you play a second Music while one
|
1001
|
+
* is already playing, the first one will be stopped. See #play.
|
1002
|
+
*/
|
1003
|
+
cOldMusic = rb_define_class_under(mMixer, "Music", rb_cObject);
|
1004
|
+
rb_define_singleton_method(cOldMusic, "load_audio", rbgm_mixmusic_new, 1);
|
1005
|
+
|
1006
|
+
//rb_define_singleton_method(cOldMusic, "set_command", rbgm_mixmusic_setcommand, 1);
|
1007
|
+
|
1008
|
+
rb_define_method(cOldMusic, "play", rbgm_mixmusic_play, -1);
|
1009
|
+
rb_define_method(cOldMusic, "stop", rbgm_mixmusic_stop, 0);
|
1010
|
+
rb_define_method(cOldMusic, "pause", rbgm_mixmusic_pause, 0);
|
1011
|
+
rb_define_method(cOldMusic, "resume", rbgm_mixmusic_resume, 0);
|
1012
|
+
rb_define_method(cOldMusic, "rewind", rbgm_mixmusic_rewind, 0);
|
1013
|
+
rb_define_method(cOldMusic, "jump", rbgm_mixmusic_jump, 1);
|
1014
|
+
rb_define_method(cOldMusic, "paused?", rbgm_mixmusic_paused, 0);
|
1015
|
+
rb_define_method(cOldMusic, "playing?", rbgm_mixmusic_playing, 0);
|
1016
|
+
|
1017
|
+
rb_define_method(cOldMusic, "volume", rbgm_mixmusic_getvolume, 0);
|
1018
|
+
rb_define_method(cOldMusic, "volume=", rbgm_mixmusic_setvolume, 1);
|
1019
|
+
rb_define_method(cOldMusic, "fade_in", rbgm_mixmusic_fadein, -1);
|
1020
|
+
rb_define_method(cOldMusic, "fade_out", rbgm_mixmusic_fadeout, 1);
|
1021
|
+
rb_define_method(cOldMusic, "fading?", rbgm_mixmusic_fading, -1);
|
1022
|
+
}
|
1023
|
+
|
1024
|
+
|