2012-07-11 45 views
5

我有一款Android游戏,需要播放短音。 SoundPool崩溃dual core phonesMediaplayer有高达200ms +的延迟,OpenSL需要SDK 9+(我支持1.5)。所以这就离开了AudioTrack在静态模式下使用AudioTrack的正确方法是什么?

这是我试过的。我创建这样的AudioTrack对象。

protected AudioTrack createAudioTrack() { 
    final int trackSize = 17408; 
    return new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, trackSize, AudioTrack.MODE_STATIC); 
} 

然后,我为每个游戏声音(约8)创建一个runnable。

private static class SoundRunnable implements Runnable { 

    private final AudioTrack sound; 
    private final byte[] rawAudio; 

    public SoundRunnable(final AudioTrack sound, final byte[] rawAudio){ 
     this.sound = sound; 
     this.rawAudio = rawAudio; 
     sound.write(rawAudio, 0, rawAudio.length); 
    } 

    @Override 
    public void run() { 
     playSound(); 
    } 

    private synchronized void playSound() { 
     switch (sound.getPlayState()) { 
     case AudioTrack.PLAYSTATE_PAUSED: 
      sound.stop(); 
      sound.reloadStaticData(); 
      sound.play(); 
     break; 
     case AudioTrack.PLAYSTATE_PLAYING: 
      sound.stop(); 
      sound.reloadStaticData(); 
      sound.play(); 
     break; 
     case AudioTrack.PLAYSTATE_STOPPED: 
      sound.reloadStaticData(); 
      sound.play(); 
     break; 
     default: 
      break; 
     } 
    } 

    public synchronized void release() { 
     sound.release(); 
    } 

} 

然后,当我需要播放声音时,我将它发送到一个ThreadPool。

private void playSound(final int soundToPlay) { 
    final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay); 
    if(soundRunnable != null){ 
     threadPool.execute(soundRunnable); 
    } 
} 

我遇到的主要问题是声音在第一次执行runnable时会播放两次。之后,每隔一段时间,我仍然可能会得到双音,但效果很好。

我还尝试在流模式下创建单个AudioTrack并从runnables写入原始音频。这有点成功,但很难知道何时停止播放。如果你停下来,声音就会缩短,太迟了,你会得到一个getsBuffer错误,并且应用程序被锁定。同时播放两个声音也很困难(可能会使用一组音频轨道)。

我很想看到不涉及流式音频的AudioTrack示例代码。

回答

1

我在谷歌办公时间问过这个问题。他们说AudioTrack和SoundPool有相同的错误。解决此问题的唯一方法是编写本地媒体播放器。虽然,这个问题似乎只影响运行姜饼的双核手机。

相关问题