miniaudio 0.1.0
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.
- checksums.yaml +7 -0
- data/ext/miniaudio/extconf.rb +16 -0
- data/ext/miniaudio/miniaudio/extras/stb_vorbis.c +5557 -0
- data/ext/miniaudio/miniaudio/miniaudio.h +64958 -0
- data/ext/miniaudio/rb-miniaudio.c +237 -0
- data/lib/miniaudio.rb +6 -0
- metadata +48 -0
@@ -0,0 +1,237 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
|
3
|
+
#define STB_VORBIS_HEADER_ONLY
|
4
|
+
#include "miniaudio/extras/stb_vorbis.c" // Enables Vorbis decoding.
|
5
|
+
|
6
|
+
#define MINIAUDIO_IMPLEMENTATION
|
7
|
+
#include "miniaudio/miniaudio.h"
|
8
|
+
|
9
|
+
// The stb_vorbis implementation must come after the implementation of miniaudio.
|
10
|
+
#undef STB_VORBIS_HEADER_ONLY
|
11
|
+
#include "miniaudio/extras/stb_vorbis.c"
|
12
|
+
|
13
|
+
#define OPEN_FILE(FORMAT, FRAME_TYPE, CODE) \
|
14
|
+
static VALUE rb_dr ## FORMAT ## _open_file_and_read_pcm_frames_ ## CODE (VALUE mod, VALUE filename) { \
|
15
|
+
if (TYPE(filename) != T_STRING) { \
|
16
|
+
rb_raise(rb_const_get(rb_cObject, rb_intern("ArgumentError")), "Filename must be a string"); \
|
17
|
+
} \
|
18
|
+
\
|
19
|
+
unsigned int num_channels; \
|
20
|
+
unsigned int sample_rate; \
|
21
|
+
uint64_t total_frames; \
|
22
|
+
\
|
23
|
+
FRAME_TYPE * frames = dr ## FORMAT ## _open_file_and_read_pcm_frames_ ## CODE (\
|
24
|
+
StringValuePtr(filename),\
|
25
|
+
&num_channels,\
|
26
|
+
&sample_rate,\
|
27
|
+
&total_frames,\
|
28
|
+
NULL\
|
29
|
+
);\
|
30
|
+
\
|
31
|
+
if (frames == NULL) {\
|
32
|
+
return Qnil;\
|
33
|
+
}\
|
34
|
+
\
|
35
|
+
VALUE ret_str = rb_str_new((char*)frames, sizeof(FRAME_TYPE)*total_frames);\
|
36
|
+
dr ## FORMAT ## _free(frames, NULL);\
|
37
|
+
VALUE ret = rb_ary_new();\
|
38
|
+
rb_ary_push(ret, ret_str);\
|
39
|
+
rb_ary_push(ret, INT2NUM(sample_rate));\
|
40
|
+
rb_ary_push(ret, INT2NUM(num_channels));\
|
41
|
+
return ret;\
|
42
|
+
}
|
43
|
+
|
44
|
+
#define OPEN_MP3_FILE(FRAME_TYPE, CODE) \
|
45
|
+
static VALUE rb_drmp3_open_file_and_read_pcm_frames_ ## CODE (VALUE mod, VALUE filename) { \
|
46
|
+
if (TYPE(filename) != T_STRING) { \
|
47
|
+
rb_raise(rb_const_get(rb_cObject, rb_intern("ArgumentError")), "Filename must be a string"); \
|
48
|
+
} \
|
49
|
+
\
|
50
|
+
uint64_t total_frames; \
|
51
|
+
\
|
52
|
+
drmp3_config config;\
|
53
|
+
FRAME_TYPE * frames = drmp3_open_file_and_read_pcm_frames_ ## CODE (\
|
54
|
+
StringValueCStr(filename),\
|
55
|
+
&config,\
|
56
|
+
&total_frames,\
|
57
|
+
NULL\
|
58
|
+
);\
|
59
|
+
\
|
60
|
+
if (frames == NULL) {\
|
61
|
+
return Qnil;\
|
62
|
+
}\
|
63
|
+
\
|
64
|
+
VALUE ret_str = rb_str_new((char*)frames, sizeof(FRAME_TYPE)*total_frames*config.channels);\
|
65
|
+
drmp3_free(frames, NULL);\
|
66
|
+
VALUE ary = rb_ary_new_from_args(3, ret_str, INT2NUM(config.sampleRate), INT2NUM(config.channels));\
|
67
|
+
return ary;\
|
68
|
+
}
|
69
|
+
|
70
|
+
#define OPEN_MEMORY(FORMAT, FRAME_TYPE, CODE) \
|
71
|
+
static VALUE rb_dr ## FORMAT ## _open_memory_and_read_pcm_frames_ ## CODE (VALUE mod, VALUE str) { \
|
72
|
+
if (TYPE(str) != T_STRING) { \
|
73
|
+
rb_raise(rb_const_get(rb_cObject, rb_intern("ArgumentError")), "Memory storage must be a string"); \
|
74
|
+
} \
|
75
|
+
\
|
76
|
+
unsigned int num_channels; \
|
77
|
+
unsigned int sample_rate; \
|
78
|
+
uint64_t total_frames; \
|
79
|
+
\
|
80
|
+
FRAME_TYPE * frames = dr ## FORMAT ## _open_memory_and_read_pcm_frames_ ## CODE (\
|
81
|
+
StringValuePtr(str),\
|
82
|
+
RSTRING_LEN(str),\
|
83
|
+
&num_channels,\
|
84
|
+
&sample_rate,\
|
85
|
+
&total_frames,\
|
86
|
+
NULL\
|
87
|
+
);\
|
88
|
+
\
|
89
|
+
if (frames == NULL) {\
|
90
|
+
return Qnil;\
|
91
|
+
}\
|
92
|
+
\
|
93
|
+
VALUE ret_str = rb_str_new((char*)frames, sizeof(FRAME_TYPE)*total_frames);\
|
94
|
+
dr ## FORMAT ## _free(frames, NULL);\
|
95
|
+
VALUE ret = rb_ary_new();\
|
96
|
+
rb_ary_push(ret, ret_str);\
|
97
|
+
rb_ary_push(ret, INT2NUM(sample_rate));\
|
98
|
+
rb_ary_push(ret, INT2NUM(num_channels));\
|
99
|
+
return ret;\
|
100
|
+
}
|
101
|
+
|
102
|
+
#define OPEN_MP3_MEMORY(FRAME_TYPE, CODE) \
|
103
|
+
static VALUE rb_drmp3_open_memory_and_read_pcm_frames_ ## CODE (VALUE mod, VALUE str) { \
|
104
|
+
if (TYPE(str) != T_STRING) { \
|
105
|
+
rb_raise(rb_const_get(rb_cObject, rb_intern("ArgumentError")), "Memory must be a string"); \
|
106
|
+
} \
|
107
|
+
\
|
108
|
+
uint64_t total_frames; \
|
109
|
+
\
|
110
|
+
drmp3_config config;\
|
111
|
+
FRAME_TYPE * frames = drmp3_open_memory_and_read_pcm_frames_ ## CODE (\
|
112
|
+
StringValuePtr(str),\
|
113
|
+
RSTRING_LEN(str),\
|
114
|
+
&config,\
|
115
|
+
&total_frames,\
|
116
|
+
NULL\
|
117
|
+
);\
|
118
|
+
\
|
119
|
+
if (frames == NULL) {\
|
120
|
+
return Qnil;\
|
121
|
+
}\
|
122
|
+
\
|
123
|
+
VALUE ret_str = rb_str_new((char*)frames, sizeof(FRAME_TYPE)*total_frames);\
|
124
|
+
drmp3_free(frames, NULL);\
|
125
|
+
VALUE ret = rb_ary_new();\
|
126
|
+
rb_ary_push(ret, ret_str);\
|
127
|
+
rb_ary_push(ret, INT2NUM(config.sampleRate));\
|
128
|
+
rb_ary_push(ret, INT2NUM(config.channels));\
|
129
|
+
return ret;\
|
130
|
+
}
|
131
|
+
|
132
|
+
static VALUE rb_stb_vorbis_decode_filename_s16 (VALUE mod, VALUE filename) {
|
133
|
+
if (TYPE(filename) != T_STRING) {
|
134
|
+
rb_raise(rb_const_get(rb_cObject, rb_intern("ArgumentError")), "Filename must be a string");
|
135
|
+
}
|
136
|
+
|
137
|
+
int num_channels;
|
138
|
+
int sample_rate;
|
139
|
+
int64_t total_frames;
|
140
|
+
|
141
|
+
int16_t *output;
|
142
|
+
|
143
|
+
total_frames = stb_vorbis_decode_filename (
|
144
|
+
StringValueCStr(filename),
|
145
|
+
&num_channels,
|
146
|
+
&sample_rate,
|
147
|
+
&output
|
148
|
+
);
|
149
|
+
|
150
|
+
if (total_frames < 0) {
|
151
|
+
return Qnil;
|
152
|
+
}
|
153
|
+
|
154
|
+
VALUE ret_str = rb_str_new((char*)output, sizeof(int16_t)*total_frames);
|
155
|
+
free(output);
|
156
|
+
VALUE ret = rb_ary_new();
|
157
|
+
rb_ary_push(ret, ret_str);
|
158
|
+
rb_ary_push(ret, INT2NUM(sample_rate));
|
159
|
+
rb_ary_push(ret, INT2NUM(num_channels));
|
160
|
+
return ret;
|
161
|
+
}
|
162
|
+
|
163
|
+
static VALUE rb_stb_vorbis_decode_memory_s16(VALUE mod, VALUE str) {
|
164
|
+
if (TYPE(str) != T_STRING) {
|
165
|
+
rb_raise(rb_const_get(rb_cObject, rb_intern("ArgumentError")), "Memory storage must be a string");
|
166
|
+
}
|
167
|
+
|
168
|
+
int num_channels;
|
169
|
+
int sample_rate;
|
170
|
+
int64_t total_frames;
|
171
|
+
|
172
|
+
int16_t *output;
|
173
|
+
|
174
|
+
total_frames = stb_vorbis_decode_memory(
|
175
|
+
(uint8*)StringValuePtr(str),
|
176
|
+
RSTRING_LEN(str),
|
177
|
+
&num_channels,
|
178
|
+
&sample_rate,
|
179
|
+
&output
|
180
|
+
);
|
181
|
+
|
182
|
+
if (total_frames < 0) {
|
183
|
+
return Qnil;
|
184
|
+
}
|
185
|
+
|
186
|
+
VALUE ret_str = rb_str_new((char*)output, sizeof(int16_t)*total_frames);
|
187
|
+
free(output);
|
188
|
+
VALUE ret = rb_ary_new();
|
189
|
+
rb_ary_push(ret, ret_str);
|
190
|
+
rb_ary_push(ret, INT2NUM(sample_rate));
|
191
|
+
rb_ary_push(ret, INT2NUM(num_channels));
|
192
|
+
return ret;
|
193
|
+
}
|
194
|
+
|
195
|
+
OPEN_FILE(wav, int16_t, s16)
|
196
|
+
OPEN_FILE(wav, int32_t, s32)
|
197
|
+
OPEN_FILE(wav, float, f32)
|
198
|
+
|
199
|
+
OPEN_MP3_FILE(int16_t, s16)
|
200
|
+
OPEN_MP3_FILE(float, f32)
|
201
|
+
|
202
|
+
OPEN_FILE(flac, int16_t, s16)
|
203
|
+
OPEN_FILE(flac, int32_t, s32)
|
204
|
+
OPEN_FILE(flac, float, f32)
|
205
|
+
|
206
|
+
OPEN_MEMORY(wav, int16_t, s16)
|
207
|
+
OPEN_MEMORY(wav, int32_t, s32)
|
208
|
+
OPEN_MEMORY(wav, float, f32)
|
209
|
+
|
210
|
+
OPEN_MP3_MEMORY(int16_t, s16)
|
211
|
+
OPEN_MP3_MEMORY(float, f32)
|
212
|
+
|
213
|
+
OPEN_MEMORY(flac, int16_t, s16)
|
214
|
+
OPEN_MEMORY(flac, int32_t, s32)
|
215
|
+
OPEN_MEMORY(flac, float, f32)
|
216
|
+
|
217
|
+
void Init_miniaudio(void) {
|
218
|
+
VALUE mod = rb_const_get(rb_cObject, rb_intern("Miniaudio"));
|
219
|
+
rb_define_module_function(mod, "wav_read_file_s16", &rb_drwav_open_file_and_read_pcm_frames_s16, 1);
|
220
|
+
rb_define_module_function(mod, "wav_read_file_s32", &rb_drwav_open_file_and_read_pcm_frames_s32, 1);
|
221
|
+
rb_define_module_function(mod, "wav_read_file_f32", &rb_drwav_open_file_and_read_pcm_frames_f32, 1);
|
222
|
+
rb_define_module_function(mod, "mp3_read_file_s16", rb_drmp3_open_file_and_read_pcm_frames_s16, 1);
|
223
|
+
rb_define_module_function(mod, "mp3_read_file_f32", rb_drmp3_open_file_and_read_pcm_frames_f32, 1);
|
224
|
+
rb_define_module_function(mod, "flac_read_file_s16", &rb_drflac_open_file_and_read_pcm_frames_s16, 1);
|
225
|
+
rb_define_module_function(mod, "flac_read_file_s32", &rb_drflac_open_file_and_read_pcm_frames_s32, 1);
|
226
|
+
rb_define_module_function(mod, "flac_read_file_f32", &rb_drflac_open_file_and_read_pcm_frames_f32, 1);
|
227
|
+
rb_define_module_function(mod, "vorbis_read_file_s16", &rb_stb_vorbis_decode_filename_s16, 1);
|
228
|
+
rb_define_module_function(mod, "wav_read_s16", &rb_drwav_open_memory_and_read_pcm_frames_s16, 1);
|
229
|
+
rb_define_module_function(mod, "wav_read_s32", &rb_drwav_open_memory_and_read_pcm_frames_s32, 1);
|
230
|
+
rb_define_module_function(mod, "wav_read_f32", &rb_drwav_open_memory_and_read_pcm_frames_f32, 1);
|
231
|
+
rb_define_module_function(mod, "mp3_read_s16", rb_drmp3_open_memory_and_read_pcm_frames_s16, 1);
|
232
|
+
rb_define_module_function(mod, "mp3_read_f32", rb_drmp3_open_memory_and_read_pcm_frames_f32, 1);
|
233
|
+
rb_define_module_function(mod, "flac_read_s16", &rb_drflac_open_memory_and_read_pcm_frames_s16, 1);
|
234
|
+
rb_define_module_function(mod, "flac_read_s32", &rb_drflac_open_memory_and_read_pcm_frames_s32, 1);
|
235
|
+
rb_define_module_function(mod, "flac_read_f32", &rb_drflac_open_memory_and_read_pcm_frames_f32, 1);
|
236
|
+
rb_define_module_function(mod, "vorbis_file_s16", &rb_stb_vorbis_decode_memory_s16, 1);
|
237
|
+
}
|
data/lib/miniaudio.rb
ADDED
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: miniaudio
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ivan Razuvaev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Miniaudio library (https://github.com/mackron/miniaudio) Ruby wrapper
|
14
|
+
email: team@orlando-labs.com
|
15
|
+
executables: []
|
16
|
+
extensions:
|
17
|
+
- ext/miniaudio/extconf.rb
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ext/miniaudio/extconf.rb
|
21
|
+
- ext/miniaudio/miniaudio/extras/stb_vorbis.c
|
22
|
+
- ext/miniaudio/miniaudio/miniaudio.h
|
23
|
+
- ext/miniaudio/rb-miniaudio.c
|
24
|
+
- lib/miniaudio.rb
|
25
|
+
homepage: https://github.com/orlando-labs/rb-miniaudio
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.5.0
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubygems_version: 3.1.4
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: Miniaudio library Ruby wrapper
|
48
|
+
test_files: []
|