version_index = ( ord( $value[1] ) & 0x18 ) >> 3; $this->layer_index = ( ord( $value[1] ) & 0x06 ) >> 1; $this->has_CRC = ord( $value[1] ) & 0x01; $this->bitrate_index = ( ord( $value[2] ) & 0xF0 ) >> 4; $this->samplerate_index = ( ord( $value[2] ) & 0x0C ) >> 2; $this->is_padded = ( ord( $value[2] ) & 0x02 ) >> 1; $this->is_private = ord( $value[2] ) & 0x01; $this->channel_mode = ( ord( $value[3] ) & 0xC0 ) >> 6; $this->mode_extension = ( ord( $value[3] ) & 0x30 ) >> 4; $this->copyright = ( ord( $value[3] ) & 0x08 ) >> 3; $this->original = ( ord( $value[3] ) & 0x04 ) >> 2; $this->emphasis = ord( $value[3] ) & 0x03; } private function get_bitrate() { $bitrate = -1; // read the bitrate, based on the mpeg layer and version if ( $this->layer != self::MPEG_VER_NA ) { if ( $this->version == self::MPEG_VER_1 ) { switch ( $this->layer) { case self::MPEG_LAYER_1: $bitrate = $this->mp3_bitrate[0][$this->bitrate_index]; break; case self::MPEG_LAYER_2: $bitrate = $this->mp3_bitrate[1][$this->bitrate_index]; break; case self::MPEG_LAYER_3: $bitrate = $this->mp3_bitrate[2][$this->bitrate_index]; break; } } else { switch ( $this->layer ) { case self::MPEG_LAYER_1: $bitrate = $this->mp3_bitrate[3][$this->bitrate_index]; break; case self::MPEG_LAYER_2: $bitrate = $this->mp3_bitrate[4][$this->bitrate_index]; break; case self::MPEG_LAYER_3: $bitrate = $this->mp3_bitrate[5][$this->bitrate_index]; break; } } } if( $bitrate != -1) { return $bitrate * 1000; } else { return $bitrate; } } private function get_samplerate() { return $this->mp3_samplerate[$this->samplerate_index][$this->version]; } private function get_samples_per_frame() { return $this->mp3_samples_per_frame[$this->version][$this->layer]; } function __get( $prop ) { switch ( $prop ) { case 'bitrate': return $this->get_bitrate(); break; case 'samplerate': return $this->get_samplerate(); break; case 'samples_per_frame': return $this->get_samples_per_frame(); break; case 'version': switch( $this->version_index ) { case 0: return self::MPEG_VER_25; break; case 1: return self::MPEG_VER_NA; break; case 2: return self::MPEG_VER_2; break; case 3: return self::MPEG_VER_1; break; } break; case 'layer': switch( $this->layer_index ) { case 0: return self::MPEG_LAYER_NA; break; case 1: return self::MPEG_LAYER_3; break; case 2: return self::MPEG_LAYER_2; break; case 3: return self::MPEG_LAYER_1; break; } break; } } } ?>