|
|
|
@ -35,18 +35,24 @@ import java.io.BufferedInputStream;
|
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.lang.invoke.MethodHandle;
|
|
|
|
|
import java.lang.invoke.MethodHandles;
|
|
|
|
|
import java.net.URL;
|
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
|
import java.nio.ByteOrder;
|
|
|
|
|
import java.nio.ShortBuffer;
|
|
|
|
|
|
|
|
|
|
import javax.sound.sampled.AudioFormat;
|
|
|
|
|
import javax.sound.sampled.spi.AudioFileReader;
|
|
|
|
|
import javax.sound.sampled.AudioInputStream;
|
|
|
|
|
import javax.sound.sampled.AudioSystem;
|
|
|
|
|
|
|
|
|
|
import org.lwjgl.openal.AL10;
|
|
|
|
|
|
|
|
|
|
import com.sun.media.sound.WaveFileReader;
|
|
|
|
|
import dev.pfaff.unfettered.UnsafeUtil;
|
|
|
|
|
|
|
|
|
|
import static java.lang.invoke.MethodHandles.*;
|
|
|
|
|
import static java.lang.invoke.MethodType.*;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
@ -57,6 +63,21 @@ import com.sun.media.sound.WaveFileReader;
|
|
|
|
|
* $Id$
|
|
|
|
|
*/
|
|
|
|
|
public class WaveData {
|
|
|
|
|
private static final MethodHandle MH_getWaveInputStream;
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
|
MethodHandles.Lookup l = UnsafeUtil.getTrustedLookup();
|
|
|
|
|
try {
|
|
|
|
|
Class<?> C_WaveFileReader = Class.forName("com.sun.media.sound.WaveFileReader");
|
|
|
|
|
MethodHandle MH_WaveFileReader_constructor = l.findConstructor(C_WaveFileReader, methodType(void.class));
|
|
|
|
|
MethodHandle MH_getAudioInputStream = l.findVirtual(AudioFileReader.class, "getAudioInputStream", methodType(AudioInputStream.class, InputStream.class));
|
|
|
|
|
MH_getAudioInputStream = MH_getAudioInputStream.asType(MH_getAudioInputStream.type().changeParameterType(0, C_WaveFileReader).changeParameterType(1, BufferedInputStream.class));
|
|
|
|
|
MH_getWaveInputStream = foldArguments(MH_getAudioInputStream, dropArguments(MH_WaveFileReader_constructor, 0, BufferedInputStream.class));
|
|
|
|
|
} catch (Throwable e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** actual wave data */
|
|
|
|
|
public final ByteBuffer data;
|
|
|
|
|
|
|
|
|
@ -97,10 +118,10 @@ public class WaveData {
|
|
|
|
|
// due to an issue with AudioSystem.getAudioInputStream
|
|
|
|
|
// and mixing unsigned and signed code
|
|
|
|
|
// we will use the reader directly
|
|
|
|
|
WaveFileReader wfr = new WaveFileReader();
|
|
|
|
|
return create(wfr.getAudioInputStream(new BufferedInputStream(path.openStream())));
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
org.lwjgl.LWJGLUtil.log("Unable to create from: " + path + ", " + e.getMessage());
|
|
|
|
|
AudioInputStream ais = (AudioInputStream) MH_getWaveInputStream.invokeExact(new BufferedInputStream(path.openStream()));
|
|
|
|
|
return create(ais);
|
|
|
|
|
} catch (Throwable e) {
|
|
|
|
|
org.lwjgl.LWJGLUtil.logger().log(() -> "Unable to create from: " + path + ", " + e.getMessage());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -126,7 +147,7 @@ public class WaveData {
|
|
|
|
|
return create(
|
|
|
|
|
AudioSystem.getAudioInputStream(is));
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
org.lwjgl.LWJGLUtil.log("Unable to create from inputstream, " + e.getMessage());
|
|
|
|
|
org.lwjgl.LWJGLUtil.logger().log(() -> "Unable to create from inputstream, " + e.getMessage());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -143,7 +164,7 @@ public class WaveData {
|
|
|
|
|
AudioSystem.getAudioInputStream(
|
|
|
|
|
new BufferedInputStream(new ByteArrayInputStream(buffer))));
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
org.lwjgl.LWJGLUtil.log("Unable to create from byte array, " + e.getMessage());
|
|
|
|
|
org.lwjgl.LWJGLUtil.logger().log(() -> "Unable to create from byte array, " + e.getMessage());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -168,7 +189,7 @@ public class WaveData {
|
|
|
|
|
}
|
|
|
|
|
return create(bytes);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
org.lwjgl.LWJGLUtil.log("Unable to create from ByteBuffer, " + e.getMessage());
|
|
|
|
|
org.lwjgl.LWJGLUtil.logger().log(() -> "Unable to create from ByteBuffer, " + e.getMessage());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|