taglib-ruby 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +9 -0
- data/CHANGES.md +22 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +13 -3
- data/Guardfile +8 -0
- data/README.md +48 -36
- data/Rakefile +5 -7
- data/docs/default/fulldoc/html/css/common.css +1 -0
- data/docs/taglib/base.rb +130 -0
- data/docs/taglib/id3v2.rb +383 -0
- data/docs/taglib/mpeg.rb +95 -0
- data/ext/taglib_base/includes.i +35 -3
- data/ext/taglib_base/taglib_base.i +19 -13
- data/ext/taglib_base/taglib_base_wrap.cxx +1440 -3357
- data/ext/taglib_id3v2/relativevolumeframe.i +35 -0
- data/ext/taglib_id3v2/taglib_id3v2.i +54 -52
- data/ext/taglib_id3v2/taglib_id3v2_wrap.cxx +3508 -10952
- data/ext/taglib_mpeg/taglib_mpeg.i +8 -7
- data/ext/taglib_mpeg/taglib_mpeg_wrap.cxx +703 -1569
- data/lib/taglib.rb +1 -0
- data/lib/taglib/id3v2.rb +8 -30
- data/lib/taglib/version.rb +2 -2
- data/taglib-ruby.gemspec +26 -5
- data/tasks/docs_coverage.rake +26 -0
- data/test/data/add-relative-volume.cpp +40 -0
- data/test/data/crash.mp3 +0 -0
- data/test/data/relative-volume.mp3 +0 -0
- data/test/test_fileref_properties.rb +21 -0
- data/test/test_id3v2_frames.rb +25 -8
- data/test/test_id3v2_relative_volume.rb +57 -0
- data/test/test_id3v2_tag.rb +23 -0
- data/test/test_mpeg_file.rb +49 -0
- metadata +55 -10
data/lib/taglib.rb
CHANGED
data/lib/taglib/id3v2.rb
CHANGED
@@ -2,40 +2,18 @@ require 'taglib_id3v2'
|
|
2
2
|
|
3
3
|
module TagLib
|
4
4
|
module ID3v2
|
5
|
-
class FrameList
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
def each
|
9
|
-
it = self.begin
|
10
|
-
it_end = self.end
|
11
|
-
while it != it_end
|
12
|
-
frame = it.value
|
13
|
-
casted_frame = frame.cast
|
14
|
-
yield casted_frame
|
15
|
-
it = it.next
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
5
|
class Frame
|
20
6
|
def to_s
|
21
7
|
to_string
|
22
8
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
when "TXXX" then to_user_text_identification_frame
|
32
|
-
when /T.../ then to_text_identification_frame
|
33
|
-
when "UFID" then to_unique_file_identifier_frame
|
34
|
-
when "USLT" then to_unsynchronized_lyrics_frame
|
35
|
-
when "WXXX" then to_user_url_link_frame
|
36
|
-
when /W.../ then to_url_link_frame
|
37
|
-
else self
|
38
|
-
end
|
9
|
+
|
10
|
+
def inspect
|
11
|
+
# Overwrite inspect because Object#inspect calls to_s. In case
|
12
|
+
# of an unlinked frame, calling to_s would lead to calling into
|
13
|
+
# SWIG through to_string, which in turn would raise an exception
|
14
|
+
# with a message including an inspect of this object, which
|
15
|
+
# would call to_s -> stack overflow.
|
16
|
+
"#<%s:0x%x>" % [self.class.to_s, object_id << 1]
|
39
17
|
end
|
40
18
|
end
|
41
19
|
end
|
data/lib/taglib/version.rb
CHANGED
data/taglib-ruby.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "taglib-ruby"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Robin Stocker"]
|
12
|
-
s.date = "2011-
|
12
|
+
s.date = "2011-10-22"
|
13
13
|
s.description = "Ruby interface for the taglib C++ library.\n\nIn contrast to other libraries, this one wraps the C++ API using SWIG,\nnot only the minimal C API. This means that all tags can be accessed.\n"
|
14
14
|
s.email = "robin@nibor.org"
|
15
15
|
s.extensions = ["ext/taglib_base/extconf.rb", "ext/taglib_mpeg/extconf.rb", "ext/taglib_id3v2/extconf.rb"]
|
@@ -18,11 +18,18 @@ Gem::Specification.new do |s|
|
|
18
18
|
"README.md"
|
19
19
|
]
|
20
20
|
s.files = [
|
21
|
+
".yardopts",
|
22
|
+
"CHANGES.md",
|
21
23
|
"Gemfile",
|
22
24
|
"Gemfile.lock",
|
25
|
+
"Guardfile",
|
23
26
|
"LICENSE.txt",
|
24
27
|
"README.md",
|
25
28
|
"Rakefile",
|
29
|
+
"docs/default/fulldoc/html/css/common.css",
|
30
|
+
"docs/taglib/base.rb",
|
31
|
+
"docs/taglib/id3v2.rb",
|
32
|
+
"docs/taglib/mpeg.rb",
|
26
33
|
"ext/Rakefile",
|
27
34
|
"ext/extconf_common.rb",
|
28
35
|
"ext/taglib_base/extconf.rb",
|
@@ -30,6 +37,7 @@ Gem::Specification.new do |s|
|
|
30
37
|
"ext/taglib_base/taglib_base.i",
|
31
38
|
"ext/taglib_base/taglib_base_wrap.cxx",
|
32
39
|
"ext/taglib_id3v2/extconf.rb",
|
40
|
+
"ext/taglib_id3v2/relativevolumeframe.i",
|
33
41
|
"ext/taglib_id3v2/taglib_id3v2.i",
|
34
42
|
"ext/taglib_id3v2/taglib_id3v2_wrap.cxx",
|
35
43
|
"ext/taglib_mpeg/extconf.rb",
|
@@ -42,15 +50,22 @@ Gem::Specification.new do |s|
|
|
42
50
|
"lib/taglib/mpeg.rb",
|
43
51
|
"lib/taglib/version.rb",
|
44
52
|
"taglib-ruby.gemspec",
|
53
|
+
"tasks/docs_coverage.rake",
|
54
|
+
"test/data/add-relative-volume.cpp",
|
55
|
+
"test/data/crash.mp3",
|
45
56
|
"test/data/globe_east_540.jpg",
|
57
|
+
"test/data/relative-volume.mp3",
|
46
58
|
"test/data/sample.mp3",
|
47
59
|
"test/data/unicode.mp3",
|
48
60
|
"test/helper.rb",
|
61
|
+
"test/test_fileref_properties.rb",
|
49
62
|
"test/test_id3v2_frames.rb",
|
50
63
|
"test/test_id3v2_memory.rb",
|
64
|
+
"test/test_id3v2_relative_volume.rb",
|
51
65
|
"test/test_id3v2_tag.rb",
|
52
66
|
"test/test_id3v2_unicode.rb",
|
53
67
|
"test/test_id3v2_write.rb",
|
68
|
+
"test/test_mpeg_file.rb",
|
54
69
|
"test/test_tag.rb"
|
55
70
|
]
|
56
71
|
s.homepage = "http://github.com/robinst/taglib-ruby"
|
@@ -69,14 +84,18 @@ Gem::Specification.new do |s|
|
|
69
84
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
70
85
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
71
86
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
72
|
-
s.add_development_dependency(%q<
|
87
|
+
s.add_development_dependency(%q<yard>, ["~> 0.7"])
|
88
|
+
s.add_development_dependency(%q<redcarpet>, [">= 0"])
|
89
|
+
s.add_development_dependency(%q<guard-test>, ["~> 0.4.0"])
|
73
90
|
else
|
74
91
|
s.add_dependency(%q<rake-compiler>, ["~> 0.7"])
|
75
92
|
s.add_dependency(%q<shoulda>, ["~> 2.11"])
|
76
93
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
77
94
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
78
95
|
s.add_dependency(%q<rcov>, [">= 0"])
|
79
|
-
s.add_dependency(%q<
|
96
|
+
s.add_dependency(%q<yard>, ["~> 0.7"])
|
97
|
+
s.add_dependency(%q<redcarpet>, [">= 0"])
|
98
|
+
s.add_dependency(%q<guard-test>, ["~> 0.4.0"])
|
80
99
|
end
|
81
100
|
else
|
82
101
|
s.add_dependency(%q<rake-compiler>, ["~> 0.7"])
|
@@ -84,7 +103,9 @@ Gem::Specification.new do |s|
|
|
84
103
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
85
104
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
86
105
|
s.add_dependency(%q<rcov>, [">= 0"])
|
87
|
-
s.add_dependency(%q<
|
106
|
+
s.add_dependency(%q<yard>, ["~> 0.7"])
|
107
|
+
s.add_dependency(%q<redcarpet>, [">= 0"])
|
108
|
+
s.add_dependency(%q<guard-test>, ["~> 0.4.0"])
|
88
109
|
end
|
89
110
|
end
|
90
111
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
desc "Show the coverage of the actual API in ext/ by the API docs in docs/"
|
2
|
+
task :docs_coverage do |t|
|
3
|
+
def sort(objects)
|
4
|
+
objects.sort_by { |obj| obj.path }
|
5
|
+
end
|
6
|
+
|
7
|
+
YARD.parse("ext/**/*_wrap.cxx")
|
8
|
+
ext_codeobjects = sort(YARD::Registry.all)
|
9
|
+
YARD::Registry.clear
|
10
|
+
YARD.parse("docs/**/*.rb")
|
11
|
+
docs_codeobjects = sort(YARD::Registry.all(:module, :class, :method))
|
12
|
+
|
13
|
+
only_in_ext = (ext_codeobjects - docs_codeobjects)
|
14
|
+
only_in_docs = (docs_codeobjects - ext_codeobjects)
|
15
|
+
|
16
|
+
unless only_in_ext.empty?
|
17
|
+
puts
|
18
|
+
puts "=== Only in ext (to document): "
|
19
|
+
puts only_in_ext
|
20
|
+
end
|
21
|
+
unless only_in_docs.empty?
|
22
|
+
puts
|
23
|
+
puts "=== Only in docs (typo?): "
|
24
|
+
puts only_in_docs
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#include <iostream>
|
2
|
+
#include <stdlib.h>
|
3
|
+
|
4
|
+
#include <taglib/taglib.h>
|
5
|
+
#include <taglib/mpegfile.h>
|
6
|
+
#include <taglib/id3v2tag.h>
|
7
|
+
#include <taglib/relativevolumeframe.h>
|
8
|
+
|
9
|
+
using namespace TagLib;
|
10
|
+
|
11
|
+
int main(int argc, char **argv) {
|
12
|
+
if (argc != 2) {
|
13
|
+
std::cout << "usage: " << argv[0] << " file.mp3" << std::endl;
|
14
|
+
exit(1);
|
15
|
+
}
|
16
|
+
char *filename = argv[1];
|
17
|
+
|
18
|
+
MPEG::File file(filename);
|
19
|
+
ID3v2::Tag *tag = file.ID3v2Tag(true);
|
20
|
+
|
21
|
+
ID3v2::RelativeVolumeFrame *rv = new ID3v2::RelativeVolumeFrame();
|
22
|
+
|
23
|
+
rv->setVolumeAdjustmentIndex(512);
|
24
|
+
rv->setVolumeAdjustmentIndex(1024, ID3v2::RelativeVolumeFrame::Subwoofer);
|
25
|
+
|
26
|
+
ID3v2::RelativeVolumeFrame::PeakVolume pv1;
|
27
|
+
pv1.bitsRepresentingPeak = 8;
|
28
|
+
pv1.peakVolume = "A"; // 0x41, 0b01000001
|
29
|
+
rv->setPeakVolume(pv1);
|
30
|
+
|
31
|
+
ID3v2::RelativeVolumeFrame::PeakVolume pv2;
|
32
|
+
pv2.bitsRepresentingPeak = 4;
|
33
|
+
pv2.peakVolume = "?"; // 0x3F, 0b00111111
|
34
|
+
rv->setPeakVolume(pv2, ID3v2::RelativeVolumeFrame::Subwoofer);
|
35
|
+
|
36
|
+
tag->addFrame(rv);
|
37
|
+
file.save();
|
38
|
+
}
|
39
|
+
|
40
|
+
// vim: set filetype=cpp sw=2 ts=2 expandtab:
|
data/test/data/crash.mp3
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestFileRefProperties < Test::Unit::TestCase
|
4
|
+
context "The crash.mp3 file audio properties" do
|
5
|
+
setup do
|
6
|
+
@fileref = TagLib::FileRef.new("test/data/crash.mp3", true, TagLib::AudioProperties::Average)
|
7
|
+
@properties = @fileref.audio_properties
|
8
|
+
end
|
9
|
+
|
10
|
+
should "exist" do
|
11
|
+
assert_not_nil @properties
|
12
|
+
end
|
13
|
+
|
14
|
+
should "contain basic information" do
|
15
|
+
assert_equal 2, @properties.length
|
16
|
+
assert_equal 157, @properties.bitrate
|
17
|
+
assert_equal 44100, @properties.sample_rate
|
18
|
+
assert_equal 2, @properties.channels
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/test/test_id3v2_frames.rb
CHANGED
@@ -20,8 +20,7 @@ class TestID3v2Frames < Test::Unit::TestCase
|
|
20
20
|
should "be complete" do
|
21
21
|
assert_not_nil @frames
|
22
22
|
assert_equal 11, @frames.size
|
23
|
-
|
24
|
-
frame = iterator.value
|
23
|
+
frame = @frames.first
|
25
24
|
assert_equal "Dummy Title", frame.to_string
|
26
25
|
end
|
27
26
|
|
@@ -35,9 +34,32 @@ class TestID3v2Frames < Test::Unit::TestCase
|
|
35
34
|
apic = @tag.frame_list('APIC').first
|
36
35
|
comm = @tag.frame_list('COMM').first
|
37
36
|
tit2 = @tag.frame_list('TIT2').first
|
37
|
+
txxx = @tag.frame_list('TXXX').first
|
38
38
|
assert_equal TagLib::ID3v2::AttachedPictureFrame, apic.class
|
39
39
|
assert_equal TagLib::ID3v2::CommentsFrame, comm.class
|
40
40
|
assert_equal TagLib::ID3v2::TextIdentificationFrame, tit2.class
|
41
|
+
assert_equal TagLib::ID3v2::UserTextIdentificationFrame, txxx.class
|
42
|
+
end
|
43
|
+
|
44
|
+
should "be removable" do
|
45
|
+
assert_equal 11, @tag.frame_list.size
|
46
|
+
tit2 = @tag.frame_list('TIT2').first
|
47
|
+
@tag.remove_frame(tit2)
|
48
|
+
assert_equal 10, @tag.frame_list.size
|
49
|
+
begin
|
50
|
+
tit2.to_string
|
51
|
+
flunk("Should have raised ObjectPreviouslyDeleted.")
|
52
|
+
rescue => e
|
53
|
+
assert_equal "ObjectPreviouslyDeleted", e.class.to_s
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
should "be removable by ID" do
|
58
|
+
frames = @tag.frame_list
|
59
|
+
@tag.remove_frames('COMM')
|
60
|
+
tit2 = frames.find{ |f| f.frame_id == 'TIT2' }
|
61
|
+
# Other frames should still be accessible
|
62
|
+
assert_equal "Dummy Title", tit2.to_s
|
41
63
|
end
|
42
64
|
|
43
65
|
context "APIC frame" do
|
@@ -77,12 +99,7 @@ class TestID3v2Frames < Test::Unit::TestCase
|
|
77
99
|
|
78
100
|
should "have to_s" do
|
79
101
|
expected = "[MusicBrainz Album Id] MusicBrainz Album Id 992dc19a-5631-40f5-b252-fbfedbc328a9"
|
80
|
-
assert_equal expected, @txxx_frame.
|
81
|
-
end
|
82
|
-
|
83
|
-
should "be convertable to its concrete type" do
|
84
|
-
txxx = @txxx_frame.to_user_text_identification_frame
|
85
|
-
assert_equal TagLib::ID3v2::UserTextIdentificationFrame, txxx.class
|
102
|
+
assert_equal expected, @txxx_frame.to_string
|
86
103
|
end
|
87
104
|
|
88
105
|
should "have field_list" do
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestID3v2RelativeVolumeFrame < Test::Unit::TestCase
|
4
|
+
context "The relative-volume.mp3 RVA2 frame" do
|
5
|
+
setup do
|
6
|
+
@file = TagLib::MPEG::File.new("test/data/relative-volume.mp3")
|
7
|
+
@tag = @file.id3v2_tag
|
8
|
+
@rv = @tag.frame_list('RVA2').first
|
9
|
+
end
|
10
|
+
|
11
|
+
should "exist" do
|
12
|
+
assert_not_nil @rv
|
13
|
+
end
|
14
|
+
|
15
|
+
should "have channels" do
|
16
|
+
expected = [TagLib::ID3v2::RelativeVolumeFrame::MasterVolume, TagLib::ID3v2::RelativeVolumeFrame::Subwoofer]
|
17
|
+
assert_equal expected, @rv.channels
|
18
|
+
end
|
19
|
+
|
20
|
+
should "have volume adjustments" do
|
21
|
+
assert_equal 512, @rv.volume_adjustment_index
|
22
|
+
assert_equal 1.0, @rv.volume_adjustment
|
23
|
+
assert_equal 1024, @rv.volume_adjustment_index(TagLib::ID3v2::RelativeVolumeFrame::Subwoofer)
|
24
|
+
assert_equal 2.0, @rv.volume_adjustment(TagLib::ID3v2::RelativeVolumeFrame::Subwoofer)
|
25
|
+
end
|
26
|
+
|
27
|
+
should "have peak volumes" do
|
28
|
+
master_pv = @rv.peak_volume
|
29
|
+
assert_equal 8, master_pv.bits_representing_peak
|
30
|
+
assert_equal 0b01000001.chr, master_pv.peak_volume
|
31
|
+
|
32
|
+
subwoofer_pv = @rv.peak_volume(TagLib::ID3v2::RelativeVolumeFrame::Subwoofer)
|
33
|
+
assert_equal 4, subwoofer_pv.bits_representing_peak
|
34
|
+
assert_equal 0b00111111.chr, subwoofer_pv.peak_volume
|
35
|
+
end
|
36
|
+
|
37
|
+
should "accept new volume adjustments" do
|
38
|
+
@rv.set_volume_adjustment_index(2048, TagLib::ID3v2::RelativeVolumeFrame::FrontCentre)
|
39
|
+
assert_equal 2048, @rv.volume_adjustment_index(TagLib::ID3v2::RelativeVolumeFrame::FrontCentre)
|
40
|
+
@rv.set_volume_adjustment(4.0, TagLib::ID3v2::RelativeVolumeFrame::FrontLeft)
|
41
|
+
assert_equal 4.0, @rv.volume_adjustment(TagLib::ID3v2::RelativeVolumeFrame::FrontLeft)
|
42
|
+
end
|
43
|
+
|
44
|
+
should "accept new peak volumes" do
|
45
|
+
pv = TagLib::ID3v2::PeakVolume.new
|
46
|
+
assert_equal 0, pv.bits_representing_peak
|
47
|
+
assert_equal "", pv.peak_volume
|
48
|
+
pv.bits_representing_peak = 6
|
49
|
+
pv.peak_volume = 0b110111.chr
|
50
|
+
@rv.set_peak_volume(pv, TagLib::ID3v2::RelativeVolumeFrame::BackLeft)
|
51
|
+
|
52
|
+
pv2 = @rv.peak_volume(TagLib::ID3v2::RelativeVolumeFrame::BackLeft)
|
53
|
+
assert_equal 6, pv2.bits_representing_peak
|
54
|
+
assert_equal 0b110111.chr, pv2.peak_volume
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/test/test_id3v2_tag.rb
CHANGED
@@ -28,4 +28,27 @@ class TestID3v2Tag < Test::Unit::TestCase
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
context "A new ID3v2::Tag" do
|
33
|
+
setup do
|
34
|
+
@tag = TagLib::ID3v2::Tag.new
|
35
|
+
end
|
36
|
+
|
37
|
+
should "be empty" do
|
38
|
+
assert @tag.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
should "have nil for string attributes" do
|
42
|
+
assert_nil @tag.title
|
43
|
+
assert_nil @tag.artist
|
44
|
+
assert_nil @tag.album
|
45
|
+
assert_nil @tag.comment
|
46
|
+
assert_nil @tag.genre
|
47
|
+
end
|
48
|
+
|
49
|
+
should "have 0 for numeric attributes" do
|
50
|
+
assert_equal 0, @tag.track
|
51
|
+
assert_equal 0, @tag.year
|
52
|
+
end
|
53
|
+
end
|
31
54
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestMPEGFile < Test::Unit::TestCase
|
4
|
+
context "The crash.mp3 file" do
|
5
|
+
setup do
|
6
|
+
read_properties = true
|
7
|
+
@file = TagLib::MPEG::File.new("test/data/crash.mp3", read_properties)
|
8
|
+
end
|
9
|
+
|
10
|
+
context "audio properties" do
|
11
|
+
setup do
|
12
|
+
@properties = @file.audio_properties
|
13
|
+
end
|
14
|
+
|
15
|
+
should "be MPEG audio properties" do
|
16
|
+
assert_equal TagLib::MPEG::Properties, @properties.class
|
17
|
+
end
|
18
|
+
|
19
|
+
should "contain information" do
|
20
|
+
assert_equal 2, @properties.length
|
21
|
+
assert_equal 157, @properties.bitrate
|
22
|
+
assert_equal 44100, @properties.sample_rate
|
23
|
+
assert_equal 2, @properties.channels
|
24
|
+
assert_equal TagLib::MPEG::Header::Version1, @properties.version
|
25
|
+
assert_equal 3, @properties.layer
|
26
|
+
assert_equal false, @properties.protection_enabled
|
27
|
+
assert_equal TagLib::MPEG::Header::JointStereo, @properties.channel_mode
|
28
|
+
assert_equal false, @properties.copyrighted?
|
29
|
+
assert_equal true, @properties.original?
|
30
|
+
end
|
31
|
+
|
32
|
+
context "Xing header" do
|
33
|
+
setup do
|
34
|
+
@xing_header = @properties.xing_header
|
35
|
+
end
|
36
|
+
|
37
|
+
should "exist" do
|
38
|
+
assert_not_nil @xing_header
|
39
|
+
end
|
40
|
+
|
41
|
+
should "contain information" do
|
42
|
+
assert_true @xing_header.valid?
|
43
|
+
assert_equal 88, @xing_header.total_frames
|
44
|
+
assert_equal 45140, @xing_header.total_size
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|