rlm@3: <?php
rlm@3: // +----------------------------------------------------------------------+
rlm@3: // | PHP version 5                                                        |
rlm@3: // +----------------------------------------------------------------------+
rlm@3: // | Copyright (c) 2002-2006 James Heinrich, Allan Hansen                 |
rlm@3: // +----------------------------------------------------------------------+
rlm@3: // | This source file is subject to version 2 of the GPL license,         |
rlm@3: // | that is bundled with this package in the file license.txt and is     |
rlm@3: // | available through the world-wide-web at the following url:           |
rlm@3: // | http://www.gnu.org/copyleft/gpl.html                                 |
rlm@3: // +----------------------------------------------------------------------+
rlm@3: // | getID3() - http://getid3.sourceforge.net or http://www.getid3.org    |
rlm@3: // +----------------------------------------------------------------------+
rlm@3: // | Authors: James Heinrich <infoØgetid3*org>                            |
rlm@3: // |          Allan Hansen <ahØartemis*dk>                                |
rlm@3: // +----------------------------------------------------------------------+
rlm@3: // | module.audio.rkau.php                                                |
rlm@3: // | Module for analyzing RKAU Audio files                                |
rlm@3: // | dependencies: NONE                                                   |
rlm@3: // +----------------------------------------------------------------------+
rlm@3: //
rlm@3: // $Id: module.audio.rkau.php,v 1.2 2006/11/02 10:48:01 ah Exp $
rlm@3: 
rlm@3:         
rlm@3:         
rlm@3: class getid3_rkau extends getid3_handler
rlm@3: {
rlm@3: 
rlm@3:     public function Analyze() {
rlm@3: 
rlm@3:         $getid3 = $this->getid3;
rlm@3:         
rlm@3:         fseek($getid3->fp, $getid3->info['avdataoffset'], SEEK_SET);
rlm@3:         $rkau_header = fread($getid3->fp, 20);
rlm@3:         
rlm@3:         // Magic bytes 'RKA'
rlm@3:             
rlm@3:         $getid3->info['fileformat']            = 'rkau';
rlm@3:         $getid3->info['audio']['dataformat']   = 'rkau';
rlm@3:         $getid3->info['audio']['bitrate_mode'] = 'vbr';
rlm@3:         
rlm@3:         // Shortcut
rlm@3:         $getid3->info['rkau'] = array ();
rlm@3:         $info_rkau            = &$getid3->info['rkau'];
rlm@3:         
rlm@3:         $info_rkau['raw']['version']   = getid3_lib::LittleEndian2Int(substr($rkau_header, 3, 1));
rlm@3:         $info_rkau['version']          = '1.'.str_pad($info_rkau['raw']['version'] & 0x0F, 2, '0', STR_PAD_LEFT);
rlm@3:         if (($info_rkau['version'] > 1.07) || ($info_rkau['version'] < 1.06)) {
rlm@3:             throw new getid3_exception('This version of getID3() can only parse RKAU files v1.06 and 1.07 (this file is v'.$info_rkau['version'].')');
rlm@3:         }
rlm@3: 
rlm@3:         getid3_lib::ReadSequence('LittleEndian2Int', $info_rkau, $rkau_header,  4,
rlm@3:             array (
rlm@3:                 'source_bytes'     => 4,
rlm@3:                 'sample_rate'      => 4,
rlm@3:                 'channels'         => 1,
rlm@3:                 'bits_per_sample'  => 1
rlm@3:             )
rlm@3:         );
rlm@3: 
rlm@3:         $info_rkau['raw']['quality']   = getid3_lib::LittleEndian2Int(substr($rkau_header, 14, 1));
rlm@3:         
rlm@3:         $quality =  $info_rkau['raw']['quality'] & 0x0F;
rlm@3: 
rlm@3:         $info_rkau['lossless']          = (($quality == 0) ? true : false);
rlm@3:         $info_rkau['compression_level'] = (($info_rkau['raw']['quality'] & 0xF0) >> 4) + 1;
rlm@3:         if (!$info_rkau['lossless']) {
rlm@3:             $info_rkau['quality_setting'] = $quality;
rlm@3:         }
rlm@3:         
rlm@3:         $info_rkau['raw']['flags']            = getid3_lib::LittleEndian2Int(substr($rkau_header, 15, 1));
rlm@3:         $info_rkau['flags']['joint_stereo']   = (bool)(!($info_rkau['raw']['flags'] & 0x01));
rlm@3:         $info_rkau['flags']['streaming']      =  (bool) ($info_rkau['raw']['flags'] & 0x02);
rlm@3:         $info_rkau['flags']['vrq_lossy_mode'] =  (bool) ($info_rkau['raw']['flags'] & 0x04);
rlm@3: 
rlm@3:         if ($info_rkau['flags']['streaming']) {
rlm@3:             $getid3->info['avdataoffset'] += 20;
rlm@3:             $info_rkau['compressed_bytes']  = getid3_lib::LittleEndian2Int(substr($rkau_header, 16, 4));
rlm@3:         } 
rlm@3:         else {
rlm@3:             $getid3->info['avdataoffset'] += 16;
rlm@3:             $info_rkau['compressed_bytes'] = $getid3->info['avdataend'] - $getid3->info['avdataoffset'] - 1;
rlm@3:         }
rlm@3:         // Note: compressed_bytes does not always equal what appears to be the actual number of compressed bytes,
rlm@3:         // sometimes it's more, sometimes less. No idea why(?)
rlm@3: 
rlm@3:         $getid3->info['audio']['lossless']        = $info_rkau['lossless'];
rlm@3:         $getid3->info['audio']['channels']        = $info_rkau['channels'];
rlm@3:         $getid3->info['audio']['bits_per_sample'] = $info_rkau['bits_per_sample'];
rlm@3:         $getid3->info['audio']['sample_rate']     = $info_rkau['sample_rate'];
rlm@3: 
rlm@3:         $getid3->info['playtime_seconds']         = $info_rkau['source_bytes'] / ($info_rkau['sample_rate'] * $info_rkau['channels'] * ($info_rkau['bits_per_sample'] / 8));
rlm@3:         $getid3->info['audio']['bitrate']         = ($info_rkau['compressed_bytes'] * 8) / $getid3->info['playtime_seconds'];
rlm@3: 
rlm@3:         return true;
rlm@3: 
rlm@3:     }
rlm@3: 
rlm@3: }
rlm@3: 
rlm@3: ?>