자동차 오디오 구현은 다음을 포함하는 표준 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 메커니즘을 사용하여 캡처해야 합니다. 데이터는 AudioAttributes
클래스를 통해 할당된 오디오 속성일 수 있으며, 기본 Android 라우팅 로직을 사용하거나 AudioRecord
또는 AudioTrack
객체에서 setPreferredDevice()
를 명시적으로 호출하여 AudioTrack
을 통해 재생할 수 있습니다.
외부 믹서에 대한 전용 하드웨어 연결이 있거나 매우 엄격한 지연 시간 요구사항이 있는 소스의 경우 createAudioPatch()
및 releaseAudioPatch()
를 사용하여 샘플 전송 시 AudioFlinger
를 사용하지 않고 외부 기기 사이의 경로를 활성화하거나 비활성화할 수 있습니다.
오디오 기기 구성
Android에 표시되는 오디오 기기는 다음 구성요소를 포함하는 /audio_policy_configuration.xml
에서 정의해야 합니다.
- 모듈 이름. "primary"(자동차 사용 사례에 사용됨), "A2DP", "remote_submix" 및 "USB"를 지원합니다. 모듈 이름과 해당 오디오 드라이버는
audio.primary.$(variant).so
로 컴파일해야 합니다. - devicePorts. 이 모듈에서 액세스할 수 있는 모든 입력 및 출력 기기(영구적으로 연결된 기기 및 이동식 기기 포함)의 기기 설명자 목록을 포함합니다.
- 각 출력 기기에 대해 밀리벨 단위의 최소값/값/단계/기본값으로 구성된 게인 제어를 정의할 수 있습니다(1밀리벨 = 1/100 dB = 1/1000 벨).
AUDIO_DEVICE_OUT_BUS
와 유형이 동일한 기기가 여러 개 있는 경우에도devicePort
인스턴스에 대한 주소 속성을 사용해 기기를 찾을 수 있습니다.
- mixPorts. 오디오 HAL에 의해 노출된 모든 출력 스트림과 입력 스트림의 목록을 포함합니다. 각
mixPort
인스턴스는 AndroidAudioService
에 대한 물리적 스트림으로 간주할 수 있습니다. - routes. 입력 기기와 출력 기기 사이 또는 스트림과 기기 사이에 가능한 연결 목록을 정의합니다.
다음 예는 모든 Android 오디오 스트림이 mixer_bus0_phone_out
으로 믹싱되는 출력 기기 bus0_phone_out
을 정의합니다. route는 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>
devicePorts 지정
자동차 플랫폼은 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()
을 통해 구분할 수 있습니다.
또한 외부 기기를 포트로 정의한 다음 이러한 포트를 사용하여 (새 CarAudioManager
진입점을 통해 노출된) Audio HAL의 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
을 참조하세요.