볼륨 관리는 CarAudioService
에 포함되어 있으며, 이는 볼륨이 소프트웨어가 아닌 하드웨어 앰프로 인해 HAL 아래에 적용되어야 한다는 점을 바탕으로 고정 볼륨을 사용합니다. CarAudioService
는 출력 기기를 볼륨 그룹으로 구성하여 볼륨 그룹에 연결된 모든 기기에 동일한 게인을 적용합니다.
고정 볼륨
AAOS 구현은 소프트웨어 믹서 대신 하드웨어 앰프를 사용하여 볼륨을 제어합니다. 부작용을 피하기 위해 config_useFixedVolume
플래그를 true
로 설정합니다 (필요한 경우 오버레이함).
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
config_useFixedVolume
플래그가 설정되지 않았거나 false
로 설정된 경우 앱은 AudioManager.setStreamVolume()
을 호출하여 소프트웨어 믹서에서 스트림 유형별로 볼륨을 변경할 수 있습니다. 이는 다른 앱에 미치는 잠재적 영향과 소프트웨어 믹서의 볼륨 감쇠로 인해 하드웨어 앰프에서 수신 시 신호에서 사용 가능한 중요 비트 수가 적어질 수 있다는 사실 때문에 바람직하지 않을 수 있습니다.
볼륨 그룹
볼륨 그룹은 오디오 영역 내 기기 모음의 볼륨을 관리합니다. 볼륨 그룹별로 독립적으로 볼륨을 제어할 수 있습니다. 결과 게인은 차량의 앰프에 의해 연결 기기에 적용되도록 구성됩니다. 볼륨 설정이 사용자에게 유지되며 사용자가 로그인하면 로드됩니다.
볼륨 그룹 정의
CarAudioService는 car_audio_configuration.xml
에 정의된 볼륨 그룹을 사용합니다.
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<device address="bus0_media_out">
<context context="music"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
...
</zoneConfigs>
</zone>
</zones>
</audioZoneConfiguration>
각 볼륨 그룹에는 연결된 주소가 있는 출력 장치가 하나 이상 포함되어야 합니다. 주소는 audio_policy_configuration.xml
에 정의된 출력 장치에 상응해야 합니다.
볼륨 그룹 게인 구성
각 볼륨 그룹에는 볼륨 그룹과 연결된 기기의 audio_policy_configuration.xml
에 구성된 값을 기반으로 최소, 최대, 기본 게인 값과 단계 크기가 있습니다.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
초기화 중에 볼륨 그룹은 연결된 기기의 게인 값을 확인하고 다음과 같이 그룹을 구성합니다.
- 단계 크기. 볼륨 그룹이 제어하는 모든 기기에서 동일해야 합니다.
- 최소 게인. 그룹의 기기 중 가장 작은 최소 게인입니다.
- 최대 게인. 그룹의 기기 중 가장 큰 최대 게인입니다.
- 기본 게인. 그룹의 기기 중 가장 큰 기본 게인입니다.
이러한 값이 구성되는 방식 때문에 볼륨 그룹과 연결된 기기에 지원되는 범위를 벗어난 볼륨 그룹의 게인을 설정하는 것이 가능합니다. 이 경우 볼륨 그룹의 값이 범위보다 낮은지 높은지에 따라 게인이 기기의 최소 또는 최대 게인 값으로 설정됩니다.
볼륨 그룹 식별자
볼륨 그룹은 런타임 시 XML 파일에 정의된 순서에 따라 식별됩니다.
ID의 범위는 오디오 영역 내에서 0
부터 N-1
사이이며, 여기서 N
는 오디오 영역에 있는 볼륨 그룹의 수입니다. 이에 따라 볼륨 그룹 ID는 영역에서 고유하지 않습니다. 이 식별자는 볼륨 그룹과 연결된 CarAudioManager
API에 사용됩니다. zoneId
없이 groupId
를 사용하는 모든 API는 기본 오디오 영역으로 기본 설정됩니다.
다중 영역 볼륨 관리
각 오디오 영역에는 볼륨 그룹이 하나 이상 있어야 하고, 각 볼륨 그룹은 단일 오디오 영역과만 연결됩니다. 이 관계는 car_audio_configuration.xml
의 일부로 정의됩니다. 자세한 내용은 위의 볼륨 그룹 정의의 예시를 참고하세요.
각 영역의 현재 볼륨 수준은 영역과 연결된 사용자에게 유지됩니다. 이러한 설정은 영역별로 다릅니다. 즉, 사용자가 기본 영역과 연결된 디스플레이에서 로그인한 다음 이후에 보조 오디오 영역과 연결된 영역에 로그인하는 경우 첫 번째 영역용으로 로드되고 유지되는 볼륨 수준과 보조 영역의 볼륨 수준은 다릅니다.
최소 및 최대 활성화 볼륨
Android 15에서는 자동차 오디오 시스템의 안전과 사용자 편의성을 개선하기 위해 볼륨 그룹 색인 제어를 도입합니다. 이는 자동차 오디오 구성 내에서 구성된 최소 및 최대 활성화 볼륨을 사용하여 달성됩니다(볼륨 그룹 정의 참고). 자동차 서비스 RRO에서 audioUseMinMaxActivationVolume
을 true
로 설정하여 이 기능을 사용 설정할 수 있습니다.
activationVolumeConfigs
에서 여러 activationVolumeConfig
항목을 정의할 수 있으며, 각 항목은 서로 다른 최소 및 최대 활성화 구성을 나타냅니다. 각 activationVolumeConfig
:
- 나중에 볼륨 그룹 (
group
)에서 참조할 수 있도록 자동차 오디오 구성 파일 전체에서 고유한name
를 포함해야 합니다. - 하나의
activationVolumeConfigEntry
만 포함해야 합니다.
각 activationVolumeConfig
에는 다음 속성이 포함됩니다.
minActivationVolumePercentage
(정수, 0~100, 선택사항, 기본값: 0): 최소 활성화 볼륨을 백분율로 지정합니다.maxActivationVolumePercentage
(정수, 0~100, 선택사항, 기본값: 100): 최대 활성화 볼륨을 백분율로 지정합니다.invocationType
(문자열, 선택사항, 기본값:onPlaybackChanged
): 최소 및 최대 활성화 볼륨이 적용되는 조건을 정의합니다.onBoot
: 부팅 후 볼륨 그룹에서 새로 활성화된 첫 번째 재생에만 적용됩니다.onSourceChanged
: 볼륨 그룹에서 앱 또는 UID 소스가 변경된 새로 활성 상태가 된 재생에만 적용됩니다.onPlaybackChanged
: 볼륨 그룹에서 새로 활성화된 모든 재생에 적용됩니다.
CarAudioService
는 현재 활성 오디오 하위 구성요소를 모니터링하여 최소 및 최대 활성화를 관리합니다.
- 현재 활성 재생 트랙
- 현재 통화 상태
- 오디오 제어 HAL의 현재 오디오 포커스 요청입니다. 오디오 제어 HAL의 오디오 포커스 요청은 활성 오디오 재생이 Android 외부에서 발생하고 있음을 나타냅니다.
다음 이미지는 최소 및 최대 활성화 볼륨 관리의 대략적인 개요를 보여줍니다.
그림 1. 최소 및 최대 활성화 볼륨 관리 활성 오디오 데이터 경로
지정된 minActivationVolumePercentage
, maxActivationVolumePercentage
, 최소 및 최대 볼륨 게인 인덱스를 사용하여 각 볼륨 그룹의 최소 및 최대 활성화 볼륨 게인 인덱스를 계산할 수 있습니다. CarAudioService
는 새로 활성화된 모든 재생을 모니터링하고 다음 조건에 따라 최소 및 최대 활성화 볼륨을 적용합니다.
- 호출 유형 일치: 재생의 활성화 유형 (오디오 관리자, 오디오 제어 HAL 또는 전화 통신 관리자에서 파생됨)은 볼륨 그룹과 연결된
activationVolumeConfigEntry
에 지정된invocationType
와 일치해야 합니다. 볼륨 색인이 범위를 벗어남: 볼륨 그룹의 현재 볼륨 게인 색인이 정의된 활성화 볼륨 게인 색인 범위 밖에 있어야 합니다. 즉, 다음 중 하나가 참이어야 합니다.
지수가 계산된 최소 활성화 볼륨 획득 지수보다 낮습니다.
또는
지수가 계산된 최대 활성화 볼륨 획득 지수보다 높습니다.
활성화 일치 항목이 주어지면 볼륨 그룹의 볼륨 게인 지수가 다음 중 하나로 조정됩니다.
최소 활성화 볼륨 획득 지수가 최소 활성화 볼륨 획득 지수보다 낮은 경우
또는
최대 활성화 볼륨 획득 지수가 최대 활성화 볼륨보다 높은 경우
또한 이벤트 유형이 EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
인 자동차 볼륨 그룹 이벤트가 등록된 모든 볼륨 그룹 이벤트 콜백으로 전송됩니다.
볼륨 키 이벤트 처리
Android는 다음을 비롯하여 볼륨 제어를 위한 여러 개의 키 코드를 정의합니다.
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
기본적으로 Android는 볼륨 키 이벤트를 앱으로 라우팅합니다. Automotive 구현은 이러한 키 이벤트를 CarAudioService
에서 처리하도록 강제해야 하며, 그런 다음 setGroupVolume
또는 setMasterMute
를 적절하게 호출합니다. 이 동작을 강제하려면 config_handleVolumeKeysInWindowManager
플래그를 true
로 설정합니다.
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
볼륨 키 이벤트는 현재 의도한 영역을 구별할 수 있는 방법이 없으며 모두 기본 오디오 영역과 연결되어 있다고 가정합니다. 볼륨 키 이벤트가 수신되면 CarAudioService
는 활성 플레이어의 오디오 컨텍스트를 가져와 조정할 볼륨 그룹을 결정한 다음 가장 우선순위가 높은 오디오 컨텍스트와 연결된 출력 장치가 포함된 볼륨 그룹을 조정합니다. 우선순위는 CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
에 정의된 고정 순서에 따라 결정됩니다.
페이드 및 밸런스
두 AudioControl HAL 버전에는 모두 차량의 페이드와 밸런스를 설정하는 API가 있습니다. CarAudioManager의 상응하는 시스템 API는 AudioControl HAL에 값을 전달합니다. 이 API에는 android.car.permission.CAR_CONTROL_AUDIO_VOLUME
이 필요합니다. AudioControl API는 다음과 같습니다.
setBalanceTowardRight(float value)
는 스피커 볼륨을 차량의 오른쪽 (+) 또는 왼쪽 (-)으로 이동합니다.- 0.0은 가운데에 있습니다.
- +1.0은 맨 오른쪽
- -1.0은 완전히 왼쪽
- -1~1 범위를 벗어난 값은 오류입니다.
setFadeTowardFront(float value)
는 스피커 볼륨을 차량의 전면 (+) 또는 후면 (-)으로 이동합니다.- 0.0은 가운데에 있습니다.
- +1.0은 맨 앞으로 이동
- -1.0은 완전히 뒤쪽입니다.
- -1~1 범위를 벗어난 값은 오류입니다.
이 값을 적용하는 방법과 사용자에게 값을 표시하는 방식은 개발자가 결정합니다. 미디어에만 적용하거나 전체적으로 모든 Android 사운드에 적용할 수 있습니다. Android 11에는 출력 장치에 오디오 효과를 적용하기 위한 지원도 도입되었습니다. 이에 따라 이러한 API를 사용하는 대신 적절한 출력 장치에서 오디오 효과를 통해 페이드와 밸런스를 관리할 수 있습니다.
오디오 볼륨 낮추기
오디오 볼륨 낮추기는 차량이 동시에 재생되는 다른 스트림이 더 선명하게 들리도록 스트림 하나의 게인을 줄이는 것입니다. AAOS에서는 HAL이 오디오 볼륨 낮추기를 구현합니다. Android는 OS를 벗어난 소리를 제어할 수 없습니다. Android 11에서 볼륨 낮추기 결정을 위해 HAL에 제공되는 기본 정보는 두 출력 장치 모두에 활성 스트림이 있는지 여부입니다.
볼륨 낮추기가 필요한 경우
HAL이 볼륨 낮추기를 처리하는 방식을 결정하는 것은 개별 OEM에 달려 있지만, 다음 가이드라인을 권장합니다.
Android에서 여러 스트림이 재생되는 일은 두 앱 또는 서비스가 동시에 오디오 포커스를 보유할 때 흔히 발생합니다. Android가 동시 포커스를 부여할 수 있는 경우를 알아보려면 제한 유형의 상호작용 매트릭스를 참고하세요. 자동차 오디오 플러그인이 도입됨에 따라 이는 AudioFocus 관리에도 달려 있습니다.
Android가 믹싱하는 스트림은 게인이 적용되기 전에 믹싱 처리됩니다. 따라서 다른 스트림과 동시에 재생될 때 볼륨을 낮춰야 하는 스트림은 HAL이 스트림 믹싱 전에 볼륨 낮추기를 적용할 수 있도록 별개의 출력 장치로 라우팅되어야 합니다.
권장되는 볼륨 낮추기 동작
다음은 볼륨 낮추기가 권장되는 동시 상호작용입니다.
상호작용 | 작업 |
---|---|
EMERGENCY
| SAFETY 를 제외한 모든 스트림을 음소거하거나 볼륨 낮추기
|
SAFETY |
EMERGENCY 을 제외한 모든 스트림의 볼륨 낮추기 |
NAVIGATION |
SAFETY 및 EMERGENCY 을 제외한 모든 스트림의 볼륨 낮추기 |
CALL |
SAFETY , EMERGENCY , NAVIGATION 를 제외한 모든 스트림의 볼륨 낮추기 |
VOICE |
오리 CALL_RING |
VEHICLE_SOUNDS |
활성 사운드의 중요도와 다른 사운드의 볼륨을 낮출지 여부를 결정합니다. |
MUSIC 및 ANNOUNCEMENT |
모든 것을 피했습니다. 예외는 SYSTEM_SOUND 로 재생되는 터치 상호작용 알림음입니다.
|
볼륨 낮추기 시 고려사항
내비게이션이나 어시스턴트 같은 일부 앱과 서비스는 작업을 실행하는 데 여러 플레이어를 사용할 수 있습니다. 내비게이션 앱이나 어시스턴트 앱의 다음 재생이 시작되기 전에 미디어가 볼륨 낮추기가 적용되기 전에 최대 볼륨으로 돌아가지 않도록 데이터 스트림이 출력 장치를 통해 흐르는 것이 중지될 때 공격적으로 볼륨 낮추기를 취소하지 마세요.
잘 격리되는 여러 사운드 단계가 있는 차량의 경우 볼륨 낮추기 대신 오디오를 차량의 서로 다른 영역으로 라우팅할 수 있습니다. 예를 들어 음악을 차량 실내 전체에서 정상 볼륨으로 계속 재생하고 내비게이션 안내는 운전자 머리 받침대에 있는 스피커로 라우팅할 수 있습니다.
안전에 중요한 사운드
Android 11에서는 HAL 오디오 포커스 API를 도입했습니다. HAL은 안전에 중요한 사운드가 다른 사운드보다 우선하도록 합니다. HAL이 USAGE_EMERGENCY
의 오디오 포커스를 보유하더라도 Android의 앱과 서비스가 사운드를 재생하지 못하도록 보장하지는 않습니다. HAL은 안전에 중요한 사운드를 재생하기 위해 Android의 어떤 스트림을 믹싱하거나 음소거해야 할지 결정합니다.
볼륨 설정 UI 구성
AAOS는 볼륨 그룹 구성에서 볼륨 설정 UI를 분리합니다. 볼륨 그룹 게인 구성에 설명된 대로 오버레이할 수 있습니다. 이렇게 분리한 덕분에 볼륨 그룹 구성이 변경되어도 UI를 변경할 필요가 없습니다.
자동차 설정 UI에서 packages/apps/Car/Settings/res/xml/car_volume_items.xml
에는 정의된 각 AudioAttributes.USAGE
와 연결된 UI 요소 (제목 및 아이콘 리소스)가 포함됩니다. 이 파일은 각 VolumeGroup
에 포함된 사용 중 첫 번째로 인식된 사용과 연결된 리소스를 사용하여 정의된 VolumeGroups
의 적절한 렌더링을 제공합니다.
예를 들어 다음 예에서는 VolumeGroup
을 voice_communication
과 voice_communication_signalling
을 모두 포함하는 것으로 정의합니다. 자동차 설정 UI의 기본 구현은 voice_communication
이 파일에서 첫 번째 일치하는 항목이므로 이와 연결된 리소스를 사용하여 VolumeGroup
을 렌더링합니다.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
위의 구성에 사용된 속성과 값은 packages/apps/Car/Settings/res/values/attrs.xml
에 선언됩니다. 볼륨 설정 UI는 다음 VolumeGroup
기반 CarAudioManager API를 사용합니다.
getVolumeGroupCount()
: 그려야 하는 컨트롤 수를 알 수 있습니다.getGroupMinVolume()
및getGroupMaxVolume()
: 하한 및 상한을 가져옵니다.getGroupVolume()
: 현재 볼륨을 가져옵니다.registerVolumeChangeObserver()
: 볼륨 변경 시 알림을 받습니다.
자동차 볼륨 그룹 이벤트
볼륨 업데이트 및 무음 전환의 자동차 사용 사례에는 볼륨 설정과 같은 특정 앱의 작업을 정의할 수 있는 상황별 기반이 있습니다. 자동차 오디오 스택의 현재 볼륨 및 음소거 콜백은 제한된 컨텍스트 정보를 제공합니다. 자동차 사용 사례와 향후 확장성을 더 잘 지원하기 위해 Android 14에 CarVolumeGroupEvent가 추가되었습니다. 각 이벤트는 세 가지 중요한 유형의 정보를 전달합니다.
CarVolumeGroupInfo
목록입니다.EventTypes
(비트맵)ExtraInfos
목록입니다.
CarVolumeGroupInfo
이벤트 콜백의 수신자는 영향을 받는 자동차 볼륨 그룹 정보 목록에 쉽게 액세스할 수 있습니다. 즉, 앱이 최신 상태를 가져오기 위해 자동차 오디오 프레임워크에 추가 호출을 할 필요가 없습니다. 수신된 CarVolumeGroupInfos
을 사용하여 UI 또는 내부 상태를 업데이트할 수 있습니다. 앱을 더 쉽게 만들기 위해 자동차 볼륨 그룹에서 변경된 측면도 아래 설명대로 EventTypes
의 일부로 제공됩니다.
EventTypes
CarVolumeGroupInfo
의 어떤 측면이 변경되었는지 정의합니다. 앱은 이를 사용하여 변경사항을 식별하고 필요한 작업을 실행할 수 있습니다. 예를 들어 EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
는 해당 CarVolumeGroups
최대 볼륨 게인 색인이 변경되었으며 CarVolumeGroupInfo.getMaxVolumeGainIndex()
로 쿼리할 수 있음을 나타냅니다.
다음 표는 EventType
와 CarVolumeGroupInfo
간의 관계를 보여줍니다.
EventType | CarVolumeGroupInfo |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED |
CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED |
CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED |
CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED |
CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED |
CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED |
CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED |
CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
CarVolumeGroup
이 변경된 이유에 관한 추가 정보를 제공합니다. 앱은 이 정보를 사용하여 사용자에게 조치를 취하도록 알리거나 알림을 보내는 추가 컨텍스트를 제공할 수 있습니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
는 열 과부하로 인해 활성 일시적 감쇠를 나타냅니다. 사용자가 볼륨을 높이려고 하면 앱에서 사용자에게 알릴 수 있습니다.
Google에서는 ExtraInfos
에 대한 프로세스를 시행하지 않습니다. ExtraInfos
에 따라 프로세스를 결정하는 것은 사용자의 재량입니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
로 인해 감쇠가 활성화된 경우 사용자가 볼륨을 변경하지 못하도록 볼륨 바 UI를 처음에는 페이드 처리할 수도 있습니다.
다른 사용자는 더킹이 활성화되어 있음을 알리는 토스트를 표시하고 사용자가 볼륨을 변경할 수 있도록 할 수 있습니다.
자동차 오디오 프레임워크는 AudioControl HAL IAudioGainCallback
에 의존하여 제안된 ExtraInfos
을 제공합니다. 자세한 내용은 오디오 게인 콜백을 참고하세요.
CarVolumeGroupEvent
는 자동차 오디오 프레임워크의 향후 요구사항을 충족하도록 확장됩니다. Google은 CarVolumeGroupEvent
을 통해서만 새로운 기능을 지원할 계획입니다. 앱 개발자는 CarVolumeGroupEvent
를 사용하여 그룹 볼륨 및 음소거 변경사항을 처리하는 것이 좋습니다.
자동차 볼륨 그룹 이벤트 콜백
Android 14는 권한이 있는 앱과 플랫폼 앱이 CarVolumeGroupEvents
를 등록하고 알림을 받을 수 있는 새로운 콜백을 제공합니다.
콜백을 등록하려면
CarAudioManager#registerCarVolumeGroupEventCallback()
를 사용하세요.콜백을 등록 취소하려면
CarAudioManager#unregisterCarVolumeGroupEventCallback()
를 사용하세요.
앱이 새 CarVolumeGroupEventCallback
와 기존 CarVolumeCallback
에 등록되면 CarVolumeGroupEventCallbacks
이벤트가 우선 적용됩니다.
자동차 오디오 스택이 더 이상 CarVolumeCallback
를 트리거하지 않습니다. 이렇게 하면 동일한 이벤트에 대해 동일한 앱에 중복 트리거가 발생하지 않습니다.
CarVolumeGroupEventCallback
를 사용하여 그룹 볼륨 및 음소거 변경사항을 관리하는 것이 좋습니다.
오디오 게인 콜백
Android 13부터 AudioControl HAL은 자동차 오디오 시스템 변경으로 인한 볼륨 수준 업데이트를 관리하기 위해 비동기 콜백을 트리거할 수 있습니다.
HAL API
AudioControl @2.0 AIDL
버전 2.0의 AudioControl AIDL HAL은 다음 API를 추가합니다.
API | 목적 |
---|---|
IAudioControl#registerGainCallback |
IAudioGainCallback 의 인스턴스를 AudioControl HAL에 등록합니다. |
IAudioGainCallback#onAudioDeviceGainsChanged |
오디오 게인 구성의 변경사항을 알리는 비동기 콜백입니다. |
AudioControl HAL 콜백에는 이유 목록과 다음으로 구성된 각 AudioGainConfigInfo
가 포함됩니다.
- 영역 ID
- 기기 포트 주소
- 볼륨 색인 > 색인은 제한된 색인 또는 업데이트 색인일 수 있습니다.
이유는 다음과 같이 크게 분류할 수 있습니다.
- 제한 이유 볼륨 및 음소거 동작의 일시적인 변경사항
- 업데이트 이유 볼륨 동작의 영구적인 변경사항
제한 유형
AudioControl
HAL AIDL
V3
부터 지원되는 제한사항 유형은 다음과 같습니다.
- 음소거
- 차단
- 제한사항
- 감쇠
활성 제한 | 사용자가 트리거한 볼륨 변경 | 사용자 트리거 음소거 전환 |
---|---|---|
음소거 | ❌ | ❌ (음소거 해제) ✔ (음소거) |
차단 | ❌ | ✔ |
제한사항 | ❌ (한도 초과) ✔ (한도 미만) |
✔ |
감쇠 | ✔ | ✔ |
제한 간 우선순위는 무음 > 차단 > 제한 > 감쇠입니다.
숨기기 제한사항
숨기기 제한사항은 다음과 같습니다.
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
자동차 오디오 프레임워크는 내부적으로 다음 두 가지 음소거 상태를 유지합니다.
사용자 음소거.
CarAudioManager
또는 키 이벤트를 통해 사용자의 요청에 따라 전환됩니다.HAL 음소거
AudioGain
콜백을 통해 수신된 음소거 제한사항에 따라 전환됩니다.
설정 앱과 같은 리스너의 경우 볼륨 그룹 전체 무음(CarVolumeGroupInfo.isMuted()
) 상태는 위의 무음 중 하나가 사용 설정되었는지에 따라 달라집니다.
HAL 음소거가 사용 설정되면 제한 기간 동안 모든 수신 볼륨 변경 및 그룹 음소거 요청이 무시됩니다.
상호작용 사례: HAL 음소거가 활성 상태이고 사용자가 음소거 전환을 요청함
HAL 음소거가 사용 설정되고 사용자 음소거가 사용 중지된 경우:
- 볼륨 그룹 전체 무음 상태가
true
로 변경됩니다. - 사용자의 음소거 사용 설정 요청이 처리됩니다.
- 이유: 사용자의 개인 정보를 보호하기 위해 사용자 음소거 요청은 항상 존중되어야 합니다.
HAL 음소거가 사용 설정되고 사용자 음소거가 사용 설정된 경우:
볼륨 그룹 전체 무음 상태가
true
로 변경됩니다.사용자가 음소거를 사용 중지하도록 요청하면
NOT
처리됩니다. 캐시된 사용자 음소거 상태가 사용 설정된 상태로 유지됩니다.이유: 활성 제한이 없는 경우에만 사용자 음소거 해제 요청이 처리됩니다.
이유: 캐시된 사용자 음소거를 해제하면 의도치 않은 소리 폭발이 발생하여 사용자 안전이 위험해질 수 있습니다. 이는 특히 소리 수준 인식에 대한 사용자의 인식을 낮추는 점화 주기에서 음소거 상태가 사용 설정된 경우에 해당합니다.
상호작용 사례: 사용자 음소거는 변경되지 않은 상태에서 HAL 음소거가 사용 설정 및 사용 중지됨
HAL 음소거를 전환하면 볼륨 그룹 전체 음소거 상태가 변경됩니다. 하지만 사용자 음소거 상태를 직접 업데이트하지는 않습니다. 사용자 음소거가 사용 중지되고 사용 설정하는 HAL 음소거 콜백이 수신되는 경우:
- 볼륨 그룹 전체 무음 상태가
true
로 변경됩니다. 사용자가 볼륨을 변경하도록 요청하면 HAL 음소거가 사용 설정된 동안
NOT
가 처리됩니다.이유: 사용자가 음소거가 사용 설정된 동안 소리를 인식할 수 없습니다. 볼륨 변경을 허용하면 소리가 갑자기 커져 사용자의 안전이 위험해질 수 있습니다.
이유: OEM에서 예상하는 동작인 경우 볼륨 앱은 콜백을 등록하고 사용자의 개입 없이 자동으로 음소거 해제(CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..))를 트리거할 수 있습니다.
사용자 음소거가 사용 중지된 상태에서 HAL 음소거가 사용 중지된 경우:
볼륨 그룹 음소거 상태가
false
로 변경됩니다.이유: 음소거 상태를 고정하고 사용자에게 음소거 해제를 요청하면 음소거 상태가 자주 전환될 때 사용자를 불필요하게 방해할 수 있습니다.
사용자의 볼륨 변경 요청은 정상적으로 처리됩니다.
차단
차단 제한사항은 다음과 같습니다.
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
차단 제한이 활성 상태인 경우 사용자가 다음을 요청하면
- 볼륨 변경이 처리되지 않습니다.
- 음소거 전환이 처리됩니다.
제한사항
제한사항은 다음과 같습니다.
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
제한 제한이 활성화되면 사용자가 다음을 요청할 수 없습니다.
볼륨 변경:
- 제한 내에서 처리됨
- 위의 제한사항은 처리되지 않습니다.
음소거 전환이 처리됩니다.
감쇠
감쇠 제한사항은 다음과 같습니다.
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
감쇠 제한이 활성화되면 사용자가 다음을 요청할 수 없습니다.
볼륨 변경이 처리됩니다. 새 현재 볼륨 수준이 이전 볼륨이 아닌 감쇠된 볼륨으로 설정됩니다. 향후 볼륨 변경사항은 이 수준에서 이루어집니다.
음소거 전환이 처리됩니다.
색인으로 업데이트
다음은 비동기 볼륨 색인 업데이트로 간주됩니다.
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
이러한 이유로 AudioControl HAL은 볼륨 그룹 현재 색인을 지정된 색인으로 업데이트할 수 있습니다. 이는 주로 자동차 오디오 프레임워크의 볼륨 변경 요청에 대한 오디오 시스템의 피드백으로 사용됩니다. 색인 업데이트는 색인을 동기화하기 위해 CarVolumeGroupEvent
콜백으로 앱에도 전달됩니다.
예
사용 사례: 사용자가 볼륨 색인을 30으로 업데이트
사용자가 볼륨 앱을 사용하여 볼륨 색인을 30으로 변경합니다.
이 색인은 볼륨 게인으로 변환되어 오디오 HAL로 전송됩니다.
Audio HAL
공급업체 구현은 새 볼륨 게인을 수신하고 오디오 시스템 (예: 외부 앰프)을 업데이트합니다.오디오 시스템은 볼륨 수준이 색인 15로만 업데이트된다고 응답합니다(Android에서 알 수 없는 이유).
AudioControl HAL
트리거의 공급업체 구현은 다음을 충족해야 합니다.IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
자동차 오디오 서비스는 지속성과 볼륨 앱에 대한 콜백에 사용되는 콜백에서 새 색인을 소비합니다. 사용자가 요청한 색인은 30입니다. 하지만 오디오 시스템 비동기 피드백은 색인을 15로 업데이트합니다.
사용 사례: 정지 종료 후 첫 번째 오디오 재생
정지 전 볼륨 색인이 높은 수준인 95로 설정됩니다 (범위: [0~99]).
Android가 정지 모드로 전환됩니다.
Android가 있으면 일시중지합니다 (예: 재개).
공급업체
Audio HAL/AudioControl HAL
는 오디오 시스템에 안전한 색인 30을 로컬로 적용합니다.공급업체
AudioControl HAL
는 안전 지수의 콜백도 트리거합니다.
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
자동차 오디오 서비스는 지속성에 사용되는 콜백과 볼륨 앱에 색인을 동기화하는 자체 콜백에서 새 색인을 사용합니다. 일시중지 전 볼륨 색인은 95입니다. 하지만 재개 후 이 색인은
AudioControl HAL
구현자에 의해 안전한 볼륨 수준인 30으로 설정됩니다.
동적 볼륨 구성
이 기능에서는 다음과 같은 기본 사용 사례를 고려합니다.
차량 생산 종료 (EOL) 구성입니다.
자동차 제조업체는 차량 오디오 시스템 설정을 기반으로 EOL에서 볼륨 구성을 업데이트하는 것을 선호합니다. 일반적으로 Android SW 이미지를 업데이트하지 않고 사이드로드하는 것입니다.
자동차 제조업체는 서비스 일정 중에 볼륨 구성을 업데이트해야 할 수 있습니다.
런타임 구성 자동차 오디오 시스템은 외부 증폭기 구성을 지원하며 이러한 ECU는 부팅 시간에 쿼리되는 볼륨 범위 구성을 호스팅할 수 있습니다.
주문형 구성 사용자가 일정 기간 동안 향상된 신호 처리를 구독하는 수요 기반 오디오 기능에 대한 증가하는 요구사항을 지원하기 위해 제공됩니다. 새 볼륨 범위 구성은 정기 결제 기간 동안 유효합니다.
디자인
동적 볼륨 구성은 다음 세 단계로 이루어집니다.
디스커버리 공급업체 AudioControl HAL 구현은 공급업체가 소유한 맞춤 IPC 메커니즘을 통해 새로운 볼륨 범위 업데이트를 검색합니다.
발견되면
AudioControl::IModuleChangeCallback
를 통해 콜백이 생성됩니다.업데이트 자동차 오디오 스택은 새 볼륨 범위로 볼륨 그룹 상태를 업데이트합니다.
볼륨 범위 업데이트 후에도 동일한 볼륨 수준을 유지하기 위해 노력합니다. 하지만 색인이 범위를 벗어나면 현재 볼륨 색인이 안전한 값으로 설정됩니다. 예를 들어 콜백 중에 공급업체에서 제공하는 기본 수준입니다.
콜백
볼륨 그룹 범위 업데이트를 게시하면 자동차 오디오 스택이
CarVolumeGroupEventCallback
를 통해 등록된 앱에 콜백을 트리거합니다.CarVolumeGroupEvent
에는 업데이트된CarVolumeGroupInfo
, 이벤트 유형(무엇이 변경됨), 추가 정보 (왜 변경됨)가 포함됩니다.
그림 2. 동적 볼륨 구성
HAL API
AudioControl @ 3.0 AIDL
버전 3.0의 AudioControl AIDL HAL에는 다음 API가 도입되었습니다.
API | |
---|---|
IAudioControl#setModuleChangeCallback | AudioControl HAL로 IModuleChangeCallback 인스턴스를 설정합니다. |
IAudioControl#clearModuleChangeCallback | AudioControl HAL로 이전에 설정된 IModuleChangeCallback 인스턴스를 삭제합니다. |
IModuleChangeCallback#onAudioPortsChanged | AudioPort 변경사항을 알리는 콜백 |
순서
동적 볼륨 구성의 시퀀스 다이어그램은 아래에 표시됩니다.
그림 3. 동적 볼륨 구성의 시퀀스 다이어그램
주요 측면
이 기능을 최적화하려면 다음 사항을 고려하세요.
콜백의 일부로 제공되는 AudioPort는 Automotive 버스 정의와 일치해야 합니다.
- 기기 포트.
IN_DEVICE
,OUT_DEVICE
- 공감대를 형성했습니다.
BUS
- 주소 오디오 HAL 정의에 정의됨
- 게인 모드.
JOINT
- 기기 포트.
공급업체는 오디오 HAL 정책에서 볼륨 범위 정의의 상위 집합을 정의하고 콜백을 사용하여 차량 변형에 맞게 맞춤설정해야 합니다. 자세한 내용은
IModuleChangeCallbac
AIDL 정의를 참고하세요.동일한 볼륨 그룹에 속하는 오디오 버스가 두 개 이상인 경우 각 버스에는 동일한 볼륨 범위 정의가 있어야 합니다. 그렇지 않으면 자동차 오디오 프레임워크에서 새 볼륨 범위 정의를 거부합니다.