2017-12-05 88 views
6

Mam problem, chcę rozpocząć dźwięk w tym samym czasie.Odtwórz trzy lub więcej krótkich dźwięków w dokładnym czasie SoundPool (akord fortepianu)

Gram 3-5 krótkich dźwięków w pętli (dźwięki fortepianu) i mam opóźnienie na pierwszych 1 ms, na sekundę 17 ms, i tak dalej, do 60-90 ms na ostatnim dźwięku.

Używam SoundPool.

Ktoś ma taki problem lub użył biblioteki, która może rozwiązać ten problem (rozpocząć synchronizację wielu krótkich dźwięków)?

Poniżej jest przykład próbka testowa (używam RxJava ale ja testowałem go i bez RxJava):

Observable.timer(150, TimeUnit.MILLISECONDS, Schedulers.single()) 
      .repeat() 
      .subscribe(aLong -> { 
       for (int soundId = 55; i < 60; i++) { 
        soundPool.play(soundId , 1f, 1f, 1, 0, 1); 
       } 
      }); 

Odpowiedz

0

Wydaje się, że trzeba wdrożyć słuchacza(OnLoadCompleteListener). SoundPool ładuje pliki audio w sposób asynchroniczny, tak jak jest to określone w dokumentach, więc uważam, że właśnie dlatego otrzymujesz opóźnienie.

Znaleziony ten przykład działa na 3 brzmi here

public class SoundManager { 

    public static int SOUNDPOOLSND_MENU_BTN   = 0; 
    public static int SOUNDPOOLSND_WIN    = 1; 
    public static int SOUNDPOOLSND_LOOSE   = 2; 
    public static int SOUNDPOOLSND_DRAW    = 3; 
    public static int SOUNDPOOLSND_TICK1   = 4; 
    public static int SOUNDPOOLSND_TICK2   = 5; 
    public static int SOUNDPOOLSND_OUT_OF_TIME  = 6; 
    public static int SOUNDPOOLSND_HISCORE   = 7; 
    public static int SOUNDPOOLSND_CORRECT_LETTER = 8; 

    public static boolean isSoundTurnedOff; 

    private static SoundManager mSoundManager; 

    private SoundPool mSoundPool; 
    private SparseArray <Integer> mSoundPoolMap; 
    private AudioManager mAudioManager; 

    public static final int maxSounds = 4; 

    public static SoundManager getInstance(Context context) 
    { 
     if (mSoundManager == null){ 
      mSoundManager = new SoundManager(context); 
     } 

     return mSoundManager; 
    } 

    public SoundManager(Context mContext) 
    { 
     mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 
     mSoundPool = new SoundPool(maxSounds, AudioManager.STREAM_MUSIC, 0); 

     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
      public void onLoadComplete(SoundPool soundPool, int sampleId,int status) { 
      loaded = true; 
      } 
     }); 

     mSoundPoolMap = new SparseArray<Integer>(); 
     mSoundPoolMap.put(SOUNDPOOLSND_MENU_BTN, mSoundPool.load(mContext, R.raw.menubutton, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_WIN, mSoundPool.load(mContext, R.raw.win, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_LOOSE, mSoundPool.load(mContext, R.raw.lose, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_TICK1, mSoundPool.load(mContext, R.raw.tick_0, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_TICK2, mSoundPool.load(mContext, R.raw.tick_1, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_OUT_OF_TIME, mSoundPool.load(mContext, R.raw.out_of_time, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_HISCORE, mSoundPool.load(mContext, R.raw.personal_highscore, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_CORRECT_LETTER, mSoundPool.load(mContext, R.raw.correct_letter, 1)); 

     // testing simultaneous playing 
     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(0), streamVolume, streamVolume, 1, 20, 1f); 
     mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1, 2, 1f); 
     mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1, 0, 1f); 


    } 

    public void playSound(int index) { 
     if (isSoundTurnedOff) 
      return; 

     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 
    } 

    public static void clear() 
    { 
     if (mSoundManager != null){ 
      mSoundManager.mSoundPool = null; 
      mSoundManager.mAudioManager = null; 
      mSoundManager.mSoundPoolMap = null; 
     } 
     mSoundManager = null; 
    } 
} 
+0

Dźwięki są już załadowane, myślę, że to może być problem gwintowania/synchronizacja – Wrobel

+0

Yah, widziałem takie rozwiązanie w internecie, że ludzie używają dwa wątki i spróbować aby zsynchronizować je dla dwóch dźwięków, ale nie wygląda to dobrze – Rainmaker

+0

Odwrotnie jest miksować dźwięki i grać jako jeden, jest to również powszechne rozwiązanie – Rainmaker

Powiązane problemy