taglib-ruby 0.6.0 → 1.1.0

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.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -1
  3. data/{CHANGES.md → CHANGELOG.md} +46 -11
  4. data/README.md +61 -17
  5. data/Rakefile +12 -3
  6. data/docs/taglib/aiff.rb +95 -0
  7. data/docs/taglib/base.rb +30 -2
  8. data/docs/taglib/flac.rb +60 -4
  9. data/docs/taglib/id3v1.rb +29 -0
  10. data/docs/taglib/id3v2.rb +22 -3
  11. data/docs/taglib/mp4.rb +124 -13
  12. data/docs/taglib/mpeg.rb +30 -1
  13. data/docs/taglib/ogg.rb +47 -5
  14. data/docs/taglib/riff.rb +3 -0
  15. data/docs/taglib/vorbis.rb +1 -1
  16. data/docs/taglib/wav.rb +116 -0
  17. data/ext/extconf_common.rb +24 -3
  18. data/ext/taglib_aiff/extconf.rb +4 -0
  19. data/ext/taglib_aiff/taglib_aiff.i +84 -0
  20. data/ext/taglib_aiff/taglib_aiff_wrap.cxx +3111 -0
  21. data/ext/taglib_base/includes.i +34 -5
  22. data/ext/taglib_base/taglib_base.i +42 -2
  23. data/ext/taglib_base/taglib_base_wrap.cxx +226 -186
  24. data/ext/taglib_flac/taglib_flac.i +21 -18
  25. data/ext/taglib_flac/taglib_flac_wrap.cxx +519 -955
  26. data/ext/taglib_flac_picture/extconf.rb +4 -0
  27. data/ext/taglib_flac_picture/includes.i +15 -0
  28. data/ext/taglib_flac_picture/taglib_flac_picture.i +15 -0
  29. data/ext/taglib_flac_picture/taglib_flac_picture_wrap.cxx +3087 -0
  30. data/ext/taglib_id3v1/taglib_id3v1.i +19 -0
  31. data/ext/taglib_id3v1/taglib_id3v1_wrap.cxx +391 -193
  32. data/ext/taglib_id3v2/relativevolumeframe.i +4 -17
  33. data/ext/taglib_id3v2/taglib_id3v2.i +72 -2
  34. data/ext/taglib_id3v2/taglib_id3v2_wrap.cxx +3051 -1113
  35. data/ext/taglib_mp4/taglib_mp4.i +101 -20
  36. data/ext/taglib_mp4/taglib_mp4_wrap.cxx +1088 -282
  37. data/ext/taglib_mpeg/taglib_mpeg.i +11 -16
  38. data/ext/taglib_mpeg/taglib_mpeg_wrap.cxx +646 -317
  39. data/ext/taglib_ogg/taglib_ogg.i +11 -0
  40. data/ext/taglib_ogg/taglib_ogg_wrap.cxx +478 -192
  41. data/ext/taglib_vorbis/taglib_vorbis.i +8 -0
  42. data/ext/taglib_vorbis/taglib_vorbis_wrap.cxx +202 -156
  43. data/ext/taglib_wav/extconf.rb +4 -0
  44. data/ext/taglib_wav/taglib_wav.i +90 -0
  45. data/ext/taglib_wav/taglib_wav_wrap.cxx +3423 -0
  46. data/lib/taglib.rb +2 -0
  47. data/lib/taglib/aiff.rb +7 -0
  48. data/lib/taglib/mp4.rb +2 -1
  49. data/lib/taglib/version.rb +2 -2
  50. data/lib/taglib/wav.rb +11 -0
  51. data/taglib-ruby.gemspec +42 -8
  52. data/tasks/ext.rake +48 -20
  53. data/tasks/gemspec_check.rake +1 -1
  54. data/tasks/swig.rake +36 -2
  55. data/test/aiff_examples_test.rb +39 -0
  56. data/test/aiff_file_test.rb +103 -0
  57. data/test/aiff_file_write_test.rb +88 -0
  58. data/test/data/Makefile +8 -2
  59. data/test/data/aiff-sample.aiff +0 -0
  60. data/test/data/flac_nopic.flac +0 -0
  61. data/test/data/vorbis-create.cpp +20 -1
  62. data/test/data/vorbis.oga +0 -0
  63. data/test/data/wav-create.cpp +55 -0
  64. data/test/data/wav-dump.cpp +74 -0
  65. data/test/data/wav-sample.wav +0 -0
  66. data/test/file_test.rb +21 -0
  67. data/test/fileref_properties_test.rb +1 -1
  68. data/test/flac_file_test.rb +45 -30
  69. data/test/flac_picture_memory_test.rb +43 -0
  70. data/test/id3v1_genres_test.rb +23 -0
  71. data/test/id3v1_tag_test.rb +1 -0
  72. data/test/id3v2_frames_test.rb +64 -0
  73. data/test/id3v2_tag_test.rb +6 -6
  74. data/test/id3v2_unknown_frames_test.rb +30 -0
  75. data/test/id3v2_write_test.rb +10 -13
  76. data/test/mp4_file_test.rb +33 -4
  77. data/test/mp4_file_write_test.rb +5 -5
  78. data/test/mp4_items_test.rb +83 -29
  79. data/test/mpeg_file_test.rb +120 -7
  80. data/test/vorbis_file_test.rb +2 -2
  81. data/test/vorbis_tag_test.rb +61 -7
  82. data/test/wav_examples_test.rb +42 -0
  83. data/test/wav_file_test.rb +108 -0
  84. data/test/wav_file_write_test.rb +113 -0
  85. metadata +86 -56
@@ -1,5 +1,34 @@
1
1
  module TagLib::ID3v1
2
2
  # An ID3v1 tag.
3
3
  class Tag < TagLib::Tag
4
+ # @return [Integer] the genre as a number
5
+ # @return [255] if not present
6
+ #
7
+ # @since 1.0.0
8
+ attr_accessor :genre_number
9
+ end
10
+
11
+ # @return [Array<String>] the ID3v1 genre list.
12
+ #
13
+ # @since 1.0.0
14
+ def genre_list
15
+ end
16
+
17
+ # @return [Map<String, int>] the map associating a genre to its index.
18
+ #
19
+ # @since 1.0.0
20
+ def genre_map
21
+ end
22
+
23
+ # @return [String] the name of genre at `index` in the ID3v1 genre list.
24
+ #
25
+ # @since 1.0.0
26
+ def genre(index)
27
+ end
28
+
29
+ # @return [String] the genre index for the (case sensitive) genre `name`.
30
+ #
31
+ # @since 1.0.0
32
+ def genre_index(name)
4
33
  end
5
34
  end
@@ -62,8 +62,13 @@ module TagLib::ID3v2
62
62
  # file.save
63
63
  # end
64
64
  class Tag < TagLib::Tag
65
- # Get a list of frames. Note that the frames returned are subclasses
66
- # of {TagLib::ID3v2::Frame}, depending on the frame ID.
65
+ # Get a list of frames.
66
+ #
67
+ # Note that the frames returned are subclasses of {TagLib::ID3v2::Frame},
68
+ # depending on the frame ID. But it's also possible that a
69
+ # {TagLib::ID3v2::UnknownFrame} is returned (e.g. when TagLib discards a
70
+ # deprecated frame). So to make sure your code can handle all the cases, it
71
+ # should include a check for the returned class of the frame.
67
72
  #
68
73
  # @overload frame_list()
69
74
  # Returns all frames.
@@ -405,7 +410,16 @@ module TagLib::ID3v2
405
410
  end
406
411
 
407
412
  # Text identification frame (`T???`).
413
+ #
414
+ # @example Create a new TIT2 frame
415
+ # frame = TagLib::ID3v2::TextIdentificationFrame.new("TIT2", TagLib::String::UTF8)
416
+ # frame.text = "Title"
408
417
  class TextIdentificationFrame < Frame
418
+ # @param [String] type the frame ID, e.g. `TDRC`
419
+ # @param [TagLib::String constant] encoding text encoding, e.g. `TagLib::String::UTF8`
420
+ def initialize(type, encoding)
421
+ end
422
+
409
423
  # Encoding for storing the text in the tag, e.g.
410
424
  # `TagLib::String::UTF8`. See the section _String Encodings_ in
411
425
  # {TagLib}.
@@ -435,6 +449,11 @@ module TagLib::ID3v2
435
449
  attr_accessor :owner
436
450
  end
437
451
 
452
+ # Unknown frame used by TagLib to represent a frame whose type is not
453
+ # known, not implemented or deprecated in later versions of ID3v2.
454
+ class UnknownFrame < Frame
455
+ end
456
+
438
457
  # Unsynchronized lyrics frame (`USLT`).
439
458
  class UnsynchronizedLyricsFrame < Frame
440
459
  # @return [String] frame description
@@ -459,7 +478,7 @@ module TagLib::ID3v2
459
478
  # @param [String] value simple text to set
460
479
  attr_writer :text
461
480
 
462
- # @param [String] value URL
481
+ # @return [String] the URL
463
482
  attr_accessor :url
464
483
  end
465
484
 
@@ -54,7 +54,7 @@ module TagLib::MP4
54
54
  # # #<TagLib::MP4::Item:0x007f9bab61d818 @__swigtype__="_p_TagLib__MP4__Item">]]
55
55
  class File < TagLib::File
56
56
 
57
- # {include:TagLib::FileRef.open}
57
+ # {include:::TagLib::FileRef.open}
58
58
  #
59
59
  # @param (see #initialize)
60
60
  # @yield [file] the {File} object, as obtained by {#initialize}
@@ -82,12 +82,48 @@ module TagLib::MP4
82
82
  # @return [TagLib::MP4::Properties]
83
83
  def audio_properties
84
84
  end
85
+
86
+ # @return [Boolean] Returns whether or not the file actually has an MP4 tag, or the
87
+ # file has a Metadata Item List (ilst) atom.
88
+ #
89
+ # @since 1.0.0
90
+ def mp4_tag?
91
+ end
85
92
  end
86
93
 
87
94
  class Tag < TagLib::Tag
88
- # Returns the map containing all the items in the tag
89
- # @return [TagLib::MP4::ItemListMap]
90
- def item_list_map
95
+ # @return [TagLib::MP4::ItemMap] The map containing all the items in the tag.
96
+ #
97
+ # @since 1.0.0
98
+ def item_map
99
+ end
100
+
101
+ # @return [TagLib::MP4::Item] The Item associated to `key` (will be invalid in `key` does not exists).
102
+ #
103
+ # @since 1.0.0
104
+ def [](key)
105
+ end
106
+
107
+ # Associate the `value` Item to `key`, overwriting any previous value.
108
+ # @param key [String]
109
+ # @param value [TagLib::MP4::Item]
110
+ # @return [nil]
111
+ #
112
+ # @since 1.0.0
113
+ def []=(key, value)
114
+ end
115
+
116
+ # Remove the [TagLib::MP4::Item] associated to `key`.
117
+ # @return [nil]
118
+ #
119
+ # @since 1.0.0
120
+ def remove_item(key)
121
+ end
122
+
123
+ # @return True if the tag has an entry for `key`, false otherwise.
124
+ #
125
+ # @since 1.0.0
126
+ def contains(key)
91
127
  end
92
128
  end
93
129
 
@@ -109,11 +145,32 @@ module TagLib::MP4
109
145
  def self.from_bool(value)
110
146
  end
111
147
 
148
+ # @param [Fixnum] value
149
+ # @return [TagLib::MP4::Item]
150
+ #
151
+ # @since 1.0.0
152
+ def self.from_byte(value)
153
+ end
154
+
155
+ # @param [Boolean] value
156
+ # @return [TagLib::MP4::Item]
157
+ #
158
+ # @since 1.0.0
159
+ def self.from_uint(value)
160
+ end
161
+
112
162
  # @param [Fixnum] number
113
163
  # @return [TagLib::MP4::Item]
114
164
  def self.from_int(number)
115
165
  end
116
166
 
167
+ # @param [Fixnum] number
168
+ # @return [TagLib::MP4::Item]
169
+ #
170
+ # @since 1.0.0
171
+ def self.from_long_long(number)
172
+ end
173
+
117
174
  # @example
118
175
  # TagLib::MP4::Item.from_int_pair([4, 11])
119
176
  # @param [Array<Fixnum, Fixnum>] integer_pair
@@ -126,18 +183,43 @@ module TagLib::MP4
126
183
  def self.from_string_list(string_array)
127
184
  end
128
185
 
186
+ # @param [TagLib::ByteVectorList] list
187
+ # @return [TagLib::MP4::Item]
188
+ #
189
+ # @since 1.0.0
190
+ def self.from_byte_vector_list(list)
191
+ end
192
+
129
193
  # @return [Boolean]
130
194
  def to_bool
131
195
  end
132
196
 
133
- # @return [Array<TagLib::MP4::CoverArt>]
134
- def to_cover_art_list
197
+ # @return [Fixnum]
198
+ #
199
+ # @since 1.0.0
200
+ def to_byte
201
+ end
202
+
203
+ # @return [Fixnum]
204
+ #
205
+ # @since 1.0.0
206
+ def to_uint
135
207
  end
136
208
 
137
209
  # @return [Fixnum]
138
210
  def to_int
139
211
  end
140
212
 
213
+ # @return [Fixnum]
214
+ #
215
+ # @since 1.0.0
216
+ def to_long_long
217
+ end
218
+
219
+ # @return [Array<TagLib::MP4::CoverArt>]
220
+ def to_cover_art_list
221
+ end
222
+
141
223
  # @return [Array<Fixnum, Fixnum>]
142
224
  def to_int_pair
143
225
  end
@@ -146,19 +228,25 @@ module TagLib::MP4
146
228
  def to_string_list
147
229
  end
148
230
 
231
+ # @return [TagLib::ByteVectorList]
232
+ #
233
+ # @since 1.0.0
234
+ def to_byte_vector_list
235
+ end
236
+
149
237
  # @return [Boolean]
150
238
  def valid?
151
239
  end
152
240
  end
153
241
 
154
- # The underlying C++-structure of `ItemListMap` inherits from `std::map`.
155
- # Consequently, `ItemListMap` behaves differently from a Ruby hash in a few
156
- # places: the C++ memory management strategies of ItemListMap can lead to
242
+ # The underlying C++-structure of `ItemMap` inherits from `std::map`.
243
+ # Consequently, `ItemMap` behaves differently from a Ruby hash in a few
244
+ # places: the C++ memory management strategies of ItemMap can lead to
157
245
  # a situation where a Ruby object refers to a location in memory that was
158
246
  # freed by C++. To prevent Ruby from crashing on us with a segmentation
159
247
  # fault, we raise an `ObjectPreviouslyDeleted` exception when we try to access
160
248
  # data that is no longer available.
161
- class ItemListMap
249
+ class ItemMap
162
250
  # Return the Item under `key`, or `nil` if no Item is present.
163
251
  # @param [String] key
164
252
  # @return [TagLib::MP4::Item]
@@ -235,10 +323,30 @@ module TagLib::MP4
235
323
  # @return [Array<Array<String, TagLib::MP4::Item>>]
236
324
  def to_a
237
325
  end
326
+
327
+ # Convert self into an hash.
328
+ # @return [Hash<String, TagLib::MP4::Item>]
329
+ #
330
+ # @since 1.0.0
331
+ def to_h
332
+ end
238
333
  end
239
334
  #
240
335
  class Properties < TagLib::AudioProperties
241
- attr_reader :bits_per_sample, :encrypted?
336
+ Unknown = 0
337
+ AAC = 1
338
+ ALAC = 2
339
+
340
+ # @return [Integer] The number of bits per audio sample.
341
+ attr_reader :bits_per_sample
342
+
343
+ # @return [Boolean] Whether or not the file is encrypted.
344
+ attr_reader :encrypted?
345
+
346
+ # @return [Integer] The codec used in the file.
347
+ #
348
+ # @since 1.0.0
349
+ attr_reader :codec
242
350
  end
243
351
 
244
352
  # The `CoverArt` class is used to embed cover art images in MP4 tags.
@@ -247,8 +355,11 @@ module TagLib::MP4
247
355
  # image_data = File.open('cover_art.jpeg', 'rb') { |f| f.read }
248
356
  # cover_art = TagLib::MP4::CoverArt.new(TagLib::MP4::CoverArt::JPEG, image_data)
249
357
  class CoverArt
250
- JPEG = 0x0D
251
- PNG = 0x0E
358
+ Unknown = 0x00
359
+ JPEG = 0x0D
360
+ PNG = 0x0E
361
+ BMP = 0x1B
362
+ GIF = 0x0C # Deprecated
252
363
 
253
364
  # Returns the format of the image data: `JPEG` or `PNG`.
254
365
  # @return [Fixnum]
@@ -14,7 +14,7 @@ module TagLib::MPEG
14
14
  APE = 0x0004
15
15
  AllTags = 0xffff
16
16
 
17
- # {include:TagLib::FileRef.open}
17
+ # {include:::TagLib::FileRef.open}
18
18
  #
19
19
  # @param (see #initialize)
20
20
  # @yield [file] the {File} object, as obtained by {#initialize}
@@ -103,6 +103,24 @@ module TagLib::MPEG
103
103
  # @return [Boolean] whether stripping was successful
104
104
  def strip(tags=TagLib::MPEG::File::AllTags)
105
105
  end
106
+
107
+ # @return [Boolean] Whether or not the file on disk actually has an ID3v1 tag.
108
+ #
109
+ # @since 1.0.0
110
+ def id3v1_tag?
111
+ end
112
+
113
+ # @return [Boolean] Whether or not the file on disk actually has an ID3v2 tag.
114
+ #
115
+ # @since 1.0.0
116
+ def id3v2_tag?
117
+ end
118
+
119
+ # @return [Boolean] Whether or not the file on disk actually has an APE tag.
120
+ #
121
+ # @since 1.0.0
122
+ def ape_tag?
123
+ end
106
124
  end
107
125
 
108
126
  # Audio properties for MPEG files.
@@ -153,6 +171,11 @@ module TagLib::MPEG
153
171
 
154
172
  # Xing VBR header.
155
173
  class XingHeader
174
+
175
+ Invalid = 0
176
+ Xing = 1
177
+ VBRI = 2
178
+
156
179
  # @return [true] if a valid Xing header is present
157
180
  def valid?
158
181
  end
@@ -164,5 +187,11 @@ module TagLib::MPEG
164
187
  # @return [Integer] total size of stream in bytes
165
188
  def total_size
166
189
  end
190
+
191
+ # @return [Integer] the type of the VBR header.
192
+ #
193
+ # @since 1.0.0
194
+ def type
195
+ end
167
196
  end
168
197
  end
@@ -29,10 +29,9 @@ module TagLib::Ogg
29
29
  def contains?(name)
30
30
  end
31
31
 
32
- # Count the number of fields.
32
+ # Count the number of fields (including the pictures).
33
33
  #
34
- # @return [Integer] the number of fields in the comment (name-value
35
- # pairs)
34
+ # @return [Integer] the number of fields in the comment (name-value pairs)
36
35
  def field_count
37
36
  end
38
37
 
@@ -44,7 +43,7 @@ module TagLib::Ogg
44
43
  # 'GENRE' => ["Rock", "Pop"] }
45
44
  #
46
45
  # Note that the returned hash is read-only. Changing it will have no
47
- # effect on the comment; use {#add_field} and {#remove_field} for
46
+ # effect on the comment; use {#add_field} and {#remove_fields} for
48
47
  # that.
49
48
  #
50
49
  # @return [Hash<String, Array<String>>] a hash from field names to
@@ -66,7 +65,50 @@ module TagLib::Ogg
66
65
  # @param [String] value field value
67
66
  #
68
67
  # @return [void]
69
- def remove_field
68
+ #
69
+ # @since 1.0.0
70
+ def remove_fields
71
+ end
72
+
73
+ # Remove all the fields.
74
+ #
75
+ # @since 1.0.0
76
+ def remove_all_fields
77
+ end
78
+
79
+ # @return [Boolean] True if the specified string is a valid Xiph comment key.
80
+ #
81
+ # @since 1.0.0
82
+ def self.check_key(key)
83
+ end
84
+
85
+ # @return [Array<TagLib::FLAC::Picture>] The list of the pictures associated to this comment.
86
+ #
87
+ # @since 1.0.0
88
+ def picture_list
89
+ end
90
+
91
+ # Add a picture.
92
+ # @param [TagLib::FLAC::Picture] picture
93
+ # @return [void]
94
+ #
95
+ # @since 1.0.0
96
+ def add_picture(picture)
97
+ end
98
+
99
+ # Remove a picture.
100
+ # @param [TagLib::FLAC::Picture] picture
101
+ # @return [void]
102
+ #
103
+ # @since 1.0.0
104
+ def remove_picture(picture)
105
+ end
106
+
107
+ # Remove all the pictures.
108
+ # @return [void]
109
+ #
110
+ # @since 1.0.0
111
+ def remove_all_pictures
70
112
  end
71
113
 
72
114
  # @return [String] vendor ID of the encoder used
@@ -0,0 +1,3 @@
1
+ # @since 0.7.0
2
+ module TagLib::RIFF
3
+ end
@@ -11,7 +11,7 @@ module TagLib::Ogg::Vorbis
11
11
  # end
12
12
  #
13
13
  class File < TagLib::Ogg::File
14
- # {include:TagLib::FileRef.open}
14
+ # {include:::TagLib::FileRef.open}
15
15
  #
16
16
  # @param (see #initialize)
17
17
  # @yield [file] the {File} object, as obtained by {#initialize}
@@ -0,0 +1,116 @@
1
+ # @since 0.7.0
2
+ module TagLib::RIFF::WAV
3
+
4
+ FORMAT_UNKNOWN = 0x0000 # @since 1.0.0
5
+ FORMAT_PCM = 0x0001 # @since 1.0.0
6
+
7
+ # The file class for `.wav` files.
8
+ #
9
+ # @example Reading the title
10
+ # title = TagLib::RIFF::WAV::File.open("sample.wav") do |file|
11
+ # file.tag.title
12
+ # end
13
+ #
14
+ # @example Reading WAV-specific audio properties
15
+ # TagLib::RIFF::WAV::File.open("sample.wav") do |file|
16
+ # file.audio_properties.sample_width #=> 16
17
+ # end
18
+ #
19
+ # @example Saving ID3v2 cover-art to disk
20
+ # TagLib::RIFF::WAV::File.open("sample.wav") do |file|
21
+ # id3v2_tag = file.tag
22
+ # cover = id3v2_tag.frame_list('APIC').first
23
+ # ext = cover.mime_type.rpartition('/')[2]
24
+ # File.open("cover-art.#{ext}", "wb") { |f| f.write cover.picture }
25
+ # end
26
+ #
27
+ # @see ID3v2::Tag ID3v2 examples.
28
+ #
29
+ class File < TagLib::File
30
+
31
+ NoTags = 0x0000
32
+ ID3v1 = 0x0001
33
+ ID3v2 = 0x0002
34
+ APE = 0x0004
35
+ AllTags = 0xffff
36
+
37
+ # {include:::TagLib::FileRef.open}
38
+ #
39
+ # @param (see #initialize)
40
+ # @yield [file] the {File} object, as obtained by {#initialize}
41
+ # @return the return value of the block
42
+ #
43
+ def self.open(filename, read_properties=true)
44
+ end
45
+
46
+ # Load a WAV file.
47
+ #
48
+ # @param [String] filename
49
+ # @param [Boolean] read_properties if audio properties should be
50
+ # read
51
+ def initialize(filename, read_properties=true)
52
+ end
53
+
54
+ # Returns the ID3v2 tag.
55
+ #
56
+ # @return [TagLib::ID3v2::Tag]
57
+ def tag
58
+ end
59
+
60
+ # Returns the ID3v2 tag.
61
+ #
62
+ # @return [TagLib::ID3v2::Tag]
63
+ #
64
+ # @since 1.0.0
65
+ def id3v2_tag
66
+ end
67
+
68
+ # Returns audio properties.
69
+ #
70
+ # @return [TagLib::RIFF::WAV::Properties]
71
+ def audio_properties
72
+ end
73
+
74
+ # Remove the tags matching the specified OR-ed types.
75
+ #
76
+ # @param [int] tags The types of tags to remove.
77
+ # @return [void]
78
+ #
79
+ # @since 1.0.0
80
+ def strip(tags=TagLib::RIFF::WAV::File::AllTags)
81
+ end
82
+
83
+ end
84
+
85
+ class Properties < TagLib::AudioProperties
86
+ # @return [Integer] Number of bits per audio sample.
87
+ #
88
+ # @since 1.0.0
89
+ attr_reader :bits_per_sample
90
+
91
+ # @return [Integer] Number of sample frames.
92
+ #
93
+ # @since 1.0.0
94
+ attr_reader :sample_frames
95
+
96
+ # @return [Integer] length of the file in seconds
97
+ #
98
+ # @since 1.0.0
99
+ attr_reader :length_in_seconds
100
+
101
+ # @return [Integer] length of the file in milliseconds
102
+ #
103
+ # @since 1.0.0
104
+ attr_reader :length_in_milliseconds
105
+
106
+ # @return [Integer] The format ID of the file.
107
+ #
108
+ # 0 for unknown, 1 for PCM, 2 for ADPCM, 3 for 32/64-bit IEEE754, and
109
+ # so forth. For further information, refer to the WAVE Form
110
+ # Registration Numbers in RFC 2361.
111
+ #
112
+ # @since 1.0.0
113
+ attr_reader :format
114
+ end
115
+
116
+ end