0

振り子のスイング間隔を 750 ミリ秒に指定し、最大スイング アークで 1 つのオーディオ ファイルを再生するメトロノーム タイプのアプリケーションを作成しました。振り子のスイングとサウンドの再生を無期限に繰り返します。ただし、コードの実際の実行タイミングはデバイスごとに劇的に異なり、単一のデバイスでも変動することがわかっています。私の意図は、毎分 80 ビートの割合で振り子を振り、各「ビート」でオーディオ ファイルを再生することです。オーディオ ファイルの再生に必要な時間に合わせて、750 ミリ秒の設定を調整しました。これにより、ミリ秒の設定が 750 から約 680 にわずかに減少しました。

Android SoundPool を使用して .wav ファイルにアクセスし、サウンドを再生しています。

Soundpool のタイミングの問題と懸念事項についての言及をかなり見つけましたが、このようなアプリケーションに一貫したタイミングを提供するための実行可能で信頼できるソリューションはまだ見つかりませんでした.

振り子のスイングは、指定された遅延に基づいてかなり一貫しているように見えるので、変動は、オーディオを再生する SoundPool コードの実行中の可変タイミングによるものだと思います。Androidで一貫した「正確な」タイミング間隔でサウンドを再生するコードを実行する信頼できる方法はありますか?

4

1 に答える 1

1

これを行う 1 つの方法は、ハンドラーです。これにより、クリップの実際の再生時間に関係なく、オーディオ クリップをまったく同時に開始できます。これにはSoundPoolは必要ありません。SoundPlayerだけです。

ハンドラーを使用すると、将来のある時点でメッセージがコードに配信されるようにスケジュールできます。SoundPlayer でのサウンドの再生は非同期であるため、この単純なメカニズムを使用して定期的にサウンドを再生できます。

これがどのように機能するかを示すコードを次に示します。

    handler = new Handler() {

        /* (non-Javadoc)
         * @see android.os.Handler#handleMessage(android.os.Message)
         */
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == NEXT_SOUND_MSG) {
                playNextSound()
            }
        }
    };

    // Set up media player for sounds
    player = new SoundPlayer(context);
    player.start();

    private void playNextSound() {
            if (mRunning) {

                // Play the sound
                int iSoundResId = item.getSoundResId();
                if (iSoundResId != -1) {
                        playSound(iSoundResId);
                }

                // schedule a message to advance to next item after duration
                Message msg = handler.obtainMessage(NEXT_SOUND_MSG);
                handler.sendMessageDelayed(msg, interval); 
            }
   }
于 2013-10-17T15:45:34.037 に答える