public
Description: I am in ur computar, encodin' and decodin' ur MP3z.
Homepage: http://icanhasaudio.com/
Clone URL: git://github.com/aaronp/icanhasaudio.git
Search Repo:
making it work

git-svn-id: svn://rubyforge.org/var/svn/daapclient/icha@130 
d404eec9-990f-0410-b7b9-e628b63c8aec
aaronp (author)
Fri Feb 15 18:12:14 -0800 2008
commit  8521c03b5a06229096a11997cc5c914798f0464f
tree    84409d6ae11faedcab60f3ff81b8afc95184e499
parent  26218ec3b3296606a78251a23e3c61dc95df1f7e
...
5
6
7
8
 
 
9
10
11
...
23
24
25
 
 
 
 
 
 
 
 
 
26
27
28
 
 
29
30
31
32
33
34
 
 
35
36
37
...
5
6
7
 
8
9
10
11
12
...
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
38
39
40
41
42
43
44
45
46
47
48
49
50
0
@@ -5,7 +5,8 @@
0
 == DESCRIPTION. LULZ
0
 
0
 Hai! icanhasaudio? is an interface to lame for decoding ur MP3s. I iz in ur
0
-computer. Decodin ur mp3s. Whatevs! I also decodin ur OGGz!
0
+computer. Decodin ur mp3s. Whatevs! I also decodin ur OGGz! I kin also
0
+encodin' ur WAV and AIFF to mp3z!
0
 
0
 == SYNOPSYS ROFLOL
0
 
0
@@ -23,15 +24,27 @@ Or even smaller:
0
   reader = Audio::OGG::Decoder.new
0
   reader.decode(File.open(ARGV[0], 'rb'), File.open(ARGV[1], 'wb'))
0
 
0
+Encoder!!!!!! LOL
0
+
0
+ writer = Audio::MPEG::Encoder.new
0
+ File.open(ARGV[0]), 'rb') { |wav_lol|
0
+ File.open(ARGV[1]), 'wb+') { |mp3_lol|
0
+ writer.encode(wav_lol, mp3_lol)
0
+ }
0
+ }
0
+
0
 == PROBLEMS
0
 
0
-Currently only decodes MP3/OGG data. Plus many other problems.... YMMV. LOL.
0
+Currently only decodes MP3/OGG data. Also encodes WAV/AIFF to mp3. Plus many
0
+other problems.... YMMV. LOL.
0
 Not laugh plz!
0
 
0
 == DEPENDENSEEZ
0
 
0
 Make sure lame is installed on ur 'puter. Also ogg and vorbisfile!
0
 
0
+ # port install libvorbis vorbis-tools lame
0
+
0
 == CREDITZ
0
 
0
 Thanx Ryan for mah name! Also, most of this code was taken from the lame
...
25
26
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
29
30
...
368
369
370
 
 
 
371
372
373
374
 
375
376
377
...
383
384
385
 
 
 
 
 
 
 
 
 
386
387
388
...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
...
478
479
480
481
482
483
484
485
486
487
488
489
490
491
...
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
0
@@ -25,6 +25,116 @@ encoder_allocate(VALUE klass) {
0
 
0
 /*
0
  * call-seq:
0
+ * encoder.vbr_hard_min=
0
+ *
0
+ * Strictly enforce the vbr min bitrate. Normally it will be violated for
0
+ * analog silence.
0
+ */
0
+static VALUE MpegEncoder_set_vbr_hard_min(VALUE self, VALUE boolean) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ lame_set_VBR_hard_min(gfp, boolean == Qtrue ? 1 : 0);
0
+ return boolean;
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.vbr_hard_min?
0
+ *
0
+ * Get the hard minimum flag.
0
+ */
0
+static VALUE MpegEncoder_get_vbr_hard_min(VALUE self) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ return lame_get_VBR_hard_min(gfp) == 0 ? Qfalse : Qtrue;
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.vbr_max_bitrate=
0
+ *
0
+ * Set the maximum vbr bitrate.
0
+ */
0
+static VALUE MpegEncoder_set_vbr_max_bitrate(VALUE self, VALUE brate) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ lame_set_VBR_max_bitrate_kbps(gfp, NUM2INT(brate));
0
+ return brate;
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.vbr_max_bitrate
0
+ *
0
+ * Get the maximum vbr bitrate.
0
+ */
0
+static VALUE MpegEncoder_get_vbr_max_bitrate(VALUE self) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ return INT2NUM(lame_get_VBR_max_bitrate_kbps(gfp));
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.vbr_min_bitrate=
0
+ *
0
+ * Set the minimum vbr bitrate.
0
+ */
0
+static VALUE MpegEncoder_set_vbr_min_bitrate(VALUE self, VALUE brate) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ lame_set_VBR_min_bitrate_kbps(gfp, NUM2INT(brate));
0
+ return brate;
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.vbr_min_bitrate
0
+ *
0
+ * Get the minimum vbr bitrate.
0
+ */
0
+static VALUE MpegEncoder_get_vbr_min_bitrate(VALUE self) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ return INT2NUM(lame_get_VBR_min_bitrate_kbps(gfp));
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.bitrate=
0
+ *
0
+ * Set the bitrate.
0
+ */
0
+static VALUE MpegEncoder_set_bitrate(VALUE self, VALUE brate) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ lame_set_brate(gfp, NUM2INT(brate));
0
+ lame_set_VBR_min_bitrate_kbps(gfp, lame_get_brate(gfp));
0
+ return brate;
0
+}
0
+
0
+/*
0
+ * call-seq:
0
+ * encoder.bitrate
0
+ *
0
+ * Get the bitrate.
0
+ */
0
+static VALUE MpegEncoder_get_bitrate(VALUE self) {
0
+ lame_global_flags * gfp;
0
+
0
+ Data_Get_Struct(self, lame_global_flags, gfp);
0
+ return INT2NUM(lame_get_brate(gfp));
0
+}
0
+
0
+/*
0
+ * call-seq:
0
  * encoder.quality=
0
  *
0
  * Set the VBR quality. 0 = highest, 9 = lowest
0
@@ -368,10 +478,14 @@ void init_MpegEncoder(VALUE rb_mMpeg) {
0
   rb_mAudio = rb_define_module("Audio");
0
   rb_mMpeg = rb_define_module_under(rb_mAudio, "MPEG");
0
   */
0
+ /*
0
+ * Encode mp3s
0
+ */
0
   cMpegEncoder = rb_define_class_under(rb_mMpeg, "Encoder", rb_cObject);
0
   rb_define_alloc_func(cMpegEncoder, encoder_allocate);
0
 
0
   /* Public Methods */
0
+
0
   rb_define_method(cMpegEncoder, "vbr_quality=",MpegEncoder_set_vbr_quality, 1);
0
   rb_define_method(cMpegEncoder, "vbr_quality", MpegEncoder_get_vbr_quality, 0);
0
   rb_define_method(cMpegEncoder, "vbr_type=", MpegEncoder_set_vbr_type, 1);
0
@@ -383,6 +497,15 @@ void init_MpegEncoder(VALUE rb_mMpeg) {
0
   rb_define_method(cMpegEncoder, "year=", MpegEncoder_set_year, 1);
0
   rb_define_method(cMpegEncoder, "track=", MpegEncoder_set_track, 1);
0
   rb_define_method(cMpegEncoder, "genre=", MpegEncoder_set_genre, 1);
0
+ rb_define_method(cMpegEncoder, "bitrate=", MpegEncoder_set_bitrate, 1);
0
+ rb_define_method(cMpegEncoder, "bitrate", MpegEncoder_get_bitrate, 0);
0
+ rb_define_method(cMpegEncoder, "vbr_min_bitrate=", MpegEncoder_set_vbr_min_bitrate, 1);
0
+ rb_define_method(cMpegEncoder, "vbr_min_bitrate", MpegEncoder_get_vbr_min_bitrate, 0);
0
+ rb_define_method(cMpegEncoder, "vbr_max_bitrate=", MpegEncoder_set_vbr_max_bitrate, 1);
0
+ rb_define_method(cMpegEncoder, "vbr_max_bitrate", MpegEncoder_get_vbr_max_bitrate, 0);
0
+ rb_define_method(cMpegEncoder, "vbr_hard_min=", MpegEncoder_set_vbr_hard_min, 1);
0
+ rb_define_method(cMpegEncoder, "vbr_hard_min?", MpegEncoder_get_vbr_hard_min, 0);
0
+
0
 
0
   rb_define_private_method(cMpegEncoder, "init_params", MpegEncoder_init_params, 0);
0
   rb_define_private_method(cMpegEncoder, "num_channels=", MpegEncoder_set_num_channels, 1);
...
98
99
100
101
 
 
102
103
104
...
157
158
159
160
 
161
162
163
...
179
180
181
182
 
183
184
185
...
98
99
100
 
101
102
103
104
105
...
158
159
160
 
161
162
163
164
...
180
181
182
 
183
184
185
186
0
@@ -98,7 +98,8 @@ module Audio
0
         when IFF_ID_FORM # AIFF file
0
           parse_aiff_header(file)
0
         else
0
- raise "Unsupported format"
0
+ $stderr.puts "Assuming RAW PCM"
0
+ file.rewind
0
         end
0
       end
0
 
0
@@ -157,7 +158,7 @@ module Audio
0
             sub_size -= 4
0
 
0
             sample_type = IFF_ID_SSND
0
- file.read(sub_size)
0
+ file.read(block_offset)
0
             is_aiff = true
0
             break
0
           else
0
@@ -179,7 +180,7 @@ module Audio
0
 
0
         @pcmbitwidth = sample_size
0
         self.num_channels = num_channels
0
- self.in_samplerate = sample_rate
0
+ self.in_samplerate = sample_rate.to_i
0
         self.num_samples = num_sample_frames
0
       end
0
 
...
1
2
 
3
4
 
 
5
6
 
7
8
9
10
 
11
12
13
14
15
16
17
18
19
 
 
 
20
21
22
23
24
 
 
 
 
 
 
 
 
 
 
25
26
27
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
30
31
32
 
33
34
35
...
37
38
39
40
 
41
42
43
...
45
46
47
48
 
49
50
51
...
53
54
55
56
 
57
58
59
...
61
62
63
64
 
65
66
67
...
69
70
71
72
 
73
74
75
...
81
82
83
84
 
85
86
87
...
1
2
3
4
5
6
7
8
 
9
10
11
12
13
14
15
16
17
18
19
20
 
 
 
21
22
23
24
25
26
 
 
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
64
65
66
67
...
69
70
71
 
72
73
74
75
...
77
78
79
 
80
81
82
83
...
85
86
87
 
88
89
90
91
...
93
94
95
 
96
97
98
99
...
101
102
103
 
104
105
106
107
...
113
114
115
 
116
117
118
119
0
@@ -1,35 +1,67 @@
0
 require 'test/unit'
0
 require 'icanhasaudio'
0
+require 'tempfile'
0
 
0
 class MPEGEncoderTest < Test::Unit::TestCase
0
+ include Audio::MPEG
0
+
0
   WAV_FILE = File.dirname(__FILE__) + "/assets/testcase.wav"
0
- AIFF_FILE = File.dirname(__FILE__) + "/assets/cow.aiff"
0
+ #AIFF_FILE = File.dirname(__FILE__) + "/assets/cow.aiff"
0
 
0
   def setup
0
     @encoder = Audio::MPEG::Encoder.new
0
     assert File.exists?(WAV_FILE)
0
+ #assert File.exists?(AIFF_FILE)
0
   end
0
 
0
   def test_encoder_initialize
0
     assert Audio::MPEG::Encoder.new
0
   end
0
   
0
- def test_encode_aiff
0
- File.open('/tmp/out_aiff.mp3', 'wb+') { |outfile|
0
- @encoder.encode(File.open(AIFF_FILE, 'rb'), outfile)
0
+ def test_encode
0
+ File.open("#{Dir::tmpdir}/out.mp3", 'wb+') { |outfile|
0
+ @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
 
0
- def test_encode
0
- File.open('/tmp/out.mp3', 'wb+') { |outfile|
0
+ def test_set_bitrate
0
+ @encoder.bitrate = 128
0
+ assert_equal(128, @encoder.bitrate)
0
+ assert_equal(128, @encoder.vbr_min_bitrate)
0
+ end
0
+
0
+ def test_vbr_type
0
+ @encoder.vbr_type = Encoder::VBR_OFF
0
+ assert_equal(Encoder::VBR_OFF, @encoder.vbr_type)
0
+ File.open("#{Dir::tmpdir}/no_vbr.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
 
0
+ def test_set_min_vbr_bitrate
0
+ @encoder.vbr_min_bitrate = 128
0
+ assert_equal(128, @encoder.vbr_min_bitrate)
0
+ end
0
+
0
+ def test_set_vbr_max_bitrate
0
+ @encoder.vbr_max_bitrate = 128
0
+ assert_equal(128, @encoder.vbr_max_bitrate)
0
+ @encoder.vbr_max_bitrate = 256
0
+ assert_equal(256, @encoder.vbr_max_bitrate)
0
+ end
0
+
0
+ def test_set_vbr_hard_min
0
+ assert_equal(false, @encoder.vbr_hard_min?)
0
+ @encoder.vbr_hard_min = true
0
+ assert_equal(true, @encoder.vbr_hard_min?)
0
+ @encoder.vbr_hard_min = false
0
+ assert_equal(false, @encoder.vbr_hard_min?)
0
+ end
0
+
0
   def test_set_title
0
     @encoder.title = 'tenderlovemaking.com'
0
 
0
- File.open('/tmp/title.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/title.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
@@ -37,7 +69,7 @@ class MPEGEncoderTest < Test::Unit::TestCase
0
   def test_set_artist
0
     @encoder.artist = 'Aaron Patterson'
0
 
0
- File.open('/tmp/artist.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/artist.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
@@ -45,7 +77,7 @@ class MPEGEncoderTest < Test::Unit::TestCase
0
   def test_set_album
0
     @encoder.album = 'Some Album'
0
 
0
- File.open('/tmp/album.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/album.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
@@ -53,7 +85,7 @@ class MPEGEncoderTest < Test::Unit::TestCase
0
   def test_set_year
0
     @encoder.year = 1999
0
 
0
- File.open('/tmp/year.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/year.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
@@ -61,7 +93,7 @@ class MPEGEncoderTest < Test::Unit::TestCase
0
   def test_set_track
0
     @encoder.track = 1
0
 
0
- File.open('/tmp/track.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/track.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
@@ -69,7 +101,7 @@ class MPEGEncoderTest < Test::Unit::TestCase
0
   def test_set_genre
0
     @encoder.genre = 'Porn Groove'
0
 
0
- File.open('/tmp/genre.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/genre.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end
0
@@ -81,7 +113,7 @@ class MPEGEncoderTest < Test::Unit::TestCase
0
     @encoder.year = 2008
0
     @encoder.track = 1
0
     @encoder.genre = 'Rock'
0
- File.open('/tmp/all.mp3', 'wb+') { |outfile|
0
+ File.open("#{Dir::tmpdir}/all.mp3", 'wb+') { |outfile|
0
       @encoder.encode(File.open(WAV_FILE, 'rb'), outfile)
0
     }
0
   end

Comments

    No one has commented yet.