麥克風輸入

擷取音訊時,Audio HAL 會收到 openInputStream 呼叫,其中包含 AudioSource 引數,用於指出應如何處理麥克風輸入內容。

VOICE_RECOGNITION 來源會預期有回音消除效果 (如有) 的立體聲麥克風串流,但不會套用其他處理。

多聲道麥克風輸入

如要擷取裝置中超過兩個聲道 (立體聲) 的音訊,請使用聲道索引遮罩,而非位置索引遮罩 (例如 CHANNEL_IN_LEFT)。例如:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

setChannelMasksetChannelIndexMask 都已設定時,AudioRecord 只會使用 setChannelMask 設定的值 (最多兩個管道)。

並行擷取

自 Android 10 起,Android 架構便支援同時擷取輸入內容,但會設有限制,以保護使用者隱私。根據這些限制,系統會忽略 AUDIO_SOURCE_FM_TUNER 等虛擬來源,並允許同時擷取這些來源和一般輸入內容 (例如麥克風)。HwAudioSource 不受同時擷取限制的約束。

應用程式若設計為與 AUDIO_DEVICE_IN_BUS 裝置或次要 AUDIO_DEVICE_IN_FM_TUNER 裝置搭配使用,就必須明確識別這些裝置,並使用 AudioRecord.setPreferredDevice() 略過 Android 預設來源選取邏輯。