import com.sun.media.sound.WaveFileReader;
import jm.util.Read;
import jass.generators.FFT;
import java.text.DecimalFormat;
public class HRIRLoaderListen implements IHRIRLoader {
private String path;
private String id;
private int fftLen = 512;
private int fftPow = 9;
public int getFFTSize() {
return this.fftLen;
}
public int getFFTPower() {
return this.fftPow;
}
public HRIRLoaderListen(String path, String id) {
this.path = path;
this.id = id;
}
private int nearest15(int val) {
int ret = val/15;
return ret*15;
}
private final double[] elevDeg ={0,15,30,45/*,60*/,315,330,345};
private int nearestElev(double elev) {
double currDiff = Double.MAX_VALUE;
double minAzOld = Double.MAX_VALUE;
double minAz = Double.MAX_VALUE;
for(double azDeg: elevDeg) {
if(Math.signum(azDeg) == Math.signum(elev) || azDeg == 0 ) {
double diff = Math.abs(azDeg-elev);
if(diff <= currDiff) {
minAzOld = minAz;
minAz = azDeg;
currDiff = diff;
}
}
}
if(minAzOld == Double.MAX_VALUE) {
minAzOld = minAz;
}
return (int) minAzOld;
}
private DecimalFormat decFormat = new DecimalFormat("000");
public double[][][] getImpulseResponses(double azimuth, double elevation) {
azimuth = ((azimuth*180.0)+180) % 360.0;
if(azimuth < 0) {azimuth += 360;}
elevation = (elevation*180.0) % 360;
if(elevation < 0) {elevation += 360;}
System.err.println("az elev "+azimuth+" "+elevation+" < "+nearest15((int)azimuth)+" "+nearestElev((int)elevation));
String az = String.format("%03d",nearest15(((int) (azimuth * 100.0)) / 100));
String elev = String.format("%03d",nearestElev(elevation));
String filePath = this.path+this.id+"_T"+az+"_P"+elev+".wav";
float[] audio = new WavFileReader(filePath).getAudio();
System.out.println(audio.length);
double[] left = new double[audio.length/2];
double[] right = new double[audio.length/2];
for(int i = 0; i < audio.length/2; i++) {
left[i] = audio[2*i];
right[i]= audio[(2*i)+1];
}
/*double[] left_img = new double[audio.length/2];
double[] right_img = new double[audio.length/2];
FFT fft = new FFT(this.fftPow);
fft.doFFT(left, left_img, false);
fft.doFFT(right, right_img, false);
*/
/*for(int i = 0; i < left.length; i++) {
left[i] = 1.0;
right[i]= 1.0;
left_img[i] = 0;
right_img[i]= 0;
} */
return new double[][][]{new double[][]{left, left},new double[][]{right, right}};
}
}