OpenAL Sound don';我不能在Java中正常播放

OpenAL Sound don';我不能在Java中正常播放,java,audio,lwjgl,openal,Java,Audio,Lwjgl,Openal,我写了一个使用OpenAL的程序。但是,当我运行它时,声音不能正常播放 声音以惊人的速度播放。此外,如果更改声音的音调,声音会变得嘈杂。 为什么呢 代码。 我查阅了下URL中的源代码 包其他; 导入java.io.BufferedInputStream; 导入java.io.FileInputStream; 导入java.io.FileNotFoundException; 导入java.io.IOException; 导入java.nio.FloatBuffer; 导入java.nio.Int

我写了一个使用OpenAL的程序。但是,当我运行它时,声音不能正常播放

声音以惊人的速度播放。此外,如果更改声音的音调,声音会变得嘈杂。 为什么呢

代码。 我查阅了下URL中的源代码

包其他;
导入java.io.BufferedInputStream;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.nio.FloatBuffer;
导入java.nio.IntBuffer;
导入org.lwjgl.BufferUtils;
导入org.lwjgl.LWJGLException;
导入org.lwjgl.openal.AL;
导入org.lwjgl.openal.AL10;
导入org.lwjgl.openal.AL11;
导入org.lwjgl.util.WaveData;
公共音乐课{
/**声源的位置*/
浮动缓冲源位置;
/**声源的速度*/
浮动缓冲源电平;
/**听众的位置*/
FloatBuffer-listenerPos;
/**听者的速度*/
漂浮神经;
/**听众的方向。(前3个元素为“at”,后3个元素为“up”)*/
李斯特菌;
/**缓冲区保存声音数据*/
IntBuffer缓冲区;
/**声源是发出声音的点*/
输入缓冲源;
公共音乐()
{
/**缓冲区保存声音数据*/
buffer=BufferUtils.createIntBuffer(1);
/**声源是发出声音的点*/
source=BufferUtils.createIntBuffer(1);
/**声源的位置*/
sourcePos=BufferUtils.createFloatBuffer(3).put(新的浮点[]{0.0f,0.0f,0.0f});
/**声源的速度*/
sourceVel=BufferUtils.createFloatBuffer(3).put(新浮点[]{0.0f,0.0f,0.0f});
/**听众的位置*/
listenerPos=BufferUtils.createFloatBuffer(3).put(新的浮点[]{0.0f,0.0f,0.0f});
/**听者的速度*/
listenverel=BufferUtils.createFloatBuffer(3).put(新的浮点[]{0.0f,0.0f,0.0f});
/**听众的方向。(前3个元素为“at”,后3个元素为“up”)*/
listenerOri=BufferUtils.createFloatBuffer(6).put(新的浮点[]{0.0f,0.0f,--1.0f,0.0f,1.0f,0.0f});
}
int loadALData()
{
sourcePos.rewind();
sourceVel.rewind();
//将wav数据加载到缓冲区。
AL10.阿尔金缓冲区(缓冲区);
如果(AL10.ALGETRORM()!=AL10.ALU无错误)
{
返回AL10.AL_FALSE;
}
波数据波文件;
试一试{
//FileInputStream fin=新的FileInputStream(“18am01.wav”);
FileInputStream fin=新的FileInputStream(“aware.wav”);
BufferedInputStream bin=新的BufferedInputStream(fin);
波形文件=波形数据。创建(bin);
AL10.alBufferData(buffer.get(0)、waveFile.format、waveFile.data、waveFile.samplerate);
dispose();
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//将缓冲区与源绑定。
AL10.阿尔及利亚资源(来源);
如果(AL10.ALGETRORM()!=AL10.ALU无错误)
{
返回AL10.AL_FALSE;
}
AL11.alSource(source.get(0),AL10.AL_BUFFER,BUFFER);
AL10.alSourcef(source.get(0),AL10.alu音高,1.0f);
AL10.alSourcef(source.get(0),AL10.AL_增益,1.0f);
AL10.alSource(source.get(0),AL10.AL_位置,sourcePos);
AL10.alSource(source.get(0),AL10.AL_速度,sourceVel);
//AL10.alSourcef(source.get(0),AL11.ALU音速,100.5f);
//执行另一个错误检查并返回。
if(AL10.alGetError()==AL10.alu无错误)
{
返回AL10.AL_TRUE;
} 
返回AL10.AL_FALSE;
}
/**
*void setListenerValues()
*
*我们已经为侦听器定义了某些值,但是我们需要
*告诉OpenAL使用这些数据。这个函数就是这样做的。
*/
void setListenerValues(){
listenerPos.rewind();
listenverel.rewind();
listenerOri.rewind();
AL10.alListener(AL10.AL_位置,listenerPos);
AL10.alListener(AL10.AL_速度,李斯特神经);
AL10.alListener(AL10.AL_方向,listenerOri);
}
/**
*void killALData()
*
*我们已经为需要的缓冲区和源分配了内存
*返回到系统。此函数释放该内存。
*/
void killALData(){
AL10.alDeleteSources(来源);
AL10.alDeleteBuffers(缓冲剂);
}
public void execute(){
//初始化OpenAL并清除错误位。
试一试{
AL.create();
}捕获(LWJGLEXE){
le.printStackTrace();
返回;
}
AL10.algeorror();
//加载wav数据。
if(loadALData()==AL10.AL_FALSE){
System.out.println(“加载数据时出错”);
返回;
}  
setListenrvalues();
//循环。
字符c='';
而(c!=“q”){
试一试{
c=(char)System.in.read();
}捕获(ioe异常ioe){
c=‘q’;
}
开关(c){
//按“p”将开始播放样本。
案例“p”:
AL10.alSourcePlay(source.get(0));
打破
//按“s”将停止播放样本。
案例:AL10.alSourceStop(source.get(0));break;
//按“h”将暂停样本。
案例“h”:AL10.alSourcePause(source.get(0));break;
};
}
killALData();
}
公共静态void main(字符串[]args){
音乐=新音乐();
音乐。执行();
}    
}