# 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