Podczas przechwytywania dźwięku warstwa Audio HAL odbiera wywołanie openInputStream
zawierające argument AudioSource
wskazujący, w jaki sposób sygnał wejściowy z mikrofonu powinien być przetwarzany.
Źródło VOICE_RECOGNITION
oczekuje strumienia z mikrofonu stereofonicznego z efektem eliminacji echa (jeśli jest dostępny), ale nie zastosowano wobec niego żadnego innego przetwarzania.
Wielokanałowe wejście mikrofonowe
Aby przechwycić dźwięk z urządzenia z więcej niż dwoma kanałami (stereo), użyj maski indeksu kanału zamiast maski indeksu pozycyjnego (takiej jak CHANNEL_IN_LEFT
). Na przykład:
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);
Gdy ustawione są zarówno setChannelMask
, jak i setChannelIndexMask
, AudioRecord
używa tylko wartości ustawionej przez setChannelMask
(maksymalnie dwa kanały).
Równoczesne przechwytywanie
Począwszy od systemu Android 10, platforma Android obsługuje współbieżne przechwytywanie danych wejściowych, ale z ograniczeniami mającymi na celu ochronę prywatności użytkownika. W ramach tych ograniczeń źródła wirtualne, takie jak AUDIO_SOURCE_FM_TUNER
, są ignorowane i mogą być przechwytywane jednocześnie ze zwykłym sygnałem wejściowym (takim jak mikrofon). HwAudioSource
nie jest uważany za część ograniczeń jednoczesnego przechwytywania.
Aplikacje zaprojektowane do współpracy z urządzeniami AUDIO_DEVICE_IN_BUS
lub dodatkowymi urządzeniami AUDIO_DEVICE_IN_FM_TUNER
muszą polegać na jawnej identyfikacji tych urządzeń i użyciu AudioRecord.setPreferredDevice()
w celu ominięcia domyślnej logiki wyboru źródła Androida.