blob: 0b16b104e803e33fe48ded94cfd6a9cf2ff9346d [file] [log] [blame]
keunyoungd32f4e62015-09-21 11:33:06 -07001/*
2 * Copyright (C) 2015 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.hal;
17
Keun-young Parke54ac272016-02-16 19:02:18 -080018import android.car.media.CarAudioManager;
keunyoung5c7cb262015-10-19 10:47:45 -070019import android.util.Log;
20
21import com.android.car.AudioRoutingPolicy;
22import com.android.car.CarLog;
23import com.android.car.vehiclenetwork.VehicleNetwork;
keunyoungd32f4e62015-09-21 11:33:06 -070024import com.android.car.vehiclenetwork.VehicleNetworkConsts;
Keun-young Park0727f952015-12-21 14:30:07 -080025import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
keunyounga74b9ca2015-10-21 13:33:58 -070026import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
27import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
keunyoung1ab8e182015-09-24 09:25:22 -070028import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
29import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
keunyounga74b9ca2015-10-21 13:33:58 -070030import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioHwVariantConfigFlag;
keunyoung5c7cb262015-10-19 10:47:45 -070031import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioRoutingPolicyIndex;
keunyoungd32f4e62015-09-21 11:33:06 -070032import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStreamState;
keunyounga74b9ca2015-10-21 13:33:58 -070033import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStreamStateIndex;
34import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeIndex;
keunyoungd32f4e62015-09-21 11:33:06 -070035import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
keunyoung5c7cb262015-10-19 10:47:45 -070036import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
keunyoungd32f4e62015-09-21 11:33:06 -070037import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
38
39import java.io.PrintWriter;
keunyounga74b9ca2015-10-21 13:33:58 -070040import java.util.HashMap;
keunyoungd32f4e62015-09-21 11:33:06 -070041import java.util.LinkedList;
42import java.util.List;
43
44public class AudioHalService extends HalServiceBase {
45
keunyounga74b9ca2015-10-21 13:33:58 -070046 public static final int VEHICLE_AUDIO_FOCUS_REQUEST_INVALID = -1;
keunyoungd32f4e62015-09-21 11:33:06 -070047 public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN =
keunyoung1ab8e182015-09-24 09:25:22 -070048 VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN;
keunyoungd32f4e62015-09-21 11:33:06 -070049 public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT =
keunyoung1ab8e182015-09-24 09:25:22 -070050 VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT;
keunyoungd32f4e62015-09-21 11:33:06 -070051 public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK =
keunyoung1ab8e182015-09-24 09:25:22 -070052 VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK;
keunyoungd32f4e62015-09-21 11:33:06 -070053 public static final int VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE =
keunyoung1ab8e182015-09-24 09:25:22 -070054 VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE;
keunyoungd32f4e62015-09-21 11:33:06 -070055
56 public static String audioFocusRequestToString(int request) {
keunyoung1ab8e182015-09-24 09:25:22 -070057 return VehicleAudioFocusRequest.enumToString(request);
keunyoungd32f4e62015-09-21 11:33:06 -070058 }
59
keunyounga74b9ca2015-10-21 13:33:58 -070060 public static final int VEHICLE_AUDIO_FOCUS_STATE_INVALID = -1;
keunyoungd32f4e62015-09-21 11:33:06 -070061 public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN =
keunyoung1ab8e182015-09-24 09:25:22 -070062 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN;
keunyoungd32f4e62015-09-21 11:33:06 -070063 public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT =
keunyoung1ab8e182015-09-24 09:25:22 -070064 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
keunyoungd32f4e62015-09-21 11:33:06 -070065 public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK =
keunyoung1ab8e182015-09-24 09:25:22 -070066 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK;
keunyoungd32f4e62015-09-21 11:33:06 -070067 public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT =
keunyoung1ab8e182015-09-24 09:25:22 -070068 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT;
keunyoungd32f4e62015-09-21 11:33:06 -070069 public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS =
keunyoung1ab8e182015-09-24 09:25:22 -070070 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
keunyoungd32f4e62015-09-21 11:33:06 -070071 public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE =
keunyoung1ab8e182015-09-24 09:25:22 -070072 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE;
keunyoungd32f4e62015-09-21 11:33:06 -070073
74 public static String audioFocusStateToString(int state) {
keunyoung1ab8e182015-09-24 09:25:22 -070075 return VehicleAudioFocusState.enumToString(state);
keunyoungd32f4e62015-09-21 11:33:06 -070076 }
77
78 public static final int VEHICLE_AUDIO_STREAM_STATE_STOPPED =
79 VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STOPPED;
80 public static final int VEHICLE_AUDIO_STREAM_STATE_STARTED =
81 VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED;
82
83 public static String audioStreamStateToString(int state) {
84 return VehicleAudioStreamState.enumToString(state);
85 }
86
keunyounga74b9ca2015-10-21 13:33:58 -070087 public static final int VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG =
88 VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG;
89 public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG =
90 VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG;
91 public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG =
92 VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG;
93 public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG =
94 VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG;
95
keunyoungd32f4e62015-09-21 11:33:06 -070096 public static final int STREAM_NUM_DEFAULT = 0;
97
Keun-young Park1fdf91c2016-01-21 10:17:41 -080098 public static final int FOCUS_STATE_ARRAY_INDEX_STATE = 0;
99 public static final int FOCUS_STATE_ARRAY_INDEX_STREAMS = 1;
100 public static final int FOCUS_STATE_ARRAY_INDEX_EXTERNAL_FOCUS = 2;
101
Keun-young Park1488ef22016-02-25 14:00:54 -0800102 public static final int AUDIO_CONTEXT_MUSIC_FLAG =
103 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
104 public static final int AUDIO_CONTEXT_NAVIGATION_FLAG =
105 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG;
106 public static final int AUDIO_CONTEXT_VOICE_COMMAND_FLAG =
107 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG;
108 public static final int AUDIO_CONTEXT_CALL_FLAG =
109 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
110 public static final int AUDIO_CONTEXT_ALARM_FLAG =
111 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
112 public static final int AUDIO_CONTEXT_NOTIFICATION_FLAG =
113 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
114 public static final int AUDIO_CONTEXT_UNKNOWN_FLAG =
115 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
116 public static final int AUDIO_CONTEXT_SAFETY_ALERT_FLAG =
117 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG;
118 public static final int AUDIO_CONTEXT_CD_ROM =
119 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM;
120 public static final int AUDIO_CONTEXT_AUX_AUDIO =
121 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO;
122 public static final int AUDIO_CONTEXT_SYSTEM_SOUND =
123 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND;
124
keunyoungd32f4e62015-09-21 11:33:06 -0700125 public interface AudioHalListener {
keunyounga74b9ca2015-10-21 13:33:58 -0700126 /**
127 * Audio focus change from car.
128 * @param focusState
129 * @param streams
130 * @param externalFocus Flags of active external audio focus.
131 * 0 means no external audio focus.
132 */
133 void onFocusChange(int focusState, int streams, int externalFocus);
134 /**
135 * Audio volume change from car.
136 * @param streamNumber
137 * @param volume
138 * @param volumeState
139 */
keunyoung5c7cb262015-10-19 10:47:45 -0700140 void onVolumeChange(int streamNumber, int volume, int volumeState);
keunyounga74b9ca2015-10-21 13:33:58 -0700141 /**
142 * Volume limit change from car.
143 * @param streamNumber
144 * @param volume
145 */
146 void onVolumeLimitChange(int streamNumber, int volume);
147 /**
148 * Stream state change (start / stop) from android
149 * @param streamNumber
150 * @param state
151 */
keunyoung5c7cb262015-10-19 10:47:45 -0700152 void onStreamStatusChange(int streamNumber, int state);
keunyoungd32f4e62015-09-21 11:33:06 -0700153 }
154
155 private final VehicleHal mVehicleHal;
156 private AudioHalListener mListener;
keunyoung5c7cb262015-10-19 10:47:45 -0700157 private int mVariant;
158
159 private List<VehiclePropValue> mQueuedEvents;
keunyoungd32f4e62015-09-21 11:33:06 -0700160
keunyounga74b9ca2015-10-21 13:33:58 -0700161 private final HashMap<Integer, VehiclePropConfig> mProperties = new HashMap<>();
162
keunyoungd32f4e62015-09-21 11:33:06 -0700163 public AudioHalService(VehicleHal vehicleHal) {
164 mVehicleHal = vehicleHal;
165 }
166
keunyoung5c7cb262015-10-19 10:47:45 -0700167 public void setListener(AudioHalListener listener) {
168 List<VehiclePropValue> eventsToDispatch = null;
169 synchronized (this) {
170 mListener = listener;
171 if (mQueuedEvents != null) {
172 eventsToDispatch = mQueuedEvents;
173 mQueuedEvents = null;
174 }
175 }
176 if (eventsToDispatch != null) {
177 dispatchEventToListener(listener, eventsToDispatch);
178 }
179 }
180
181 public void setAudioRoutingPolicy(AudioRoutingPolicy policy) {
182 VehicleNetwork vn = mVehicleHal.getVehicleNetwork();
183 VehiclePropConfigs configs = vn.listProperties(
184 VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY);
185 if (configs == null) {
186 Log.w(CarLog.TAG_AUDIO,
187 "Vehicle HAL did not implement VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY");
188 return;
189 }
190 int[] policyToSet = new int[2];
191 for (int i = 0; i < policy.getPhysicalStreamsCount(); i++) {
192 policyToSet[VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM] =
193 i;
Keun-young Park1488ef22016-02-25 14:00:54 -0800194 int contexts = 0;
keunyoung5c7cb262015-10-19 10:47:45 -0700195 for (int logicalStream : policy.getLogicalStreamsForPhysicalStream(i)) {
Keun-young Park1488ef22016-02-25 14:00:54 -0800196 contexts |= logicalStreamToHalContextType(logicalStream);
keunyoung5c7cb262015-10-19 10:47:45 -0700197 }
198 policyToSet[VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS]
Keun-young Park1488ef22016-02-25 14:00:54 -0800199 = contexts;
keunyoung5c7cb262015-10-19 10:47:45 -0700200 vn.setIntVectorProperty(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
201 policyToSet);
202 }
203 }
204
Keun-young Park1488ef22016-02-25 14:00:54 -0800205 /**
206 * Convert car audio manager stream type (usage) into audio context type.
207 */
208 public static int logicalStreamToHalContextType(int logicalStream) {
keunyoung5c7cb262015-10-19 10:47:45 -0700209 switch (logicalStream) {
Keun-young Park1488ef22016-02-25 14:00:54 -0800210 //TODO enable when hal is ready
211 //case CarAudioManager.CAR_AUDIO_USAGE_RADIO:
212 // return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800213 case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
Keun-young Park0727f952015-12-21 14:30:07 -0800214 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800215 case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
Keun-young Park0727f952015-12-21 14:30:07 -0800216 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800217 case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
Keun-young Park0727f952015-12-21 14:30:07 -0800218 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800219 case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
Keun-young Park0727f952015-12-21 14:30:07 -0800220 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800221 case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
Keun-young Park0727f952015-12-21 14:30:07 -0800222 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800223 case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
Keun-young Park0727f952015-12-21 14:30:07 -0800224 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
Keun-young Park5672e852016-02-09 19:53:48 -0800225 case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
226 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG;
227 case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
228 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND;
229 case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
Keun-young Park0727f952015-12-21 14:30:07 -0800230 return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
keunyoung5c7cb262015-10-19 10:47:45 -0700231 default:
232 Log.w(CarLog.TAG_AUDIO, "Unknown logical stream:" + logicalStream);
233 return 0;
234 }
keunyoungd32f4e62015-09-21 11:33:06 -0700235 }
236
Keun-young Park1488ef22016-02-25 14:00:54 -0800237 public void requestAudioFocusChange(int request, int streams, int audioContexts) {
238 requestAudioFocusChange(request, streams, VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG, audioContexts);
keunyounga74b9ca2015-10-21 13:33:58 -0700239 }
240
Keun-young Park1488ef22016-02-25 14:00:54 -0800241 public void requestAudioFocusChange(int request, int streams, int extFocus, int audioContexts) {
242 int[] payload = { request, streams, extFocus, audioContexts };
keunyoungd32f4e62015-09-21 11:33:06 -0700243 mVehicleHal.getVehicleNetwork().setIntVectorProperty(
244 VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, payload);
245 }
246
keunyoung5c7cb262015-10-19 10:47:45 -0700247 public synchronized int getHwVariant() {
248 return mVariant;
249 }
250
keunyounga74b9ca2015-10-21 13:33:58 -0700251 public synchronized boolean isRadioExternal() {
252 VehiclePropConfig config = mProperties.get(
253 VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
254 if (config == null) {
255 return true;
256 }
Keun-young Park0727f952015-12-21 14:30:07 -0800257 return (config.getConfigArray(0) &
keunyounga74b9ca2015-10-21 13:33:58 -0700258 VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG)
259 == 0;
260 }
261
262 public synchronized boolean isFocusSupported() {
263 return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS);
264 }
265
Keun-young Park1fdf91c2016-01-21 10:17:41 -0800266 /**
267 * Get the current audio focus state.
268 * @return 0: focusState, 1: streams, 2: externalFocus
269 */
270 public int[] getCurrentFocusState() {
271 if (!isFocusSupported()) {
272 return new int[] { VEHICLE_AUDIO_FOCUS_STATE_GAIN, 0xffffffff, 0};
273 }
274 return mVehicleHal.getVehicleNetwork().getIntVectorProperty(
275 VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS);
276 }
277
keunyounga74b9ca2015-10-21 13:33:58 -0700278 private boolean isPropertySupportedLocked(int property) {
279 VehiclePropConfig config = mProperties.get(property);
280 return config != null;
281 }
282
keunyoungd32f4e62015-09-21 11:33:06 -0700283 @Override
284 public synchronized void init() {
keunyounga74b9ca2015-10-21 13:33:58 -0700285 for (VehiclePropConfig config : mProperties.values()) {
286 if (VehicleHal.isPropertySubscribable(config)) {
287 mVehicleHal.subscribeProperty(this, config.getProp(), 0);
keunyoung5c7cb262015-10-19 10:47:45 -0700288 }
289 }
290 try {
291 mVariant = mVehicleHal.getVehicleNetwork().getIntProperty(
292 VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
293 } catch (IllegalArgumentException e) {
294 // no variant. Set to default, 0.
295 mVariant = 0;
keunyoungd32f4e62015-09-21 11:33:06 -0700296 }
297 }
298
299 @Override
300 public synchronized void release() {
keunyounga74b9ca2015-10-21 13:33:58 -0700301 for (VehiclePropConfig config : mProperties.values()) {
302 if (VehicleHal.isPropertySubscribable(config)) {
303 mVehicleHal.unsubscribeProperty(this, config.getProp());
keunyoung5c7cb262015-10-19 10:47:45 -0700304 }
keunyoungd32f4e62015-09-21 11:33:06 -0700305 }
keunyounga74b9ca2015-10-21 13:33:58 -0700306 mProperties.clear();
keunyoungd32f4e62015-09-21 11:33:06 -0700307 }
308
309 @Override
310 public synchronized List<VehiclePropConfig> takeSupportedProperties(
311 List<VehiclePropConfig> allProperties) {
keunyoungd32f4e62015-09-21 11:33:06 -0700312 for (VehiclePropConfig p : allProperties) {
313 switch (p.getProp()) {
314 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS:
keunyoungd32f4e62015-09-21 11:33:06 -0700315 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME:
keunyoung5c7cb262015-10-19 10:47:45 -0700316 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT:
keunyoung5c7cb262015-10-19 10:47:45 -0700317 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT:
keunyoungd32f4e62015-09-21 11:33:06 -0700318 case VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE:
keunyounga74b9ca2015-10-21 13:33:58 -0700319 mProperties.put(p.getProp(), p);
keunyoungd32f4e62015-09-21 11:33:06 -0700320 break;
321 }
322 }
keunyounga74b9ca2015-10-21 13:33:58 -0700323 return new LinkedList<VehiclePropConfig>(mProperties.values());
keunyoungd32f4e62015-09-21 11:33:06 -0700324 }
325
326 @Override
327 public void handleHalEvents(List<VehiclePropValue> values) {
328 AudioHalListener listener = null;
329 synchronized (this) {
330 listener = mListener;
keunyoung5c7cb262015-10-19 10:47:45 -0700331 if (listener == null) {
332 if (mQueuedEvents == null) {
333 mQueuedEvents = new LinkedList<VehiclePropValue>();
334 }
335 mQueuedEvents.addAll(values);
336 }
keunyoungd32f4e62015-09-21 11:33:06 -0700337 }
keunyoung5c7cb262015-10-19 10:47:45 -0700338 if (listener != null) {
339 dispatchEventToListener(listener, values);
keunyoungd32f4e62015-09-21 11:33:06 -0700340 }
keunyoung5c7cb262015-10-19 10:47:45 -0700341 }
342
343 private void dispatchEventToListener(AudioHalListener listener, List<VehiclePropValue> values) {
keunyoungd32f4e62015-09-21 11:33:06 -0700344 for (VehiclePropValue v : values) {
345 switch (v.getProp()) {
346 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS: {
keunyounga74b9ca2015-10-21 13:33:58 -0700347 int focusState = v.getInt32Values(
348 VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
349 int streams = v.getInt32Values(
350 VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
351 int externalFocus = v.getInt32Values(
352 VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
353 listener.onFocusChange(focusState, streams, externalFocus);
keunyoungd32f4e62015-09-21 11:33:06 -0700354 } break;
355 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME: {
keunyounga74b9ca2015-10-21 13:33:58 -0700356 int volume = v.getInt32Values(
357 VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_VOLUME);
358 int streamNum = v.getInt32Values(
359 VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
360 int volumeState = v.getInt32Values(
361 VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STATE);
keunyoung5c7cb262015-10-19 10:47:45 -0700362 listener.onVolumeChange(streamNum, volume, volumeState);
363 } break;
364 case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: {
365 //TODO
keunyoungd32f4e62015-09-21 11:33:06 -0700366 } break;
367 case VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: {
keunyounga74b9ca2015-10-21 13:33:58 -0700368 int state = v.getInt32Values(
369 VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE);
370 int streamNum = v.getInt32Values(
371 VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM);
keunyoung5c7cb262015-10-19 10:47:45 -0700372 listener.onStreamStatusChange(streamNum, state);
keunyoungd32f4e62015-09-21 11:33:06 -0700373 } break;
374 }
375 }
376 }
377
378 @Override
379 public void dump(PrintWriter writer) {
keunyoung5c7cb262015-10-19 10:47:45 -0700380 writer.println("*Audio HAL*");
381 writer.println(" audio H/W variant:" + mVariant);
keunyounga74b9ca2015-10-21 13:33:58 -0700382 writer.println(" Supported properties");
383 VehicleHal.dumpProperties(writer, mProperties.values());
keunyoungd32f4e62015-09-21 11:33:06 -0700384 }
385
386}