Advertisement
Guest User

Untitled

a guest
Mar 5th, 2010
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.14 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use warnings;
  4. use strict;
  5.  
  6. use Fcntl ":seek";
  7.  
  8. my $riffHeaderLength = length("RIFF") + 4;
  9. my $ww2ogg = "ww2ogg";
  10.  
  11. {
  12.     my @bnkFilenames = @ARGV;
  13.     exit unless @bnkFilenames;
  14.    
  15.     BNK_FILE_LOOP:
  16.     foreach my $bnkFilename (<@bnkFilenames>)
  17.     {
  18.         open(BNK_FILE, $bnkFilename) or die "Could not open BNK file '${bnkFilename}'";
  19.         binmode BNK_FILE;
  20.        
  21.         my $input;
  22.        
  23.         read(BNK_FILE, $input, 8);
  24.         my ($bkhd, $bkhdLength) = unpack("(A4L)<", $input);
  25.         print "bkhd: $bkhd\n";
  26.         print "bkhdLength: $bkhdLength\n";
  27.         next BNK_FILE_LOOP unless $bkhd eq "BKHD";
  28.        
  29.         seek BNK_FILE, $bkhdLength, SEEK_CUR;
  30.        
  31.         read(BNK_FILE, $input, 8);
  32.         my ($didx, $didxLength) = unpack("(A4L)<", $input);
  33.         print "didx: $didx\n";
  34.         print "didxLength: $didxLength\n";
  35.         next BNK_FILE_LOOP unless $didx eq "DIDX";
  36.        
  37.         seek BNK_FILE, $didxLength, SEEK_CUR;
  38.        
  39.         read(BNK_FILE, $input, 8);
  40.         my ($data, $dataLength) = unpack("(A4L)<", $input);
  41.         print "data: $data\n";
  42.         print "dataLength: $dataLength\n";
  43.         next BNK_FILE_LOOP unless $data eq "DATA";
  44.        
  45.         my $dataContents;
  46.         read(BNK_FILE, $dataContents, $dataLength);
  47.         close(BNK_FILE);
  48.        
  49.         print "dataContents length: ". length($dataContents) ."\n";
  50.        
  51.         my $dataOffset = 0;
  52.         my $iRiff = 0;
  53.         while($dataOffset < length($dataContents))
  54.         {
  55.             print "dataOffset: $dataOffset\n";
  56.            
  57.             my ($riffHeader, $riffLength) = unpack("A4L<", substr($dataContents, $dataOffset, $riffHeaderLength));
  58.             print "riffHeader: $riffHeader\n";
  59.             print "riffLength: $riffLength\n";
  60.            
  61.             my $riffData = substr($dataContents, $dataOffset, $riffHeaderLength + $riffLength);
  62.             my $wavFilename = "${bnkFilename}-${iRiff}.wav";
  63.             open WAV_FILE, ">${wavFilename}";
  64.             binmode WAV_FILE;
  65.             print length($riffData) ."\n";
  66.             print WAV_FILE $riffData;
  67.             close WAV_FILE;
  68.            
  69.             system("${ww2ogg} --full-setup ${wavFilename}");
  70.            
  71.             unlink $wavFilename;
  72.            
  73.             $dataOffset += $riffHeaderLength + $riffLength;
  74.            
  75.             my $pad = 0;
  76.             if($dataOffset % 16 != 0)
  77.             {
  78.                 $pad = 16 - ($dataOffset % 16);
  79.             }
  80.            
  81.             $dataOffset += $pad;
  82.            
  83.             print "pad: $pad\n";
  84.            
  85.             $iRiff++;
  86.         }
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement