• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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