我正在尝试创建一个简单的摩尔斯电码应用程序。当用户按下按钮时,莫尔斯声音应该在释放之前开始。
问题是延迟 - 莫尔斯声音在用户按下按钮后大约400ms才开始。我不确定为什么这是确切的,但在研究问题后我认为这是我的代码结构的方式。我尝试播放的文件是Mp3格式,位于原始文件夹中。
我已经使用媒体播放器完成了这个但是我遇到了同样的问题,因为它没有足够的响应,所以我选择尝试使用声音池。有没有人对如何加快操作有任何意见/建议?在发展方面,这是我的新领域。
public int S1 = R.raw.morse;
private SoundPool soundPool;
private boolean loaded;
static int x;
public void initSounds(Context context) {
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
final int y = soundPool.load(context, R.raw.morse, 1);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
loaded = true;
playSound(y);
}
});
}
public void playSound(int soundID) {
if(loaded) {
x = soundPool.play(soundID, 0.5f, 0.5f, 1, 0, 1f);
}
}
//Calling code
pad.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
//State of a toggle button
if(audioOnOff==true) {
//Sound pool object is created and initialized as a global variabe
sp.initSounds(getApplicationContext());
}
}
答案 0 :(得分:1)
在我看来,这里发生的事情是,每次按下按钮,你都会加载声音,等待它完成加载,然后再播放。你真正想要的是加载声音一次,然后每按一次按钮就播放它。
因此,不要在onTouchListener中调用initSounds,而是在按下按钮之前在其他地方调用initSounds。然后在你的onTouchListener中你只需要调用你的playSound方法。
最后,请确保从onLoadCompleteListener中删除playSound方法调用,以便在最初加载声音时不会产生神秘的噪音;)