3

AudioRecordコンストラクターを呼び出すコードを使用しています。

AudioRecord listener = new AudioRecord(list of parameters);
do {} while (listener.getState() != AudioRecord.STATE_INITIALIZED);

このコードは、AudioRecordが別のスレッドでオフになり、初期化に時間がかかる場合に意味があるように思われます。ただし、これが当てはまるかどうかはわかりません。そうでない場合は、初期化が実際に失敗したときに無限ループが開始されないように、コードをチェックして例外を返す方がはるかに良いように思われます(チェックの数を有限のものに制限することもできますが)。

コードをそのままにするか、2行目を次のようなものに置き換える必要がありますか?

if(listener.getState() != AudioRecord.STATE_INITIALIZED) {
    throw new Exception("AudioRecord failed to initialize");
}
4

2 に答える 2

3

ソースコードを見ると非常に明確になります。

public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, 
            int bufferSizeInBytes)
    throws IllegalArgumentException {   
        mState = STATE_UNINITIALIZED;
        mRecordingState = RECORDSTATE_STOPPED;

        ... //parameter checks

        // native initialization
        //update native initialization when information about hardware init failure
        //due to capture device already open is available.
        int initResult = native_setup( new WeakReference<AudioRecord>(this), 
                mRecordSource, mSampleRate, mChannels, mAudioFormat, mNativeBufferSizeInBytes);
        if (initResult != SUCCESS) {
            loge("Error code "+initResult+" when initializing native AudioRecord object.");
            return; // with mState == STATE_UNINITIALIZED
        }

        mState = STATE_INITIALIZED;
    }

したがって、状態の遷移を待つ必要はありません。コンストラクターを1回呼び出した後でのみ、状態を確認する必要があります。native_setupに問題がある場合、状態はSTATE_UNINITIALIZEDになります。

于 2013-02-26T07:56:44.633 に答える
1

私は例外を投げると言うでしょう。ダウンロード数が1000000を超えるAudioRecordを使用するアプリがあり、AudioRecordの状態を待つ必要はありません。(必要な場合は、AudioRecordの待機中に100%CPUを消費しないように、whileループに少なくともThread.sleep()が必要です。)

于 2013-02-26T07:33:11.430 に答える