#!/usr/bin/perl


# display headers of wave files

if ($#ARGV < 0 )
{
    print "display <inname>\n";
    print "# display headers of wave files.\n");
    exit;
}

# open it
open(WAV,$ARGV[0]) || die "Can't open $ARGV[0]";

# RIFF Header
read (WAV, $riffheader, 12);
print "RIFF Header\n";
print "-----------\n";
@riffhdr = unpack("C32",$riffheader);
for($i=0;$i<12;$i++)
{
    if( ($i%8) ==0 && $i!=0 ){print "\n";}
    printf("%02x ",$riffhdr[$i]);
}
print "\n\n";

# verify header ----------------------------------
read (WAV, $header, 32);
print "WAVE Header\n";
print "-----------\n";

@hdr = unpack("C32",$header);

# print out header
for($i=0;$i<32;$i++)
{
    if( ($i%8) ==0 && $i !=0 ){print "\n";}
    printf("%02x ",$hdr[$i]);
}
print "\n\n";

#ckID ---------------------------------
print "ckID:             ";
for($p=0,$i=0;$i<4;$i++){printf("%02x ",$hdr[$p++]);}
$p-=4;
for($i=0;$i<4;$i++){printf("%c",$hdr[$p++]);}
print "\n";

#nChunkSize ---------------------------
print "nChunkSize:       ";
for($i=0;$i<4;$i++) {printf("%02x ",$hdr[$p++]);}
$p-=4;
$nChunkSize = $hdr[$p++] + 256*$hdr[$p++] + 65536*$hdr[$p++] + 256*256*256*$hdr[$p++];
print "($nChunkSize bytes)\n";

#wFormatTag ---------------------------
print "wFormatTag:       ";
printf("%02x ",$hdr[$p++]);
printf("%02x \n",$hdr[$p++]);

#nChannels ----------------------------
print "nChannels:        ";
printf("%02x ",$hdr[$p++]);
printf("%02x \n",$hdr[$p++]);

#nSamplesPerSec -----------------------
print "nSamplesPerSec:   ";
for($i=0;$i<4;$i++){printf("%02x ",$hdr[$p++]);}
$p-=4;
$nSamplesPerSec = $hdr[$p++]+256*$hdr[$p++] + 65536*$hdr[$p++] + 256*256*256*$hdr[$p++];
print "($nSamplesPerSec samples per second)\n";

#nAvgBytesPerSec ----------------------
print "nAvgBytesPerSec:  ";
for($i=0;$i<4;$i++) {printf("%02x ",$hdr[$p++]);}
$p-=4;
$nAvgBytesPerSec = $hdr[$p++]+256*$hdr[$p++] + 65536*$hdr[$p++]+256*256*256*$hdr[$p++];
print "($nAvgBytesPerSec average bytes per second)\n";

#nBlockAlign --------------------------
print "nBlockAlign:      ";
for($i=0;$i<2;$i++) {printf("%02x ",$hdr[$p++]);}
$p-=2;
$nBlockAlign = $hdr[$p++]+256*$hdr[$p++];
print "\n";

#nBitsPerSample -----------------------
print "nBitsperSample:   ";
for($i=0;$i<2;$i++) {printf("%02x ",$hdr[$p++]);}
$p-=2;
$nBlockAlign = $hdr[$p++]+256*$hdr[$p++];
print "\n";