lame 0.0.3 → 0.0.5
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/.github/workflows/ci.yml +47 -0
- data/.travis.yml +3 -4
- data/README.md +51 -19
- data/docs/lame-3.101.h +1357 -0
- data/lame.gemspec +2 -1
- data/lib/lame/buffer.rb +1 -1
- data/lib/lame/encoder.rb +10 -11
- data/lib/lame/encoding/interleaved_int_buffer_encoder.rb +15 -0
- data/lib/lame/encoding/long_buffer_encoder.rb +1 -1
- data/lib/lame/encoding/stereo_buffer_encoder.rb +1 -0
- data/lib/lame/ffi/functions.rb +99 -38
- data/lib/lame/ffi.rb +2 -0
- data/lib/lame/version.rb +1 -1
- data/lib/lame.rb +2 -0
- data/spec/buffer_spec.rb +8 -8
- data/spec/configuration_spec.rb +76 -76
- data/spec/decoder_spec.rb +34 -34
- data/spec/decoding/decoded_frame_spec.rb +7 -7
- data/spec/decoding/id3_tag_parser_spec.rb +3 -3
- data/spec/decoding/mp3_data_header_parser_spec.rb +21 -21
- data/spec/decoding/mpeg_audio_frame_finder_spec.rb +15 -15
- data/spec/decoding/mpeg_audio_frame_matcher_spec.rb +2 -2
- data/spec/decoding/single_frame_decoder_spec.rb +36 -35
- data/spec/decoding/stream_decoder_spec.rb +10 -10
- data/spec/delegation_spec.rb +37 -37
- data/spec/encoder_spec.rb +100 -100
- data/spec/encoding/flusher_spec.rb +16 -16
- data/spec/encoding/id3_spec.rb +38 -38
- data/spec/encoding/interleaved_buffer_encoder_spec.rb +32 -25
- data/spec/encoding/stereo_buffer_encoder_spec.rb +34 -33
- data/spec/encoding/vbr_info_spec.rb +16 -16
- data/spec/ffi/decode_flags_spec.rb +3 -2
- data/spec/ffi/encoding_spec.rb +22 -22
- data/spec/ffi/global_flags_spec.rb +166 -160
- data/spec/ffi/id3tag_spec.rb +26 -26
- data/spec/ffi/mp3_data_spec.rb +3 -3
- data/spec/integration/encoding_spec.rb +75 -3
- data/spec/integration/id3_tags_spec.rb +18 -18
- data/spec/lib/custom_matchers.rb +4 -4
- data/spec/lib/wave_file_generator.rb +9 -9
- data/spec/spec_helper.rb +14 -10
- metadata +58 -67
data/spec/ffi/id3tag_spec.rb
CHANGED
|
@@ -20,75 +20,75 @@ module LAME
|
|
|
20
20
|
|
|
21
21
|
LAME.id3tag_genre_list(genre_collector_callback, nil)
|
|
22
22
|
|
|
23
|
-
genres.
|
|
24
|
-
genres[0].
|
|
25
|
-
genres[147].
|
|
23
|
+
expect(genres.length).to be(148)
|
|
24
|
+
expect(genres[0]).to eql "Blues"
|
|
25
|
+
expect(genres[147]).to eql "SynthPop"
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
it "initializes" do
|
|
29
|
-
LAME.id3tag_init(@flags_pointer).
|
|
29
|
+
expect(LAME.id3tag_init(@flags_pointer)).to eql nil
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
it "adds v2" do
|
|
33
|
-
LAME.id3tag_add_v2(@flags_pointer).
|
|
33
|
+
expect(LAME.id3tag_add_v2(@flags_pointer)).to eql nil
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
it "set v1 only" do
|
|
37
|
-
LAME.id3tag_v1_only(@flags_pointer).
|
|
37
|
+
expect(LAME.id3tag_v1_only(@flags_pointer)).to eql nil
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it "set v2 only" do
|
|
41
|
-
LAME.id3tag_v2_only(@flags_pointer).
|
|
41
|
+
expect(LAME.id3tag_v2_only(@flags_pointer)).to eql nil
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
it "pads with spaces" do
|
|
45
|
-
LAME.id3tag_space_v1(@flags_pointer).
|
|
45
|
+
expect(LAME.id3tag_space_v1(@flags_pointer)).to eql nil
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "pads v2 with 128 extra bytes" do
|
|
49
|
-
LAME.id3tag_pad_v2(@flags_pointer).
|
|
49
|
+
expect(LAME.id3tag_pad_v2(@flags_pointer)).to eql nil
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
it "pads v2 with extra bytes" do
|
|
53
|
-
LAME.id3tag_set_pad(@flags_pointer, 256).
|
|
53
|
+
expect(LAME.id3tag_set_pad(@flags_pointer, 256)).to eql nil
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "sets the title" do
|
|
57
|
-
LAME.id3tag_set_title(@flags_pointer, pointer_from_string("foo")).
|
|
57
|
+
expect(LAME.id3tag_set_title(@flags_pointer, pointer_from_string("foo"))).to eql nil
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
it "sets the artist" do
|
|
61
|
-
LAME.id3tag_set_artist(@flags_pointer, pointer_from_string("foo")).
|
|
61
|
+
expect(LAME.id3tag_set_artist(@flags_pointer, pointer_from_string("foo"))).to eql nil
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
it "sets the album" do
|
|
65
|
-
LAME.id3tag_set_album(@flags_pointer, pointer_from_string("foo")).
|
|
65
|
+
expect(LAME.id3tag_set_album(@flags_pointer, pointer_from_string("foo"))).to eql nil
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
it "sets the year" do
|
|
69
|
-
LAME.id3tag_set_year(@flags_pointer, pointer_from_string("foo")).
|
|
69
|
+
expect(LAME.id3tag_set_year(@flags_pointer, pointer_from_string("foo"))).to eql nil
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
it "sets the comment" do
|
|
73
|
-
LAME.id3tag_set_comment(@flags_pointer, pointer_from_string("foo")).
|
|
73
|
+
expect(LAME.id3tag_set_comment(@flags_pointer, pointer_from_string("foo"))).to eql nil
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
it "sets the track" do
|
|
77
|
-
LAME.id3tag_set_track(@flags_pointer, pointer_from_string("1")).
|
|
77
|
+
expect(LAME.id3tag_set_track(@flags_pointer, pointer_from_string("1"))).to eql 0
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
it "ignores out of range track numbers for id3" do
|
|
81
|
-
LAME.id3tag_set_track(@flags_pointer, pointer_from_string("256")).
|
|
81
|
+
expect(LAME.id3tag_set_track(@flags_pointer, pointer_from_string("256"))).to eql -1
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
it "sets the genre" do
|
|
85
|
-
LAME.id3tag_set_genre(@flags_pointer, pointer_from_string("Rock")).
|
|
85
|
+
expect(LAME.id3tag_set_genre(@flags_pointer, pointer_from_string("Rock"))).to eql 0
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
# There is a fixed set of allowed fields (see id3tag.c)
|
|
89
89
|
# LAME 3.99.4 fixed some bugs in setting field values, this could crash for certain tags.
|
|
90
90
|
it "sets the fieldvalue" do
|
|
91
|
-
LAME.id3tag_set_fieldvalue(@flags_pointer, pointer_from_string("TIT2=foofoo")).
|
|
91
|
+
expect(LAME.id3tag_set_fieldvalue(@flags_pointer, pointer_from_string("TIT2=foofoo"))).to eql 0
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
# it "sets the fieldvalue (utf16)" do
|
|
@@ -100,10 +100,10 @@ module LAME
|
|
|
100
100
|
|
|
101
101
|
# fake JPG image
|
|
102
102
|
buffer = ::FFI::MemoryPointer.new(:char, buffer_size)
|
|
103
|
-
buffer.
|
|
104
|
-
buffer.
|
|
103
|
+
buffer.put_uint8(0, 0xff)
|
|
104
|
+
buffer.put_uint8(1, 0xd8)
|
|
105
105
|
|
|
106
|
-
LAME.id3tag_set_albumart(@flags_pointer, buffer, buffer_size).
|
|
106
|
+
expect(LAME.id3tag_set_albumart(@flags_pointer, buffer, buffer_size)).to eql 0
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
it "creates id3v1 tag" do
|
|
@@ -111,7 +111,7 @@ module LAME
|
|
|
111
111
|
buffer = ::FFI::MemoryPointer.new(:uchar, buffer_size)
|
|
112
112
|
LAME.id3tag_set_title(@flags_pointer, pointer_from_string("foo"))
|
|
113
113
|
LAME.id3tag_set_album(@flags_pointer, pointer_from_string("bar"))
|
|
114
|
-
LAME.lame_get_id3v1_tag(@flags_pointer, buffer, buffer_size).
|
|
114
|
+
expect(LAME.lame_get_id3v1_tag(@flags_pointer, buffer, buffer_size)).to eql 128
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
it "creates id3v2 tag" do
|
|
@@ -120,15 +120,15 @@ module LAME
|
|
|
120
120
|
LAME.id3tag_add_v2(@flags_pointer)
|
|
121
121
|
LAME.id3tag_set_title(@flags_pointer, pointer_from_string("foo"))
|
|
122
122
|
LAME.id3tag_set_album(@flags_pointer, pointer_from_string("bar"))
|
|
123
|
-
LAME.lame_get_id3v2_tag(@flags_pointer, buffer, buffer_size).
|
|
123
|
+
expect(LAME.lame_get_id3v2_tag(@flags_pointer, buffer, buffer_size)).to eql 38
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
it "sets id3tag automatic" do
|
|
127
|
-
LAME.
|
|
127
|
+
expect(LAME).to have_flag(:write_id3tag_automatic).with_value(1).for(@flags_pointer)
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
it "gets id3tag automatic" do
|
|
131
|
-
LAME.
|
|
131
|
+
expect(LAME).to be_able_to_set(:write_id3tag_automatic).to(0).for(@flags_pointer).and_return(nil)
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
end
|
data/spec/ffi/mp3_data_spec.rb
CHANGED
|
@@ -8,17 +8,17 @@ module LAME
|
|
|
8
8
|
|
|
9
9
|
it "is stereo for two channels" do
|
|
10
10
|
mp3_data[:stereo] = 2
|
|
11
|
-
mp3_data.channel_mode.
|
|
11
|
+
expect(mp3_data.channel_mode).to eql :stereo
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "is mono for one channel" do
|
|
15
15
|
mp3_data[:stereo] = 1
|
|
16
|
-
mp3_data.channel_mode.
|
|
16
|
+
expect(mp3_data.channel_mode).to eql :mono
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
it "has a sample rate" do
|
|
20
20
|
mp3_data[:samplerate] = 44100
|
|
21
|
-
mp3_data.sample_rate.
|
|
21
|
+
expect(mp3_data.sample_rate).to eql 44100
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
end
|
|
@@ -4,13 +4,19 @@ require 'wavefile'
|
|
|
4
4
|
|
|
5
5
|
describe "Encoding", :slow => true do
|
|
6
6
|
|
|
7
|
+
# regular 16-bit, 44.1kHz sine wave:
|
|
7
8
|
let(:wav_file) { WaveFileGenerator.new(:length => 2).generate }
|
|
8
9
|
let(:wav_path) { wav_file.path }
|
|
10
|
+
let(:wav_reader) { WaveFile::Reader.new(wav_path) }
|
|
11
|
+
|
|
12
|
+
# 24-bit, 192kHz sine wave:
|
|
13
|
+
let(:wav_file_24) { WaveFileGenerator.new(length: 2, bits: 24, sample_rate: 192000).generate }
|
|
14
|
+
let(:wav_path_24) { wav_file_24.path }
|
|
15
|
+
let(:wav_reader_24) { WaveFile::Reader.new(wav_path_24) }
|
|
16
|
+
|
|
9
17
|
let(:mp3_path_raw) { Tempfile.new("output-raw.mp3") }
|
|
10
18
|
let(:mp3_path_api) { Tempfile.new("output-api.mp3") }
|
|
11
19
|
|
|
12
|
-
let(:wav_reader) { WaveFile::Reader.new(wav_path) }
|
|
13
|
-
|
|
14
20
|
it "encodes a file by api" do
|
|
15
21
|
|
|
16
22
|
encoder = LAME::Encoder.new
|
|
@@ -87,7 +93,7 @@ describe "Encoding", :slow => true do
|
|
|
87
93
|
# Digest::MD5.hexdigest(File.read(mp3_path_api)).should eql "d1cd92c106e7aac4f5291fd141a19e10"
|
|
88
94
|
end
|
|
89
95
|
|
|
90
|
-
# This test serves as an example how to use the LAME API
|
|
96
|
+
# This test serves as an example how to use the LAME C-API
|
|
91
97
|
it "encodes a wav file" do
|
|
92
98
|
|
|
93
99
|
# setup
|
|
@@ -148,4 +154,70 @@ describe "Encoding", :slow => true do
|
|
|
148
154
|
# Digest::MD5.hexdigest(File.read(mp3_path_raw)).should eql "84a1ce7994bb4a54fc13fb5381ebac40"
|
|
149
155
|
end
|
|
150
156
|
|
|
157
|
+
it "encodes 24-bit source files using the long encoder" do
|
|
158
|
+
encoder = LAME::Encoder.new
|
|
159
|
+
|
|
160
|
+
encoder.configure do |config|
|
|
161
|
+
config.input_samplerate = 192000
|
|
162
|
+
config.id3.write_automatic = false
|
|
163
|
+
config.vbr.mode = :vbr_default
|
|
164
|
+
config.vbr.q = 0
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
File.open(mp3_path_api, "wb") do |file|
|
|
168
|
+
|
|
169
|
+
wav_reader_24.each_buffer(encoder.framesize) do |read_buffer|
|
|
170
|
+
# important: shift the 24-bit samples to the system's long-size (32/64-bit)
|
|
171
|
+
left = read_buffer.samples.map { |s| s[0] << (::LAME::FFI::LONG_SIZE-24) }
|
|
172
|
+
right = read_buffer.samples.map { |s| s[1] << (::LAME::FFI::LONG_SIZE-24) }
|
|
173
|
+
|
|
174
|
+
encoder.encode_long(left, right) do |mp3|
|
|
175
|
+
file.write mp3
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
encoder.flush do |flush_frame|
|
|
179
|
+
file.write(flush_frame)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
encoder.vbr_frame do |vbr_frame|
|
|
183
|
+
file.write(vbr_frame)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it "encodes 24-bit source files using the float encoder" do
|
|
190
|
+
encoder = LAME::Encoder.new
|
|
191
|
+
|
|
192
|
+
encoder.configure do |config|
|
|
193
|
+
config.input_samplerate = 192000
|
|
194
|
+
config.id3.write_automatic = false
|
|
195
|
+
config.vbr.mode = :vbr_default
|
|
196
|
+
config.vbr.q = 0
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
max24 = 2**24/2.0
|
|
200
|
+
|
|
201
|
+
File.open(mp3_path_api, "wb") do |file|
|
|
202
|
+
|
|
203
|
+
wav_reader_24.each_buffer(encoder.framesize) do |read_buffer|
|
|
204
|
+
# important: scale the 24-bit input values to floats between -1.0 and +1.0
|
|
205
|
+
left = read_buffer.samples.map { |s| s[0] / max24 }
|
|
206
|
+
right = read_buffer.samples.map { |s| s[1] / max24 }
|
|
207
|
+
|
|
208
|
+
encoder.encode_float(left, right) do |mp3|
|
|
209
|
+
file.write mp3
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
encoder.flush do |flush_frame|
|
|
213
|
+
file.write(flush_frame)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
encoder.vbr_frame do |vbr_frame|
|
|
217
|
+
file.write(vbr_frame)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
151
223
|
end
|
|
@@ -13,17 +13,17 @@ describe "ID3 tags", :slow => true do
|
|
|
13
13
|
encode_wav_file(false)
|
|
14
14
|
|
|
15
15
|
Mp3Info.open(mp3_id3_path) do |info|
|
|
16
|
-
info.hastag1
|
|
17
|
-
info.hastag2
|
|
16
|
+
expect(info.hastag1?).to be_truthy
|
|
17
|
+
expect(info.hastag2?).to be_falsy
|
|
18
18
|
|
|
19
19
|
tags = info.tag1
|
|
20
|
-
tags["title"].
|
|
21
|
-
tags["artist"].
|
|
22
|
-
tags["album"].
|
|
23
|
-
tags["year"].
|
|
24
|
-
tags["comments"].
|
|
25
|
-
tags["tracknum"].
|
|
26
|
-
tags["genre_s"].
|
|
20
|
+
expect(tags["title"]).to eql "title"
|
|
21
|
+
expect(tags["artist"]).to eql "artist"
|
|
22
|
+
expect(tags["album"]).to eql "album"
|
|
23
|
+
expect(tags["year"]).to eql 2013
|
|
24
|
+
expect(tags["comments"]).to eql "comment"
|
|
25
|
+
expect(tags["tracknum"]).to eql 42
|
|
26
|
+
expect(tags["genre_s"]).to eql "Rock"
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -31,17 +31,17 @@ describe "ID3 tags", :slow => true do
|
|
|
31
31
|
encode_wav_file
|
|
32
32
|
|
|
33
33
|
Mp3Info.open(mp3_id3_path) do |info|
|
|
34
|
-
info.hastag1
|
|
35
|
-
info.hastag2
|
|
34
|
+
expect(info.hastag1?).to be_truthy
|
|
35
|
+
expect(info.hastag2?).to be_truthy
|
|
36
36
|
|
|
37
37
|
tags = info.tag2
|
|
38
|
-
tags["TIT2"].
|
|
39
|
-
tags["TPE1"].
|
|
40
|
-
tags["TALB"].
|
|
41
|
-
tags["TYER"].
|
|
42
|
-
tags["COMM"].
|
|
43
|
-
tags["TRCK"].
|
|
44
|
-
tags["TCON"].
|
|
38
|
+
expect(tags["TIT2"]).to eql "title"
|
|
39
|
+
expect(tags["TPE1"]).to eql "artist"
|
|
40
|
+
expect(tags["TALB"]).to eql "album"
|
|
41
|
+
expect(tags["TYER"]).to eql "2013"
|
|
42
|
+
expect(tags["COMM"]).to eql "comment"
|
|
43
|
+
expect(tags["TRCK"]).to eql "42"
|
|
44
|
+
expect(tags["TCON"]).to eql "Rock"
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
data/spec/lib/custom_matchers.rb
CHANGED
|
@@ -56,7 +56,7 @@ RSpec::Matchers.define :have_getter do |expected|
|
|
|
56
56
|
has_value?(actual, expected)
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
failure_message do |actual|
|
|
60
60
|
if !has_getter?(actual, expected)
|
|
61
61
|
"expected that #{actual} would have a getter for field :#{expected}"
|
|
62
62
|
elsif @value && !has_value?(actual, expected)
|
|
@@ -83,7 +83,7 @@ RSpec::Matchers.define :delegate do |from|
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
def delegates_setter?
|
|
86
|
-
LAME.
|
|
86
|
+
expect(LAME).to receive(:"lame_set_#{target}").with(subject.global_flags, anything)
|
|
87
87
|
subject.send(:"#{from}=", double)
|
|
88
88
|
true
|
|
89
89
|
rescue => e
|
|
@@ -92,7 +92,7 @@ RSpec::Matchers.define :delegate do |from|
|
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
def delegates_getter?
|
|
95
|
-
LAME.
|
|
95
|
+
expect(LAME).to receive(:"lame_get_#{target}").with(subject.global_flags)
|
|
96
96
|
subject.send(:"#{from}")
|
|
97
97
|
true
|
|
98
98
|
rescue => e
|
|
@@ -100,7 +100,7 @@ RSpec::Matchers.define :delegate do |from|
|
|
|
100
100
|
false
|
|
101
101
|
end
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
failure_message do |actual|
|
|
104
104
|
"expected #{subject.class} to delegate :#{from} to LAME.lame_set_#{target}"
|
|
105
105
|
end
|
|
106
106
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
class WaveFileGenerator
|
|
2
|
-
attr_accessor :mode, :bits, :
|
|
2
|
+
attr_accessor :mode, :bits, :sample_rate, :length, :hertz
|
|
3
3
|
|
|
4
4
|
def initialize(options = {})
|
|
5
|
-
@mode
|
|
6
|
-
@bits
|
|
7
|
-
@
|
|
8
|
-
@length
|
|
9
|
-
@hertz
|
|
5
|
+
@mode = options[:mode] || :stereo
|
|
6
|
+
@bits = options[:bits] || 16
|
|
7
|
+
@sample_rate = options[:sample_rate] || 44100
|
|
8
|
+
@length = options[:length] || 1
|
|
9
|
+
@hertz = options[:hertz] || 440
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def generate
|
|
13
13
|
wav_file = Tempfile.new('sine.wav')
|
|
14
14
|
|
|
15
|
-
format = WaveFile::Format.new(mode, pcm_type,
|
|
15
|
+
format = WaveFile::Format.new(mode, pcm_type, sample_rate)
|
|
16
16
|
WaveFile::Writer.new(wav_file.path, format) do |writer|
|
|
17
|
-
samples = (0...
|
|
17
|
+
samples = (0...sample_rate*length).map do |offset|
|
|
18
18
|
sample = (Math.sin((Math::PI*2 / scale) * offset) * max).round
|
|
19
19
|
[sample, sample]
|
|
20
20
|
end
|
|
@@ -31,7 +31,7 @@ class WaveFileGenerator
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def scale
|
|
34
|
-
|
|
34
|
+
sample_rate / hertz
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def pcm_type
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
if RUBY_DESCRIPTION =~ /\Aruby
|
|
1
|
+
if RUBY_DESCRIPTION =~ /\Aruby 3.4/
|
|
2
2
|
require 'simplecov'
|
|
3
|
-
require '
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
require 'simplecov-lcov'
|
|
4
|
+
|
|
5
|
+
# Configure simplecov-lcov to generate a single lcov.info file
|
|
6
|
+
SimpleCov::Formatter::LcovFormatter.config do |config|
|
|
7
|
+
config.report_with_single_file = true
|
|
8
|
+
config.single_report_path = 'coverage/lcov.info'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Set SimpleCov to use the LCOV formatter
|
|
12
|
+
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
|
|
13
|
+
|
|
14
|
+
SimpleCov.start do "test"
|
|
15
|
+
add_filter '/spec/' # Exclude spec files from coverage statistics
|
|
11
16
|
end
|
|
12
17
|
end
|
|
13
18
|
|
|
@@ -19,7 +24,6 @@ require 'lib/setter_getter'
|
|
|
19
24
|
require 'lib/custom_matchers'
|
|
20
25
|
|
|
21
26
|
RSpec.configure do |config|
|
|
22
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
23
27
|
config.run_all_when_everything_filtered = true
|
|
24
28
|
config.filter_run :focus
|
|
25
29
|
config.order = 'random'
|
metadata
CHANGED
|
@@ -1,128 +1,126 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lame
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
5
|
-
version: 0.0.3
|
|
4
|
+
version: 0.0.5
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Roel van Dijk
|
|
9
|
-
autorequire:
|
|
10
8
|
bindir: bin
|
|
11
9
|
cert_chain: []
|
|
12
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
11
|
dependencies:
|
|
14
12
|
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: ffi
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
15
19
|
type: :runtime
|
|
16
20
|
prerelease: false
|
|
17
|
-
name: ffi
|
|
18
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
19
22
|
requirements:
|
|
20
|
-
- -
|
|
23
|
+
- - ">="
|
|
21
24
|
- !ruby/object:Gem::Version
|
|
22
25
|
version: '0'
|
|
23
|
-
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rake
|
|
24
28
|
requirement: !ruby/object:Gem::Requirement
|
|
25
29
|
requirements:
|
|
26
|
-
- -
|
|
30
|
+
- - ">="
|
|
27
31
|
- !ruby/object:Gem::Version
|
|
28
32
|
version: '0'
|
|
29
|
-
none: false
|
|
30
|
-
- !ruby/object:Gem::Dependency
|
|
31
33
|
type: :development
|
|
32
34
|
prerelease: false
|
|
33
|
-
name: rake
|
|
34
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
35
36
|
requirements:
|
|
36
|
-
- -
|
|
37
|
+
- - ">="
|
|
37
38
|
- !ruby/object:Gem::Version
|
|
38
39
|
version: '0'
|
|
39
|
-
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rspec
|
|
40
42
|
requirement: !ruby/object:Gem::Requirement
|
|
41
43
|
requirements:
|
|
42
|
-
- -
|
|
44
|
+
- - ">="
|
|
43
45
|
- !ruby/object:Gem::Version
|
|
44
46
|
version: '0'
|
|
45
|
-
none: false
|
|
46
|
-
- !ruby/object:Gem::Dependency
|
|
47
47
|
type: :development
|
|
48
48
|
prerelease: false
|
|
49
|
-
name: rspec
|
|
50
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
50
|
requirements:
|
|
52
|
-
- -
|
|
51
|
+
- - ">="
|
|
53
52
|
- !ruby/object:Gem::Version
|
|
54
53
|
version: '0'
|
|
55
|
-
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: pry
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
|
-
- -
|
|
58
|
+
- - ">="
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
60
|
version: '0'
|
|
61
|
-
none: false
|
|
62
|
-
- !ruby/object:Gem::Dependency
|
|
63
61
|
type: :development
|
|
64
62
|
prerelease: false
|
|
65
|
-
name: pry
|
|
66
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
67
64
|
requirements:
|
|
68
|
-
- -
|
|
65
|
+
- - ">="
|
|
69
66
|
- !ruby/object:Gem::Version
|
|
70
67
|
version: '0'
|
|
71
|
-
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: wavefile
|
|
72
70
|
requirement: !ruby/object:Gem::Requirement
|
|
73
71
|
requirements:
|
|
74
|
-
- -
|
|
72
|
+
- - ">="
|
|
75
73
|
- !ruby/object:Gem::Version
|
|
76
74
|
version: '0'
|
|
77
|
-
none: false
|
|
78
|
-
- !ruby/object:Gem::Dependency
|
|
79
75
|
type: :development
|
|
80
76
|
prerelease: false
|
|
81
|
-
name: wavefile
|
|
82
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
83
78
|
requirements:
|
|
84
|
-
- -
|
|
79
|
+
- - ">="
|
|
85
80
|
- !ruby/object:Gem::Version
|
|
86
81
|
version: '0'
|
|
87
|
-
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: ruby-mp3info
|
|
88
84
|
requirement: !ruby/object:Gem::Requirement
|
|
89
85
|
requirements:
|
|
90
|
-
- -
|
|
86
|
+
- - ">="
|
|
91
87
|
- !ruby/object:Gem::Version
|
|
92
88
|
version: '0'
|
|
93
|
-
none: false
|
|
94
|
-
- !ruby/object:Gem::Dependency
|
|
95
89
|
type: :development
|
|
96
90
|
prerelease: false
|
|
97
|
-
name: ruby-mp3info
|
|
98
91
|
version_requirements: !ruby/object:Gem::Requirement
|
|
99
92
|
requirements:
|
|
100
|
-
- -
|
|
93
|
+
- - ">="
|
|
101
94
|
- !ruby/object:Gem::Version
|
|
102
95
|
version: '0'
|
|
103
|
-
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: simplecov
|
|
104
98
|
requirement: !ruby/object:Gem::Requirement
|
|
105
99
|
requirements:
|
|
106
|
-
- -
|
|
100
|
+
- - "~>"
|
|
107
101
|
- !ruby/object:Gem::Version
|
|
108
|
-
version: '0'
|
|
109
|
-
none: false
|
|
110
|
-
- !ruby/object:Gem::Dependency
|
|
102
|
+
version: '0.22'
|
|
111
103
|
type: :development
|
|
112
104
|
prerelease: false
|
|
113
|
-
name: coveralls
|
|
114
105
|
version_requirements: !ruby/object:Gem::Requirement
|
|
115
106
|
requirements:
|
|
116
|
-
- -
|
|
107
|
+
- - "~>"
|
|
117
108
|
- !ruby/object:Gem::Version
|
|
118
|
-
version: '0'
|
|
119
|
-
|
|
109
|
+
version: '0.22'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: simplecov-lcov
|
|
120
112
|
requirement: !ruby/object:Gem::Requirement
|
|
121
113
|
requirements:
|
|
122
|
-
- -
|
|
114
|
+
- - "~>"
|
|
123
115
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
125
|
-
|
|
116
|
+
version: '0.8'
|
|
117
|
+
type: :development
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '0.8'
|
|
126
124
|
description: FFI powered library for the LAME MP3 encoder.
|
|
127
125
|
email:
|
|
128
126
|
- roel@rustradio.org
|
|
@@ -130,15 +128,17 @@ executables: []
|
|
|
130
128
|
extensions: []
|
|
131
129
|
extra_rdoc_files: []
|
|
132
130
|
files:
|
|
133
|
-
- .
|
|
134
|
-
- .
|
|
135
|
-
- .
|
|
136
|
-
- .
|
|
131
|
+
- ".github/workflows/ci.yml"
|
|
132
|
+
- ".gitignore"
|
|
133
|
+
- ".rspec"
|
|
134
|
+
- ".rvmrc"
|
|
135
|
+
- ".travis.yml"
|
|
137
136
|
- Gemfile
|
|
138
137
|
- LICENSE.txt
|
|
139
138
|
- README.md
|
|
140
139
|
- Rakefile
|
|
141
140
|
- docs/id3v2.4.0-structure.txt
|
|
141
|
+
- docs/lame-3.101.h
|
|
142
142
|
- docs/lame-3.99.5.h
|
|
143
143
|
- lame.gemspec
|
|
144
144
|
- lib/lame.rb
|
|
@@ -159,6 +159,7 @@ files:
|
|
|
159
159
|
- lib/lame/encoding/id3.rb
|
|
160
160
|
- lib/lame/encoding/interleaved_buffer_encoder.rb
|
|
161
161
|
- lib/lame/encoding/interleaved_float_buffer_encoder.rb
|
|
162
|
+
- lib/lame/encoding/interleaved_int_buffer_encoder.rb
|
|
162
163
|
- lib/lame/encoding/interleaved_short_buffer_encoder.rb
|
|
163
164
|
- lib/lame/encoding/long_buffer_encoder.rb
|
|
164
165
|
- lib/lame/encoding/short_buffer_encoder.rb
|
|
@@ -205,33 +206,23 @@ files:
|
|
|
205
206
|
- spec/spec_helper.rb
|
|
206
207
|
homepage: http://github.com/rdvdijk/lame
|
|
207
208
|
licenses: []
|
|
208
|
-
|
|
209
|
+
metadata: {}
|
|
209
210
|
rdoc_options: []
|
|
210
211
|
require_paths:
|
|
211
212
|
- lib
|
|
212
213
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
213
214
|
requirements:
|
|
214
|
-
- -
|
|
215
|
+
- - ">="
|
|
215
216
|
- !ruby/object:Gem::Version
|
|
216
|
-
hash: 220624676423183308
|
|
217
|
-
segments:
|
|
218
|
-
- 0
|
|
219
217
|
version: '0'
|
|
220
|
-
none: false
|
|
221
218
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
219
|
requirements:
|
|
223
|
-
- -
|
|
220
|
+
- - ">="
|
|
224
221
|
- !ruby/object:Gem::Version
|
|
225
|
-
hash: 220624676423183308
|
|
226
|
-
segments:
|
|
227
|
-
- 0
|
|
228
222
|
version: '0'
|
|
229
|
-
none: false
|
|
230
223
|
requirements: []
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
signing_key:
|
|
234
|
-
specification_version: 3
|
|
224
|
+
rubygems_version: 3.6.9
|
|
225
|
+
specification_version: 4
|
|
235
226
|
summary: Easily encode MP3 files using the LAME MP3 encoder.
|
|
236
227
|
test_files:
|
|
237
228
|
- spec/buffer_spec.rb
|