128 lines
6.6 KiB
PHP
128 lines
6.6 KiB
PHP
<?php
|
||
session_start();
|
||
|
||
class wave
|
||
{
|
||
public $nombre;
|
||
public function __construct($nombre = 0)
|
||
{
|
||
if(!empty($nombre))
|
||
{
|
||
$this->nombre = $nombre.'r'.$nombre;
|
||
$strlen = strlen($this->nombre);
|
||
|
||
$binary = ''; // Contiendra les donnees, juste les donnees.
|
||
|
||
for($i = 0; $i < $strlen; $i++)
|
||
{
|
||
$binary .= $this->get_datas('../'.$this->nombre{$i}.'.wav');
|
||
}
|
||
|
||
$this->package($binary);
|
||
}
|
||
}
|
||
|
||
public function analyse($wav,$arg = FALSE)
|
||
{
|
||
if(file_exists('../'.$wav))
|
||
{
|
||
|
||
$entete_unpack = 'a4file_type/Lfile_size/a4file_id/A4nom_zone1/Ltaille_zone1/SFormatTag/SChannels/LSamplesPerSec/LAvgBytesPerSec/SBlockAlign/SBitsPerSample/A4nom_data/Ltaille_data';
|
||
|
||
$fp = fopen('../'.$wav,'r');
|
||
$file = fread($fp, 44 );
|
||
|
||
$entete = unpack($entete_unpack,$file);
|
||
fclose($fp);
|
||
|
||
|
||
if( ($entete['file_type'] !== chr(0x52).chr(0x49).chr(0x46).chr(0x46) ) OR ( $entete['file_id'] !== chr(0x57).chr(0x41).chr(0x56).chr(0x45) ) )
|
||
{
|
||
trigger_error('Le fichier '.$wav.' n\'est pas un fichier wav',E_USER_ERROR);
|
||
}
|
||
|
||
if(!$arg)
|
||
return $entete;
|
||
else
|
||
return $entete[$arg];
|
||
}
|
||
else
|
||
{
|
||
|
||
trigger_error('fonction analyse, le fichier '.$wav.' est neccessaire mais manquant', E_USER_ERROR);
|
||
return FALSE;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
private function get_datas($wav)
|
||
{
|
||
if(file_exists('../'.$wav))
|
||
{
|
||
$fp = fopen('../'.$wav,'r');
|
||
fseek($fp, 44 );
|
||
|
||
$datas = fread($fp, $this->analyse($wav, 'taille_data'));
|
||
|
||
fclose($fp);
|
||
|
||
return $datas;
|
||
}
|
||
else
|
||
{
|
||
trigger_error('fonction analyse, le fichier '.$wav.' est neccessaire mais manquant', E_USER_ERROR);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
private function package($datas)
|
||
{
|
||
$entete_pack = 'a4La4A4LSSLLSSA4L';
|
||
|
||
$entete = $this->analyse('../'.$this->nombre{0}.'.wav');
|
||
|
||
for($i = 1;$i<strlen($this->nombre); $i ++)
|
||
{
|
||
$entete2 = $this->analyse('../'.$this->nombre{$i}.'.wav');
|
||
if($entete !== $entete2)
|
||
{
|
||
if($entete['Channels'] !== $entete2['Channels'])
|
||
{
|
||
trigger_error('fonction package, un ou plusieurs fichiers wad n\'ont pas le m<>me nombre de canaux',E_USER_ERROR);
|
||
}
|
||
|
||
if($entete['BitsPerSample'] !== $entete2['BitsPerSample'])
|
||
{
|
||
trigger_error('fonction package, un ou plusieurs fichiers wad, n\'on pas le m<>me nombres d\'<27>chantillons par seconde', E_USER_ERROR);
|
||
}
|
||
|
||
if($entete['SamplesPerSec'] !== $entete2['SamplesPerSec'])
|
||
{
|
||
trigger_error('fonction package, un ou plusieurs fichiers wad, n\'ont pas la m<>me fr<66>quence d\'<27>chantillonage', E_USER_WARNING);
|
||
}
|
||
}
|
||
}
|
||
|
||
/* On calcule la taille des donnees que l'on <20> creer selon la formule de soundeditor */
|
||
$entete['taille_data'] = strlen($datas);
|
||
$entete['taille_data'] /= $entete['BlockAlign'];
|
||
$entete['taille_data'] *= $entete['BlockAlign'];
|
||
|
||
$entete['file_size'] = 44 + strlen($datas);
|
||
|
||
/* on "pack l entete et on y ajoute les donnees */
|
||
$binary = pack($entete_pack, $entete['file_type'],$entete['file_size'],$entete['file_id'],$entete['nom_zone1'],
|
||
$entete['taille_zone1'],$entete['FormatTag'],$entete['Channels'],$entete['SamplesPerSec'],$entete['AvgBytesPerSec'],
|
||
$entete['BlockAlign'],$entete['BitsPerSample'],$entete['nom_data'],$entete['taille_data']);
|
||
$binary .= $datas;
|
||
|
||
/* On transmet ou enregistre */
|
||
header('Content-type: audio/x-wav');
|
||
header('Content-Disposition: attachment; filename="code.wav"');
|
||
echo $binary;
|
||
}
|
||
}
|
||
|
||
$wav = new wave($_SESSION['aleat_nbr']);
|
||
?>
|