blob: 54ed2c638c2837d8ef2838f21784a15fb67c09b4 [file] [log] [blame]
Keun-young Park5672e852016-02-09 19:53:48 -08001/*
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 */
16package com.android.car;
17
Keun-young Parke54ac272016-02-16 19:02:18 -080018import android.car.media.CarAudioManager;
Keun-young Park5672e852016-02-09 19:53:48 -080019import android.media.AudioAttributes;
20import android.os.Bundle;
Keun-young Park5672e852016-02-09 19:53:48 -080021
22/**
23 * Utility class to map car usage into AudioAttributes and the other way around.
24 */
25public 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;
Keun-young Park3cb89102016-05-05 13:16:03 -070029 public static final int CAR_AUDIO_USAGE_CARSERVICE_MEDIA_MUTE = 102;
Keun-young Park5672e852016-02-09 19:53:48 -080030
Keun-young Park4c6834a2016-06-28 12:58:23 -070031 /** Bundle key for storing media type. */
Keun-young Park5672e852016-02-09 19:53:48 -080032 public static final String KEY_CAR_AUDIO_TYPE = "car_audio_type";
Keun-young Park3cb89102016-05-05 13:16:03 -070033
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;
Keun-young Park4c6834a2016-06-28 12:58:23 -070041 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";
Keun-young Park5672e852016-02-09 19:53:48 -080045
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);
Keun-young Park4c6834a2016-06-28 12:58:23 -070051 case CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE: // default to radio
Keun-young Park5672e852016-02-09 19:53:48 -080052 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);
Keun-young Park3cb89102016-05-05 13:16:03 -070086 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);
Keun-young Park5672e852016-02-09 19:53:48 -080090 case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
91 default:
92 return createAudioAttributes(AudioAttributes.CONTENT_TYPE_UNKNOWN,
93 AudioAttributes.USAGE_UNKNOWN);
94 }
95 }
96
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:
Keun-young Park4c6834a2016-06-28 12:58:23 -0700106 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;
Keun-young Park5672e852016-02-09 19:53:48 -0800113 }
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:
Keun-young Park3cb89102016-05-05 13:16:03 -0700133 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;
Keun-young Park5672e852016-02-09 19:53:48 -0800143 }
Keun-young Park3cb89102016-05-05 13:16:03 -0700144 }
Keun-young Park5672e852016-02-09 19:53:48 -0800145 }
146 }
147
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
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 }
Keun-young Park4c6834a2016-06-28 12:58:23 -0700160
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
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 */
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 }
Keun-young Park5672e852016-02-09 19:53:48 -0800192}