Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

자동차 오디오 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 메커니즘을 사용하여 캡처해야 합니다. 데이터는 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 인스턴스는 Android AudioService에 대한 물리적 스트림으로 간주할 수 있습니다.
  • 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을 참조하세요.