# File lib/mp3info.rb, line 271 def initialize(filename) $stderr.puts("#{self.class}::new() does not take block; use #{self.class}::open() instead") if block_given? raise(Mp3InfoError, "empty file") unless File.stat(filename).size? #FIXME @filename = filename @vbr = false @file = File.new(filename, "rb") @tag2 = {} @tag1 = gettag1 @tag_orig = @tag1.dup ########################## # ID3v2 ########################## tag2_len = 0 @file.rewind if @file.read(3) == "ID3" version_maj, version_min, flags = @file.read(3).unpack("CCB4") unsync, ext_header, experimental, footer = (0..3).collect { |i| flags[i].chr == '1' } @tag2["version"] = "2.#{version_maj}.#{version_min}" tag2_len = size_syncsafe(@file.read(4)) if ext_header ext_size = size_syncsafe(@file.read(4)) - 6 @file.read(2) @file.read(ext_size) end loop do break if @file.pos >= tag2_len name = @file.read(4) #break if name == "\000\000\000\000" size = @file.read(4).unpack("N")[0] flags = @file.read(2) data = @file.read(size) type = data[0] name = ID2TAGS[name] || name if name != "\000\000\000\000" @tag2[name] = data[1..-1] end end else @file.rewind end ########################## # END OF ID3v2 ########################## begin find_frame_sync head = @file.read(4) raise(Mp3InfoInternalError) if not check_head(head) @first_frame_pos = @file.pos - 4 h = extract_infos_from_head(head) h.each { |k,v| eval "@#{k} = #{v.inspect}" } seek = if @mpeg_version == 3 # mpeg version 1 if @channel_num == 3 15 # Single Channel else 30 end else # mpeg version 2 or 2.5 if @channel_num == 3 # Single Channel 7 else 15 end end @file.pos += seek if @file.read(4) == "Xing" # This is a VBR file @vbr = true @file.pos += 4 #we have the frames number after #if @file.read(4).unpack("N")[0] == 0xF #end @frames = @file.read(4).unpack("N")[0] medframe = @file.stat.size / @frames.to_f @bitrate = ( (medframe * @samplerate) / ( 1000 * ( layer==3 ? 12 : 144) ) ).to_i end @frame_num = 0 @length = (( (8 * @file.stat.size) / 1000.0) / @bitrate) rescue Mp3InfoInternalError retry rescue @file.close raise end end