1 /*
2  * Copyright (C) 2016 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 package com.android.car;
17 
18 import android.car.media.CarAudioManager;
19 import android.media.AudioAttributes;
20 import android.os.Bundle;
21 
22 /**
23  * Utility class to map car usage into AudioAttributes and the other way around.
24  */
25 public class CarAudioAttributesUtil {
26 
27     public static final int CAR_AUDIO_USAGE_CARSERVICE_BOTTOM = 100;
28     public static final int CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY = 101;
29     public static final int CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE = 102;
30 
31     /** Bundle key for storing media type. */
32     public static final String KEY_CAR_AUDIO_TYPE = "car_audio_type";
33 
34     private static final int CAR_AUDIO_TYPE_DEFAULT = 0;
35     private static final int CAR_AUDIO_TYPE_VOICE_COMMAND = 1;
36     private static final int CAR_AUDIO_TYPE_SAFETY_ALERT = 2;
37     private static final int CAR_AUDIO_TYPE_RADIO = 3;
38     private static final int CAR_AUDIO_TYPE_CARSERVICE_BOTTOM = 4;
39     private static final int CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY = 5;
40     private static final int CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE = 6;
41     private static final int CAR_AUDIO_TYPE_EXTERNAL_SOURCE = 7;
42 
43     /** Bundle key for storing routing type which is String. */
44     public static final String KEY_EXT_ROUTING_TYPE = "ext_routing_type";
45 
getAudioAttributesForCarUsage(int carUsage)46     public static AudioAttributes getAudioAttributesForCarUsage(int carUsage) {
47         switch (carUsage) {
48             case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
49                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_MUSIC,
50                         AudioAttributes.USAGE_MEDIA);
51             case CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE: // default to radio
52             case CarAudioManager.CAR_AUDIO_USAGE_RADIO:
53                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_RADIO,
54                         AudioAttributes.CONTENT_TYPE_MUSIC, AudioAttributes.USAGE_MEDIA);
55             case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
56                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
57                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
58             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
59                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
60                         AudioAttributes.USAGE_VOICE_COMMUNICATION);
61             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
62                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_VOICE_COMMAND,
63                         AudioAttributes.CONTENT_TYPE_SPEECH,
64                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
65             case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
66                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
67                         AudioAttributes.USAGE_ALARM);
68             case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
69                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
70                         AudioAttributes.USAGE_NOTIFICATION);
71             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
72                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
73                         AudioAttributes.USAGE_ASSISTANCE_SONIFICATION);
74             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
75                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_SAFETY_ALERT,
76                         AudioAttributes.CONTENT_TYPE_SONIFICATION,
77                         AudioAttributes.USAGE_NOTIFICATION);
78             case CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
79                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_BOTTOM,
80                         AudioAttributes.CONTENT_TYPE_UNKNOWN,
81                         AudioAttributes.USAGE_UNKNOWN);
82             case CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
83                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY,
84                         AudioAttributes.CONTENT_TYPE_UNKNOWN,
85                         AudioAttributes.USAGE_UNKNOWN);
86             case CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE:
87                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE,
88                         AudioAttributes.CONTENT_TYPE_MUSIC,
89                         AudioAttributes.USAGE_UNKNOWN);
90             case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
91             default:
92                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_UNKNOWN,
93                         AudioAttributes.USAGE_UNKNOWN);
94         }
95     }
96 
getCarUsageFromAudioAttributes(AudioAttributes attr)97     public static int getCarUsageFromAudioAttributes(AudioAttributes attr) {
98         int usage = attr.getUsage();
99         Bundle bundle = attr.getBundle();
100         int type = CAR_AUDIO_TYPE_DEFAULT;
101         if (bundle != null) {
102             type = bundle.getInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_DEFAULT);
103         }
104         switch (usage) {
105             case AudioAttributes.USAGE_MEDIA:
106                 switch (type) {
107                     case CAR_AUDIO_TYPE_RADIO:
108                         return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
109                     case CAR_AUDIO_TYPE_EXTERNAL_SOURCE:
110                         return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
111                     default:
112                         return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
113                 }
114             case AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
115                 if (type == CAR_AUDIO_TYPE_VOICE_COMMAND) {
116                     return CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND;
117                 } else {
118                     return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
119                 }
120             case AudioAttributes.USAGE_VOICE_COMMUNICATION:
121                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
122             case AudioAttributes.USAGE_ALARM:
123                 return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
124             case AudioAttributes.USAGE_NOTIFICATION:
125                 if (type == CAR_AUDIO_TYPE_SAFETY_ALERT) {
126                     return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
127                 } else {
128                     return CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION;
129                 }
130             case AudioAttributes.USAGE_ASSISTANCE_SONIFICATION:
131                 return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND;
132             case AudioAttributes.USAGE_UNKNOWN:
133             default: {
134                 switch (type) {
135                     case CAR_AUDIO_TYPE_CARSERVICE_BOTTOM:
136                         return CAR_AUDIO_USAGE_CARSERVICE_BOTTOM;
137                     case CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY:
138                         return CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY;
139                     case CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE:
140                         return CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE;
141                     default:
142                         return CarAudioManager.CAR_AUDIO_USAGE_DEFAULT;
143                 }
144             }
145         }
146     }
147 
createAudioAttributes(int contentType, int usage)148     private static AudioAttributes createAudioAttributes(int contentType, int usage) {
149         AudioAttributes.Builder builder = new AudioAttributes.Builder();
150         return builder.setContentType(contentType).setUsage(usage).build();
151     }
152 
createCustomAudioAttributes(int carAudioType, int contentType, int usage)153     private static AudioAttributes createCustomAudioAttributes(int carAudioType,
154             int contentType, int usage) {
155         AudioAttributes.Builder builder = new AudioAttributes.Builder();
156         Bundle bundle = new Bundle();
157         bundle.putInt(KEY_CAR_AUDIO_TYPE, carAudioType);
158         return builder.setContentType(contentType).setUsage(usage).addBundle(bundle).build();
159     }
160 
getCarRadioAttributes(String radioType)161     public static AudioAttributes getCarRadioAttributes(String radioType) {
162         AudioAttributes.Builder builder = new AudioAttributes.Builder();
163         Bundle bundle = new Bundle();
164         bundle.putInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_RADIO);
165         bundle.putString(KEY_EXT_ROUTING_TYPE, radioType);
166         return builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
167                 setUsage(AudioAttributes.USAGE_MEDIA).addBundle(bundle).build();
168     }
169 
getCarExtSourceAttributes(String externalSourceType)170     public static AudioAttributes getCarExtSourceAttributes(String externalSourceType) {
171         AudioAttributes.Builder builder = new AudioAttributes.Builder();
172         Bundle bundle = new Bundle();
173         bundle.putInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_EXTERNAL_SOURCE);
174         bundle.putString(KEY_EXT_ROUTING_TYPE, externalSourceType);
175         return builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
176                 setUsage(AudioAttributes.USAGE_MEDIA).addBundle(bundle).build();
177     }
178 
179     /**
180      * Get ext routing type from given AudioAttributes.
181      * @param attr
182      * @return {@link CarAudioManager#CAR_RADIO_TYPE_AM_FM} if ext routing info does not exist.
183      */
getExtRouting(AudioAttributes attr)184     public static String getExtRouting(AudioAttributes attr) {
185         Bundle bundle = attr.getBundle();
186         String extRouting = CarAudioManager.CAR_RADIO_TYPE_AM_FM;
187         if (bundle != null) {
188             extRouting = bundle.getString(KEY_EXT_ROUTING_TYPE);
189         }
190         return extRouting;
191     }
192 }
193