Example #1
0
 /**
  * Writes the tag data.
  *
  * @param HausDesign_Io_Writer $writer The writer object.
  * @return void
  */
 private function _writeData($writer)
 {
     $this->clearOption('unsynchronisation');
     $buffer = new HausDesign_Io_StringWriter();
     foreach ($this->_frames as $frames) {
         foreach ($frames as $frame) {
             $frame->write($buffer);
         }
     }
     $frameData = $buffer->toString();
     $frameDataLength = strlen($frameData);
     $paddingLength = 0;
     // ID3v2.4.0 supports frame level unsynchronisation while
     // ID3v2.3.0 supports only tag level unsynchronisation.
     if ($this->getOption('version', 4) < 4 && $this->getOption('compat', false) !== true) {
         $frameData = $this->_encodeUnsynchronisation($frameData);
         if (($len = strlen($frameData)) != $frameDataLength) {
             $frameDataLength = $len;
             $this->_header->setFlags($this->_header->getFlags() | HausDesign_Media_Id3_Header::UNSYNCHRONISATION);
         } else {
             $this->_header->setFlags($this->_header->getFlags() & ~HausDesign_Media_Id3_Header::UNSYNCHRONISATION);
         }
     }
     // The tag padding is calculated as follows. If the tag can be written
     // in the space of the previous tag, the remaining space is used for
     // padding. If there is no previous tag or the new tag is bigger than
     // the space taken by the previous tag, the padding is a constant
     // 4096 bytes.
     if ($this->hasFooter() === false) {
         if ($this->_reader !== null && $frameDataLength < $this->_header->getSize()) {
             $paddingLength = $this->_header->getSize() - $frameDataLength;
         } else {
             $paddingLength = 4096;
         }
     }
     /* ID3v2.4.0 CRC calculated w/ padding */
     if ($this->getOption('version', 4) >= 4) {
         $frameData = str_pad($frameData, $frameDataLength += $paddingLength, "");
     }
     $extendedHeaderData = '';
     $extendedHeaderDataLength = 0;
     if ($this->hasExtendedHeader()) {
         $this->_extendedHeader->setPadding($paddingLength);
         if ($this->_extendedHeader->hasFlag(HausDesign_Media_Id3_ExtendedHeader::CRC32)) {
             $crc = crc32($frameData);
             if ($crc & 0x80000000) {
                 $crc = -(($crc ^ 0xffffffff) + 1);
             }
             $this->_extendedHeader->setCrc($crc);
         }
         $buffer = new HausDesign_Io_StringWriter();
         $this->_extendedHeader->write($buffer);
         $extendedHeaderData = $buffer->toString();
         $extendedHeaderDataLength = strlen($extendedHeaderData);
     }
     /* ID3v2.3.0 CRC calculated w/o padding */
     if ($this->getOption('version', 4) < 4) {
         $frameData = str_pad($frameData, $frameDataLength += $paddingLength, "");
     }
     $this->_header->setSize($extendedHeaderDataLength + $frameDataLength);
     $writer->write('ID3');
     $this->_header->write($writer);
     $writer->write($extendedHeaderData);
     $writer->write($frameData);
     if ($this->hasFooter()) {
         $writer->write('3DI');
         $this->_footer->write($writer);
     }
 }