ruby-openal 0.1

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.
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
+ }