rlm@3: | rlm@3: // | Allan Hansen | 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: ?>