• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_RINGTONE:
59                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
60                         AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
61             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
62                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SPEECH,
63                         AudioAttributes.USAGE_VOICE_COMMUNICATION);
64             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
65                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_VOICE_COMMAND,
66                         AudioAttributes.CONTENT_TYPE_SPEECH,
67                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE);
68             case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
69                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
70                         AudioAttributes.USAGE_ALARM);
71             case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
72                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
73                         AudioAttributes.USAGE_NOTIFICATION);
74             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
75                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_SONIFICATION,
76                         AudioAttributes.USAGE_ASSISTANCE_SONIFICATION);
77             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
78                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_SAFETY_ALERT,
79                         AudioAttributes.CONTENT_TYPE_SONIFICATION,
80                         AudioAttributes.USAGE_NOTIFICATION);
81             case CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
82                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_BOTTOM,
83                         AudioAttributes.CONTENT_TYPE_UNKNOWN,
84                         AudioAttributes.USAGE_UNKNOWN);
85             case CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
86                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY,
87                         AudioAttributes.CONTENT_TYPE_UNKNOWN,
88                         AudioAttributes.USAGE_UNKNOWN);
89             case CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE:
90                 return createCustomAudioAttributes(CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE,
91                         AudioAttributes.CONTENT_TYPE_MUSIC,
92                         AudioAttributes.USAGE_UNKNOWN);
93             case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
94             default:
95                 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_UNKNOWN,
96                         AudioAttributes.USAGE_UNKNOWN);
97         }
98     }
99 
getCarUsageFromAudioAttributes(AudioAttributes attr)100     public static int getCarUsageFromAudioAttributes(AudioAttributes attr) {
101         int usage = attr.getUsage();
102         Bundle bundle = attr.getBundle();
103         int type = CAR_AUDIO_TYPE_DEFAULT;
104         if (bundle != null) {
105             type = bundle.getInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_DEFAULT);
106         }
107         switch (usage) {
108             case AudioAttributes.USAGE_MEDIA:
109                 switch (type) {
110                     case CAR_AUDIO_TYPE_RADIO:
111                         return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
112                     case CAR_AUDIO_TYPE_EXTERNAL_SOURCE:
113                         return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
114                     default:
115                         return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
116                 }
117             case AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
118                 if (type == CAR_AUDIO_TYPE_VOICE_COMMAND) {
119                     return CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND;
120                 } else {
121                     return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
122                 }
123             case AudioAttributes.USAGE_VOICE_COMMUNICATION:
124                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
125             case AudioAttributes.USAGE_NOTIFICATION_RINGTONE:
126                 return CarAudioManager.CAR_AUDIO_USAGE_RINGTONE;
127             case AudioAttributes.USAGE_ALARM:
128                 return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
129             case AudioAttributes.USAGE_NOTIFICATION:
130                 if (type == CAR_AUDIO_TYPE_SAFETY_ALERT) {
131                     return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
132                 } else {
133                     return CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION;
134                 }
135             case AudioAttributes.USAGE_ASSISTANCE_SONIFICATION:
136                 return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND;
137             case AudioAttributes.USAGE_UNKNOWN:
138             default: {
139                 switch (type) {
140                     case CAR_AUDIO_TYPE_CARSERVICE_BOTTOM:
141                         return CAR_AUDIO_USAGE_CARSERVICE_BOTTOM;
142                     case CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY:
143                         return CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY;
144                     case CAR_AUDIO_TYPE_CARSERVICE_MEDIA_MUTE:
145                         return CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE;
146                     default:
147                         return CarAudioManager.CAR_AUDIO_USAGE_DEFAULT;
148                 }
149             }
150         }
151     }
152 
createAudioAttributes(int contentType, int usage)153     private static AudioAttributes createAudioAttributes(int contentType, int usage) {
154         AudioAttributes.Builder builder = new AudioAttributes.Builder();
155         return builder.setContentType(contentType).setUsage(usage).build();
156     }
157 
createCustomAudioAttributes(int carAudioType, int contentType, int usage)158     private static AudioAttributes createCustomAudioAttributes(int carAudioType,
159             int contentType, int usage) {
160         AudioAttributes.Builder builder = new AudioAttributes.Builder();
161         Bundle bundle = new Bundle();
162         bundle.putInt(KEY_CAR_AUDIO_TYPE, carAudioType);
163         return builder.setContentType(contentType).setUsage(usage).addBundle(bundle).build();
164     }
165 
getCarRadioAttributes(String radioType)166     public static AudioAttributes getCarRadioAttributes(String radioType) {
167         AudioAttributes.Builder builder = new AudioAttributes.Builder();
168         Bundle bundle = new Bundle();
169         bundle.putInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_RADIO);
170         bundle.putString(KEY_EXT_ROUTING_TYPE, radioType);
171         return builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
172                 setUsage(AudioAttributes.USAGE_MEDIA).addBundle(bundle).build();
173     }
174 
getCarExtSourceAttributes(String externalSourceType)175     public static AudioAttributes getCarExtSourceAttributes(String externalSourceType) {
176         AudioAttributes.Builder builder = new AudioAttributes.Builder();
177         Bundle bundle = new Bundle();
178         bundle.putInt(KEY_CAR_AUDIO_TYPE, CAR_AUDIO_TYPE_EXTERNAL_SOURCE);
179         bundle.putString(KEY_EXT_ROUTING_TYPE, externalSourceType);
180         return builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
181                 setUsage(AudioAttributes.USAGE_MEDIA).addBundle(bundle).build();
182     }
183 
184     /**
185      * Get ext routing type from given AudioAttributes.
186      * @param attr
187      * @return {@link CarAudioManager#CAR_RADIO_TYPE_AM_FM} if ext routing info does not exist.
188      */
getExtRouting(AudioAttributes attr)189     public static String getExtRouting(AudioAttributes attr) {
190         Bundle bundle = attr.getBundle();
191         String extRouting = CarAudioManager.CAR_RADIO_TYPE_AM_FM;
192         if (bundle != null) {
193             extRouting = bundle.getString(KEY_EXT_ROUTING_TYPE);
194         }
195         return extRouting;
196     }
197 }
198