icanhasaudio 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/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: