ruby-openal 0.1

Sign up to get free protection for your applications and to get access to all the features.
Binary file
Binary file
@@ -0,0 +1,1406 @@
1
+ #include "ruby.h"
2
+ #include "openal.h"
3
+ #include "openal_al.h"
4
+ #include "AL/al.h"
5
+ #include "AL/alc.h"
6
+ #include "AL/alut.h"
7
+
8
+ /// module values
9
+ VALUE vAL;
10
+
11
+ /// class values
12
+ VALUE vAL_Listener;
13
+ VALUE vAL_SampleData;
14
+ VALUE vAL_Buffer;
15
+ VALUE vAL_Source;
16
+
17
+ /// AL: error constants
18
+ VALUE vAL_NO_ERROR = INT2FIX(AL_NO_ERROR);
19
+ VALUE vAL_INVALID_NAME = INT2FIX(AL_INVALID_NAME);
20
+ VALUE vAL_INVALID_ENUM = INT2FIX(AL_INVALID_ENUM);
21
+ VALUE vAL_INVALID_VALUE = INT2FIX(AL_INVALID_VALUE);
22
+ VALUE vAL_INVALID_OPERATION = INT2FIX(AL_INVALID_OPERATION);
23
+ VALUE vAL_OUT_OF_MEMORY = INT2FIX(AL_OUT_OF_MEMORY);
24
+
25
+ /// AL: state constants
26
+ VALUE vAL_DOPPLER_FACTOR = INT2FIX(AL_DOPPLER_FACTOR);
27
+ VALUE vAL_SPEED_OF_SOUND = INT2FIX(AL_SPEED_OF_SOUND);
28
+ VALUE vAL_DISTANCE_MODEL = INT2FIX(AL_DISTANCE_MODEL);
29
+
30
+ /// AL: spec constants
31
+ VALUE vAL_VENDOR = INT2FIX(AL_VENDOR);
32
+ VALUE vAL_VERSION = INT2FIX(AL_VERSION);
33
+ VALUE vAL_RENDERER = INT2FIX(AL_RENDERER);
34
+ VALUE vAL_EXTENSIONS = INT2FIX(AL_EXTENSIONS);
35
+
36
+ /// AL: distance model constants
37
+ VALUE vAL_INVERSE_DISTANCE = INT2FIX(AL_INVERSE_DISTANCE);
38
+ VALUE vAL_INVERSE_DISTANCE_CLAMPED = INT2FIX(AL_INVERSE_DISTANCE_CLAMPED);
39
+ VALUE vAL_LINEAR_DISTANCE = INT2FIX(AL_LINEAR_DISTANCE);
40
+ VALUE vAL_LINEAR_DISTANCE_CLAMPED = INT2FIX(AL_LINEAR_DISTANCE_CLAMPED);
41
+ VALUE vAL_EXPONENT_DISTANCE = INT2FIX(AL_EXPONENT_DISTANCE);
42
+ VALUE vAL_EXPONENT_DISTANCE_CLAMPED = INT2FIX(AL_EXPONENT_DISTANCE_CLAMPED);
43
+ VALUE vAL_NONE = INT2FIX(AL_NONE);
44
+
45
+ /// AL: format constants
46
+ VALUE vAL_FORMAT_MONO8 = INT2FIX(AL_FORMAT_MONO8);
47
+ VALUE vAL_FORMAT_MONO16 = INT2FIX(AL_FORMAT_MONO16);
48
+ VALUE vAL_FORMAT_STEREO8 = INT2FIX(AL_FORMAT_STEREO8);
49
+ VALUE vAL_FORMAT_STEREO16 = INT2FIX(AL_FORMAT_STEREO16);
50
+
51
+ /// AL: source type constants
52
+ VALUE vAL_UNDETERMINED = INT2FIX(AL_UNDETERMINED);
53
+ VALUE vAL_STATIC = INT2FIX(AL_STATIC);
54
+ VALUE vAL_STREAMING = INT2FIX(AL_STREAMING);
55
+
56
+
57
+
58
+ /// AL::get_error
59
+ static VALUE AL_get_error(VALUE self) {
60
+ return INT2FIX(alGetError());
61
+ }
62
+
63
+ /// AL::extension_present?(extname)
64
+ static VALUE AL_extension_present_p(VALUE self, VALUE extension_name) {
65
+ ALboolean rslt;
66
+ const char* str;
67
+ Check_Type(extension_name, T_STRING);
68
+ str = RSTRING_PTR(extension_name);
69
+ rslt = alIsExtensionPresent(str);
70
+ return albool2rbbool(rslt);
71
+ }
72
+
73
+ /// AL::enum_value_of(enum_name)
74
+ static VALUE AL_enum_value_of(VALUE self, VALUE enum_name) {
75
+ const char* str;
76
+ Check_Type(enum_name, T_STRING);
77
+ str = RSTRING_PTR(enum_name);
78
+ return INT2FIX(alGetEnumValue(str));
79
+ }
80
+
81
+ /// AL::enable(capacity)
82
+ static VALUE AL_enable(VALUE self, VALUE capacity) {
83
+ ALenum c = NUM2INT(capacity);
84
+ alEnable(c);
85
+ return Qnil;
86
+ }
87
+
88
+ /// AL::disable(capacity)
89
+ static VALUE AL_disable(VALUE self, VALUE capacity) {
90
+ ALenum c = NUM2INT(capacity);
91
+ alDisable(c);
92
+ return Qnil;
93
+ }
94
+
95
+ /// AL::enable?
96
+ static VALUE AL_enable_p(VALUE self, VALUE capacity) {
97
+ ALenum c = NUM2INT(capacity);
98
+ ALboolean rslt = alIsEnabled(c);
99
+ return albool2rbbool(rslt);
100
+ }
101
+
102
+ /// AL::boolean
103
+ static VALUE AL_get_boolean(VALUE self, VALUE capacity) {
104
+ ALenum c = NUM2INT(capacity);
105
+ ALboolean rslt = alGetBoolean(c);
106
+ return albool2rbbool(rslt);
107
+ }
108
+
109
+ /// AL::float
110
+ static VALUE AL_get_float(VALUE self, VALUE capacity) {
111
+ ALenum c = NUM2INT(capacity);
112
+ ALfloat f = alGetFloat(c);
113
+ return rb_float_new((double)f);
114
+ }
115
+
116
+ /// AL::double
117
+ static VALUE AL_get_double(VALUE self, VALUE capacity) {
118
+ ALenum c = NUM2INT(capacity);
119
+ ALdouble d = alGetDouble(c);
120
+ return rb_float_new(d);
121
+ }
122
+
123
+ /// AL::integer
124
+ static VALUE AL_get_integer(VALUE self, VALUE capacity) {
125
+ ALenum c = NUM2INT(capacity);
126
+ ALint i = alGetInteger(c);
127
+ return INT2FIX(i);
128
+ }
129
+
130
+ /// AL::booleans
131
+ /*
132
+ static VALUE AL_get_booleans(VALUE self, VALUE capacity) {
133
+ }
134
+ */
135
+
136
+ /// AL::doubles
137
+ /*
138
+ static VALUE AL_get_doubles(VALUE self, VALUE capacity) {
139
+ }
140
+ */
141
+
142
+ /// AL::floats
143
+ /*
144
+ static VALUE AL_get_floats(VALUE self, VALUE capacity) {
145
+ }
146
+ */
147
+
148
+ /// AL::integers
149
+ /*
150
+ static VALUE AL_get_integers(VALUE self, VALUE capacity) {
151
+ }
152
+ */
153
+
154
+ /// AL::string
155
+ static VALUE AL_get_string(VALUE self, VALUE capacity) {
156
+ ALenum c = NUM2INT(capacity);
157
+ const char* s = alGetString(c);
158
+ if (NULL == s) return Qnil;
159
+ else return rb_str_new2(s);
160
+ }
161
+
162
+ /// AL::distance_model=(val)
163
+ static VALUE AL_set_distance_model(VALUE self, VALUE v) {
164
+ ALenum e = NUM2INT(v);
165
+ alDistanceModel(e);
166
+ return Qnil;
167
+ }
168
+
169
+ /// AL::doppler_factor=(val)
170
+ static VALUE AL_set_doppler_factor(VALUE self, VALUE v) {
171
+ ALfloat f = (ALfloat) NUM2DBL(v);
172
+ alDopplerFactor(f);
173
+ return Qnil;
174
+ }
175
+
176
+ /// AL::doppler_velocity=(val)
177
+ static VALUE AL_set_doppler_velocity(VALUE self, VALUE v) {
178
+ ALfloat f = (ALfloat) NUM2DBL(v);
179
+ alDopplerVelocity(f);
180
+ return Qnil;
181
+ }
182
+
183
+ /// AL::speed_of_sound=(val)
184
+ static VALUE AL_set_speed_of_sound(VALUE self, VALUE v) {
185
+ ALfloat f = (ALfloat) NUM2DBL(v);
186
+ alSpeedOfSound(f);
187
+ return Qnil;
188
+ }
189
+
190
+ static void define_AL_error_consts() {
191
+ rb_define_const(vAL, "NO_ERROR", vAL_NO_ERROR);
192
+ rb_define_const(vAL, "INVALID_NAME", vAL_INVALID_NAME);
193
+ rb_define_const(vAL, "INVALID_ENUM", vAL_INVALID_ENUM);
194
+ rb_define_const(vAL, "INVALID_VALUE", vAL_INVALID_VALUE);
195
+ rb_define_const(vAL, "INVALID_OPERATION", vAL_INVALID_OPERATION);
196
+ rb_define_const(vAL, "OUT_OF_MEMORY", vAL_OUT_OF_MEMORY);
197
+ }
198
+
199
+ static void define_AL_state_consts() {
200
+ rb_define_const(vAL, "DOPPLER_FACTOR", vAL_DOPPLER_FACTOR);
201
+ rb_define_const(vAL, "SPEED_OF_SOUND", vAL_SPEED_OF_SOUND);
202
+ rb_define_const(vAL, "DISTANCE_MODEL", vAL_DISTANCE_MODEL);
203
+ }
204
+
205
+ static void define_AL_spec_consts() {
206
+ rb_define_const(vAL, "VENDOR", vAL_VENDOR);
207
+ rb_define_const(vAL, "VERSION", vAL_VERSION);
208
+ rb_define_const(vAL, "RENDERER", vAL_RENDERER);
209
+ rb_define_const(vAL, "EXTENSIONS", vAL_EXTENSIONS);
210
+ }
211
+
212
+ static void define_AL_distance_model_consts() {
213
+ rb_define_const(vAL, "INVERSE_DISTANCE", vAL_INVERSE_DISTANCE);
214
+ rb_define_const(vAL, "INVERSE_DISTANCE_CLAMPED", vAL_INVERSE_DISTANCE_CLAMPED);
215
+ rb_define_const(vAL, "LINEAR_DISTANCE", vAL_LINEAR_DISTANCE);
216
+ rb_define_const(vAL, "LINEAR_DISTANCE_CLAMPED", vAL_LINEAR_DISTANCE_CLAMPED);
217
+ rb_define_const(vAL, "EXPONENT_DISTANCE", vAL_EXPONENT_DISTANCE);
218
+ rb_define_const(vAL, "EXPONENT_DISTANCE_CLAMPED", vAL_EXPONENT_DISTANCE_CLAMPED);
219
+ rb_define_const(vAL, "NONE", vAL_NONE);
220
+ }
221
+
222
+ static void define_AL_format_consts() {
223
+ rb_define_const(vAL, "FORMAT_MONO8", vAL_FORMAT_MONO8);
224
+ rb_define_const(vAL, "FORMAT_MONO16", vAL_FORMAT_MONO16);
225
+ rb_define_const(vAL, "FORMAT_STEREO8", vAL_FORMAT_STEREO8);
226
+ rb_define_const(vAL, "FORMAT_STEREO16", vAL_FORMAT_STEREO16);
227
+ }
228
+
229
+ static void define_AL_source_type_consts() {
230
+ rb_define_const(vAL, "UNDETERMINED", vAL_UNDETERMINED);
231
+ rb_define_const(vAL, "STATIC", vAL_STATIC);
232
+ rb_define_const(vAL, "STREAMING", vAL_STREAMING);
233
+ }
234
+
235
+ static void define_AL_error_funcs() {
236
+ // error handling.
237
+ /// AL::get_error
238
+ rb_define_module_function(vAL, "get_error", &AL_get_error, 0);
239
+ }
240
+
241
+ static void define_AL_exts_funcs() {
242
+ // extension.
243
+ /// AL::extension_present?(extname)
244
+ rb_define_module_function(vAL, "extension_present?", &AL_extension_present_p, 1);
245
+ /// AL::enum_value_of(enum_name)
246
+ rb_define_module_function(vAL, "enum_value_of", &AL_enum_value_of, 1);
247
+ }
248
+
249
+ static void define_AL_state_funcs() {
250
+ // states
251
+ /// AL::enable(capacity)
252
+ rb_define_module_function(vAL, "enable", &AL_enable, 1);
253
+ /// AL::disable(capacity)
254
+ rb_define_module_function(vAL, "disable", &AL_disable, 1);
255
+ /// AL::enable?(capacity)
256
+ rb_define_module_function(vAL, "enable?", &AL_enable_p, 1);
257
+ /// AL::boolean(param)
258
+ rb_define_module_function(vAL, "boolean", &AL_get_boolean, 1);
259
+ /// AL::double(param)
260
+ rb_define_module_function(vAL, "double", &AL_get_double, 1);
261
+ /// AL::float(param)
262
+ rb_define_module_function(vAL, "float", &AL_get_float, 1);
263
+ /// AL::integer(param)
264
+ rb_define_module_function(vAL, "integer", &AL_get_integer, 1);
265
+ /// FIXME: AL::booleans(param)
266
+ //rb_define_module_function(vAL, "booleans", &AL_get_booleans, 1);
267
+ /// FIXME: AL::doubles(param)
268
+ //rb_define_module_function(vAL, "doubles", &AL_get_doubles, 1);
269
+ /// FIXME: AL::floats(param)
270
+ //rb_define_module_function(vAL, "floats", &AL_get_floats, 1);
271
+ /// FIXME: AL::integers(param)
272
+ //rb_define_module_function(vAL, "integers", &AL_get_integers, 1);
273
+ /// AL::string(param)
274
+ rb_define_module_function(vAL, "string", &AL_get_string, 1);
275
+
276
+ /// TODO: getters!
277
+ /// AL::distance_model=(val)
278
+ rb_define_module_function(vAL, "distance_model=", &AL_set_distance_model, 1);
279
+ /// AL::doppler_factor=(val)
280
+ rb_define_module_function(vAL, "doppler_factor=", &AL_set_doppler_factor, 1);
281
+ /// AL::doppler_velocity=(val)
282
+ rb_define_module_function(vAL, "doppler_velocity=", &AL_set_doppler_velocity, 1);
283
+ /// AL::speed_of_sound=(val)
284
+ rb_define_module_function(vAL, "speed_of_sound=", &AL_set_speed_of_sound, 1);
285
+ }
286
+
287
+ /// + AL::Listener.orientation rw:([fx, fy, fz, ux, uy, uz])
288
+ static VALUE AL_Listener_get_orientation(VALUE self) {
289
+ ALfloat v[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
290
+ VALUE ary;
291
+ ary = rb_ary_new();
292
+ alGetListenerfv(AL_ORIENTATION, v);
293
+ ARRAY2RARRAY(v, ary, 6, rb_float_new);
294
+ return ary;
295
+ }
296
+
297
+ static VALUE AL_Listener_set_orientation(VALUE self, VALUE a) {
298
+ ALfloat vec[6];
299
+ RARRAY2ARRAY(a, vec, 6, NUM2DBL);
300
+ alListenerfv(AL_ORIENTATION, vec);
301
+ return Qnil;
302
+ }
303
+
304
+ /// + AL::Listener.gain rw:(v)
305
+ static VALUE AL_Listener_get_gain(VALUE self) {
306
+ ALfloat n = 0.0f;
307
+ alGetListenerf(AL_GAIN, &n);
308
+ return rb_float_new(n);
309
+ }
310
+
311
+ static VALUE AL_Listener_set_gain(VALUE self, VALUE gain) {
312
+ ALfloat n = (float) NUM2DBL(gain);
313
+ alListenerf(AL_GAIN, n);
314
+ return Qnil;
315
+ }
316
+
317
+ /// + AL::Listener.position rw:([x, y, z])
318
+ static VALUE AL_Listener_get_position(VALUE self) {
319
+ ALfloat v[] = {0.0f, 0.0f, 0.0f};
320
+ VALUE ary;
321
+ ary = rb_ary_new();
322
+ alGetListenerfv(AL_POSITION, v);
323
+ ARRAY2RARRAY(v, ary, 3, rb_float_new);
324
+ return ary;
325
+ }
326
+
327
+ static VALUE AL_Listener_set_position(VALUE self, VALUE a) {
328
+ ALfloat vec[3];
329
+ RARRAY2ARRAY(a, vec, 3, NUM2DBL);
330
+ alListenerfv(AL_POSITION, vec);
331
+ return Qnil;
332
+ }
333
+
334
+ /// + AL::Listener.velocity rw:([x, y, z])
335
+ static VALUE AL_Listener_get_velocity(VALUE self) {
336
+ ALfloat v[] = {0.0f, 0.0f, 0.0f};
337
+ VALUE ary;
338
+ ary = rb_ary_new();
339
+ alGetListenerfv(AL_VELOCITY, v);
340
+ ARRAY2RARRAY(v, ary, 3, rb_float_new);
341
+ return ary;
342
+ }
343
+
344
+ static VALUE AL_Listener_set_velocity(VALUE self, VALUE a) {
345
+ ALfloat vec[3];
346
+ RARRAY2ARRAY(a, vec, 3, NUM2DBL);
347
+ alListenerfv(AL_VELOCITY, vec);
348
+ return Qnil;
349
+ }
350
+
351
+ static VALUE AL_Listener_to_s(VALUE self) {
352
+ ALfloat gain;
353
+ ALfloat position[3];
354
+ ALfloat velocity[3];
355
+ ALfloat orientation[6];
356
+ const long slen = 4096;
357
+ char s[slen];
358
+
359
+ alGetListenerf(AL_GAIN, &gain);
360
+ alGetListenerfv(AL_POSITION, position);
361
+ alGetListenerfv(AL_VELOCITY, velocity);
362
+ alGetListenerfv(AL_ORIENTATION, orientation);
363
+
364
+ snprintf(s, slen, "#<AL::Listner{:gain=>%f, :position=>[%f, %f, %f], :orientation=>[%f, %f, %f, %f, %f, %f], :velocity=>[%f, %f, %f]}>",
365
+ gain, position[0], position[1], position[2],
366
+ orientation[0], orientation[1], orientation[2], orientation[3], orientation[4], orientation[5],
367
+ velocity[0], velocity[1], velocity[2]);
368
+
369
+ return rb_str_new2(s);
370
+ }
371
+
372
+
373
+ static void define_AL_Listener_methods() {
374
+ /// + AL::Listener.orientation rw:([fx, fy, fz, ux, uy, uz])
375
+ rb_define_singleton_method(vAL_Listener, "orientation", AL_Listener_get_orientation, 0);
376
+ rb_define_singleton_method(vAL_Listener, "orientation=", AL_Listener_set_orientation, 1);
377
+
378
+ /// + AL::Listener.gain rw:(v)
379
+ rb_define_singleton_method(vAL_Listener, "gain", AL_Listener_get_gain, 0);
380
+ rb_define_singleton_method(vAL_Listener, "gain=", AL_Listener_set_gain, 1);
381
+
382
+ /// + AL::Listener.position rw:([x, y, z])
383
+ rb_define_singleton_method(vAL_Listener, "position", AL_Listener_get_position, 0);
384
+ rb_define_singleton_method(vAL_Listener, "position=", AL_Listener_set_position, 1);
385
+
386
+ /// + AL::Listener.velocity rw:([x, y, z])
387
+ rb_define_singleton_method(vAL_Listener, "velocity", AL_Listener_get_velocity, 0);
388
+ rb_define_singleton_method(vAL_Listener, "velocity=", AL_Listener_set_velocity, 1);
389
+
390
+ /// + AL::Listener.to_s r:String
391
+ rb_define_singleton_method(vAL_Listener, "to_s", AL_Listener_to_s, 0);
392
+ }
393
+
394
+ static void setup_class_AL_Listener() {
395
+ vAL_Listener = rb_define_class_under(vAL, "Listener", rb_cObject);
396
+ define_AL_Listener_methods();
397
+ }
398
+
399
+
400
+ al_sample_data_t* AL_SampleData_new() {
401
+ al_sample_data_t* p = NULL;
402
+ p = (al_sample_data_t*)malloc(sizeof(al_sample_data_t));
403
+ memset((void*)p, 0, sizeof(al_sample_data_t));
404
+ return p;
405
+ }
406
+
407
+ void AL_SampleData_free(al_sample_data_t* p) {
408
+ if ( p != NULL ) {
409
+ if ( p->buf != NULL) {
410
+ free((void*)p->buf);
411
+ }
412
+ free((void*)p);
413
+ }
414
+ }
415
+
416
+ /// - AL::SampleData#to_s
417
+ static VALUE AL_SampleData_to_s(VALUE self) {
418
+ al_sample_data_t* p = NULL;
419
+ const long slen = 4096;
420
+ char s[slen];
421
+ Data_Get_Struct(self, al_sample_data_t, p);
422
+ snprintf(s, slen, "#<AL::SampleData {buf@%p, :bufsize=>%d, :freq=>%d, :fmt=>%d}@%p>",
423
+ (p->buf), (p->bufsize), (p->freq), (p->fmt), p);
424
+ return rb_str_new2(s);
425
+ }
426
+
427
+ /// - AL::SampleData#buffer_size
428
+ static VALUE AL_SampleData_get_buffer_size(VALUE self) {
429
+ al_sample_data_t* p = NULL;
430
+ Data_Get_Struct(self, al_sample_data_t, p);
431
+ return LONG2FIX(p->bufsize);
432
+ }
433
+
434
+ /// - AL::SampleData#format
435
+ static VALUE AL_SampleData_get_format(VALUE self) {
436
+ al_sample_data_t* p = NULL;
437
+ Data_Get_Struct(self, al_sample_data_t, p);
438
+ return INT2FIX(p->fmt);
439
+ }
440
+
441
+ /// - AL::SampleData#frequency
442
+ static VALUE AL_SampleData_get_frequency(VALUE self) {
443
+ al_sample_data_t* p = NULL;
444
+ Data_Get_Struct(self, al_sample_data_t, p);
445
+ return LONG2FIX(p->freq);
446
+ }
447
+
448
+ /// + helloWorld (alutLoadMemoryHelloWorld)
449
+ /*
450
+ static VALUE AL_SampleData_helloWorld(VALUE klass) {
451
+ VALUE self;
452
+ al_sample_data_t* p = AL_SampleData_new();
453
+ p->buf = alutLoadMemoryHelloWorld(&(p->fmt), &(p->bufsize), &(p->freq));
454
+ if ( NULL == (p->buf) ) {
455
+ AL_SampleData_free(p);
456
+ return Qnil;
457
+ } else {
458
+ self = Data_Wrap_Struct(vAL_SampleData, 0, AL_SampleData_free, p);
459
+ return self;
460
+ }
461
+ }
462
+ */
463
+
464
+ /// + load_from_file(filename) (alutLoadMemoryFromFile)
465
+ static VALUE AL_SampleData_load_from_file(VALUE klass, VALUE vFilename) {
466
+ VALUE self;
467
+ char* filename;
468
+ al_sample_data_t* p;
469
+ Check_Type(vFilename, T_STRING);
470
+ filename = RSTRING_PTR(vFilename);
471
+ p = AL_SampleData_new();
472
+ p->buf = alutLoadMemoryFromFile(filename, &(p->fmt), &(p->bufsize), (ALfloat*)&(p->freq));
473
+ if ( NULL == (p->buf) ) {
474
+ AL_SampleData_free(p);
475
+ return Qnil;
476
+ } else {
477
+ self = Data_Wrap_Struct(vAL_SampleData, 0, AL_SampleData_free, p);
478
+ return self;
479
+ }
480
+ }
481
+
482
+ /// + load_from_string(io) (alutLoadMemoryFromFileImage)
483
+ static VALUE AL_SampleData_load_from_string(VALUE klass, VALUE s) {
484
+ VALUE self;
485
+ al_sample_data_t* p;
486
+ Check_Type(s, T_STRING);
487
+ p = AL_SampleData_new();
488
+ p->buf = alutLoadMemoryFromFileImage(
489
+ RSTRING_PTR(s), RSTRING_LEN(s),
490
+ &(p->fmt), &(p->bufsize), (ALfloat*)&(p->freq));
491
+ if ( NULL == (p->buf) ) {
492
+ AL_SampleData_free(p);
493
+ return Qnil;
494
+ } else {
495
+ self = Data_Wrap_Struct(vAL_SampleData, 0, AL_SampleData_free, p);
496
+ return self;
497
+ }
498
+ }
499
+
500
+ static void define_AL_SampleData_methods() {
501
+ /// C-Level SampleData.new
502
+ /// - AL::SampleData#buffer_size
503
+ rb_define_method(vAL_SampleData, "buffer_size", &AL_SampleData_get_buffer_size, 0);
504
+ /// - AL::SampleData#format
505
+ rb_define_method(vAL_SampleData, "format", &AL_SampleData_get_format, 0);
506
+ /// - AL::SampleData#frequency
507
+ rb_define_method(vAL_SampleData, "frequency", &AL_SampleData_get_frequency, 0);
508
+ /// - AL::SampleData#to_s
509
+ rb_define_method(vAL_SampleData, "to_s", &AL_SampleData_to_s, 0);
510
+ /// + load_from_file(filename) (alutLoadMemoryFromFile)
511
+ rb_define_singleton_method(vAL_SampleData, "load_from_file", &AL_SampleData_load_from_file, 1);
512
+ /// + load_from_string(io) (alutLoadMemoryFromFileImage)
513
+ rb_define_singleton_method(vAL_SampleData, "load_from_string", &AL_SampleData_load_from_string, 1);
514
+ }
515
+
516
+ static void setup_class_AL_SampleData() {
517
+ vAL_SampleData = rb_define_class_under(vAL, "SampleData", rb_cObject);
518
+ define_AL_SampleData_methods();
519
+ }
520
+
521
+ /// - AL::Buffer#free
522
+ void AL_Buffer_free(ALuint* p) {
523
+ if ( NULL != p ) {
524
+ if ( alIsBuffer(*p) ) {
525
+ alDeleteBuffers(1, p);
526
+ }
527
+ free((void*)p);
528
+ }
529
+ }
530
+
531
+ VALUE AL_Buffer_from_albuf(const ALuint b) {
532
+ ALsizei* p = NULL;
533
+ p = malloc(sizeof(ALsizei));
534
+ *p = b;
535
+ return Data_Wrap_Struct(vAL_Buffer, 0, AL_Buffer_free, p);
536
+ }
537
+
538
+ /// + AL::Buffer#new
539
+ static VALUE AL_Buffer_new(VALUE klass) {
540
+ ALuint b;
541
+ alGenBuffers(1, (ALuint*)&b);
542
+ return AL_Buffer_from_albuf(b);
543
+ }
544
+
545
+ /// - AL::Buffer#initialize
546
+ static VALUE AL_Buffer_initialize(VALUE self) {
547
+ return self;
548
+ }
549
+
550
+ /// - r: AL::Buffer#frequency : ALint
551
+ static VALUE AL_Buffer_get_frequency(VALUE self) {
552
+ ALuint* p;
553
+ ALint v;
554
+ Data_Get_Struct(self, ALuint, p);
555
+ alGetBufferi(*p, AL_FREQUENCY, &v);
556
+ return INT2FIX(v);
557
+ }
558
+
559
+ /// - r: AL::Buffer#size : ALint
560
+ static VALUE AL_Buffer_get_size(VALUE self) {
561
+ ALuint* p;
562
+ ALint v;
563
+ Data_Get_Struct(self, ALuint, p);
564
+ alGetBufferi(*p, AL_SIZE, &v);
565
+ return INT2FIX(v);
566
+ }
567
+
568
+ /// - r: AL::Buffer#bits : ALint
569
+ static VALUE AL_Buffer_get_bits(VALUE self) {
570
+ ALuint* p;
571
+ ALint v;
572
+ Data_Get_Struct(self, ALuint, p);
573
+ alGetBufferi(*p, AL_BITS, &v);
574
+ return INT2FIX(v);
575
+ }
576
+
577
+ /// - r: AL::Buffer#channels : ALint
578
+ static VALUE AL_Buffer_get_channels(VALUE self) {
579
+ ALuint* p;
580
+ ALint v;
581
+ Data_Get_Struct(self, ALuint, p);
582
+ alGetBufferi(*p, AL_CHANNELS, &v);
583
+ return INT2FIX(v);
584
+ }
585
+
586
+ /// + AL::Buffer#load_hello_world # alutCreateBufferHelloWorld
587
+ static VALUE AL_Buffer_load_hello_world(VALUE klass) {
588
+ ALuint b = alutCreateBufferHelloWorld();
589
+ return AL_Buffer_from_albuf(b);
590
+ }
591
+
592
+ /// - AL::Buffer#attach(sample_data)
593
+ static VALUE AL_Buffer_attach(VALUE self, VALUE vSampleData) {
594
+ ALuint* pBuf;
595
+ al_sample_data_t* pSampleData;
596
+ if ( CLASS_OF(vSampleData) != vAL_SampleData )
597
+ return Qfalse;
598
+ Data_Get_Struct(self, ALuint, pBuf);
599
+ Data_Get_Struct(vSampleData, al_sample_data_t, pSampleData);
600
+ ///FIXME: it doesn't works.
601
+ /*
602
+ alBufferData(*pBuf,
603
+ pSampleData->fmt, pSampleData->buf,
604
+ pSampleData->bufsize, pSampleData->freq);
605
+ */
606
+ return Qtrue;
607
+ }
608
+
609
+ /// + AL::Buffer#load_waveform(enWave : ALenum, freq : ALfloat, phase : ALfloat, duration : ALfloat)
610
+ static VALUE AL_Buffer_load_waveform(VALUE self,
611
+ VALUE vEnWave, VALUE vFltFreq, VALUE vFltPhase, VALUE vFltDuration) {
612
+ ALenum wave = NUM2INT(vEnWave);
613
+ ALfloat freq = (float) NUM2DBL(vFltFreq);
614
+ ALfloat phase = (float) NUM2DBL(vFltPhase);
615
+ ALfloat duration = (float) NUM2DBL(vFltDuration);
616
+ ALuint b = alutCreateBufferWaveform(wave, freq, phase, duration);
617
+ if ( AL_NONE == b ) return Qnil;
618
+ return AL_Buffer_from_albuf(b);
619
+ }
620
+
621
+ /// + AL::Buffer#load_from_sample_data(sample_data)
622
+ static VALUE AL_Buffer_load_from_sample_data(VALUE klass, VALUE vSampleData) {
623
+ VALUE self;
624
+ self = AL_Buffer_new(klass);
625
+ AL_Buffer_attach(self, vSampleData);
626
+ return self;
627
+ }
628
+
629
+ /// + AL::Buffer#load_from_file(filename) # alutCreateBufferFromFile
630
+ static VALUE AL_Buffer_load_from_file(VALUE klass, VALUE vFilename) {
631
+ char* filename;
632
+ ALuint b;
633
+ Check_Type(vFilename, T_STRING);
634
+ filename = RSTRING_PTR(vFilename);
635
+ b = alutCreateBufferFromFile(filename);
636
+ if ( AL_NONE == b ) return Qnil;
637
+ else return AL_Buffer_from_albuf(b);
638
+ }
639
+
640
+ /// + AL::Buffer#load_from_string(s) # alutCreateBufferFromFileImage
641
+ static VALUE AL_Buffer_load_from_string(VALUE klass, VALUE vStr) {
642
+ char* s;
643
+ long slen;
644
+ ALuint b;
645
+ Check_Type(vStr, T_STRING);
646
+ s = RSTRING_PTR(vStr);
647
+ slen = RSTRING_LEN(vStr);
648
+ b = alutCreateBufferFromFileImage(s, slen);
649
+ if ( AL_NONE == b ) return Qnil;
650
+ else return AL_Buffer_from_albuf(b);
651
+ }
652
+
653
+ /// - AL::Buffer#to_s
654
+ static VALUE AL_Buffer_to_s(VALUE self) {
655
+ ALuint* p = NULL;
656
+ const long slen = 4096;
657
+ char s[slen];
658
+ ALint freq, size, bits, channels;
659
+ Data_Get_Struct(self, ALuint, p);
660
+ alGetBufferi(*p, AL_FREQUENCY, &freq);
661
+ alGetBufferi(*p, AL_SIZE, &size);
662
+ alGetBufferi(*p, AL_BITS, &bits);
663
+ alGetBufferi(*p, AL_CHANNELS, &channels);
664
+ snprintf(s, slen, "#<AL::Buffer {:freq=>%d, :size=>%d, :bits=>%d, :channels=>%d}@%p>",
665
+ freq, size, bits, channels, p);
666
+ return rb_str_new2(s);
667
+ }
668
+
669
+
670
+ static void define_AL_Buffer_methods() {
671
+ /// + AL::Buffer#new
672
+ rb_define_singleton_method(vAL_Buffer, "new", &AL_Buffer_new, 0);
673
+
674
+ /// - AL::Buffer#initialize
675
+ rb_define_method(vAL_Buffer, "initialize", &AL_Buffer_initialize, 0);
676
+
677
+ /// + AL::Buffer#load_hello_world # alutCreateBufferHelloWorld
678
+ rb_define_singleton_method(vAL_Buffer, "load_hello_world", &AL_Buffer_load_hello_world, 0);
679
+
680
+ /// - r: AL::Buffer#frequency : ALint
681
+ rb_define_method(vAL_Buffer, "frequency", &AL_Buffer_get_frequency, 0);
682
+
683
+ /// - r: AL::Buffer#size : ALint
684
+ rb_define_method(vAL_Buffer, "size", &AL_Buffer_get_size, 0);
685
+
686
+ /// - r: AL::Buffer#bits : ALint
687
+ rb_define_method(vAL_Buffer, "bits", &AL_Buffer_get_bits, 0);
688
+
689
+ /// - r: AL::Buffer#channels : ALint
690
+ rb_define_method(vAL_Buffer, "channels", &AL_Buffer_get_channels, 0);
691
+
692
+ /// - AL::Buffer#attach(sample_data)
693
+ rb_define_method(vAL_Buffer, "attach", &AL_Buffer_attach, 1);
694
+
695
+ /// + AL::Buffer#load_waveform(enWave : ALenum, freq : ALfloat, phase : ALfloat, duration : ALfloat)
696
+ rb_define_singleton_method(vAL_Buffer, "load_waveform", &AL_Buffer_load_waveform, 4);
697
+
698
+ /// + AL::Buffer#load_from_sample_data(sample_data)
699
+ rb_define_singleton_method(vAL_Buffer, "load_from_sample_data", &AL_Buffer_load_from_sample_data, 1);
700
+
701
+ /// + AL::Buffer#load_from_file(filename) # alutCreateBufferFromFile
702
+ rb_define_singleton_method(vAL_Buffer, "load_from_file", &AL_Buffer_load_from_file, 1);
703
+
704
+ /// + AL::Buffer#load_from_string(s) # alutCreateBufferFromFileImage
705
+ rb_define_singleton_method(vAL_Buffer, "load_from_string", &AL_Buffer_load_from_string, 1);
706
+
707
+ /// - AL::Buffer#to_s
708
+ rb_define_method(vAL_Buffer, "to_s", &AL_Buffer_to_s, 0);
709
+
710
+ }
711
+
712
+ static void setup_class_AL_Buffer() {
713
+ vAL_Buffer = rb_define_class_under(vAL, "Buffer", rb_cObject);
714
+ define_AL_Buffer_methods();
715
+ }
716
+
717
+
718
+ /// - AL::Source#free
719
+ void AL_Source_free(ALuint* p) {
720
+ if ( NULL != p ) {
721
+ if ( alIsSource(*p) ) {
722
+ alDeleteSources(1, p);
723
+ }
724
+ free((void*)p);
725
+ }
726
+ }
727
+
728
+ VALUE AL_Source_from_alsrc(const ALuint b) {
729
+ ALsizei* p = NULL;
730
+ p = malloc(sizeof(ALsizei));
731
+ *p = b;
732
+ return Data_Wrap_Struct(vAL_Source, 0, AL_Source_free, p);
733
+ }
734
+
735
+ /// + AL::Source#new
736
+ static VALUE AL_Source_new(VALUE klass) {
737
+ ALuint b;
738
+ alGenSources(1, (ALuint*)&b);
739
+ return AL_Source_from_alsrc(b);
740
+ }
741
+
742
+ /// - AL::Source#initialize
743
+ static VALUE AL_Source_initialize(VALUE self) {
744
+ return self;
745
+ }
746
+
747
+ /// - AL::Source#play
748
+ static VALUE AL_Source_play(VALUE self) {
749
+ ALuint* p = NULL;
750
+ Data_Get_Struct(self, ALuint, p);
751
+ alSourcePlay(*p);
752
+ return Qnil;
753
+ }
754
+
755
+ /// - AL::Source#stop
756
+ static VALUE AL_Source_stop(VALUE self) {
757
+ ALuint* p = NULL;
758
+ Data_Get_Struct(self, ALuint, p);
759
+ alSourceStop(*p);
760
+ return Qnil;
761
+ }
762
+
763
+ /// - AL::Source#pause
764
+ static VALUE AL_Source_pause(VALUE self) {
765
+ ALuint* p = NULL;
766
+ Data_Get_Struct(self, ALuint, p);
767
+ alSourcePause(*p);
768
+ return Qnil;
769
+ }
770
+
771
+ /// - AL::Source#rewind
772
+ static VALUE AL_Source_rewind(VALUE self) {
773
+ ALuint* p = NULL;
774
+ Data_Get_Struct(self, ALuint, p);
775
+ alSourceRewind(*p);
776
+ return Qnil;
777
+ }
778
+
779
+ /// - AL::Source#attach(buf) # AL_BUFFER
780
+ static VALUE AL_Source_attach(VALUE self, VALUE vBuf) {
781
+ ALuint* pSrc = NULL;
782
+ ALuint* pBuf = NULL;
783
+ Data_Get_Struct(self, ALuint, pSrc);
784
+ if ( CLASS_OF(vBuf) != vAL_Buffer )
785
+ return Qfalse;
786
+ Data_Get_Struct(self, ALuint, pBuf);
787
+ alSourcei(*pSrc, AL_BUFFER, *pBuf);
788
+ return Qtrue;
789
+ }
790
+
791
+ /// - AL::Source#queue([bufs])
792
+ static VALUE AL_Source_queue(VALUE self, VALUE vBufs) {
793
+ long len = RARRAY_LEN(vBufs);
794
+ ALuint* bufs;
795
+ ALuint* pSrc;
796
+ ALuint* pTmp;
797
+ long n;
798
+ VALUE vBuf;
799
+ Data_Get_Struct(self, ALuint, pSrc);
800
+ bufs = (ALuint*) malloc(sizeof(ALuint)*len);
801
+ for ( n = 0 ; n < len ; n ++ ) {
802
+ vBuf = rb_ary_entry(vBufs, n);
803
+ Data_Get_Struct(vBuf, ALuint, pTmp);
804
+ bufs[n] = *pTmp;
805
+ }
806
+ alSourceQueueBuffers(*pSrc, len, bufs);
807
+ free((void*)bufs);
808
+ return Qnil;
809
+ }
810
+
811
+ /// - AL::Source#unqueue([bufs])
812
+ static VALUE AL_Source_unqueue(VALUE self, VALUE vBufs) {
813
+ long len = RARRAY_LEN(vBufs);
814
+ ALuint* bufs;
815
+ ALuint* pSrc;
816
+ ALuint* pTmp;
817
+ long n;
818
+ VALUE vBuf;
819
+ Data_Get_Struct(self, ALuint, pSrc);
820
+ bufs = (ALuint*) malloc(sizeof(ALuint)*len);
821
+ for ( n = 0 ; n < len ; n ++ ) {
822
+ vBuf = rb_ary_entry(vBufs, n);
823
+ Data_Get_Struct(vBuf, ALuint, pTmp);
824
+ bufs[n] = *pTmp;
825
+ }
826
+ alSourceUnqueueBuffers(*pSrc, len, bufs);
827
+ free((void*)bufs);
828
+ return Qnil;
829
+ }
830
+
831
+ /// - r: AL::Source#buffers_processed :i
832
+ static VALUE AL_Source_buffers_processed(VALUE self) {
833
+ // AL_BUFFERS_PROCESSED
834
+ ALint i;
835
+ ALuint* p = NULL;
836
+ Data_Get_Struct(self, ALuint, p);
837
+ alGetSourcei(*p, AL_BUFFERS_PROCESSED, &i);
838
+ return INT2FIX(i);
839
+ }
840
+
841
+
842
+ /// - AL::Source#source_type : enum
843
+ static VALUE AL_Source_get_source_type(VALUE self) {
844
+ ALint i;
845
+ ALuint* p = NULL;
846
+ Data_Get_Struct(self, ALuint, p);
847
+ alGetSourcei(*p, AL_SOURCE_TYPE, &i);
848
+ switch (i) {
849
+ case AL_UNDETERMINED:
850
+ return vAL_UNDETERMINED;
851
+ case AL_STATIC:
852
+ return vAL_STATIC;
853
+ case AL_STREAMING:
854
+ return vAL_STREAMING;
855
+ default:
856
+ return INT2FIX(i);
857
+ }
858
+ }
859
+
860
+ /// - AL::Source#source_type=(enum)
861
+ static VALUE AL_Source_set_source_type(VALUE self, VALUE vSrcType) {
862
+ ALuint e;
863
+ ALuint* p = NULL;
864
+ Data_Get_Struct(self, ALuint, p);
865
+ e = NUM2INT(vSrcType);
866
+ alSourcei(*p, AL_SOURCE_TYPE, e);
867
+ return Qnil;
868
+ }
869
+
870
+ /// - AL::Source#looping : bool # AL_LOOPING
871
+ static VALUE AL_Source_get_looping(VALUE self) {
872
+ ALint e;
873
+ ALuint* p = NULL;
874
+ Data_Get_Struct(self, ALuint, p);
875
+ alGetSourcei(*p, AL_LOOPING, &e);
876
+ return albool2rbbool(e);
877
+ }
878
+
879
+ /// - AL::Source#looping=(bool) # AL_LOOPING
880
+ static VALUE AL_Source_set_looping(VALUE self, VALUE vOnOff) {
881
+ ALint onoff = NUM2INT(vOnOff);
882
+ ALuint* p = NULL;
883
+ Data_Get_Struct(self, ALuint, p);
884
+ switch (onoff) {
885
+ case AL_TRUE:
886
+ case AL_FALSE:
887
+ alSourcei(*p, AL_LOOPING, onoff);
888
+ return vOnOff;
889
+ default:
890
+ return Qnil;
891
+ }
892
+ }
893
+
894
+ /// - AL::Source#playing? : bool # AL_SOURCE_STATE [AL_STOPPPED, AL_PLAYING]
895
+ static VALUE AL_Source_get_source_state(VALUE self) {
896
+ ALint e;
897
+ ALuint* p = NULL;
898
+ Data_Get_Struct(self, ALuint, p);
899
+ alGetSourcei(*p, AL_SOURCE_STATE, &e);
900
+ switch (e) {
901
+ case AL_PLAYING:
902
+ return Qtrue;
903
+ case AL_STOPPED:
904
+ return Qfalse;
905
+ default:
906
+ return Qnil;
907
+ }
908
+ }
909
+
910
+ /// - AL::Source#playing=(bool) # AL_SOURCE_STATE [AL_STOPPPED, AL_PLAYING]
911
+ static VALUE AL_Source_set_source_state(VALUE self, VALUE vState) {
912
+ ALuint* p = NULL;
913
+ Data_Get_Struct(self, ALuint, p);
914
+ if (Qtrue == vState) alSourcei(*p, AL_SOURCE_STATE, AL_PLAYING);
915
+ if (Qfalse == vState) alSourcei(*p, AL_SOURCE_STATE, AL_STOPPED);
916
+ return vState;
917
+ }
918
+
919
+ /// - AL::Source#buffers_queued : n # AL_BUFFERS_QUEUED
920
+ static VALUE AL_Source_get_buffers_queued(VALUE self) {
921
+ ALint n;
922
+ ALuint* p = NULL;
923
+ Data_Get_Struct(self, ALuint, p);
924
+ alGetSourcei(*p, AL_BUFFERS_QUEUED, &n);
925
+ return NUM2INT(n);
926
+ }
927
+
928
+ /// - AL::Source#buffers_queued=(n) # AL_BUFFERS_QUEUED
929
+ static VALUE AL_Source_set_buffers_queued(VALUE self, VALUE vN) {
930
+ ALint n = NUM2INT(vN);
931
+ ALuint* p = NULL;
932
+ Data_Get_Struct(self, ALuint, p);
933
+ alSourcei(*p, AL_BUFFERS_QUEUED, n);
934
+ return Qnil;
935
+ }
936
+
937
+ /// - AL::Source#sec_offset : nsec # AL_SEC_OFFSET
938
+ static VALUE AL_Source_get_sec_offset(VALUE self) {
939
+ ALint n;
940
+ ALuint* p = NULL;
941
+ Data_Get_Struct(self, ALuint, p);
942
+ alGetSourcei(*p, AL_SEC_OFFSET, &n);
943
+ return INT2FIX(n);
944
+ }
945
+
946
+ /// - AL::Source#sec_offse=(nsec) # AL_SEC_OFFSET
947
+ static VALUE AL_Source_set_sec_offset(VALUE self, VALUE vSec) {
948
+ ALuint* p = NULL;
949
+ Data_Get_Struct(self, ALuint, p);
950
+ alSourcei(*p, AL_SEC_OFFSET, NUM2INT(vSec));
951
+ return Qnil;
952
+ }
953
+
954
+ /// - AL::Source#sample_offset : nsamples # AL_SAMPLE_OFFSET
955
+ static VALUE AL_Source_get_sample_offset(VALUE self) {
956
+ ALint n;
957
+ ALuint* p = NULL;
958
+ Data_Get_Struct(self, ALuint, p);
959
+ alGetSourcei(*p, AL_SAMPLE_OFFSET, &n);
960
+ return NUM2INT(n);
961
+ }
962
+
963
+ /// - AL::Source#sample_offset=(nsamples) # AL_SAMPLE_OFFSET
964
+ static VALUE AL_Source_set_sample_offset(VALUE self, VALUE vN) {
965
+ ALint n = NUM2INT(vN);
966
+ ALuint* p = NULL;
967
+ Data_Get_Struct(self, ALuint, p);
968
+ alSourcei(*p, AL_SAMPLE_OFFSET, n);
969
+ return Qnil;
970
+ }
971
+
972
+ /// - AL::Source#byte_offset : nbytes # AL_BYTE_OFFSET
973
+ static VALUE AL_Source_get_byte_offset(VALUE self) {
974
+ ALint n;
975
+ ALuint* p = NULL;
976
+ Data_Get_Struct(self, ALuint, p);
977
+ alGetSourcei(*p, AL_BYTE_OFFSET, &n);
978
+ return NUM2INT(n);
979
+ }
980
+
981
+ /// - AL::Source#byte_offset=(nbytes) # AL_BYTE_OFFSET
982
+ static VALUE AL_Source_set_byte_offset(VALUE self, VALUE vN) {
983
+ ALint n = NUM2INT(vN);
984
+ ALuint* p = NULL;
985
+ Data_Get_Struct(self, ALuint, p);
986
+ alSourcei(*p, AL_BYTE_OFFSET, n);
987
+ return Qnil;
988
+ }
989
+
990
+ /// - AL::Source#source_relative?
991
+ static VALUE AL_Source_is_source_relative(VALUE self) {
992
+ ALint n;
993
+ ALuint* p = NULL;
994
+ Data_Get_Struct(self, ALuint, p);
995
+ alGetSourcei(*p, AL_SOURCE_RELATIVE, &n);
996
+ return albool2rbbool(n);
997
+ }
998
+
999
+ /// - AL::Source#source_relative=(b)
1000
+ static VALUE AL_Source_set_source_relative(VALUE self, VALUE vBool) {
1001
+ ALuint* p = NULL;
1002
+ Data_Get_Struct(self, ALuint, p);
1003
+ if (vBool == Qtrue) alSourcei(*p, AL_SOURCE_RELATIVE, AL_TRUE);
1004
+ if (vBool == Qfalse) alSourcei(*p, AL_SOURCE_RELATIVE, AL_FALSE);
1005
+ return vBool;
1006
+ }
1007
+
1008
+ /// - AL::Source#pitch : f # AL_PITCH > 0
1009
+ static VALUE AL_Source_get_pitch(VALUE self) {
1010
+ ALfloat n;
1011
+ ALuint* p = NULL;
1012
+ Data_Get_Struct(self, ALuint, p);
1013
+ alGetSourcef(*p, AL_PITCH, &n);
1014
+ return rb_float_new(n);
1015
+ }
1016
+
1017
+ /// - AL::Source#pitch=(f) # AL_PITCH > 0
1018
+ static VALUE AL_Source_set_pitch(VALUE self, VALUE v) {
1019
+ ALuint* p = NULL;
1020
+ ALfloat n = (float) NUM2DBL(v);
1021
+ Data_Get_Struct(self, ALuint, p);
1022
+ alSourcef(*p, AL_PITCH, n);
1023
+ return v;
1024
+ }
1025
+
1026
+ /// - AL::Source#gain : f
1027
+ static VALUE AL_Source_get_gain(VALUE self) {
1028
+ ALfloat n;
1029
+ ALuint* p = NULL;
1030
+ Data_Get_Struct(self, ALuint, p);
1031
+ alGetSourcef(*p, AL_GAIN, &n);
1032
+ return rb_float_new(n);
1033
+ }
1034
+
1035
+ /// - AL::Source#gain=(f) #
1036
+ static VALUE AL_Source_set_gain(VALUE self, VALUE v) {
1037
+ ALuint* p = NULL;
1038
+ ALfloat n = (float) NUM2DBL(v);
1039
+ Data_Get_Struct(self, ALuint, p);
1040
+ alSourcef(*p, AL_GAIN, n);
1041
+ return v;
1042
+ }
1043
+
1044
+ /// - AL::Source#max_distance : f
1045
+ static VALUE AL_Source_get_max_distance(VALUE self) {
1046
+ ALfloat n;
1047
+ ALuint* p = NULL;
1048
+ Data_Get_Struct(self, ALuint, p);
1049
+ alGetSourcef(*p, AL_MAX_DISTANCE, &n);
1050
+ return rb_float_new(n);
1051
+ }
1052
+
1053
+ /// - AL::Source#max_distance=(f) #
1054
+ static VALUE AL_Source_set_max_distance(VALUE self, VALUE v) {
1055
+ ALuint* p = NULL;
1056
+ ALfloat n = (float) NUM2DBL(v);
1057
+ Data_Get_Struct(self, ALuint, p);
1058
+ alSourcef(*p, AL_MAX_DISTANCE, n);
1059
+ return v;
1060
+ }
1061
+
1062
+ /// - AL::Source#rolloff_factor : f
1063
+ static VALUE AL_Source_get_rolloff_factor(VALUE self) {
1064
+ ALfloat n;
1065
+ ALuint* p = NULL;
1066
+ Data_Get_Struct(self, ALuint, p);
1067
+ alGetSourcef(*p, AL_ROLLOFF_FACTOR, &n);
1068
+ return rb_float_new(n);
1069
+ }
1070
+
1071
+ /// - AL::Source#rolloff_factor=(f) #
1072
+ static VALUE AL_Source_set_rolloff_factor(VALUE self, VALUE v) {
1073
+ ALuint* p = NULL;
1074
+ ALfloat n = (float) NUM2DBL(v);
1075
+ Data_Get_Struct(self, ALuint, p);
1076
+ alSourcef(*p, AL_ROLLOFF_FACTOR, n);
1077
+ return v;
1078
+ }
1079
+
1080
+ /// - AL::Source#reference_distance : f
1081
+ static VALUE AL_Source_get_reference_distance(VALUE self) {
1082
+ ALfloat n;
1083
+ ALuint* p = NULL;
1084
+ Data_Get_Struct(self, ALuint, p);
1085
+ alGetSourcef(*p, AL_REFERENCE_DISTANCE, &n);
1086
+ return rb_float_new(n);
1087
+ }
1088
+
1089
+ /// - AL::Source#reference_distance=(f) #
1090
+ static VALUE AL_Source_set_reference_distance(VALUE self, VALUE v) {
1091
+ ALuint* p = NULL;
1092
+ ALfloat n = (float) NUM2DBL(v);
1093
+ Data_Get_Struct(self, ALuint, p);
1094
+ alSourcef(*p, AL_REFERENCE_DISTANCE, n);
1095
+ return v;
1096
+ }
1097
+
1098
+ /// - AL::Source#min_gain : f
1099
+ static VALUE AL_Source_get_min_gain(VALUE self) {
1100
+ ALfloat n;
1101
+ ALuint* p = NULL;
1102
+ Data_Get_Struct(self, ALuint, p);
1103
+ alGetSourcef(*p, AL_MIN_GAIN, &n);
1104
+ return rb_float_new(n);
1105
+ }
1106
+
1107
+ /// - AL::Source#min_gain=(f) #
1108
+ static VALUE AL_Source_set_min_gain(VALUE self, VALUE v) {
1109
+ ALuint* p = NULL;
1110
+ ALfloat n = (float) NUM2DBL(v);
1111
+ Data_Get_Struct(self, ALuint, p);
1112
+ alSourcef(*p, AL_MIN_GAIN, n);
1113
+ return v;
1114
+ }
1115
+
1116
+ /// - AL::Source#max_gain : f
1117
+ static VALUE AL_Source_get_max_gain(VALUE self) {
1118
+ ALfloat n;
1119
+ ALuint* p = NULL;
1120
+ Data_Get_Struct(self, ALuint, p);
1121
+ alGetSourcef(*p, AL_MAX_GAIN, &n);
1122
+ return rb_float_new(n);
1123
+ }
1124
+
1125
+ /// - AL::Source#max_gain=(f) #
1126
+ static VALUE AL_Source_set_max_gain(VALUE self, VALUE v) {
1127
+ ALuint* p = NULL;
1128
+ ALfloat n = (float) NUM2DBL(v);
1129
+ Data_Get_Struct(self, ALuint, p);
1130
+ alSourcef(*p, AL_MAX_GAIN, n);
1131
+ return v;
1132
+ }
1133
+
1134
+ /// - AL::Source#cone_outer_gain : f
1135
+ static VALUE AL_Source_get_cone_outer_gain(VALUE self) {
1136
+ ALfloat n;
1137
+ ALuint* p = NULL;
1138
+ Data_Get_Struct(self, ALuint, p);
1139
+ alGetSourcef(*p, AL_CONE_OUTER_GAIN, &n);
1140
+ return rb_float_new(n);
1141
+ }
1142
+
1143
+ /// - AL::Source#cone_outer_gain=(f) #
1144
+ static VALUE AL_Source_set_cone_outer_gain(VALUE self, VALUE v) {
1145
+ ALuint* p = NULL;
1146
+ ALfloat n = (float) NUM2DBL(v);
1147
+ Data_Get_Struct(self, ALuint, p);
1148
+ alSourcef(*p, AL_CONE_OUTER_GAIN, n);
1149
+ return v;
1150
+ }
1151
+
1152
+ /// - AL::Source#cone_inner_angle : f
1153
+ static VALUE AL_Source_get_cone_inner_angle(VALUE self) {
1154
+ ALfloat n;
1155
+ ALuint* p = NULL;
1156
+ Data_Get_Struct(self, ALuint, p);
1157
+ alGetSourcef(*p, AL_CONE_INNER_ANGLE, &n);
1158
+ return rb_float_new(n);
1159
+ }
1160
+
1161
+ /// - AL::Source#cone_inner_angle=(f) #
1162
+ static VALUE AL_Source_set_cone_inner_angle(VALUE self, VALUE v) {
1163
+ ALuint* p = NULL;
1164
+ ALfloat n = (float) NUM2DBL(v);
1165
+ Data_Get_Struct(self, ALuint, p);
1166
+ alSourcef(*p, AL_CONE_INNER_ANGLE, n);
1167
+ return v;
1168
+ }
1169
+
1170
+ /// - AL::Source#cone_outer_angle : f
1171
+ static VALUE AL_Source_get_cone_outer_angle(VALUE self) {
1172
+ ALfloat n;
1173
+ ALuint* p = NULL;
1174
+ Data_Get_Struct(self, ALuint, p);
1175
+ alGetSourcef(*p, AL_CONE_OUTER_ANGLE, &n);
1176
+ return rb_float_new(n);
1177
+ }
1178
+
1179
+ /// - AL::Source#cone_outer_angle=(f) #
1180
+ static VALUE AL_Source_set_cone_outer_angle(VALUE self, VALUE v) {
1181
+ ALuint* p = NULL;
1182
+ ALfloat n = (float) NUM2DBL(v);
1183
+ Data_Get_Struct(self, ALuint, p);
1184
+ alSourcef(*p, AL_CONE_OUTER_ANGLE, n);
1185
+ return v;
1186
+ }
1187
+
1188
+ /// - AL::Source#position : [x, y, z]
1189
+ static VALUE AL_Source_get_position(VALUE self) {
1190
+ ALfloat v[] = {0.0f, 0.0f, 0.0f};
1191
+ VALUE ary;
1192
+ ALuint* p;
1193
+ // self
1194
+ Data_Get_Struct(self, ALuint, p);
1195
+ // self->vec
1196
+ ary = rb_ary_new();
1197
+ alGetSourcefv(*p, AL_POSITION, v);
1198
+ ARRAY2RARRAY(v, ary, 3, rb_float_new);
1199
+ return ary;
1200
+ }
1201
+
1202
+ /// - AL::Source#position=([x, y, z])
1203
+ static VALUE AL_Source_set_position(VALUE self, VALUE vPos) {
1204
+ ALfloat vec[3];
1205
+ ALuint* p;
1206
+ Data_Get_Struct(self, ALuint, p);
1207
+ RARRAY2ARRAY(vPos, vec, 3, NUM2DBL);
1208
+ alSourcefv(*p, AL_POSITION, vec);
1209
+ return Qnil;
1210
+ }
1211
+
1212
+ /// - AL::Source#velocity : [x, y, z]
1213
+ static VALUE AL_Source_get_velocity(VALUE self) {
1214
+ ALfloat v[] = {0.0f, 0.0f, 0.0f};
1215
+ VALUE ary;
1216
+ ALuint* p;
1217
+ // self
1218
+ Data_Get_Struct(self, ALuint, p);
1219
+ // self->vec
1220
+ ary = rb_ary_new();
1221
+ alGetSourcefv(*p, AL_VELOCITY, v);
1222
+ ARRAY2RARRAY(v, ary, 3, rb_float_new);
1223
+ return ary;
1224
+ }
1225
+
1226
+ /// - AL::Source#velocity=([x, y, z])
1227
+ static VALUE AL_Source_set_velocity(VALUE self, VALUE vVel) {
1228
+ ALfloat vec[3];
1229
+ ALuint* p;
1230
+ Data_Get_Struct(self, ALuint, p);
1231
+ RARRAY2ARRAY(vVel, vec, 3, NUM2DBL);
1232
+ alSourcefv(*p, AL_VELOCITY, vec);
1233
+ return Qnil;
1234
+ }
1235
+
1236
+ /// - AL::Source#direction : [x, y, z]
1237
+ static VALUE AL_Source_get_direction(VALUE self) {
1238
+ ALfloat v[] = {0.0f, 0.0f, 0.0f};
1239
+ VALUE ary;
1240
+ ALuint* p;
1241
+ // self
1242
+ Data_Get_Struct(self, ALuint, p);
1243
+ // self->vec
1244
+ ary = rb_ary_new();
1245
+ alGetSourcefv(*p, AL_DIRECTION, v);
1246
+ ARRAY2RARRAY(v, ary, 3, rb_float_new);
1247
+ return ary;
1248
+ }
1249
+
1250
+ /// - AL::Source#direction=([x, y, z])
1251
+ static VALUE AL_Source_set_direction(VALUE self, VALUE vDir) {
1252
+ ALfloat vec[3];
1253
+ ALuint* p;
1254
+ Data_Get_Struct(self, ALuint, p);
1255
+ RARRAY2ARRAY(vDir, vec, 3, NUM2DBL);
1256
+ alSourcefv(*p, AL_DIRECTION, vec);
1257
+ return Qnil;
1258
+ }
1259
+
1260
+
1261
+ static void define_AL_Source_methods() {
1262
+ /// + new
1263
+ rb_define_singleton_method(vAL_Source, "new", &AL_Source_new, 0);
1264
+
1265
+ /// - initialize
1266
+ rb_define_method(vAL_Source, "initialize", &AL_Source_initialize, 0);
1267
+
1268
+ ///FIXME: - to_s
1269
+
1270
+ /// - play
1271
+ rb_define_method(vAL_Source, "play", &AL_Source_play, 0);
1272
+
1273
+ /// - stop
1274
+ rb_define_method(vAL_Source, "stop", &AL_Source_stop, 0);
1275
+
1276
+ /// - pause
1277
+ rb_define_method(vAL_Source, "pause", &AL_Source_pause, 0);
1278
+
1279
+ /// - rewind
1280
+ rb_define_method(vAL_Source, "rewind", &AL_Source_rewind, 0);
1281
+
1282
+ /// - attach(buf) # AL_BUFFER
1283
+ rb_define_method(vAL_Source, "attach", &AL_Source_attach, 1);
1284
+
1285
+ /// - queue([bufs])
1286
+ rb_define_method(vAL_Source, "queue", &AL_Source_queue, 1);
1287
+
1288
+ /// - unqueue([bufs])
1289
+ rb_define_method(vAL_Source, "unqueue", &AL_Source_unqueue, 1);
1290
+
1291
+ /// - r: buffers_processed :i # AL_BUFFERS_PROCESSED
1292
+ rb_define_method(vAL_Source, "buffers_processed", &AL_Source_buffers_processed, 0);
1293
+
1294
+ /// - rw: pitch(f) # AL_PITCH > 0
1295
+ rb_define_method(vAL_Source, "pitch", &AL_Source_get_pitch, 0);
1296
+ rb_define_method(vAL_Source, "pitch=", &AL_Source_set_pitch, 1);
1297
+
1298
+ /// - rw: gain(f) # AL_GAIN > 0
1299
+ rb_define_method(vAL_Source, "gain", &AL_Source_get_gain, 0);
1300
+ rb_define_method(vAL_Source, "gain=", &AL_Source_set_gain, 1);
1301
+
1302
+ /// - rw: max_distance(f) # AL_MAX_DISTANCE
1303
+ rb_define_method(vAL_Source, "max_distance", &AL_Source_get_max_distance, 0);
1304
+ rb_define_method(vAL_Source, "max_distance=", &AL_Source_set_max_distance, 1);
1305
+
1306
+ /// - rw: rolloff_factor(f) # AL_ROLLOFF_FACTOR
1307
+ rb_define_method(vAL_Source, "rolloff_factor", &AL_Source_get_rolloff_factor, 0);
1308
+ rb_define_method(vAL_Source, "rolloff_factor=", &AL_Source_set_rolloff_factor, 1);
1309
+
1310
+ /// - rw: reference_distance(f) # AL_REFERENCE_DISTANCE
1311
+ rb_define_method(vAL_Source, "reference_distance", &AL_Source_get_reference_distance, 0);
1312
+ rb_define_method(vAL_Source, "reference_distance=", &AL_Source_set_reference_distance, 1);
1313
+
1314
+ /// - rw: min_gain(f) # AL_MIN_GAIN
1315
+ rb_define_method(vAL_Source, "min_gain", &AL_Source_get_min_gain, 0);
1316
+ rb_define_method(vAL_Source, "min_gain=", &AL_Source_set_min_gain, 1);
1317
+
1318
+ /// - rw: max_gain(f) # AL_MAX_GAIN
1319
+ rb_define_method(vAL_Source, "max_gain", &AL_Source_get_max_gain, 0);
1320
+ rb_define_method(vAL_Source, "max_gain=", &AL_Source_set_max_gain, 1);
1321
+
1322
+ /// - rw: cone_outer_gain(f) # AL_CONE_OUTER_GAIN
1323
+ rb_define_method(vAL_Source, "cone_outer_gain", &AL_Source_get_cone_outer_gain, 0);
1324
+ rb_define_method(vAL_Source, "cone_outer_gain=", &AL_Source_set_cone_outer_gain, 1);
1325
+
1326
+ /// - rw: cone_inner_angle(f) # AL_CONE_INNER_ANGLE
1327
+ rb_define_method(vAL_Source, "cone_inner_angle", &AL_Source_get_cone_inner_angle, 0);
1328
+ rb_define_method(vAL_Source, "cone_inner_angle=", &AL_Source_set_cone_inner_angle, 1);
1329
+
1330
+ /// - rw: cone_outer_angle(f) # AL_CONE_OUTER_ANGLE
1331
+ rb_define_method(vAL_Source, "cone_outer_angle", &AL_Source_get_cone_outer_angle, 0);
1332
+ rb_define_method(vAL_Source, "cone_outer_angle=", &AL_Source_set_cone_outer_angle, 1);
1333
+
1334
+ /// - rw: position([x, y, z]) # AL_POSITION
1335
+ rb_define_method(vAL_Source, "position", &AL_Source_get_position, 0);
1336
+ rb_define_method(vAL_Source, "position=", &AL_Source_set_position, 1);
1337
+
1338
+ /// - rw: velocity([x, y, z]) # AL_VELOCITY
1339
+ rb_define_method(vAL_Source, "velocity", &AL_Source_get_velocity, 0);
1340
+ rb_define_method(vAL_Source, "velocity=", &AL_Source_set_velocity, 1);
1341
+
1342
+ /// - rw: direction([x, y, z]) # AL_DIRECTION
1343
+ rb_define_method(vAL_Source, "direction", &AL_Source_get_direction, 0);
1344
+ rb_define_method(vAL_Source, "direction=", &AL_Source_set_direction, 1);
1345
+
1346
+ /// - rw: source_type(enum) # AL_SOURCE_TYPE [AL_UNDERTERMINED, AL_STATIC, AL_STREAMING]
1347
+ rb_define_method(vAL_Source, "source_type", &AL_Source_get_source_type, 0);
1348
+ rb_define_method(vAL_Source, "source_type=", &AL_Source_set_source_type, 1);
1349
+
1350
+ /// - rw: looping(bool) # AL_LOOPING
1351
+ rb_define_method(vAL_Source, "looping", &AL_Source_get_looping, 0);
1352
+ rb_define_method(vAL_Source, "looping=", &AL_Source_set_looping, 1);
1353
+
1354
+ /// - rw: playing?(enum) # AL_SOURCE_STATE [AL_STOPPPED, AL_PLAYING]
1355
+ rb_define_method(vAL_Source, "playing?", &AL_Source_get_source_state, 0);
1356
+ rb_define_method(vAL_Source, "playing=", &AL_Source_set_source_state, 1);
1357
+
1358
+ /// - rw: buffers_queued(i) # AL_BUFFERS_QUEUED
1359
+ rb_define_method(vAL_Source, "buffers_queued", &AL_Source_get_buffers_queued, 0);
1360
+ rb_define_method(vAL_Source, "buffers_queued=", &AL_Source_set_buffers_queued, 1);
1361
+
1362
+ /// - rw: sec_offset(nsec) # AL_SEC_OFFSET
1363
+ rb_define_method(vAL_Source, "sec_offset", &AL_Source_get_sec_offset, 0);
1364
+ rb_define_method(vAL_Source, "sec_offset=", &AL_Source_set_sec_offset, 1);
1365
+
1366
+ /// - rw: sample_offset(nsamples) # AL_SAMPLE_OFFSET
1367
+ rb_define_method(vAL_Source, "sample_offset", &AL_Source_get_sample_offset, 0);
1368
+ rb_define_method(vAL_Source, "sample_offset=", &AL_Source_set_sample_offset, 1);
1369
+
1370
+ /// - rw: byte_offset(nbytes) # AL_BYTE_OFFSET
1371
+ rb_define_method(vAL_Source, "byte_offset", &AL_Source_get_byte_offset, 0);
1372
+ rb_define_method(vAL_Source, "byte_offset=", &AL_Source_set_byte_offset, 1);
1373
+
1374
+ /// - rw: source_relative(bool) # AL_SOURCE_RELATIVE
1375
+ rb_define_method(vAL_Source, "source_relative?", &AL_Source_is_source_relative, 0);
1376
+ rb_define_method(vAL_Source, "source_relative=", &AL_Source_set_source_relative, 1);
1377
+ }
1378
+
1379
+ static void setup_class_AL_Source() {
1380
+ vAL_Source = rb_define_class_under(vAL, "Source", rb_cObject);
1381
+ define_AL_Source_methods();
1382
+ }
1383
+
1384
+
1385
+ void setup_module_AL() {
1386
+ vAL = rb_define_module("AL");
1387
+ // constants: AL
1388
+ define_AL_error_consts();
1389
+ define_AL_state_consts();
1390
+ define_AL_spec_consts();
1391
+ define_AL_distance_model_consts();
1392
+ define_AL_format_consts();
1393
+ define_AL_source_type_consts();
1394
+ // module functions: AL
1395
+ define_AL_error_funcs();
1396
+ define_AL_exts_funcs();
1397
+ define_AL_state_funcs();
1398
+ // AL::Listener
1399
+ setup_class_AL_Listener();
1400
+ // AL::SampleData
1401
+ setup_class_AL_SampleData();
1402
+ // AL::Buffer
1403
+ setup_class_AL_Buffer();
1404
+ // AL::Source
1405
+ setup_class_AL_Source();
1406
+ }