2011-11-16 3 views
1

플레이어가 게임 객체와 상호 작용할 때 지연 효과가있는 사운드 효과를 구현해야하는 Android 게임을 만들고 있습니다. 간단하게하기 위해, 물체가 화면에서 움직이며, 플레이어는 음향 효과를 유발하기 위해 물체를 가볍게 두 드려야합니다. 내가 가지고있는 문제는 플레이어가 짧은 시간에 많은 물체를 두 드리면 각 사운드 효과 사이에 눈에 띄는 지연이 있다는 것입니다. 예를 들어, 플레이어는 오브젝트 1을 누르고, 사운드를 재생하고, 오브젝트 2를 탭하고, 사운드를 재생하고, 플레이어가 오브젝트 n을 두 드릴 때까지 계속 진행합니다. 사운드는 재생되지만 이전에 재생 한 사운드 효과보다 약간 지연됩니다.Android에서 동시 사운드 효과 구현

내 SoundPool 개체를 설정하여 같은 리소스에서 다른 사운드를로드하려고했지만 많은 작업을 수행하지 않았습니다. 그래서 사운드 효과의 각 반복이 소리의 현저한 지연을 경험하지 않고 새로운 것으로 교체 될 사운드 효과의 이전 반복을 오버랩하거나 멈추게 할 수있는 방법이 있습니까? 다음은 내 코드입니다 :

protected SoundPool mSoundPool; 
protected boolean mLoaded; 
protected int mBalloonPopStreams = 5; 
protected int[] mSoundIds; 
protected int mSoundIdx = 0; 

protected void initializeMedia() { 
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC); 
    mSoundPool = new SoundPool(mBalloonPopStreams, AudioManager.STREAM_MUSIC, 0); 

    mSoundIds = new int[mBalloonPopStreams]; 
    for (int i = 0; i < mBalloonPopStreams; i++) { 
     mSoundIds[i] = mSoundPool.load(this, R.raw.sound_effect, 1); 
    } 
    mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int sampleId, 
       int status) { 
      mLoaded = true; 
     } 
    }); 
} 

protected OnTouchListener mTouchEvent = new OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) {   
     int action = arg1.getAction(); 
     int actionCode = action & MotionEvent.ACTION_MASK; 
     int pointerId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     int x; 
     int y; 

     x = (int)arg1.getX(pointerId); 
     y = (int)arg1.getY(pointerId); 
     if (actionCode == MotionEvent.ACTION_DOWN || actionCode == MotionEvent.ACTION_POINTER_DOWN) { 
      // Check if the player tapped a game object 
      playSound(); 
     } 


     return true; 
    } 
}; 

public void playSound() { 
    if (mLoaded) { 
     synchronized(mSoundPool) { 
      AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
      float actualVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
      float maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
      float volume = actualVolume/maxVolume; 
      mSoundPool.play(mSoundIds[mSoundIdx], volume, volume, 1, 0, 1f); 
      mSoundIdx = ++mSoundIdx % mBalloonPopStreams; 
     } 
    } 
} 

그것을 요약하면, 문제는,의 5 "팝업"소리를 1 초 내에 재생할 수있는 말을 할 수 있다는 것입니다. 나는 터지는 소리가 5 번 들린다는 말을 듣지 만 지연되고 실제로 게임에서 진행되는 것과 동기화되지 않습니다. 이것이 하드웨어의 한계 일 수 있습니까? 그렇지 않다면 코드를 잘못 구현 했습니까? 이 문제의 해결 방법은 무엇입니까?

답변

0

This answer 유사한 질문에 도움이 될 수 있습니다. SoundPool으로 여러 소리를 재생하려고하면 해당 질문의 OP가 앱 충돌을 일으켰지 만 동일한 문제의 다른 증상 일 수 있습니다.

+0

그건 내 문제를 해결하지 못했습니다. killable 큐는 내 음향 효과가 매우 짧기 때문에 아무런 의미가 없습니다. SoundPool 객체에 대한 나의 관심은 오디오 트랙을 동시에 재생할 수 있는지, 즉 각 사운드 효과가 별도의 스레드에서 재생되는지 여부입니다. – Dan

0

SoundPool 대신 AudioTrack을 사용하면 더 좋은 결과를 얻을 수 있습니다.