icanhasaudio 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.0.2
2
+ * 1 major enhancement
3
+ * I can has ogg decoder!
4
+
1
5
  == 0.0.1 / 2007-07-10
2
6
 
3
7
  * 1 major enhancement
data/Manifest.txt CHANGED
@@ -11,5 +11,10 @@ ext/extconf.rb
11
11
  ext/get_audio.c
12
12
  ext/get_audio.h
13
13
  ext/icanhasaudio.c
14
+ ext/rb_ogg.c
15
+ ext/rb_wav.c
16
+ ext/rb_wav.h
14
17
  ext/syncword.c
15
18
  ext/syncword.h
19
+ lib/icanhasaudio/mpeg.rb
20
+ lib/icanhasaudio/ogg.rb
data/README.txt CHANGED
@@ -5,7 +5,7 @@
5
5
  == DESCRIPTION. LULZ
6
6
 
7
7
  Hai! icanhasaudio? is an interface to lame for decoding ur MP3s. I iz in ur
8
- computer. Decodin ur mp3s.
8
+ computer. Decodin ur mp3s. Whatevs! I also decodin ur OGGz!
9
9
 
10
10
  == SYNOPSYS ROFLOL
11
11
 
@@ -20,22 +20,22 @@ computer. Decodin ur mp3s.
20
20
 
21
21
  Or even smaller:
22
22
 
23
- reader = Audio::MPEG::Decoder.new
23
+ reader = Audio::OGG::Decoder.new
24
24
  reader.decode(File.open(ARGV[0], 'rb'), File.open(ARGV[1], 'wb'))
25
25
 
26
26
  == PROBLEMS
27
27
 
28
- Currently only decodes MP3 data. Plus many other problems.... YYMV. LOL.
28
+ Currently only decodes MP3/OGG data. Plus many other problems.... YMMV. LOL.
29
29
  Not laugh plz!
30
30
 
31
31
  == DEPENDENSEEZ
32
32
 
33
- Make sure lame is installed on ur 'puter.
33
+ Make sure lame is installed on ur 'puter. Also ogg and vorbisfile!
34
34
 
35
35
  == CREDITZ
36
36
 
37
37
  Thanx Ryan for mah name! Also, most of this code was taken from the lame
38
- front end. So thank you to the lame team!
38
+ front end. So thank you to the lame team! THX VORBIS!
39
39
 
40
40
  == LICENSE
41
41
 
data/Rakefile CHANGED
@@ -2,11 +2,11 @@ require 'hoe'
2
2
 
3
3
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "lib")
4
4
 
5
- Hoe.new('icanhasaudio', '0.0.1') do |p|
5
+ Hoe.new('icanhasaudio', '0.0.2') do |p|
6
6
  p.rubyforge_name = 'seattlerb'
7
7
  p.author = 'Aaron Patterson'
8
8
  p.email = 'aaronp@rubyforge.org'
9
- p.summary = "icanhasaudio is a wrappers lame for decoding ur mp3s."
9
+ p.summary = "icanhasaudio is a lame/vorbis wrapper for decoding ur mp3s and ur oggs."
10
10
  p.description = p.paragraphs_of('README.txt', 3..6).join("\n\n")
11
11
  p.url = p.paragraphs_of('README.txt', 1).first.strip
12
12
  p.changes = p.paragraphs_of('History.txt', 0..2).join("\n\n")
data/ext/decoder.c CHANGED
@@ -1,8 +1,9 @@
1
1
  #include <ruby.h>
2
2
  #include <lame/lame.h>
3
3
  #include <assert.h>
4
- #include "decoder.h"
5
- #include "get_audio.h"
4
+ #include <decoder.h>
5
+ #include <get_audio.h>
6
+ #include <rb_wav.h>
6
7
 
7
8
  int
8
9
  lame_decoder(VALUE self, VALUE infile, VALUE outf, mp3data_struct * mp3data)
@@ -14,20 +15,31 @@ lame_decoder(VALUE self, VALUE infile, VALUE outf, mp3data_struct * mp3data)
14
15
  int i;
15
16
  int tmp_num_channels;
16
17
  int skip;
18
+ char headbuf[44];
19
+ VALUE raw;
20
+
21
+ raw = rb_iv_get(self, "@raw");
22
+ if(raw == Qnil) {
23
+ raw = Qfalse;
24
+ rb_iv_set(self, "@raw", Qfalse);
25
+ }
17
26
 
18
27
  Data_Get_Struct(self, lame_global_flags, gfp);
19
28
  tmp_num_channels = lame_get_num_channels( gfp );
20
29
 
21
30
  skip = lame_get_encoder_delay(gfp)+528+1;
22
31
 
23
- /* FIXME: Not sure if necessary
24
- if ( 0 == disable_wav_header )
25
- */
26
- WriteWaveHeader(outf, 0x7FFFFFFF, lame_get_in_samplerate( gfp ),
27
- tmp_num_channels,
28
- 16);
29
-
30
- /* unknown size, so write maximum 32 bit signed value */
32
+ if(!raw) {
33
+ rb_iv_set(self, "@bits", INT2NUM(16));
34
+ prelim_header( self,
35
+ headbuf,
36
+ 0x7FFFFFFF,
37
+ 0,
38
+ tmp_num_channels,
39
+ lame_get_in_samplerate( gfp )
40
+ );
41
+ rb_funcall(outf, rb_intern("write"), 1, rb_str_new(headbuf, 44));
42
+ }
31
43
 
32
44
  wavsize = -skip;
33
45
  mp3data->totalframes = mp3data->nsamp / mp3data->framesize;
@@ -46,16 +58,7 @@ lame_decoder(VALUE self, VALUE infile, VALUE outf, mp3data_struct * mp3data)
46
58
 
47
59
  skip -= (i = skip < iread ? skip : iread); /* 'i' samples are to skip in this frame */
48
60
 
49
- //printf("Writing: %d\n", mp3data->framenum);
50
61
  for (; i < iread; i++) {
51
- /*
52
- if ( disable_wav_header ) {
53
- WriteFunction(outf, (char *) &Buffer[0][i], sizeof(short));
54
- if (tmp_num_channels == 2)
55
- WriteFunction(outf, (char *) &Buffer[1][i], sizeof(short));
56
- }
57
- else { */
58
-
59
62
  /* Write the 0 channel */
60
63
  BitBuffer16[bit_16_i] = Buffer[0][i] & 0xFF;
61
64
  BitBuffer16[bit_16_i + 1] = ((Buffer[0][i] >> 8) & 0xFF);
@@ -67,13 +70,6 @@ lame_decoder(VALUE self, VALUE infile, VALUE outf, mp3data_struct * mp3data)
67
70
  } else {
68
71
  bit_16_i += 2;
69
72
  }
70
-
71
- /*
72
- Write16BitsLowHigh(outf, Buffer[0][i]);
73
- if (tmp_num_channels == 2)
74
- Write16BitsLowHigh(outf, Buffer[1][i]);
75
- */
76
- /* } */
77
73
  }
78
74
  rb_funcall(outf, rb_intern("write"), 1, rb_str_new(BitBuffer16, bit_16_i));
79
75
  } while (iread);
@@ -90,16 +86,16 @@ lame_decoder(VALUE self, VALUE infile, VALUE outf, mp3data_struct * mp3data)
90
86
  wavsize *= i;
91
87
  }
92
88
 
93
- if(rb_respond_to(outf, rb_intern("seek")) == Qtrue) {
89
+ if(!raw && rb_respond_to(outf, rb_intern("seek")) == Qtrue) {
94
90
  rb_funcall( outf,
95
91
  rb_intern("seek"),
96
92
  2,
97
93
  INT2NUM(0),
98
94
  rb_const_get(rb_cIO, rb_intern("SEEK_SET")) );
99
- WriteWaveHeader(outf, (int)wavsize, lame_get_in_samplerate(gfp),
100
- tmp_num_channels, 16);
101
- }
102
95
 
96
+ rewrite_header(headbuf, (int)wavsize);
97
+ rb_funcall(outf, rb_intern("write"), 1, rb_str_new(headbuf, 44));
98
+ }
103
99
  return 0;
104
100
  }
105
101
 
data/ext/extconf.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  require 'mkmf'
2
2
 
3
3
  have_header("lame/lame.h")
4
+ have_header("ogg/ogg.h")
5
+ have_header("vorbis/vorbisfile.h")
4
6
  have_library("mp3lame")
7
+ have_library("vorbis")
8
+ have_library("vorbisfile")
5
9
  dir_config('icanhasaudio')
6
10
  create_makefile('icanhasaudio')
data/ext/get_audio.c CHANGED
@@ -18,19 +18,6 @@ int
18
18
  lame_decode_fromfile(VALUE file, short pcm_l[], short pcm_r[],
19
19
  mp3data_struct * mp3data);
20
20
 
21
- static void
22
- Write16BitsLowHigh(VALUE file, int i) {
23
- rb_funcall(file, rb_intern("putc"), 1, INT2NUM(i & 0xFF));
24
- rb_funcall(file, rb_intern("putc"), 1, INT2NUM((i >> 8) & 0xFF));
25
- }
26
-
27
- void
28
- Write32BitsLowHigh(VALUE fp, int i)
29
- {
30
- Write16BitsLowHigh(fp,(int)(i&0xffffL));
31
- Write16BitsLowHigh(fp,(int)((i>>16)&0xffffL));
32
- }
33
-
34
21
  /*
35
22
  get_audio16 - behave as the original get_audio function, with a limited
36
23
  16 bit per sample output
@@ -143,27 +130,6 @@ read_samples_mp3(VALUE self, VALUE musicin,
143
130
  }
144
131
 
145
132
 
146
- void
147
- WriteWaveHeader(VALUE fp, const int pcmbytes,
148
- const int freq, const int channels, const int bits)
149
- {
150
- int bytes = (bits + 7) / 8;
151
-
152
- /* quick and dirty, but documented */
153
- rb_funcall(fp, rb_intern("write"), 1, rb_str_new2("RIFF"));
154
- Write32BitsLowHigh(fp, pcmbytes + 44 - 8); /* length in bytes without header */
155
- rb_funcall(fp, rb_intern("write"), 1, rb_str_new2("WAVEfmt "));
156
- Write32BitsLowHigh(fp, 2 + 2 + 4 + 4 + 2 + 2); /* length of PCM format declaration area */
157
- Write16BitsLowHigh(fp, 1); /* is PCM? */
158
- Write16BitsLowHigh(fp, channels); /* number of channels */
159
- Write32BitsLowHigh(fp, freq); /* sample frequency in [Hz] */
160
- Write32BitsLowHigh(fp, freq * channels * bytes); /* bytes per second */
161
- Write16BitsLowHigh(fp, channels * bytes); /* bytes per sample time */
162
- Write16BitsLowHigh(fp, bits); /* bits per sample */
163
- rb_funcall(fp, rb_intern("write"), 1, rb_str_new2("data"));
164
- Write32BitsLowHigh(fp, pcmbytes); /* length in bytes of raw PCM data */
165
- }
166
-
167
133
  /*
168
134
  For lame_decode_fromfile: return code
169
135
  -1 error
data/ext/get_audio.h CHANGED
@@ -2,7 +2,3 @@
2
2
  int
3
3
  get_audio16(VALUE self, VALUE musicin, short buffer[2][1152],
4
4
  mp3data_struct * mp3data);
5
-
6
- void
7
- WriteWaveHeader(VALUE fp, const int pcmbytes,
8
- const int freq, const int channels, const int bits);
data/ext/icanhasaudio.c CHANGED
@@ -16,12 +16,22 @@
16
16
  static VALUE rb_mAudio;
17
17
  static VALUE rb_mMpeg;
18
18
  static VALUE rb_cDecoder;
19
+ static VALUE rb_mOgg;
20
+ static VALUE rb_cOggDecoder;
19
21
 
20
22
  static void reader_mark(lame_global_flags * lgf) {}
21
23
  static void reader_free(lame_global_flags * gfp) {
22
24
  lame_close(gfp);
23
25
  }
24
26
 
27
+ /*
28
+ * call-seq:
29
+ * decoder.decode(input_io, output_io)
30
+ *
31
+ * Decode the input IO and write it to the output IO.
32
+ */
33
+ VALUE method_ogg_decode(VALUE self, VALUE infile, VALUE outf);
34
+
25
35
  /*
26
36
  * call-seq:
27
37
  * Audio::MPEG::Decoder.new
@@ -150,8 +160,12 @@ void Init_icanhasaudio() {
150
160
  rb_mAudio = rb_define_module("Audio");
151
161
  rb_mMpeg = rb_define_module_under(rb_mAudio, "MPEG");
152
162
  rb_cDecoder = rb_define_class_under(rb_mMpeg, "Decoder", rb_cObject);
153
- /* VERSION = '0.0.1' */
154
- rb_define_const(rb_cDecoder, "VERSION", rb_str_new2("0.0.1"));
163
+
164
+ rb_mOgg = rb_define_module_under(rb_mAudio, "OGG");
165
+ rb_cOggDecoder = rb_define_class_under(rb_mOgg, "Decoder", rb_cObject);
166
+
167
+ /* VERSION = '0.0.2' */
168
+ rb_define_const(rb_cDecoder, "VERSION", rb_str_new2("0.0.2"));
155
169
  rb_define_singleton_method(
156
170
  rb_cDecoder,
157
171
  "lame_version",
@@ -161,5 +175,8 @@ void Init_icanhasaudio() {
161
175
 
162
176
  rb_define_alloc_func(rb_cDecoder, reader_allocate);
163
177
  rb_define_method(rb_cDecoder, "decode", method_lame_decode, 2);
178
+ rb_define_method(rb_cOggDecoder, "decode", method_ogg_decode, 2);
179
+ rb_require("icanhasaudio/mpeg");
180
+ rb_require("icanhasaudio/ogg");
164
181
  }
165
182
 
data/ext/rb_ogg.c ADDED
@@ -0,0 +1,139 @@
1
+ #include <ruby.h>
2
+ #include <ogg/ogg.h>
3
+ #include <vorbis/vorbisfile.h>
4
+ #include <rb_wav.h>
5
+
6
+ size_t rb_ogg_read(void *ptr, size_t size, size_t nmemb, void *datasource) {
7
+ VALUE file = (VALUE)datasource;
8
+ VALUE str;
9
+ size_t length;
10
+
11
+ str = rb_funcall(file, rb_intern("read"), 1, INT2NUM(size * nmemb));
12
+ if(str == Qnil) return 0;
13
+
14
+ length = NUM2INT(rb_funcall(str, rb_intern("length"), 0));
15
+
16
+ memcpy(ptr, StringValuePtr(str), length);
17
+ return length;
18
+ }
19
+
20
+ int rb_ogg_seek(void *datasource, ogg_int64_t offset, int whence) {
21
+ VALUE file = (VALUE)datasource;
22
+ if(rb_respond_to(file, rb_intern("seek")) == Qtrue) {
23
+ return NUM2INT(rb_funcall( file,
24
+ rb_intern("seek"),
25
+ 2,
26
+ INT2NUM(offset),
27
+ INT2NUM(whence)));
28
+ }
29
+ return -1;
30
+ }
31
+
32
+ int rb_ogg_close(void *datasource) {
33
+ VALUE file = (VALUE)datasource;
34
+ rb_funcall(file, rb_intern("close"), 0);
35
+ return 0;
36
+ }
37
+
38
+ long rb_ogg_tell(void *datasource) {
39
+ VALUE file = (VALUE)datasource;
40
+ return NUM2LONG(rb_funcall(file, rb_intern("tell"), 0));
41
+ }
42
+
43
+ /*
44
+ * call-seq:
45
+ * decoder.decode(input_io, output_io)
46
+ *
47
+ * Decode the input IO and write it to the output IO.
48
+ */
49
+ VALUE method_ogg_decode(VALUE self, VALUE infile, VALUE outf) {
50
+ OggVorbis_File vf;
51
+ ov_callbacks callbacks;
52
+ int bs = 0;
53
+ char buf[8192];
54
+ int buflen = 8192;
55
+ unsigned int written = 0;
56
+ int ret;
57
+ ogg_int64_t length = 0;
58
+ int seekable = 0;
59
+ VALUE raw;
60
+ char headbuf[44];
61
+ VALUE bits;
62
+ VALUE endian;
63
+ VALUE sign;
64
+
65
+ raw = rb_iv_get(self, "@raw");
66
+ if(raw == Qnil) {
67
+ raw = Qfalse;
68
+ rb_iv_set(self, "@raw", Qfalse);
69
+ }
70
+
71
+ bits = rb_iv_get(self, "@bits");
72
+ if(bits == Qnil) {
73
+ bits = INT2NUM(16);
74
+ rb_iv_set(self, "@bits", INT2NUM(16));
75
+ }
76
+
77
+ endian = rb_iv_get(self, "@endian");
78
+ if(endian == Qnil) {
79
+ rb_iv_set(self, "@endian", INT2NUM(0));
80
+ endian = INT2NUM(0);
81
+ }
82
+
83
+ sign = rb_iv_get(self, "@sign");
84
+ if(sign == Qnil) {
85
+ rb_iv_set(self, "@sign", INT2NUM(1));
86
+ sign = INT2NUM(1);
87
+ }
88
+
89
+ callbacks.read_func = rb_ogg_read;
90
+ callbacks.seek_func = rb_ogg_seek;
91
+ callbacks.close_func = rb_ogg_close;
92
+ callbacks.tell_func = rb_ogg_tell;
93
+
94
+ if(ov_open_callbacks((void *)infile, &vf, NULL, 0, callbacks) < 0) {
95
+ rb_raise(rb_eRuntimeError, "Failed to open input as vorbis.\n");
96
+ }
97
+
98
+ if(ov_seekable(&vf)) {
99
+ seekable = 1;
100
+ length = ov_pcm_total(&vf, 0);
101
+ }
102
+
103
+ if(!raw) {
104
+ prelim_header( self,
105
+ headbuf,
106
+ 0x7fffffff,
107
+ length,
108
+ ov_info(&vf,0)->channels,
109
+ ov_info(&vf,0)->rate );
110
+
111
+ rb_funcall(outf, rb_intern("write"), 1, rb_str_new(headbuf, 44));
112
+ }
113
+
114
+ while((ret = ov_read(&vf, buf, buflen, NUM2INT(endian), NUM2INT(bits)/8, NUM2INT(sign), &bs)) != 0) {
115
+ if(bs !=0) {
116
+ rb_raise(rb_eRuntimeError,
117
+ "Only one logical bitstream currently supported.\n");
118
+ }
119
+
120
+ if(ret) {
121
+ rb_funcall(outf, rb_intern("write"), 1, rb_str_new(buf, ret));
122
+ written += ret;
123
+ }
124
+ }
125
+
126
+ if(seekable && !raw) {
127
+ rewrite_header(headbuf, written);
128
+ rb_funcall( outf,
129
+ rb_intern("seek"),
130
+ 2,
131
+ INT2NUM(0),
132
+ rb_const_get(rb_cIO, rb_intern("SEEK_SET")) );
133
+ rb_funcall(outf, rb_intern("write"), 1, rb_str_new(headbuf, 44));
134
+ }
135
+
136
+ ov_clear(&vf);
137
+
138
+ return Qnil;
139
+ }
data/ext/rb_wav.c ADDED
@@ -0,0 +1,51 @@
1
+ #include <ruby.h>
2
+ #include <rb_wav.h>
3
+
4
+ #define WRITE_U32(buf, x) *(buf) = (unsigned char)((x)&0xff);\
5
+ *((buf)+1) = (unsigned char)(((x)>>8)&0xff);\
6
+ *((buf)+2) = (unsigned char)(((x)>>16)&0xff);\
7
+ *((buf)+3) = (unsigned char)(((x)>>24)&0xff);
8
+
9
+ #define WRITE_U16(buf, x) *(buf) = (unsigned char)((x)&0xff);\
10
+ *((buf)+1) = (unsigned char)(((x)>>8)&0xff);
11
+
12
+ /* Some of this based on ao/src/ao_wav.c */
13
+ void prelim_header( VALUE self,
14
+ char *headbuf,
15
+ unsigned int size, /* 0x7fffffff */
16
+ ogg_int64_t knownlength,
17
+ int channels,
18
+ int samplerate
19
+ ) {
20
+ VALUE bits = rb_iv_get(self, "@bits");
21
+ int bytespersec = channels*samplerate*NUM2INT(bits)/8;
22
+ int align = channels*NUM2INT(bits)/8;
23
+ int samplesize = NUM2INT(bits);
24
+
25
+ if(knownlength && knownlength*NUM2INT(bits)/8*channels < size)
26
+ size = (unsigned int)(knownlength*NUM2INT(bits)/8*channels+44) ;
27
+
28
+ memcpy(headbuf, "RIFF", 4);
29
+ WRITE_U32(headbuf+4, size-8);
30
+ memcpy(headbuf+8, "WAVE", 4);
31
+ memcpy(headbuf+12, "fmt ", 4);
32
+ WRITE_U32(headbuf+16, 16);
33
+ WRITE_U16(headbuf+20, 1); /* format */
34
+ WRITE_U16(headbuf+22, channels);
35
+ WRITE_U32(headbuf+24, samplerate);
36
+ WRITE_U32(headbuf+28, bytespersec);
37
+ WRITE_U16(headbuf+32, align);
38
+ WRITE_U16(headbuf+34, samplesize);
39
+ memcpy(headbuf+36, "data", 4);
40
+ WRITE_U32(headbuf+40, size - 44);
41
+ }
42
+
43
+ void rewrite_header(char *headbuf, unsigned int written)
44
+ {
45
+ unsigned int length = written;
46
+
47
+ length += 44;
48
+
49
+ WRITE_U32(headbuf+4, length-8);
50
+ WRITE_U32(headbuf+40, length-44);
51
+ }
data/ext/rb_wav.h ADDED
@@ -0,0 +1,11 @@
1
+ #include <ogg/ogg.h>
2
+ #include <vorbis/vorbisfile.h>
3
+
4
+ void prelim_header( VALUE self,
5
+ char *headbuf,
6
+ unsigned int size, /* 0x7fffffff */
7
+ ogg_int64_t knownlength,
8
+ int channels,
9
+ int samplerate
10
+ );
11
+ void rewrite_header(char *headbuf, unsigned int written);
@@ -0,0 +1,12 @@
1
+ class Audio::MPEG::Decoder
2
+ attr_reader :stereo, :samplerate, :bitrate, :mode, :mode_ext, :framesize
3
+
4
+ # Number of bits, 8 or 16
5
+ attr_accessor :bits
6
+
7
+ def initialize
8
+ @bits = 16
9
+ yield self if block_given?
10
+ end
11
+ end
12
+
@@ -0,0 +1,21 @@
1
+ class Audio::OGG::Decoder
2
+ # Set to true for no WAV header
3
+ attr_accessor :raw
4
+
5
+ # Number of bits, 8 or 16
6
+ attr_accessor :bits
7
+
8
+ # Endianness
9
+ attr_accessor :endian
10
+
11
+ # Signedness
12
+ attr_accessor :sign
13
+
14
+ def initialize
15
+ @raw = false
16
+ @bits = 16
17
+ @endian = 0
18
+ @sign = 1
19
+ yield self if block_given?
20
+ end
21
+ end
metadata CHANGED
@@ -1,21 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: icanhasaudio
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.1
7
- date: 2007-07-11 00:00:00 -07:00
8
- summary: icanhasaudio is a wrappers lame for decoding ur mp3s.
6
+ version: 0.0.2
7
+ date: 2007-07-28 00:00:00 -07:00
8
+ summary: icanhasaudio is a lame/vorbis wrapper for decoding ur mp3s and ur oggs.
9
9
  require_paths:
10
+ - lib
10
11
  - ext
11
12
  email: aaronp@rubyforge.org
12
13
  homepage: http://seattlerb.rubyforge.org/
13
14
  rubyforge_project: seattlerb
14
15
  description: "Hai! icanhasaudio? is an interface to lame for decoding ur MP3s. I iz in ur
15
- computer. Decodin ur mp3s. == SYNOPSYS ROFLOL require 'icanhasaudio' reader =
16
- Audio::MPEG::Decoder.new File.open(ARGV[0], 'rb') { |input_lol|
17
- File.open(ARGV[1], 'wb') { |output_lol| reader.decode(input_lol, output_lol) }
18
- }"
16
+ computer. Decodin ur mp3s. Whatevs! I also decodin ur OGGz! == SYNOPSYS
17
+ ROFLOL require 'icanhasaudio' reader = Audio::MPEG::Decoder.new
18
+ File.open(ARGV[0], 'rb') { |input_lol| File.open(ARGV[1], 'wb') { |output_lol|
19
+ reader.decode(input_lol, output_lol) } }"
19
20
  autorequire:
20
21
  default_executable:
21
22
  bindir: bin
@@ -47,8 +48,13 @@ files:
47
48
  - ext/get_audio.c
48
49
  - ext/get_audio.h
49
50
  - ext/icanhasaudio.c
51
+ - ext/rb_ogg.c
52
+ - ext/rb_wav.c
53
+ - ext/rb_wav.h
50
54
  - ext/syncword.c
51
55
  - ext/syncword.h
56
+ - lib/icanhasaudio/mpeg.rb
57
+ - lib/icanhasaudio/ogg.rb
52
58
  test_files: []
53
59
  rdoc_options:
54
60
  - "--main"
@@ -71,5 +77,5 @@ dependencies:
71
77
  -
72
78
  - ">="
73
79
  - !ruby/object:Gem::Version
74
- version: 1.2.1
80
+ version: 1.2.2
75
81
  version: