자동차 오디오 구현에서는 다음을 포함하는 표준 Android 오디오 HAL을 사용합니다.
IDevice
(hardware/interfaces/audio/2.0/IDevice.hal
). 입력 및 출력 스트림을 만들고 마스터 볼륨 및 음소거를 처리하고 다음을 사용합니다.createAudioPatch
. 기기 간 외부-외부 패치를 만듭니다.IDevice.setAudioPortConfig()
. 각 물리적 스트림의 볼륨을 제공합니다.
IStream
(hardware/interfaces/audio/2.0/IStream.hal
). 입력 및 출력 변형과 함께 하드웨어로부터 또는 하드웨어로의 오디오 샘플 스트리밍을 관리합니다.
자동차 기기 유형
다음은 자동차 플랫폼과 관련된 기기 유형입니다.
기기 유형 | 설명 |
---|---|
AUDIO_DEVICE_OUT_BUS |
Android의 기본 출력입니다. Android의 모든 오디오가 차량으로 전달되는 방법입니다. 각 컨텍스트의 스트림을 구별하기 위한 주소로 사용됩니다. |
AUDIO_DEVICE_OUT_TELEPHONY_TX |
전송을 위해 무선 라디오로 라우팅되는 오디오에 사용됩니다. |
AUDIO_DEVICE_IN_BUS |
달리 분류되지 않은 입력에 사용됩니다. |
AUDIO_DEVICE_IN_FM_TUNER |
라디오 입력 브로드캐스팅에만 사용됩니다. |
AUDIO_DEVICE_IN_TV_TUNER |
TV 기기(있는 경우)에 사용됩니다. |
AUDIO_DEVICE_IN_LINE |
AUX 입력 잭에 사용됩니다. |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP |
블루투스를 통해 수신된 음악입니다. |
AUDIO_DEVICE_IN_TELEPHONY_RX |
전화 통화와 연결된 무선 라디오에서 수신한 오디오에 사용됩니다. |
오디오 소스 라우팅
대부분의 오디오 소스는 AudioRecord
또는 관련 Android 메커니즘을 사용하여 캡처해야 합니다. 그런 다음 기본 Android 라우팅 로직을 사용하여 또는 AudioRecord
객체나 AudioTrack
객체에서 setPreferredDevice()
를 명시적으로 호출하여 데이터에 AudioAttributes를 할당하고 AndroidTrack
을 통해 데이터를 재생할 수 있습니다.
외부 믹서에 전용 하드웨어로 연결하거나 매우 엄격한 지연 시간 요구사항이 있는 소스의 경우, 샘플 전송에 AudioFlinger
를 포함하지 않고 createAudioPatch()
와 releaseAudioPatch()
를 사용하여 외부 기기 간 경로를 활성화하거나 비활성화할 수 있습니다.
오디오 기기 구성
Android에 표시되는 오디오 기기는 다음 구성요소가 포함된 /audio_policy_configuration.xml
에서 정의해야 합니다.
- 모듈 이름. 'primary'(자동차 사용 사례에 사용됨), 'A2DP', 'remote_submix' 및 'USB'를 지원합니다. 모듈 이름과 이에 상응하는 오디오 드라이버는
audio.primary.$(variant).so
로 컴파일해야 합니다. - devicePorts. 이 모듈에서 액세스할 수 있는 모든 입력 및 출력 장치(영구적으로 연결된 기기 및 이동식 기기 포함)의 기기 설명어 목록을 포함합니다.
- 각 출력 장치의 경우 밀리벨 단위의 최소/최대/기본/단계 값으로 구성된 게인 컨트롤을 정의할 수 있습니다(1밀리벨 = 1/100dB = 1/1000벨).
AUDIO_DEVICE_OUT_BUS
와 기기 유형이 동일한 기기가 여러 개 있는 경우에도devicePort
인스턴스의 주소 속성을 사용해 기기를 찾을 수 있습니다.
- mixPorts. 오디오 HAL에서 노출한 모든 출력 스트림과 입력 스트림의 목록을 포함합니다. 각
mixPort
인스턴스는 AndroidAudioService
의 물리적 스트림으로 간주될 수 있습니다. - 경로. 입력 장치와 출력 장치 사이 또는 스트림과 기기 사이에 가능한 연결 목록을 정의합니다.
다음 예는 모든 Android 오디오 스트림이 mixer_bus0_phone_out
으로 혼합되는 출력 장치 bus0_phone_out
을 정의합니다. 경로는 mixer_bus0_phone_out
의 출력 스트림을 device bus0_phone_out
으로 가져옵니다.
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>
devicePort 지정
자동차 플랫폼은 Android로 입력되고 Android에서 출력되는 각 물리적 스트림의 devicePort
인스턴스를 지정해야 합니다. 출력의 경우 각 devicePort
인스턴스는 AUDIO_DEVICE_OUT_BUS
유형이어야 하고 정수(즉, 버스 0, 버스 1 등)로 주소가 지정되어야 합니다. mixPort
인스턴스는 devicePort
인스턴스와 1:1 관계로 만들어야 하며 각 버스로 라우팅될 수 있는 데이터 형식의 사양을 허용해야 합니다.
자동차 구현에서는 FM_TUNER
(방송 라디오 입력을 위해 예약됨), 마이크 입력 처리를 위한 MIC
기기, 아날로그 라인 입력을 표현하기 위한 TYPE_AUX_LINE
을 포함한 여러 입력 장치 유형을 사용할 수 있습니다. 다른 모든 입력 스트림은 AUDIO_DEVICE_IN_BUS
에 할당되고 AudioManager.getDeviceList()
호출로 기기를 열거하여 검색됩니다. 개별 소스는 AudioDeviceInfo.getProductName()
으로 구별할 수 있습니다.
외부 기기를 포트로 정의한 다음 이러한 포트를 사용하여 오디오 HAL(새 CarAudioManager
진입점을 통해 노출됨)의 IDevice::createAudioPatch
메서드로 외부 하드웨어와 상호작용할 수도 있습니다.
버스 기반 오디오 드라이버가 있으면 audioUseDynamicRouting
플래그를 true
로 설정해야 합니다.
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
자세한 내용은 device/generic/car/emulator/audio/overlay/packages/services/Car/service/res/values/config.xml
을 참고하세요.