1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.car.audio; 18 19 import static android.car.builtin.media.AudioManagerHelper.usageToXsdString; 20 21 import android.hardware.audio.common.PlaybackTrackMetadata; 22 import android.hardware.automotive.audiocontrol.DuckingInfo; 23 import android.media.AudioAttributes; 24 import android.media.audio.common.AudioChannelLayout; 25 import android.media.audio.common.AudioDevice; 26 import android.media.audio.common.AudioDeviceAddress; 27 import android.media.audio.common.AudioDeviceDescription; 28 29 import com.android.car.internal.annotation.AttributeUsage; 30 31 import java.util.ArrayList; 32 import java.util.List; 33 import java.util.Objects; 34 35 /** Car HAL audio Utils */ 36 public final class CarHalAudioUtils { CarHalAudioUtils()37 private CarHalAudioUtils() {} 38 39 /** 40 * Creates {@link DuckingInfo} instance from contents of {@link CarDuckingInfo}. 41 * 42 * <p>Converts usages to XSD strings as part of this process. 43 */ generateDuckingInfo(CarDuckingInfo carDuckingInfo)44 public static DuckingInfo generateDuckingInfo(CarDuckingInfo carDuckingInfo) { 45 Objects.requireNonNull(carDuckingInfo, "Car Ducking Info can not be null"); 46 DuckingInfo duckingInfo = new DuckingInfo(); 47 duckingInfo.zoneId = carDuckingInfo.getZoneId(); 48 duckingInfo.deviceAddressesToDuck = 49 carDuckingInfo.getAddressesToDuck().toArray(new String[0]); 50 duckingInfo.deviceAddressesToUnduck = 51 carDuckingInfo.getAddressesToUnduck().toArray(new String[0]); 52 List<PlaybackTrackMetadata> playbackTrackMetadataList = 53 carDuckingInfo.getPlaybackMetaDataHoldingFocus(); 54 duckingInfo.playbackMetaDataHoldingFocus = 55 playbackTrackMetadataList.toArray(PlaybackTrackMetadata[]::new); 56 duckingInfo.usagesHoldingFocus = metadatasToUsageStrings(playbackTrackMetadataList); 57 return duckingInfo; 58 } 59 60 /** 61 * Converts the {@link AttributeUsage} into a metadata for a particular 62 * audio zone. 63 * 64 */ audioAttributeToMetadata( AudioAttributes audioAttributes, CarAudioZone zone)65 public static PlaybackTrackMetadata audioAttributeToMetadata( 66 AudioAttributes audioAttributes, CarAudioZone zone) { 67 Objects.requireNonNull(zone, "Car audio zone can not be null"); 68 int carAudioContextId = zone.getCarAudioContext() 69 .getContextForAudioAttribute(audioAttributes); 70 PlaybackTrackMetadata playbackTrackMetadata = new PlaybackTrackMetadata(); 71 playbackTrackMetadata.usage = audioAttributes.getSystemUsage(); 72 playbackTrackMetadata.tags = new String[0]; 73 playbackTrackMetadata.channelMask = AudioChannelLayout.none(0); 74 AudioDeviceDescription audioDeviceDescription = new AudioDeviceDescription(); 75 audioDeviceDescription.connection = new String(); 76 AudioDevice audioDevice = new AudioDevice(); 77 audioDevice.type = audioDeviceDescription; 78 audioDevice.address = 79 AudioDeviceAddress.id(zone.getAddressForContext(carAudioContextId)); 80 playbackTrackMetadata.sourceDevice = audioDevice; 81 return playbackTrackMetadata; 82 } 83 84 /** 85 * Converts the list of {@link AttributeUsage} usages into 86 * Playback metadata for a particular zone. 87 * 88 */ audioAttributesToMetadatas( List<AudioAttributes> audioAttributes, CarAudioZone zone)89 public static List<PlaybackTrackMetadata> audioAttributesToMetadatas( 90 List<AudioAttributes> audioAttributes, CarAudioZone zone) { 91 Objects.requireNonNull(zone, "Car audio zone can not be null"); 92 List<PlaybackTrackMetadata> playbackTrackMetadataList = 93 new ArrayList<>(audioAttributes.size()); 94 for (int index = 0; index < audioAttributes.size(); index++) { 95 playbackTrackMetadataList.add(audioAttributeToMetadata(audioAttributes.get(index), 96 zone)); 97 } 98 return playbackTrackMetadataList; 99 } 100 101 /** 102 * Converts a playback track metadata into the corresponding audio attribute 103 * 104 */ metadataToAudioAttribute( PlaybackTrackMetadata playbackTrackMetadataList)105 public static AudioAttributes metadataToAudioAttribute( 106 PlaybackTrackMetadata playbackTrackMetadataList) { 107 return CarAudioContext.getAudioAttributeFromUsage(playbackTrackMetadataList.usage); 108 } 109 110 /** 111 * Converts a list playback track metadata into list of audio attributes 112 * 113 */ metadataToAudioAttributes( List<PlaybackTrackMetadata> playbackTrackMetadataList)114 public static List<AudioAttributes> metadataToAudioAttributes( 115 List<PlaybackTrackMetadata> playbackTrackMetadataList) { 116 List<AudioAttributes> audioAttributesForMetadata = 117 new ArrayList<>(playbackTrackMetadataList.size()); 118 for (int index = 0; index < playbackTrackMetadataList.size(); index++) { 119 audioAttributesForMetadata.add( 120 metadataToAudioAttribute(playbackTrackMetadataList.get(index))); 121 } 122 return audioAttributesForMetadata; 123 } 124 125 /** 126 * Converts a list of playback track metadata into an array of 127 * audio usages in string representation. 128 */ metadatasToUsageStrings( List<PlaybackTrackMetadata> playbackTrackMetadataList)129 public static String[] metadatasToUsageStrings( 130 List<PlaybackTrackMetadata> playbackTrackMetadataList) { 131 String[] usageLiteralsForMetadata = new String[playbackTrackMetadataList.size()]; 132 for (int index = 0; index < playbackTrackMetadataList.size(); index++) { 133 PlaybackTrackMetadata playbackTrackMetadata = playbackTrackMetadataList.get(index); 134 usageLiteralsForMetadata[index] = usageToXsdString(playbackTrackMetadata.usage); 135 } 136 return usageLiteralsForMetadata; 137 } 138 } 139