2

Android用のメトロノームを作成しようとしています。SoundPoolを使用して300BPMでビープ音を鳴らすようにこのコードを記述しましたが、ビートがスキップされる傾向があり、ラグが発生します。私は調査しましたが、見つけたすべての答えが私の問題を解決するわけではありません。これは特に、bpmカウントを高速化しようとしたり、4分の1(2倍の時間)ではなく8分音符を使用したりする場合に発生します。誰かがこれをできるだけ正確にする正しい方向に私を導くことができますか?遅延/ビートスキップは受け入れられません。ありがとう!!

     final SoundPool sndPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
     final int sndHigh = sndPool.load(this, R.raw.high, 1);
     setVolumeControlStream(AudioManager.STREAM_MUSIC);
     Thread th = new Thread(new Runnable(){
          public void run() {
            while(true){
                sndPool.play(sndHigh, 1f, 1f, 1, 0, 1f);
                //Log.d("asd", "beep");
                LockSupport.parkNanos(((240000/300)/4)*1000000); //300bpm
            }
          }
     });
     th.setPriority(Thread.MAX_PRIORITY);
     th.start();
4

1 に答える 1

2

解決策は、タイマーやSoundPoolをまったく使用しないことです。代わりに、継続的に管理する低レベルのAudioTrackを使用してください。バッファの適切なポイントでAudioTrackに適切なサンプルを挿入することにより、ビープ音やクリック音などを合成する必要があります。Google AudioTrackだけで、その使用方法のサンプルを探してください。

于 2013-03-28T01:01:04.653 に答える