Access WaveFileReader reflectively
This commit is contained in:
parent
34e1bc3868
commit
49c273763a
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue