final NumberFormat numFormat = NumberFormat.getInstance( Locale.US );
File inputDir, outputDir, inputFile, outputFile;
int aziDeg, elevDeg;
AudioFile inF = null;
AudioFile outF = null;
AudioFileDescr inDescr, outDescr;
File[] fileArgs = (File[]) context.getClientArg( "files" );
final int progLen = 24 * 7;
int progOff = 0;
boolean success = false;
try {
numFormat.setMinimumIntegerDigits( 3 );
numFormat.setMaximumIntegerDigits( 3 );
numFormat.setMinimumFractionDigits( 0 );
numFormat.setMaximumFractionDigits( 0 );
fileFormat.setFormatByArgumentIndex( 3, numFormat );
fileFormat.setFormatByArgumentIndex( 4, numFormat );
inputDir = fileArgs[0];
outputDir = fileArgs[1];
fileFrmtArgs[0] = inputDir.getAbsolutePath();
fileFrmtArgs[1] = File.separator;
fileFrmtArgs[2] = inputDir.getName();
try {
for( int azi = 0; azi < 24; azi++ ) {
for( int elev = 0; elev < 7; elev++ ) {
aziDeg = ((azi + 12) * 15) % 360;
elevDeg = elev <= 3 ? (45 - elev * 15) : (405 - elev * 15);
fileFrmtArgs[3] = new Integer( aziDeg );
fileFrmtArgs[4] = new Integer( elevDeg );
inputFile = new File( fileFormat.format( fileFrmtArgs ));
System.err.println( "Reading '"+inputFile.getName()+"' ..." );
inF = AudioFile.openAsRead( inputFile );
inDescr = inF.getDescr();
if( inDescr.channels != 2 ) throw new IOException( "Wrong channel num. Needs to be 2, but is "+inDescr.channels );
if( inDescr.length != 8192 ) System.err.println( "Warning, frame length should be 8192, but is "+inDescr.length );
inF.seekFrame( IR_OFFSET );
inF.readFrames( inBuf, 0, IR_LENGTH ); // simply truncate
inF.close();
inF = null;
for( int ch = 0; ch < 2; ch++ ) {
// short fade in / out
for( int i = 1, j = 0; i < 32; i++, j++ ) {
inBuf[ ch ][ j ] *= (float) i / 32;
}
for( int i = 31, j = IR_LENGTH - 32; i > 0; i--, j++ ) {
inBuf[ ch ][ j ] *= (float) i / 32;
}
outputFile = new File( outputDir, "hrtf" + (elev * 24 + azi) + (ch == 0 ? "l" : "r" ) + ".aif" );
System.err.println( "Writing '"+outputFile.getName()+"' ..." );
outDescr = new AudioFileDescr( inDescr );
outDescr.type = AudioFileDescr.TYPE_AIFF;
outDescr.channels = 1;
outDescr.file = outputFile;
outF = AudioFile.openAsWrite( outDescr );
outBuf[ 0 ] = inBuf[ ch ];