lamer 0.1.0 → 0.1.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.
@@ -0,0 +1,33 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "lamer"
8
+ gem.summary = "Ruby wrapper for the LAME library"
9
+ gem.description = "Ruby wrapper for the LAME library. Currently wraps around the LAME executable so you can use LAME in your Ruby programs."
10
+ gem.email = "mauricio@edge14.com"
11
+ gem.homepage = "http://github.com/mgomes/lamer"
12
+ gem.authors = ["Chris Anderson", "Mauricio Gomes"]
13
+ end
14
+ Jeweler::GemcutterTasks.new
15
+ rescue LoadError
16
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
17
+ end
18
+
19
+ require 'spec/rake/spectask'
20
+ Spec::Rake::SpecTask.new(:spec) do |spec|
21
+ spec.libs << 'lib' << 'spec'
22
+ spec.spec_files = FileList['spec/**/*_spec.rb']
23
+ end
24
+
25
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.pattern = 'spec/**/*_spec.rb'
28
+ spec.rcov = true
29
+ end
30
+
31
+ task :spec => :check_dependencies
32
+
33
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.2
@@ -0,0 +1,55 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{lamer}
8
+ s.version = "0.1.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Chris Anderson", "Mauricio Gomes"]
12
+ s.date = %q{2010-02-09}
13
+ s.description = %q{Ruby wrapper for the LAME library. Currently wraps around the LAME executable so you can use LAME in your Ruby programs.}
14
+ s.email = %q{mauricio@edge14.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "LICENSE",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "lamer.gemspec",
25
+ "lib/lamer.rb",
26
+ "spec/decoding_spec.rb",
27
+ "spec/encoding_spec.rb",
28
+ "spec/lamer_spec.rb",
29
+ "spec/output.mp3",
30
+ "spec/spec_helper.rb",
31
+ "spec/test.mp3"
32
+ ]
33
+ s.homepage = %q{http://github.com/mgomes/lamer}
34
+ s.rdoc_options = ["--charset=UTF-8"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.3.5}
37
+ s.summary = %q{Ruby wrapper for the LAME library}
38
+ s.test_files = [
39
+ "spec/decoding_spec.rb",
40
+ "spec/encoding_spec.rb",
41
+ "spec/lamer_spec.rb",
42
+ "spec/spec_helper.rb"
43
+ ]
44
+
45
+ if s.respond_to? :specification_version then
46
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
50
+ else
51
+ end
52
+ else
53
+ end
54
+ end
55
+
@@ -0,0 +1,119 @@
1
+ class Lamer
2
+
3
+ # These constants come from the LAME documentation
4
+ MP3_Bitrates = [32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
5
+ Sample_Rates = [8, 11.025, 12, 16, 22.05, 24, 32, 44.1, 48]
6
+ Encoding_Quality = (0..9)
7
+ VBR_Quality = (0..6)
8
+ Channels = {:mono => 'm', :stereo => 's', :joint => 'j', :auto => 'a', :mid_side => 'f'}
9
+ Replay_Gain = {:fast => "--replaygain-fast", :accurate => "--replaygain-accurate",
10
+ :none => "--noreplaygain", :clip_detect => "--clipdetect", :default => nil}
11
+
12
+ attr_accessor :options, :id3_options
13
+
14
+ def initialize
15
+ @options = {}
16
+ end
17
+
18
+ def argument_list
19
+ @options.delete :id3_version unless @id3_options
20
+ @options.collect {|k,v| v}.join(' ')
21
+ end
22
+
23
+ def command_line
24
+ raise ArgumentError, "No input file specified." unless @input_file
25
+ ['lame', argument_list, @input_file, @output_file, id3_arguments].select{|x| !(x.nil? || x.empty?)}.join(' ')
26
+ end
27
+
28
+ def convert!
29
+ system command_line
30
+ end
31
+
32
+ # methods for setting options on the encoder
33
+
34
+ def sample_rate(rate)
35
+ raise ArgumentError unless Sample_Rates.include? rate
36
+ @options[:sample_rate] = "--resample #{rate}"
37
+ end
38
+
39
+ def bitrate(kbps)
40
+ raise ArgumentError, "legal bitrates: #{MP3_Bitrates.join(', ')}" unless MP3_Bitrates.include? kbps
41
+ @options[:bitrate] = "-b #{kbps}"
42
+ end
43
+
44
+ def encode_quality(quality)
45
+ quality_keys = Hash.new { |h,k| k }.merge( { :high => 2, :fast => 7 } )
46
+ quality = quality_keys[quality]
47
+ raise ArgumentError, "legal qualities: #{Encoding_Quality.to_a.join(', ')}" unless Encoding_Quality.include? quality
48
+ @options[:encode_quality] = "-q #{quality}"
49
+ end
50
+
51
+ def vbr_quality(quality)
52
+ raise ArgumentError, "legal qualities: #{VBR_Quality.to_a.join(', ')}" unless VBR_Quality.include? quality
53
+ @options[:vbr_quality], @options[:vbr] = "-V #{quality}", "-v"
54
+ end
55
+
56
+ def mode(channels)
57
+ @options[:mode] = Channels[channels] ? "-m #{Channels[channels]}" : nil
58
+ end
59
+
60
+ def replay_gain(gain)
61
+ @options[:replay_gain] = Replay_Gain[gain]
62
+ end
63
+
64
+ # options for dealing with the input and output files
65
+
66
+ def input_file(filename)
67
+ @input_file = filename
68
+ mark_as_copy! if filename =~ /\.mp3$/
69
+ end
70
+
71
+ def output_file(filename)
72
+ @output_file = filename
73
+ end
74
+
75
+ def decode_mp3!
76
+ @options.clear
77
+ @options[:decode_mp3] = "--decode"
78
+ end
79
+
80
+ def output_ogg!
81
+ @options[:output_ogg] = "--ogg"
82
+ end
83
+
84
+ def input_mp3!
85
+ @options[:input_mp3] = "--mp3input"
86
+ mark_as_copy!
87
+ end
88
+
89
+ def input_raw(sample_rate, swapbytes = false)
90
+ @options[:input_raw] = "-r -s #{sample_rate}#{' -x' if swapbytes}"
91
+ end
92
+
93
+ def mark_as_copy!
94
+ @options[:copy] = "-o"
95
+ end
96
+
97
+ # id3 options
98
+
99
+ def id3 options
100
+ @id3_options = @id3_options ? @id3_options.merge(options) : options
101
+ end
102
+
103
+ def id3_arguments
104
+ id3_fields = { :title => 'tt', :artist => 'ta', :album => 'tl',
105
+ :year => 'ty', :comment => 'tc', :track_number => 'tn',
106
+ :genre => 'tg' }
107
+ return nil if @id3_options.nil? || @id3_options.empty?
108
+ @id3_options.select{|k,v| id3_fields[k]}.collect {|k,v| "--#{id3_fields[k]} #{v}"}.join(' ')
109
+ end
110
+
111
+ def id3_version_only version
112
+ @options[:id3_version] = "--id3v#{version}-only"
113
+ end
114
+
115
+ def id3_add_v2!
116
+ @options[:id3_version] = "--add-id3v2"
117
+ end
118
+
119
+ end
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "A Lamer, used for decoding," do
4
+ before(:each) do
5
+ @la = Lamer.new
6
+ end
7
+
8
+ it "should decode mp3s" do
9
+ @la.decode_mp3!
10
+ @la.options[:decode_mp3].should == "--decode"
11
+ end
12
+
13
+ it "should decode mp3s without other options" do
14
+ @la.vbr_quality 4
15
+ @la.decode_mp3!
16
+ @la.options.length.should == 1
17
+ end
18
+ end
@@ -0,0 +1,161 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "A high-quality VBR encoder without a file" do
4
+
5
+ before(:each) do
6
+ @la = Lamer.new
7
+ @la.vbr_quality 4
8
+ @la.sample_rate 44.1
9
+ end
10
+
11
+ it "should ouput the correct command line options" do
12
+ [ /-v/,/-V 4/,/--resample 44\.1/].each do |match|
13
+ @la.argument_list.should =~ match
14
+ end
15
+ end
16
+
17
+ it "should balk at returning the command line" do
18
+ lambda {@la.command_line}.should raise_error(ArgumentError)
19
+ end
20
+
21
+ it "should balk at running the conversion" do
22
+ lambda {@la.convert!}.should raise_error(ArgumentError)
23
+ end
24
+
25
+ end
26
+
27
+ describe "An encoder with a file specified" do
28
+
29
+ before(:each) do
30
+ @la = Lamer.new
31
+ @la.input_file "/Path/to/my/audio_file.wav"
32
+ end
33
+
34
+ it "should provide the right command line" do
35
+ @la.command_line.should == "lame /Path/to/my/audio_file.wav"
36
+ end
37
+
38
+ end
39
+
40
+ describe "An encoder with options and an input and output file specified" do
41
+
42
+ before(:each) do
43
+ @la = Lamer.new
44
+ @la.encode_quality :high
45
+ @la.input_file "/Path/to/my/audio_file.wav"
46
+ @la.output_file "/Path/to/my/audio_file.mp3"
47
+ end
48
+
49
+ it "should provide the right command line" do
50
+ @la.command_line.should == "lame -q 2 /Path/to/my/audio_file.wav /Path/to/my/audio_file.mp3"
51
+ end
52
+
53
+ end
54
+
55
+ describe "An encoder sent various id3 information" do
56
+
57
+ before(:each) do
58
+ @la = Lamer.new
59
+ end
60
+
61
+ it "should set the title" do
62
+ @la.id3 :title => "The All-Knowning Mind of Minolta"
63
+ @la.id3_options[:title].should == "The All-Knowning Mind of Minolta"
64
+ @la.id3_arguments.should == "--tt The All-Knowning Mind of Minolta"
65
+ end
66
+
67
+ it "should set multiple values" do
68
+ @la.id3 :title => "The All-Knowning Mind of Minolta"
69
+ @la.id3 :artist => "Tin Man Shuffler"
70
+ @la.id3_options[:title].should == "The All-Knowning Mind of Minolta"
71
+ @la.id3_options[:artist].should == "Tin Man Shuffler"
72
+ @la.id3_arguments.should =~ /--tt The All-Knowning Mind of Minolta/
73
+ @la.id3_arguments.should =~ /--ta Tin Man Shuffler/
74
+ end
75
+
76
+ it "should set the title, artist, album, year, comment, track number, and genre" do
77
+ @la.id3 :title => 'title', :artist => 'artist', :album => 'album',
78
+ :year => 1998, :comment => 'comment', :track_number => 1,
79
+ :genre => 'genre'
80
+ [/--tt title/,/--ta artist/, /--tl album/,/--ty 1998/,/--tc comment/,/--tn 1/,/--tg genre/].each do |match|
81
+ @la.id3_arguments.should =~ match
82
+ end
83
+ end
84
+
85
+ it "should ignore nonsense values" do
86
+ @la.id3 :bugz => "Not Real"
87
+ @la.id3_arguments.should_not =~ /Real/
88
+ @la.id3 :title => "Coolbeans"
89
+ @la.id3_arguments.should =~ /Coolbeans/
90
+ end
91
+
92
+ it "should add v1 or v2 id3 tags as requested" do
93
+ 2.times do |n|
94
+ @la.id3_version_only n
95
+ @la.options[:id3_version].should == "--id3v#{n}-only"
96
+ end
97
+ end
98
+
99
+ it "should allow adding v2 tags on top of default behaviour" do
100
+ @la.id3_add_v2!
101
+ @la.options[:id3_version].should == "--add-id3v2"
102
+ end
103
+
104
+ it "should not output id3_version unless tags are set" do
105
+ @la.id3_version_only 1
106
+ @la.argument_list.should == ""
107
+ end
108
+
109
+ describe "An encoder with id3 options and an input file" do
110
+ before(:each) do
111
+ @la = Lamer.new
112
+ @la.id3 :title => 'title', :artist => 'artist', :album => 'album',
113
+ :year => 1998, :comment => 'comment', :track_number => 1,
114
+ :genre => 'genre'
115
+ @la.input_file File.join( File.dirname( __FILE__ ), 'test.mp3' )
116
+ end
117
+
118
+ it "should output those options to the command line" do
119
+ [/--tt title/,/--ta artist/, /--tl album/,/--ty 1998/,/--tc comment/,/--tn 1/,/--tg genre/].each do |match|
120
+ @la.command_line.should =~ match
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "An encoder starting with an mp3 file" do
126
+ before(:each) do
127
+ @root = './spec/'
128
+ begin
129
+ File.delete File.join( File.dirname( __FILE__ ), 'output.mp3' )
130
+ rescue
131
+ end
132
+ @la = Lamer.new
133
+ @la.input_file "#{@root}test.mp3"
134
+ @la.output_file "#{@root}output.mp3"
135
+ @la.input_mp3!
136
+ end
137
+
138
+ it "should provide the right command line" do
139
+ [/lame/,/--mp3input/, /-o/,/#{@root}test.mp3/,/#{@root}output.mp3/].each do |match|
140
+ @la.command_line.should =~ match
141
+ end
142
+ end
143
+
144
+ it "should successfully output a low bitrate version" do
145
+ @la.bitrate 32
146
+ @la.mode :mono
147
+ File.exists?("#{@root}output.mp3").should == false
148
+ @la.convert!
149
+ File.exists?("#{@root}output.mp3").should == true
150
+ end
151
+ end
152
+
153
+ describe "The runtime environment" do
154
+ it "should have lame version 3.9x installed" do
155
+ version = `lame --help`
156
+ version.should =~ /LAME/
157
+ version.should =~ /3\.9+/
158
+ end
159
+ end
160
+
161
+ end
@@ -0,0 +1,126 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "A new Lamer" do
4
+
5
+ before(:each) do
6
+ @la = Lamer.new
7
+ end
8
+
9
+ it "should have a blank argument list" do
10
+ @la.argument_list.empty?.should == true
11
+ end
12
+
13
+ it "should record valid bitrates" do
14
+ @la.bitrate 128
15
+ @la.options[:bitrate].should == "-b 128"
16
+ end
17
+
18
+ it "should record valid sample rates" do
19
+ @la.sample_rate 44.1
20
+ @la.options[:sample_rate].should == "--resample 44.1"
21
+ end
22
+
23
+ it "should record valid VBR quality" do
24
+ @la.vbr_quality 5
25
+ @la.options[:vbr_quality].should == "-V 5"
26
+ @la.options[:vbr].should == "-v"
27
+ end
28
+
29
+ it "should record valid quality" do
30
+ @la.encode_quality 1
31
+ @la.options[:encode_quality].should == "-q 1"
32
+ end
33
+
34
+ it "should record valid quality" do
35
+ @la.encode_quality 5
36
+ @la.options[:encode_quality].should == "-q 5"
37
+ end
38
+
39
+ it "should record valid quality shortcut" do
40
+ @la.encode_quality :high
41
+ @la.options[:encode_quality].should == "-q 2"
42
+ @la.encode_quality :fast
43
+ @la.options[:encode_quality].should == "-q 7"
44
+ end
45
+
46
+ it "should balk at invalid bitrates" do
47
+ lambda {@la.bitrate 113}.should raise_error(ArgumentError)
48
+ end
49
+
50
+ it "should balk at invalid sample rates" do
51
+ lambda {@la.sample_rate 113}.should raise_error(ArgumentError)
52
+ end
53
+
54
+ it "should balk at invalid VBR qualities" do
55
+ lambda {@la.vbr_quality 113}.should raise_error(ArgumentError)
56
+ end
57
+
58
+ it "should balk at invalid encode qualities" do
59
+ lambda {@la.encode_quality 113}.should raise_error(ArgumentError)
60
+ end
61
+
62
+ it "should set mode to stereo or mono" do
63
+ {:stereo => '-m s', :mono => '-m m', :joint => '-m j'}.each do |option, setting|
64
+ @la.mode option
65
+ @la.options[:mode].should == setting
66
+ end
67
+ end
68
+
69
+ it "should set mode to nil on bad option" do
70
+ @la.mode :bugz
71
+ @la.options[:mode].should == nil
72
+ end
73
+
74
+ it "should accept flag that input is mp3" do
75
+ @la.input_mp3!
76
+ @la.options[:input_mp3].should == "--mp3input"
77
+ end
78
+
79
+ it "should accept an input filename" do
80
+ @la.input_file "/Path/to/my/audio_file.wav"
81
+ @la.command_line.should == "lame /Path/to/my/audio_file.wav"
82
+ end
83
+
84
+ it "should accept replygain options" do
85
+ {:accurate => "--replaygain-accurate",
86
+ :fast => "--replaygain-fast",
87
+ :none => "--noreplaygain",
88
+ :clip_detect => "--clipdetect",
89
+ :default => nil
90
+ }.each do |option, setting|
91
+ @la.replay_gain option
92
+ @la.options[:replay_gain].should == setting
93
+ end
94
+ end
95
+
96
+ it "should accept raw PCM files" do
97
+ @la.input_raw 44.1
98
+ @la.options[:input_raw].should == "-r -s 44.1"
99
+ @la.input_raw 32, true
100
+ @la.options[:input_raw].should == "-r -s 32 -x"
101
+ end
102
+
103
+ it "should mark as copy when requested" do
104
+ @la.mark_as_copy!
105
+ @la.options[:copy].should == "-o"
106
+ end
107
+ it "should mark as copy when starting from a file ending in .mp3" do
108
+ @la.input_file "/Path/to/my/audio_file.mp3"
109
+ @la.options[:copy].should == "-o"
110
+ end
111
+ it "should mark as copy when starting from an mp3 file" do
112
+ @la.input_mp3!
113
+ @la.options[:copy].should == "-o"
114
+ end
115
+ it "should not mark as copy when starting from a file not ending in .mp3" do
116
+ @la.input_file "/Path/to/my/audio_file.aif"
117
+ @la.options[:copy].should == nil
118
+ end
119
+
120
+ it "should output ogg files when requested" do
121
+ @la.output_ogg!
122
+ @la.options[:output_ogg].should == "--ogg"
123
+ end
124
+
125
+ end
126
+
Binary file
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+
3
+ def smart_require(lib_name, gem_name, gem_version = '>= 0.0.0')
4
+ begin
5
+ require lib_name if lib_name
6
+ rescue LoadError
7
+ if gem_name
8
+ gem gem_name, gem_version
9
+ require lib_name if lib_name
10
+ end
11
+ end
12
+ end
13
+
14
+ smart_require 'spec', 'spec', '>= 1.2.6'
15
+
16
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/lamer'))
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lamer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Anderson
@@ -14,7 +14,7 @@ date: 2010-02-09 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
17
- description: Ruby wrapper for the LAME library
17
+ description: Ruby wrapper for the LAME library. Currently wraps around the LAME executable so you can use LAME in your Ruby programs.
18
18
  email: mauricio@edge14.com
19
19
  executables: []
20
20
 
@@ -24,9 +24,18 @@ extra_rdoc_files:
24
24
  - LICENSE
25
25
  - README.md
26
26
  files:
27
- - VERSION
28
27
  - LICENSE
29
28
  - README.md
29
+ - Rakefile
30
+ - VERSION
31
+ - lamer.gemspec
32
+ - lib/lamer.rb
33
+ - spec/decoding_spec.rb
34
+ - spec/encoding_spec.rb
35
+ - spec/lamer_spec.rb
36
+ - spec/output.mp3
37
+ - spec/spec_helper.rb
38
+ - spec/test.mp3
30
39
  has_rdoc: true
31
40
  homepage: http://github.com/mgomes/lamer
32
41
  licenses: []
@@ -56,4 +65,7 @@ signing_key:
56
65
  specification_version: 3
57
66
  summary: Ruby wrapper for the LAME library
58
67
  test_files:
59
- - spec/lame_encoder_spec.rb
68
+ - spec/decoding_spec.rb
69
+ - spec/encoding_spec.rb
70
+ - spec/lamer_spec.rb
71
+ - spec/spec_helper.rb
@@ -1,302 +0,0 @@
1
- $: << File.join( File.dirname( __FILE__ ), '../lib' )
2
-
3
- require 'rubygems'
4
- require_gem 'rspec'
5
- require 'lame_encoder'
6
-
7
- context "A new LameEncoder" do
8
-
9
- setup do
10
- @la = LameEncoder.new
11
- end
12
-
13
- specify "has a blank argument list" do
14
- @la.argument_list.should_be_empty
15
- end
16
-
17
- specify "records valid bitrates" do
18
- @la.bitrate 128
19
- @la.options[:bitrate].should_equal "-b 128"
20
- end
21
-
22
- specify "records valid sample rate" do
23
- @la.sample_rate 44.1
24
- @la.options[:sample_rate].should_equal "--resample 44.1"
25
- end
26
-
27
- specify "records valid VBR quality" do
28
- @la.vbr_quality 5
29
- @la.options[:vbr_quality].should_equal "-V 5"
30
- @la.options[:vbr].should_equal "-v"
31
- end
32
-
33
- specify "records valid quality" do
34
- @la.encode_quality 1
35
- @la.options[:encode_quality].should_equal "-q 1"
36
- end
37
-
38
- specify "records valid quality" do
39
- @la.encode_quality 5
40
- @la.options[:encode_quality].should_equal "-q 5"
41
- end
42
-
43
- specify "records valid quality shortcut" do
44
- @la.encode_quality :high
45
- @la.options[:encode_quality].should_equal "-q 2"
46
- @la.encode_quality :fast
47
- @la.options[:encode_quality].should_equal "-q 7"
48
- end
49
-
50
- specify "balks at invalid bitrate" do
51
- lambda {@la.bitrate 113}.should_raise ArgumentError
52
- end
53
-
54
- specify "balks at invalid sample rate" do
55
- lambda {@la.sample_rate 113}.should_raise ArgumentError
56
- end
57
-
58
- specify "balks at invalid VBR quality" do
59
- lambda {@la.vbr_quality 113}.should_raise ArgumentError
60
- end
61
-
62
- specify "balks at invalid encode quality" do
63
- lambda {@la.encode_quality 113}.should_raise ArgumentError
64
- end
65
-
66
- specify "sets mode to stereo or mono" do
67
- {:stereo => '-m s', :mono => '-m m', :joint => '-m j'}.each do |option, setting|
68
- @la.mode option
69
- @la.options[:mode].should_equal setting
70
- end
71
- end
72
-
73
- specify "sets mode to nil on bad option" do
74
- @la.mode :bugz
75
- @la.options[:mode].should_be nil
76
- end
77
-
78
- specify "decodes mp3s" do
79
- @la.decode_mp3!
80
- @la.options[:decode_mp3].should_equal "--decode"
81
- lambda {@la.options[:new_value] = 'something'}.should_raise TypeError
82
- end
83
-
84
- specify "decodes mp3s without other options" do
85
- @la.vbr_quality 4
86
- @la.decode_mp3!
87
- @la.options.length.should_equal 1
88
- end
89
-
90
- specify "accepts flag that input is mp3" do
91
- @la.input_mp3!
92
- @la.options[:input_mp3].should_equal "--mp3input"
93
- end
94
-
95
- specify "accepts an input filename" do
96
- @la.input_file "/Path/to/my/audio_file.wav"
97
- @la.command_line.should_equal "lame /Path/to/my/audio_file.wav"
98
- end
99
-
100
- specify "accepts replygain options" do
101
- {:accurate => "--replaygain-accurate",
102
- :fast => "--replaygain-fast",
103
- :none => "--noreplaygain",
104
- :clip_detect => "--clipdetect",
105
- :default => nil
106
- }.each do |option, setting|
107
- @la.replay_gain option
108
- @la.options[:replay_gain].should_equal setting
109
- end
110
- end
111
-
112
- specify "accepts raw PCM files" do
113
- @la.input_raw 44.1
114
- @la.options[:input_raw].should_equal "-r -s 44.1"
115
- @la.input_raw 32, true
116
- @la.options[:input_raw].should_equal "-r -s 32 -x"
117
- end
118
-
119
- specify "marks as copy when requested" do
120
- @la.mark_as_copy!
121
- @la.options[:copy].should_equal "-o"
122
- end
123
- specify "marks as copy when starting from a file ending in .mp3" do
124
- @la.input_file "/Path/to/my/audio_file.mp3"
125
- @la.options[:copy].should_equal "-o"
126
- end
127
- specify "marks as copy when starting from an mp3 file" do
128
- @la.input_mp3!
129
- @la.options[:copy].should_equal "-o"
130
- end
131
- specify "does not mark as copy when starting from a file not ending in .mp3" do
132
- @la.input_file "/Path/to/my/audio_file.aif"
133
- @la.options[:copy].should_be_nil
134
- end
135
-
136
- specify "outputs ogg files when requested" do
137
- @la.output_ogg!
138
- @la.options[:output_ogg].should_equal "--ogg"
139
- end
140
-
141
- end
142
-
143
- context "A high-quality VBR encoder without a file" do
144
-
145
- setup do
146
- @la = LameEncoder.new
147
- @la.vbr_quality 4
148
- @la.sample_rate 44.1
149
- end
150
-
151
- specify "ouputs the correct command line options" do
152
- [ /-v/,/-V 4/,/--resample 44\.1/].each do |match|
153
- @la.argument_list.should_match match
154
- end
155
- end
156
-
157
- specify "balks at returning the command line" do
158
- lambda {@la.command_line}.should_raise ArgumentError
159
- end
160
-
161
- specify "balks at running the conversion" do
162
- lambda {@la.convert!}.should_raise ArgumentError
163
- end
164
-
165
- end
166
-
167
- context "An encoder with a file specified" do
168
-
169
- setup do
170
- @la = LameEncoder.new
171
- @la.input_file "/Path/to/my/audio_file.wav"
172
- end
173
-
174
- specify "provides the right command line" do
175
- @la.command_line.should_equal "lame /Path/to/my/audio_file.wav"
176
- end
177
-
178
- end
179
-
180
- context "An encoder with options and an input and output file specified" do
181
-
182
- setup do
183
- @la = LameEncoder.new
184
- @la.encode_quality :high
185
- @la.input_file "/Path/to/my/audio_file.wav"
186
- @la.output_file "/Path/to/my/audio_file.mp3"
187
- end
188
-
189
- specify "provides the right command line" do
190
- @la.command_line.should_equal "lame -q 2 /Path/to/my/audio_file.wav /Path/to/my/audio_file.mp3"
191
- end
192
-
193
- end
194
-
195
- context "An encoder sent various id3 information" do
196
-
197
- setup do
198
- @la = LameEncoder.new
199
- end
200
-
201
- specify "sets the title" do
202
- @la.id3 :title => "The All-Knowning Mind of Minolta"
203
- @la.id3_options[:title].should_equal "The All-Knowning Mind of Minolta"
204
- @la.id3_arguments.should_equal "--tt The All-Knowning Mind of Minolta"
205
- end
206
-
207
- specify "sets multiple values" do
208
- @la.id3 :title => "The All-Knowning Mind of Minolta"
209
- @la.id3 :artist => "Tin Man Shuffler"
210
- @la.id3_options[:title].should_equal "The All-Knowning Mind of Minolta"
211
- @la.id3_options[:artist].should_equal "Tin Man Shuffler"
212
- @la.id3_arguments.should_match /--tt The All-Knowning Mind of Minolta/
213
- @la.id3_arguments.should_match /--ta Tin Man Shuffler/
214
- end
215
-
216
- specify "sets title, artist, album, year, comment, track number, and genre" do
217
- @la.id3 :title => 'title', :artist => 'artist', :album => 'album',
218
- :year => 1998, :comment => 'comment', :track_number => 1,
219
- :genre => 'genre'
220
- [/--tt title/,/--ta artist/, /--tl album/,/--ty 1998/,/--tc comment/,/--tn 1/,/--tg genre/].each do |match|
221
- @la.id3_arguments.should_match match
222
- end
223
- end
224
-
225
- specify "ignores nonsense values" do
226
- @la.id3 :bugz => "Not Real"
227
- @la.id3_arguments.should_not_match /Real/
228
- @la.id3 :title => "Coolbeans"
229
- @la.id3_arguments.should_match /Coolbeans/
230
- end
231
-
232
- specify "adds v1 or v2 id3 tags as requested" do
233
- 2.times do |n|
234
- @la.id3_version_only n
235
- @la.options[:id3_version].should_equal "--id3v#{n}-only"
236
- end
237
- end
238
-
239
- specify "allows adding v2 tags on top of default behaviour" do
240
- @la.id3_add_v2!
241
- @la.options[:id3_version].should_equal "--add-id3v2"
242
- end
243
-
244
- specify "does not output id3_version unless tags are set" do
245
- @la.id3_version_only 1
246
- @la.argument_list.should_equal ""
247
- end
248
-
249
- context "An encoder with id3 options and an input file" do
250
- setup do
251
- @la = LameEncoder.new
252
- @la.id3 :title => 'title', :artist => 'artist', :album => 'album',
253
- :year => 1998, :comment => 'comment', :track_number => 1,
254
- :genre => 'genre'
255
- @la.input_file File.join( File.dirname( __FILE__ ), 'test.mp3' )
256
- end
257
-
258
- specify "outputs those options to the command line" do
259
- [/--tt title/,/--ta artist/, /--tl album/,/--ty 1998/,/--tc comment/,/--tn 1/,/--tg genre/].each do |match|
260
- @la.command_line.should_match match
261
- end
262
- end
263
- end
264
-
265
- context "An encoder starting with an mp3 file" do
266
- setup do
267
- @root = './spec/'
268
- begin
269
- File.delete File.join( File.dirname( __FILE__ ), 'output.mp3' )
270
- rescue
271
- end
272
- @la = LameEncoder.new
273
- @la.input_file "#{@root}test.mp3"
274
- @la.output_file "#{@root}output.mp3"
275
- @la.input_mp3!
276
- end
277
-
278
- specify "provides the right command line" do
279
- [/lame/,/--mp3input/, /-o/,/#{@root}test.mp3/,/#{@root}output.mp3/].each do |match|
280
- @la.command_line.should_match match
281
- end
282
- end
283
-
284
- specify "successfully outputs a low bitrate version" do
285
- @la.bitrate 32
286
- @la.mode :mono
287
- File.should_not_exist "#{@root}output.mp3"
288
- @la.convert!
289
- File.should_exist "#{@root}output.mp3"
290
- end
291
- end
292
-
293
- context "The runtime environment" do
294
- specify "should have lame version 3.96 installed" do
295
- version = `lame --help`
296
- version.should_match /LAME/
297
- version.should_match /3\.96/
298
- end
299
- end
300
-
301
- end
302
-