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 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 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 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 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 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 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 */ 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