2017-12-05 208 views
6

Bir sorunum var, aynı anda ses başlatmak istiyorum.Tam zamanında üç veya daha fazla kısa ses çalın SoundPool (piyano akor)

3-5 kısa ses döngüsünde (piyano sesleri) oynuyorum ve ilk 1 ms'de, ikinci 17 ms'de ve son seste 60-90 ms'ye kadar gecikme yaşıyorum.

SoundPool kullanıyorum.

Bunun gibi bir sorunu olan veya bu sorunu çözebilecek kütüphaneyi kullanmış olan (senkronize edilmiş çoklu kısa sesleri başlatma)? Eğer dinleyici(OnLoadCompleteListener) uygulamak gerekiyor gibi

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); 
       } 
      }); 

cevap

0

Öyle görünüyor:

Aşağıda örnek testi örneği (ı RxJava kullanın ama RxJava ile ve olmadan test ettik) 'dir. SoundPool, ses dosyalarını dokümanda belirtildiği gibi eşzamansız olarak yükler, bu yüzden gecikmenizi almanızın gerekliliğine inanıyorum.

Bulunan 3 için bu çalışma örnek Sesler zaten yüklenir 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

, bunu belki – Wrobel

+0

Yah bir iş parçacığı/senkronizasyon sorunu olduğunu düşünüyorum sesler, insanların iki parçacığı kullanan ve deneyin net böyle bir çözüm gördüm iki ses için onları senkronize etmek için, ama doğru değil – Rainmaker

+0

Diğer şekilde yuvarlak sesler karıştırmak ve bir olarak oynamak, aynı zamanda yaygın bir çözüm – Rainmaker