자동차 오디오 HAL 구현

자동차 오디오 구현에서는 다음을 포함하는 표준 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 인스턴스는 Android AudioService의 물리적 스트림으로 간주될 수 있습니다.
  • 경로. 입력 장치와 출력 장치 사이 또는 스트림과 기기 사이에 가능한 연결 목록을 정의합니다.

다음 예는 모든 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을 참고하세요.