# File lib/mp3info.rb, line 320
  def close
    puts "close" if $DEBUG
    if @tag != @tag_orig
      puts "@tag has changed" if $DEBUG
      @tag.each do |k, v|
        @tag1[k] = v
      end
      
      V1_V2_TAG_MAPPING.each do |key1, key2|
        @tag2[key2] = @tag[key1] if @tag[key1]
      end
    end

    if @tag1 != @tag1_orig
      puts "@tag1 has changed" if $DEBUG
      raise(Mp3InfoError, "file is not writable") unless File.writable?(@filename)
      @tag1_orig.update(@tag1)
      #puts "@tag1_orig: #{@tag1_orig.inspect}"
      File.open(@filename, 'rb+') do |file|
        file.seek(-TAGSIZE, File::SEEK_END)
        t = file.read(3)
        if t != 'TAG'
          #append new tag
          file.seek(0, File::SEEK_END)
          file.write('TAG')
        end
        str = [
          @tag1_orig["title"]||"",
          @tag1_orig["artist"]||"",
          @tag1_orig["album"]||"",
          ((@tag1_orig["year"] != 0) ? ("%04d" % @tag1_orig["year"].to_i) : "\0\0\0\0"),
          @tag1_orig["comments"]||"",
          0,
          @tag1_orig["tracknum"]||0,
          @tag1_orig["genre"]||255
          ].pack("Z30Z30Z30Z4Z28CCC")
        file.write(str)
      end
    end

    if @tag2.changed?
      puts "@tag2 has changed" if $DEBUG
      raise(Mp3InfoError, "file is not writable") unless File.writable?(@filename)
      tempfile_name = nil
      File.open(@filename, 'rb+') do |file|
        
        #if tag2 already exists, seek to end of it
        if @tag2.valid?
          file.seek(@tag2.io_position)
        end
  #      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_len = @file.get_syncsafe
  #        @file.seek(@file.get_syncsafe - 4, IO::SEEK_CUR) if ext_header
  #     @file.seek(tag2_len, IO::SEEK_CUR)
  #      end
        tempfile_name = @filename + ".tmp"
        File.open(tempfile_name, "wb") do |tempfile|
          unless @tag2.empty?
            tempfile.write("ID3")
            tempfile.write(@tag2.to_bin)
          end

          bufsiz = file.stat.blksize || 4096
          while buf = file.read(bufsiz)
            tempfile.write(buf)
          end
        end
      end
      File.rename(tempfile_name, @filename)
    end
    @file = nil
  end