1 /* 2 * Copyright (C) 2006 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 17 package android.media; 18 19 import android.annotation.NonNull; 20 import android.content.Context; 21 import android.content.pm.PackageManager; 22 import android.media.audiopolicy.AudioMix; 23 import android.util.Log; 24 25 import java.util.ArrayList; 26 import java.util.Map; 27 28 /* IF YOU CHANGE ANY OF THE CONSTANTS IN THIS FILE, DO NOT FORGET 29 * TO UPDATE THE CORRESPONDING NATIVE GLUE AND AudioManager.java. 30 * THANK YOU FOR YOUR COOPERATION. 31 */ 32 33 /** 34 * @hide 35 */ 36 public class AudioSystem 37 { 38 private static final String TAG = "AudioSystem"; 39 /* These values must be kept in sync with system/audio.h */ 40 /* 41 * If these are modified, please also update Settings.System.VOLUME_SETTINGS 42 * and attrs.xml and AudioManager.java. 43 */ 44 /** Used to identify the default audio stream volume */ 45 public static final int STREAM_DEFAULT = -1; 46 /** Used to identify the volume of audio streams for phone calls */ 47 public static final int STREAM_VOICE_CALL = 0; 48 /** Used to identify the volume of audio streams for system sounds */ 49 public static final int STREAM_SYSTEM = 1; 50 /** Used to identify the volume of audio streams for the phone ring and message alerts */ 51 public static final int STREAM_RING = 2; 52 /** Used to identify the volume of audio streams for music playback */ 53 public static final int STREAM_MUSIC = 3; 54 /** Used to identify the volume of audio streams for alarms */ 55 public static final int STREAM_ALARM = 4; 56 /** Used to identify the volume of audio streams for notifications */ 57 public static final int STREAM_NOTIFICATION = 5; 58 /** Used to identify the volume of audio streams for phone calls when connected on bluetooth */ 59 public static final int STREAM_BLUETOOTH_SCO = 6; 60 /** Used to identify the volume of audio streams for enforced system sounds in certain 61 * countries (e.g camera in Japan) */ 62 public static final int STREAM_SYSTEM_ENFORCED = 7; 63 /** Used to identify the volume of audio streams for DTMF tones */ 64 public static final int STREAM_DTMF = 8; 65 /** Used to identify the volume of audio streams exclusively transmitted through the 66 * speaker (TTS) of the device */ 67 public static final int STREAM_TTS = 9; 68 /** Used to identify the volume of audio streams for accessibility prompts */ 69 public static final int STREAM_ACCESSIBILITY = 10; 70 /** 71 * @deprecated Use {@link #numStreamTypes() instead} 72 */ 73 public static final int NUM_STREAMS = 5; 74 75 // Expose only the getter method publicly so we can change it in the future 76 private static final int NUM_STREAM_TYPES = 11; getNumStreamTypes()77 public static final int getNumStreamTypes() { return NUM_STREAM_TYPES; } 78 79 public static final String[] STREAM_NAMES = new String[] { 80 "STREAM_VOICE_CALL", 81 "STREAM_SYSTEM", 82 "STREAM_RING", 83 "STREAM_MUSIC", 84 "STREAM_ALARM", 85 "STREAM_NOTIFICATION", 86 "STREAM_BLUETOOTH_SCO", 87 "STREAM_SYSTEM_ENFORCED", 88 "STREAM_DTMF", 89 "STREAM_TTS", 90 "STREAM_ACCESSIBILITY" 91 }; 92 93 /* 94 * Sets the microphone mute on or off. 95 * 96 * @param on set <var>true</var> to mute the microphone; 97 * <var>false</var> to turn mute off 98 * @return command completion status see AUDIO_STATUS_OK, see AUDIO_STATUS_ERROR 99 */ muteMicrophone(boolean on)100 public static native int muteMicrophone(boolean on); 101 102 /* 103 * Checks whether the microphone mute is on or off. 104 * 105 * @return true if microphone is muted, false if it's not 106 */ isMicrophoneMuted()107 public static native boolean isMicrophoneMuted(); 108 109 /* modes for setPhoneState, must match AudioSystem.h audio_mode */ 110 public static final int MODE_INVALID = -2; 111 public static final int MODE_CURRENT = -1; 112 public static final int MODE_NORMAL = 0; 113 public static final int MODE_RINGTONE = 1; 114 public static final int MODE_IN_CALL = 2; 115 public static final int MODE_IN_COMMUNICATION = 3; 116 public static final int NUM_MODES = 4; 117 modeToString(int mode)118 public static String modeToString(int mode) { 119 switch (mode) { 120 case MODE_CURRENT: return "MODE_CURRENT"; 121 case MODE_IN_CALL: return "MODE_IN_CALL"; 122 case MODE_IN_COMMUNICATION: return "MODE_IN_COMMUNICATION"; 123 case MODE_INVALID: return "MODE_INVALID"; 124 case MODE_NORMAL: return "MODE_NORMAL"; 125 case MODE_RINGTONE: return "MODE_RINGTONE"; 126 default: return "unknown mode (" + mode + ")"; 127 } 128 } 129 130 /* Routing bits for the former setRouting/getRouting API */ 131 /** @deprecated */ 132 @Deprecated public static final int ROUTE_EARPIECE = (1 << 0); 133 /** @deprecated */ 134 @Deprecated public static final int ROUTE_SPEAKER = (1 << 1); 135 /** @deprecated use {@link #ROUTE_BLUETOOTH_SCO} */ 136 @Deprecated public static final int ROUTE_BLUETOOTH = (1 << 2); 137 /** @deprecated */ 138 @Deprecated public static final int ROUTE_BLUETOOTH_SCO = (1 << 2); 139 /** @deprecated */ 140 @Deprecated public static final int ROUTE_HEADSET = (1 << 3); 141 /** @deprecated */ 142 @Deprecated public static final int ROUTE_BLUETOOTH_A2DP = (1 << 4); 143 /** @deprecated */ 144 @Deprecated public static final int ROUTE_ALL = 0xFFFFFFFF; 145 146 // Keep in sync with system/media/audio/include/system/audio.h 147 public static final int AUDIO_SESSION_ALLOCATE = 0; 148 149 /* 150 * Checks whether the specified stream type is active. 151 * 152 * return true if any track playing on this stream is active. 153 */ isStreamActive(int stream, int inPastMs)154 public static native boolean isStreamActive(int stream, int inPastMs); 155 156 /* 157 * Checks whether the specified stream type is active on a remotely connected device. The notion 158 * of what constitutes a remote device is enforced by the audio policy manager of the platform. 159 * 160 * return true if any track playing on this stream is active on a remote device. 161 */ isStreamActiveRemotely(int stream, int inPastMs)162 public static native boolean isStreamActiveRemotely(int stream, int inPastMs); 163 164 /* 165 * Checks whether the specified audio source is active. 166 * 167 * return true if any recorder using this source is currently recording 168 */ isSourceActive(int source)169 public static native boolean isSourceActive(int source); 170 171 /* 172 * Returns a new unused audio session ID 173 */ newAudioSessionId()174 public static native int newAudioSessionId(); 175 176 /* 177 * Returns a new unused audio player ID 178 */ newAudioPlayerId()179 public static native int newAudioPlayerId(); 180 181 182 /* 183 * Sets a group generic audio configuration parameters. The use of these parameters 184 * are platform dependent, see libaudio 185 * 186 * param keyValuePairs list of parameters key value pairs in the form: 187 * key1=value1;key2=value2;... 188 */ setParameters(String keyValuePairs)189 public static native int setParameters(String keyValuePairs); 190 191 /* 192 * Gets a group generic audio configuration parameters. The use of these parameters 193 * are platform dependent, see libaudio 194 * 195 * param keys list of parameters 196 * return value: list of parameters key value pairs in the form: 197 * key1=value1;key2=value2;... 198 */ getParameters(String keys)199 public static native String getParameters(String keys); 200 201 // These match the enum AudioError in frameworks/base/core/jni/android_media_AudioSystem.cpp 202 /* Command sucessful or Media server restarted. see ErrorCallback */ 203 public static final int AUDIO_STATUS_OK = 0; 204 /* Command failed or unspecified audio error. see ErrorCallback */ 205 public static final int AUDIO_STATUS_ERROR = 1; 206 /* Media server died. see ErrorCallback */ 207 public static final int AUDIO_STATUS_SERVER_DIED = 100; 208 209 private static ErrorCallback mErrorCallback; 210 211 /* 212 * Handles the audio error callback. 213 */ 214 public interface ErrorCallback 215 { 216 /* 217 * Callback for audio server errors. 218 * param error error code: 219 * - AUDIO_STATUS_OK 220 * - AUDIO_STATUS_SERVER_DIED 221 * - AUDIO_STATUS_ERROR 222 */ onError(int error)223 void onError(int error); 224 }; 225 226 /* 227 * Registers a callback to be invoked when an error occurs. 228 * @param cb the callback to run 229 */ setErrorCallback(ErrorCallback cb)230 public static void setErrorCallback(ErrorCallback cb) 231 { 232 synchronized (AudioSystem.class) { 233 mErrorCallback = cb; 234 if (cb != null) { 235 cb.onError(checkAudioFlinger()); 236 } 237 } 238 } 239 errorCallbackFromNative(int error)240 private static void errorCallbackFromNative(int error) 241 { 242 ErrorCallback errorCallback = null; 243 synchronized (AudioSystem.class) { 244 if (mErrorCallback != null) { 245 errorCallback = mErrorCallback; 246 } 247 } 248 if (errorCallback != null) { 249 errorCallback.onError(error); 250 } 251 } 252 253 /** 254 * Handles events from the audio policy manager about dynamic audio policies 255 * @see android.media.audiopolicy.AudioPolicy 256 */ 257 public interface DynamicPolicyCallback 258 { onDynamicPolicyMixStateUpdate(String regId, int state)259 void onDynamicPolicyMixStateUpdate(String regId, int state); 260 } 261 262 //keep in sync with include/media/AudioPolicy.h 263 private final static int DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE = 0; 264 265 private static DynamicPolicyCallback sDynPolicyCallback; 266 setDynamicPolicyCallback(DynamicPolicyCallback cb)267 public static void setDynamicPolicyCallback(DynamicPolicyCallback cb) 268 { 269 synchronized (AudioSystem.class) { 270 sDynPolicyCallback = cb; 271 native_register_dynamic_policy_callback(); 272 } 273 } 274 dynamicPolicyCallbackFromNative(int event, String regId, int val)275 private static void dynamicPolicyCallbackFromNative(int event, String regId, int val) 276 { 277 DynamicPolicyCallback cb = null; 278 synchronized (AudioSystem.class) { 279 if (sDynPolicyCallback != null) { 280 cb = sDynPolicyCallback; 281 } 282 } 283 if (cb != null) { 284 switch(event) { 285 case DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE: 286 cb.onDynamicPolicyMixStateUpdate(regId, val); 287 break; 288 default: 289 Log.e(TAG, "dynamicPolicyCallbackFromNative: unknown event " + event); 290 } 291 } 292 } 293 294 /** 295 * Handles events from the audio policy manager about recording events 296 * @see android.media.AudioManager.AudioRecordingCallback 297 */ 298 public interface AudioRecordingCallback 299 { 300 /** 301 * Callback for recording activity notifications events 302 * @param event 303 * @param uid uid of the client app performing the recording 304 * @param session 305 * @param source 306 * @param recordingFormat an array of ints containing respectively the client and device 307 * recording configurations (2*3 ints), followed by the patch handle: 308 * index 0: client format 309 * 1: client channel mask 310 * 2: client sample rate 311 * 3: device format 312 * 4: device channel mask 313 * 5: device sample rate 314 * 6: patch handle 315 * @param packName package name of the client app performing the recording. NOT SUPPORTED 316 */ onRecordingConfigurationChanged(int event, int uid, int session, int source, int[] recordingFormat, String packName)317 void onRecordingConfigurationChanged(int event, int uid, int session, int source, 318 int[] recordingFormat, String packName); 319 } 320 321 private static AudioRecordingCallback sRecordingCallback; 322 setRecordingCallback(AudioRecordingCallback cb)323 public static void setRecordingCallback(AudioRecordingCallback cb) { 324 synchronized (AudioSystem.class) { 325 sRecordingCallback = cb; 326 native_register_recording_callback(); 327 } 328 } 329 330 /** 331 * Callback from native for recording configuration updates. 332 * @param event 333 * @param session 334 * @param source 335 * @param recordingFormat see 336 * {@link AudioRecordingCallback#onRecordingConfigurationChanged(int, int, int, int, int[])} 337 * for the description of the record format. 338 */ recordingCallbackFromNative(int event, int uid, int session, int source, int[] recordingFormat)339 private static void recordingCallbackFromNative(int event, int uid, int session, int source, 340 int[] recordingFormat) { 341 AudioRecordingCallback cb = null; 342 synchronized (AudioSystem.class) { 343 cb = sRecordingCallback; 344 } 345 if (cb != null) { 346 // TODO receive package name from native 347 cb.onRecordingConfigurationChanged(event, uid, session, source, recordingFormat, ""); 348 } 349 } 350 351 /* 352 * Error codes used by public APIs (AudioTrack, AudioRecord, AudioManager ...) 353 * Must be kept in sync with frameworks/base/core/jni/android_media_AudioErrors.h 354 */ 355 public static final int SUCCESS = 0; 356 public static final int ERROR = -1; 357 public static final int BAD_VALUE = -2; 358 public static final int INVALID_OPERATION = -3; 359 public static final int PERMISSION_DENIED = -4; 360 public static final int NO_INIT = -5; 361 public static final int DEAD_OBJECT = -6; 362 public static final int WOULD_BLOCK = -7; 363 364 /* 365 * AudioPolicyService methods 366 */ 367 368 // 369 // audio device definitions: must be kept in sync with values in system/core/audio.h 370 // 371 372 public static final int DEVICE_NONE = 0x0; 373 // reserved bits 374 public static final int DEVICE_BIT_IN = 0x80000000; 375 public static final int DEVICE_BIT_DEFAULT = 0x40000000; 376 // output devices, be sure to update AudioManager.java also 377 public static final int DEVICE_OUT_EARPIECE = 0x1; 378 public static final int DEVICE_OUT_SPEAKER = 0x2; 379 public static final int DEVICE_OUT_WIRED_HEADSET = 0x4; 380 public static final int DEVICE_OUT_WIRED_HEADPHONE = 0x8; 381 public static final int DEVICE_OUT_BLUETOOTH_SCO = 0x10; 382 public static final int DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20; 383 public static final int DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40; 384 public static final int DEVICE_OUT_BLUETOOTH_A2DP = 0x80; 385 public static final int DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100; 386 public static final int DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200; 387 public static final int DEVICE_OUT_AUX_DIGITAL = 0x400; 388 public static final int DEVICE_OUT_HDMI = DEVICE_OUT_AUX_DIGITAL; 389 public static final int DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800; 390 public static final int DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000; 391 public static final int DEVICE_OUT_USB_ACCESSORY = 0x2000; 392 public static final int DEVICE_OUT_USB_DEVICE = 0x4000; 393 public static final int DEVICE_OUT_REMOTE_SUBMIX = 0x8000; 394 public static final int DEVICE_OUT_TELEPHONY_TX = 0x10000; 395 public static final int DEVICE_OUT_LINE = 0x20000; 396 public static final int DEVICE_OUT_HDMI_ARC = 0x40000; 397 public static final int DEVICE_OUT_SPDIF = 0x80000; 398 public static final int DEVICE_OUT_FM = 0x100000; 399 public static final int DEVICE_OUT_AUX_LINE = 0x200000; 400 public static final int DEVICE_OUT_SPEAKER_SAFE = 0x400000; 401 public static final int DEVICE_OUT_IP = 0x800000; 402 public static final int DEVICE_OUT_BUS = 0x1000000; 403 public static final int DEVICE_OUT_PROXY = 0x2000000; 404 public static final int DEVICE_OUT_USB_HEADSET = 0x4000000; 405 public static final int DEVICE_OUT_HEARING_AID = 0x8000000; 406 407 public static final int DEVICE_OUT_DEFAULT = DEVICE_BIT_DEFAULT; 408 409 public static final int DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE | 410 DEVICE_OUT_SPEAKER | 411 DEVICE_OUT_WIRED_HEADSET | 412 DEVICE_OUT_WIRED_HEADPHONE | 413 DEVICE_OUT_BLUETOOTH_SCO | 414 DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 415 DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 416 DEVICE_OUT_BLUETOOTH_A2DP | 417 DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 418 DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 419 DEVICE_OUT_HDMI | 420 DEVICE_OUT_ANLG_DOCK_HEADSET | 421 DEVICE_OUT_DGTL_DOCK_HEADSET | 422 DEVICE_OUT_USB_ACCESSORY | 423 DEVICE_OUT_USB_DEVICE | 424 DEVICE_OUT_REMOTE_SUBMIX | 425 DEVICE_OUT_TELEPHONY_TX | 426 DEVICE_OUT_LINE | 427 DEVICE_OUT_HDMI_ARC | 428 DEVICE_OUT_SPDIF | 429 DEVICE_OUT_FM | 430 DEVICE_OUT_AUX_LINE | 431 DEVICE_OUT_SPEAKER_SAFE | 432 DEVICE_OUT_IP | 433 DEVICE_OUT_BUS | 434 DEVICE_OUT_PROXY | 435 DEVICE_OUT_USB_HEADSET | 436 DEVICE_OUT_HEARING_AID | 437 DEVICE_OUT_DEFAULT); 438 public static final int DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP | 439 DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 440 DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER); 441 public static final int DEVICE_OUT_ALL_SCO = (DEVICE_OUT_BLUETOOTH_SCO | 442 DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 443 DEVICE_OUT_BLUETOOTH_SCO_CARKIT); 444 public static final int DEVICE_OUT_ALL_USB = (DEVICE_OUT_USB_ACCESSORY | 445 DEVICE_OUT_USB_DEVICE | 446 DEVICE_OUT_USB_HEADSET); 447 public static final int DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO = (DEVICE_OUT_AUX_LINE | 448 DEVICE_OUT_HDMI_ARC | 449 DEVICE_OUT_SPDIF); 450 public static final int DEVICE_ALL_HDMI_SYSTEM_AUDIO_AND_SPEAKER = 451 (DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO | 452 DEVICE_OUT_SPEAKER); 453 454 // input devices 455 public static final int DEVICE_IN_COMMUNICATION = DEVICE_BIT_IN | 0x1; 456 public static final int DEVICE_IN_AMBIENT = DEVICE_BIT_IN | 0x2; 457 public static final int DEVICE_IN_BUILTIN_MIC = DEVICE_BIT_IN | 0x4; 458 public static final int DEVICE_IN_BLUETOOTH_SCO_HEADSET = DEVICE_BIT_IN | 0x8; 459 public static final int DEVICE_IN_WIRED_HEADSET = DEVICE_BIT_IN | 0x10; 460 public static final int DEVICE_IN_AUX_DIGITAL = DEVICE_BIT_IN | 0x20; 461 public static final int DEVICE_IN_HDMI = DEVICE_IN_AUX_DIGITAL; 462 public static final int DEVICE_IN_VOICE_CALL = DEVICE_BIT_IN | 0x40; 463 public static final int DEVICE_IN_TELEPHONY_RX = DEVICE_IN_VOICE_CALL; 464 public static final int DEVICE_IN_BACK_MIC = DEVICE_BIT_IN | 0x80; 465 public static final int DEVICE_IN_REMOTE_SUBMIX = DEVICE_BIT_IN | 0x100; 466 public static final int DEVICE_IN_ANLG_DOCK_HEADSET = DEVICE_BIT_IN | 0x200; 467 public static final int DEVICE_IN_DGTL_DOCK_HEADSET = DEVICE_BIT_IN | 0x400; 468 public static final int DEVICE_IN_USB_ACCESSORY = DEVICE_BIT_IN | 0x800; 469 public static final int DEVICE_IN_USB_DEVICE = DEVICE_BIT_IN | 0x1000; 470 public static final int DEVICE_IN_FM_TUNER = DEVICE_BIT_IN | 0x2000; 471 public static final int DEVICE_IN_TV_TUNER = DEVICE_BIT_IN | 0x4000; 472 public static final int DEVICE_IN_LINE = DEVICE_BIT_IN | 0x8000; 473 public static final int DEVICE_IN_SPDIF = DEVICE_BIT_IN | 0x10000; 474 public static final int DEVICE_IN_BLUETOOTH_A2DP = DEVICE_BIT_IN | 0x20000; 475 public static final int DEVICE_IN_LOOPBACK = DEVICE_BIT_IN | 0x40000; 476 public static final int DEVICE_IN_IP = DEVICE_BIT_IN | 0x80000; 477 public static final int DEVICE_IN_BUS = DEVICE_BIT_IN | 0x100000; 478 public static final int DEVICE_IN_PROXY = DEVICE_BIT_IN | 0x1000000; 479 public static final int DEVICE_IN_USB_HEADSET = DEVICE_BIT_IN | 0x2000000; 480 public static final int DEVICE_IN_DEFAULT = DEVICE_BIT_IN | DEVICE_BIT_DEFAULT; 481 482 public static final int DEVICE_IN_ALL = (DEVICE_IN_COMMUNICATION | 483 DEVICE_IN_AMBIENT | 484 DEVICE_IN_BUILTIN_MIC | 485 DEVICE_IN_BLUETOOTH_SCO_HEADSET | 486 DEVICE_IN_WIRED_HEADSET | 487 DEVICE_IN_HDMI | 488 DEVICE_IN_TELEPHONY_RX | 489 DEVICE_IN_BACK_MIC | 490 DEVICE_IN_REMOTE_SUBMIX | 491 DEVICE_IN_ANLG_DOCK_HEADSET | 492 DEVICE_IN_DGTL_DOCK_HEADSET | 493 DEVICE_IN_USB_ACCESSORY | 494 DEVICE_IN_USB_DEVICE | 495 DEVICE_IN_FM_TUNER | 496 DEVICE_IN_TV_TUNER | 497 DEVICE_IN_LINE | 498 DEVICE_IN_SPDIF | 499 DEVICE_IN_BLUETOOTH_A2DP | 500 DEVICE_IN_LOOPBACK | 501 DEVICE_IN_IP | 502 DEVICE_IN_BUS | 503 DEVICE_IN_PROXY | 504 DEVICE_IN_USB_HEADSET | 505 DEVICE_IN_DEFAULT); 506 public static final int DEVICE_IN_ALL_SCO = DEVICE_IN_BLUETOOTH_SCO_HEADSET; 507 public static final int DEVICE_IN_ALL_USB = (DEVICE_IN_USB_ACCESSORY | 508 DEVICE_IN_USB_DEVICE | 509 DEVICE_IN_USB_HEADSET); 510 511 // device states, must match AudioSystem::device_connection_state 512 public static final int DEVICE_STATE_UNAVAILABLE = 0; 513 public static final int DEVICE_STATE_AVAILABLE = 1; 514 private static final int NUM_DEVICE_STATES = 1; 515 deviceStateToString(int state)516 public static String deviceStateToString(int state) { 517 switch (state) { 518 case DEVICE_STATE_UNAVAILABLE: return "DEVICE_STATE_UNAVAILABLE"; 519 case DEVICE_STATE_AVAILABLE: return "DEVICE_STATE_AVAILABLE"; 520 default: return "unknown state (" + state + ")"; 521 } 522 } 523 524 public static final String DEVICE_OUT_EARPIECE_NAME = "earpiece"; 525 public static final String DEVICE_OUT_SPEAKER_NAME = "speaker"; 526 public static final String DEVICE_OUT_WIRED_HEADSET_NAME = "headset"; 527 public static final String DEVICE_OUT_WIRED_HEADPHONE_NAME = "headphone"; 528 public static final String DEVICE_OUT_BLUETOOTH_SCO_NAME = "bt_sco"; 529 public static final String DEVICE_OUT_BLUETOOTH_SCO_HEADSET_NAME = "bt_sco_hs"; 530 public static final String DEVICE_OUT_BLUETOOTH_SCO_CARKIT_NAME = "bt_sco_carkit"; 531 public static final String DEVICE_OUT_BLUETOOTH_A2DP_NAME = "bt_a2dp"; 532 public static final String DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES_NAME = "bt_a2dp_hp"; 533 public static final String DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER_NAME = "bt_a2dp_spk"; 534 public static final String DEVICE_OUT_AUX_DIGITAL_NAME = "aux_digital"; 535 public static final String DEVICE_OUT_HDMI_NAME = "hdmi"; 536 public static final String DEVICE_OUT_ANLG_DOCK_HEADSET_NAME = "analog_dock"; 537 public static final String DEVICE_OUT_DGTL_DOCK_HEADSET_NAME = "digital_dock"; 538 public static final String DEVICE_OUT_USB_ACCESSORY_NAME = "usb_accessory"; 539 public static final String DEVICE_OUT_USB_DEVICE_NAME = "usb_device"; 540 public static final String DEVICE_OUT_REMOTE_SUBMIX_NAME = "remote_submix"; 541 public static final String DEVICE_OUT_TELEPHONY_TX_NAME = "telephony_tx"; 542 public static final String DEVICE_OUT_LINE_NAME = "line"; 543 public static final String DEVICE_OUT_HDMI_ARC_NAME = "hmdi_arc"; 544 public static final String DEVICE_OUT_SPDIF_NAME = "spdif"; 545 public static final String DEVICE_OUT_FM_NAME = "fm_transmitter"; 546 public static final String DEVICE_OUT_AUX_LINE_NAME = "aux_line"; 547 public static final String DEVICE_OUT_SPEAKER_SAFE_NAME = "speaker_safe"; 548 public static final String DEVICE_OUT_IP_NAME = "ip"; 549 public static final String DEVICE_OUT_BUS_NAME = "bus"; 550 public static final String DEVICE_OUT_PROXY_NAME = "proxy"; 551 public static final String DEVICE_OUT_USB_HEADSET_NAME = "usb_headset"; 552 public static final String DEVICE_OUT_HEARING_AID_NAME = "hearing_aid_out"; 553 554 public static final String DEVICE_IN_COMMUNICATION_NAME = "communication"; 555 public static final String DEVICE_IN_AMBIENT_NAME = "ambient"; 556 public static final String DEVICE_IN_BUILTIN_MIC_NAME = "mic"; 557 public static final String DEVICE_IN_BLUETOOTH_SCO_HEADSET_NAME = "bt_sco_hs"; 558 public static final String DEVICE_IN_WIRED_HEADSET_NAME = "headset"; 559 public static final String DEVICE_IN_AUX_DIGITAL_NAME = "aux_digital"; 560 public static final String DEVICE_IN_TELEPHONY_RX_NAME = "telephony_rx"; 561 public static final String DEVICE_IN_BACK_MIC_NAME = "back_mic"; 562 public static final String DEVICE_IN_REMOTE_SUBMIX_NAME = "remote_submix"; 563 public static final String DEVICE_IN_ANLG_DOCK_HEADSET_NAME = "analog_dock"; 564 public static final String DEVICE_IN_DGTL_DOCK_HEADSET_NAME = "digital_dock"; 565 public static final String DEVICE_IN_USB_ACCESSORY_NAME = "usb_accessory"; 566 public static final String DEVICE_IN_USB_DEVICE_NAME = "usb_device"; 567 public static final String DEVICE_IN_FM_TUNER_NAME = "fm_tuner"; 568 public static final String DEVICE_IN_TV_TUNER_NAME = "tv_tuner"; 569 public static final String DEVICE_IN_LINE_NAME = "line"; 570 public static final String DEVICE_IN_SPDIF_NAME = "spdif"; 571 public static final String DEVICE_IN_BLUETOOTH_A2DP_NAME = "bt_a2dp"; 572 public static final String DEVICE_IN_LOOPBACK_NAME = "loopback"; 573 public static final String DEVICE_IN_IP_NAME = "ip"; 574 public static final String DEVICE_IN_BUS_NAME = "bus"; 575 public static final String DEVICE_IN_PROXY_NAME = "proxy"; 576 public static final String DEVICE_IN_USB_HEADSET_NAME = "usb_headset"; 577 getOutputDeviceName(int device)578 public static String getOutputDeviceName(int device) 579 { 580 switch(device) { 581 case DEVICE_OUT_EARPIECE: 582 return DEVICE_OUT_EARPIECE_NAME; 583 case DEVICE_OUT_SPEAKER: 584 return DEVICE_OUT_SPEAKER_NAME; 585 case DEVICE_OUT_WIRED_HEADSET: 586 return DEVICE_OUT_WIRED_HEADSET_NAME; 587 case DEVICE_OUT_WIRED_HEADPHONE: 588 return DEVICE_OUT_WIRED_HEADPHONE_NAME; 589 case DEVICE_OUT_BLUETOOTH_SCO: 590 return DEVICE_OUT_BLUETOOTH_SCO_NAME; 591 case DEVICE_OUT_BLUETOOTH_SCO_HEADSET: 592 return DEVICE_OUT_BLUETOOTH_SCO_HEADSET_NAME; 593 case DEVICE_OUT_BLUETOOTH_SCO_CARKIT: 594 return DEVICE_OUT_BLUETOOTH_SCO_CARKIT_NAME; 595 case DEVICE_OUT_BLUETOOTH_A2DP: 596 return DEVICE_OUT_BLUETOOTH_A2DP_NAME; 597 case DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES: 598 return DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES_NAME; 599 case DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER: 600 return DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER_NAME; 601 case DEVICE_OUT_HDMI: 602 return DEVICE_OUT_HDMI_NAME; 603 case DEVICE_OUT_ANLG_DOCK_HEADSET: 604 return DEVICE_OUT_ANLG_DOCK_HEADSET_NAME; 605 case DEVICE_OUT_DGTL_DOCK_HEADSET: 606 return DEVICE_OUT_DGTL_DOCK_HEADSET_NAME; 607 case DEVICE_OUT_USB_ACCESSORY: 608 return DEVICE_OUT_USB_ACCESSORY_NAME; 609 case DEVICE_OUT_USB_DEVICE: 610 return DEVICE_OUT_USB_DEVICE_NAME; 611 case DEVICE_OUT_REMOTE_SUBMIX: 612 return DEVICE_OUT_REMOTE_SUBMIX_NAME; 613 case DEVICE_OUT_TELEPHONY_TX: 614 return DEVICE_OUT_TELEPHONY_TX_NAME; 615 case DEVICE_OUT_LINE: 616 return DEVICE_OUT_LINE_NAME; 617 case DEVICE_OUT_HDMI_ARC: 618 return DEVICE_OUT_HDMI_ARC_NAME; 619 case DEVICE_OUT_SPDIF: 620 return DEVICE_OUT_SPDIF_NAME; 621 case DEVICE_OUT_FM: 622 return DEVICE_OUT_FM_NAME; 623 case DEVICE_OUT_AUX_LINE: 624 return DEVICE_OUT_AUX_LINE_NAME; 625 case DEVICE_OUT_SPEAKER_SAFE: 626 return DEVICE_OUT_SPEAKER_SAFE_NAME; 627 case DEVICE_OUT_IP: 628 return DEVICE_OUT_IP_NAME; 629 case DEVICE_OUT_BUS: 630 return DEVICE_OUT_BUS_NAME; 631 case DEVICE_OUT_PROXY: 632 return DEVICE_OUT_PROXY_NAME; 633 case DEVICE_OUT_USB_HEADSET: 634 return DEVICE_OUT_USB_HEADSET_NAME; 635 case DEVICE_OUT_HEARING_AID: 636 return DEVICE_OUT_HEARING_AID_NAME; 637 case DEVICE_OUT_DEFAULT: 638 default: 639 return Integer.toString(device); 640 } 641 } 642 getInputDeviceName(int device)643 public static String getInputDeviceName(int device) 644 { 645 switch(device) { 646 case DEVICE_IN_COMMUNICATION: 647 return DEVICE_IN_COMMUNICATION_NAME; 648 case DEVICE_IN_AMBIENT: 649 return DEVICE_IN_AMBIENT_NAME; 650 case DEVICE_IN_BUILTIN_MIC: 651 return DEVICE_IN_BUILTIN_MIC_NAME; 652 case DEVICE_IN_BLUETOOTH_SCO_HEADSET: 653 return DEVICE_IN_BLUETOOTH_SCO_HEADSET_NAME; 654 case DEVICE_IN_WIRED_HEADSET: 655 return DEVICE_IN_WIRED_HEADSET_NAME; 656 case DEVICE_IN_AUX_DIGITAL: 657 return DEVICE_IN_AUX_DIGITAL_NAME; 658 case DEVICE_IN_TELEPHONY_RX: 659 return DEVICE_IN_TELEPHONY_RX_NAME; 660 case DEVICE_IN_BACK_MIC: 661 return DEVICE_IN_BACK_MIC_NAME; 662 case DEVICE_IN_REMOTE_SUBMIX: 663 return DEVICE_IN_REMOTE_SUBMIX_NAME; 664 case DEVICE_IN_ANLG_DOCK_HEADSET: 665 return DEVICE_IN_ANLG_DOCK_HEADSET_NAME; 666 case DEVICE_IN_DGTL_DOCK_HEADSET: 667 return DEVICE_IN_DGTL_DOCK_HEADSET_NAME; 668 case DEVICE_IN_USB_ACCESSORY: 669 return DEVICE_IN_USB_ACCESSORY_NAME; 670 case DEVICE_IN_USB_DEVICE: 671 return DEVICE_IN_USB_DEVICE_NAME; 672 case DEVICE_IN_FM_TUNER: 673 return DEVICE_IN_FM_TUNER_NAME; 674 case DEVICE_IN_TV_TUNER: 675 return DEVICE_IN_TV_TUNER_NAME; 676 case DEVICE_IN_LINE: 677 return DEVICE_IN_LINE_NAME; 678 case DEVICE_IN_SPDIF: 679 return DEVICE_IN_SPDIF_NAME; 680 case DEVICE_IN_BLUETOOTH_A2DP: 681 return DEVICE_IN_BLUETOOTH_A2DP_NAME; 682 case DEVICE_IN_LOOPBACK: 683 return DEVICE_IN_LOOPBACK_NAME; 684 case DEVICE_IN_IP: 685 return DEVICE_IN_IP_NAME; 686 case DEVICE_IN_BUS: 687 return DEVICE_IN_BUS_NAME; 688 case DEVICE_IN_PROXY: 689 return DEVICE_IN_PROXY_NAME; 690 case DEVICE_IN_USB_HEADSET: 691 return DEVICE_IN_USB_HEADSET_NAME; 692 case DEVICE_IN_DEFAULT: 693 default: 694 return Integer.toString(device); 695 } 696 } 697 698 // phone state, match audio_mode??? 699 public static final int PHONE_STATE_OFFCALL = 0; 700 public static final int PHONE_STATE_RINGING = 1; 701 public static final int PHONE_STATE_INCALL = 2; 702 703 // device categories config for setForceUse, must match audio_policy_forced_cfg_t 704 public static final int FORCE_NONE = 0; 705 public static final int FORCE_SPEAKER = 1; 706 public static final int FORCE_HEADPHONES = 2; 707 public static final int FORCE_BT_SCO = 3; 708 public static final int FORCE_BT_A2DP = 4; 709 public static final int FORCE_WIRED_ACCESSORY = 5; 710 public static final int FORCE_BT_CAR_DOCK = 6; 711 public static final int FORCE_BT_DESK_DOCK = 7; 712 public static final int FORCE_ANALOG_DOCK = 8; 713 public static final int FORCE_DIGITAL_DOCK = 9; 714 public static final int FORCE_NO_BT_A2DP = 10; 715 public static final int FORCE_SYSTEM_ENFORCED = 11; 716 public static final int FORCE_HDMI_SYSTEM_AUDIO_ENFORCED = 12; 717 public static final int FORCE_ENCODED_SURROUND_NEVER = 13; 718 public static final int FORCE_ENCODED_SURROUND_ALWAYS = 14; 719 public static final int FORCE_ENCODED_SURROUND_MANUAL = 15; 720 public static final int NUM_FORCE_CONFIG = 16; 721 public static final int FORCE_DEFAULT = FORCE_NONE; 722 forceUseConfigToString(int config)723 public static String forceUseConfigToString(int config) { 724 switch (config) { 725 case FORCE_NONE: return "FORCE_NONE"; 726 case FORCE_SPEAKER: return "FORCE_SPEAKER"; 727 case FORCE_HEADPHONES: return "FORCE_HEADPHONES"; 728 case FORCE_BT_SCO: return "FORCE_BT_SCO"; 729 case FORCE_BT_A2DP: return "FORCE_BT_A2DP"; 730 case FORCE_WIRED_ACCESSORY: return "FORCE_WIRED_ACCESSORY"; 731 case FORCE_BT_CAR_DOCK: return "FORCE_BT_CAR_DOCK"; 732 case FORCE_BT_DESK_DOCK: return "FORCE_BT_DESK_DOCK"; 733 case FORCE_ANALOG_DOCK: return "FORCE_ANALOG_DOCK"; 734 case FORCE_DIGITAL_DOCK: return "FORCE_DIGITAL_DOCK"; 735 case FORCE_NO_BT_A2DP: return "FORCE_NO_BT_A2DP"; 736 case FORCE_SYSTEM_ENFORCED: return "FORCE_SYSTEM_ENFORCED"; 737 case FORCE_HDMI_SYSTEM_AUDIO_ENFORCED: return "FORCE_HDMI_SYSTEM_AUDIO_ENFORCED"; 738 case FORCE_ENCODED_SURROUND_NEVER: return "FORCE_ENCODED_SURROUND_NEVER"; 739 case FORCE_ENCODED_SURROUND_ALWAYS: return "FORCE_ENCODED_SURROUND_ALWAYS"; 740 case FORCE_ENCODED_SURROUND_MANUAL: return "FORCE_ENCODED_SURROUND_MANUAL"; 741 default: return "unknown config (" + config + ")" ; 742 } 743 } 744 745 // usage for setForceUse, must match audio_policy_force_use_t 746 public static final int FOR_COMMUNICATION = 0; 747 public static final int FOR_MEDIA = 1; 748 public static final int FOR_RECORD = 2; 749 public static final int FOR_DOCK = 3; 750 public static final int FOR_SYSTEM = 4; 751 public static final int FOR_HDMI_SYSTEM_AUDIO = 5; 752 public static final int FOR_ENCODED_SURROUND = 6; 753 public static final int FOR_VIBRATE_RINGING = 7; 754 private static final int NUM_FORCE_USE = 8; 755 forceUseUsageToString(int usage)756 public static String forceUseUsageToString(int usage) { 757 switch (usage) { 758 case FOR_COMMUNICATION: return "FOR_COMMUNICATION"; 759 case FOR_MEDIA: return "FOR_MEDIA"; 760 case FOR_RECORD: return "FOR_RECORD"; 761 case FOR_DOCK: return "FOR_DOCK"; 762 case FOR_SYSTEM: return "FOR_SYSTEM"; 763 case FOR_HDMI_SYSTEM_AUDIO: return "FOR_HDMI_SYSTEM_AUDIO"; 764 case FOR_ENCODED_SURROUND: return "FOR_ENCODED_SURROUND"; 765 case FOR_VIBRATE_RINGING: return "FOR_VIBRATE_RINGING"; 766 default: return "unknown usage (" + usage + ")" ; 767 } 768 } 769 770 // usage for AudioRecord.startRecordingSync(), must match AudioSystem::sync_event_t 771 public static final int SYNC_EVENT_NONE = 0; 772 public static final int SYNC_EVENT_PRESENTATION_COMPLETE = 1; 773 774 /** 775 * @return command completion status, one of {@link #AUDIO_STATUS_OK}, 776 * {@link #AUDIO_STATUS_ERROR} or {@link #AUDIO_STATUS_SERVER_DIED} 777 */ setDeviceConnectionState(int device, int state, String device_address, String device_name)778 public static native int setDeviceConnectionState(int device, int state, 779 String device_address, String device_name); getDeviceConnectionState(int device, String device_address)780 public static native int getDeviceConnectionState(int device, String device_address); handleDeviceConfigChange(int device, String device_address, String device_name)781 public static native int handleDeviceConfigChange(int device, 782 String device_address, 783 String device_name); setPhoneState(int state)784 public static native int setPhoneState(int state); setForceUse(int usage, int config)785 public static native int setForceUse(int usage, int config); getForceUse(int usage)786 public static native int getForceUse(int usage); initStreamVolume(int stream, int indexMin, int indexMax)787 public static native int initStreamVolume(int stream, int indexMin, int indexMax); setStreamVolumeIndex(int stream, int index, int device)788 public static native int setStreamVolumeIndex(int stream, int index, int device); getStreamVolumeIndex(int stream, int device)789 public static native int getStreamVolumeIndex(int stream, int device); setMasterVolume(float value)790 public static native int setMasterVolume(float value); getMasterVolume()791 public static native float getMasterVolume(); setMasterMute(boolean mute)792 public static native int setMasterMute(boolean mute); getMasterMute()793 public static native boolean getMasterMute(); getDevicesForStream(int stream)794 public static native int getDevicesForStream(int stream); 795 796 /** @hide returns true if master mono is enabled. */ getMasterMono()797 public static native boolean getMasterMono(); 798 /** @hide enables or disables the master mono mode. */ setMasterMono(boolean mono)799 public static native int setMasterMono(boolean mono); 800 801 // helpers for android.media.AudioManager.getProperty(), see description there for meaning getPrimaryOutputSamplingRate()802 public static native int getPrimaryOutputSamplingRate(); getPrimaryOutputFrameCount()803 public static native int getPrimaryOutputFrameCount(); getOutputLatency(int stream)804 public static native int getOutputLatency(int stream); 805 setLowRamDevice(boolean isLowRamDevice, long totalMemory)806 public static native int setLowRamDevice(boolean isLowRamDevice, long totalMemory); checkAudioFlinger()807 public static native int checkAudioFlinger(); 808 listAudioPorts(ArrayList<AudioPort> ports, int[] generation)809 public static native int listAudioPorts(ArrayList<AudioPort> ports, int[] generation); createAudioPatch(AudioPatch[] patch, AudioPortConfig[] sources, AudioPortConfig[] sinks)810 public static native int createAudioPatch(AudioPatch[] patch, 811 AudioPortConfig[] sources, AudioPortConfig[] sinks); releaseAudioPatch(AudioPatch patch)812 public static native int releaseAudioPatch(AudioPatch patch); listAudioPatches(ArrayList<AudioPatch> patches, int[] generation)813 public static native int listAudioPatches(ArrayList<AudioPatch> patches, int[] generation); setAudioPortConfig(AudioPortConfig config)814 public static native int setAudioPortConfig(AudioPortConfig config); 815 816 // declare this instance as having a dynamic policy callback handler native_register_dynamic_policy_callback()817 private static native final void native_register_dynamic_policy_callback(); 818 // declare this instance as having a recording configuration update callback handler native_register_recording_callback()819 private static native final void native_register_recording_callback(); 820 821 // must be kept in sync with value in include/system/audio.h 822 public static final int AUDIO_HW_SYNC_INVALID = 0; 823 getAudioHwSyncForSession(int sessionId)824 public static native int getAudioHwSyncForSession(int sessionId); 825 registerPolicyMixes(ArrayList<AudioMix> mixes, boolean register)826 public static native int registerPolicyMixes(ArrayList<AudioMix> mixes, boolean register); 827 systemReady()828 public static native int systemReady(); 829 getStreamVolumeDB(int stream, int index, int device)830 public static native float getStreamVolumeDB(int stream, int index, int device); 831 isOffloadSupported(@onNull AudioFormat format)832 static boolean isOffloadSupported(@NonNull AudioFormat format) { 833 return native_is_offload_supported(format.getEncoding(), format.getSampleRate(), 834 format.getChannelMask(), format.getChannelIndexMask()); 835 } 836 native_is_offload_supported(int encoding, int sampleRate, int channelMask, int channelIndexMask)837 private static native boolean native_is_offload_supported(int encoding, int sampleRate, 838 int channelMask, int channelIndexMask); 839 getMicrophones(ArrayList<MicrophoneInfo> microphonesInfo)840 public static native int getMicrophones(ArrayList<MicrophoneInfo> microphonesInfo); 841 getSurroundFormats(Map<Integer, Boolean> surroundFormats, boolean reported)842 public static native int getSurroundFormats(Map<Integer, Boolean> surroundFormats, 843 boolean reported); 844 setSurroundFormatEnabled(int audioFormat, boolean enabled)845 public static native int setSurroundFormatEnabled(int audioFormat, boolean enabled); 846 847 // Items shared with audio service 848 849 /** 850 * The delay before playing a sound. This small period exists so the user 851 * can press another key (non-volume keys, too) to have it NOT be audible. 852 * <p> 853 * PhoneWindow will implement this part. 854 */ 855 public static final int PLAY_SOUND_DELAY = 300; 856 857 /** 858 * Constant to identify a focus stack entry that is used to hold the focus while the phone 859 * is ringing or during a call. Used by com.android.internal.telephony.CallManager when 860 * entering and exiting calls. 861 */ 862 public final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls"; 863 864 /** 865 * @see AudioManager#setVibrateSetting(int, int) 866 */ getValueForVibrateSetting(int existingValue, int vibrateType, int vibrateSetting)867 public static int getValueForVibrateSetting(int existingValue, int vibrateType, 868 int vibrateSetting) { 869 870 // First clear the existing setting. Each vibrate type has two bits in 871 // the value. Note '3' is '11' in binary. 872 existingValue &= ~(3 << (vibrateType * 2)); 873 874 // Set into the old value 875 existingValue |= (vibrateSetting & 3) << (vibrateType * 2); 876 877 return existingValue; 878 } 879 getDefaultStreamVolume(int streamType)880 public static int getDefaultStreamVolume(int streamType) { 881 return DEFAULT_STREAM_VOLUME[streamType]; 882 } 883 884 public static int[] DEFAULT_STREAM_VOLUME = new int[] { 885 4, // STREAM_VOICE_CALL 886 7, // STREAM_SYSTEM 887 5, // STREAM_RING 888 5, // STREAM_MUSIC 889 6, // STREAM_ALARM 890 5, // STREAM_NOTIFICATION 891 7, // STREAM_BLUETOOTH_SCO 892 7, // STREAM_SYSTEM_ENFORCED 893 5, // STREAM_DTMF 894 5, // STREAM_TTS 895 5, // STREAM_ACCESSIBILITY 896 }; 897 streamToString(int stream)898 public static String streamToString(int stream) { 899 if (stream >= 0 && stream < STREAM_NAMES.length) return STREAM_NAMES[stream]; 900 if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) return "USE_DEFAULT_STREAM_TYPE"; 901 return "UNKNOWN_STREAM_" + stream; 902 } 903 904 /** The platform has no specific capabilities */ 905 public static final int PLATFORM_DEFAULT = 0; 906 /** The platform is voice call capable (a phone) */ 907 public static final int PLATFORM_VOICE = 1; 908 /** The platform is a television or a set-top box */ 909 public static final int PLATFORM_TELEVISION = 2; 910 911 /** 912 * Return the platform type that this is running on. One of: 913 * <ul> 914 * <li>{@link #PLATFORM_VOICE}</li> 915 * <li>{@link #PLATFORM_TELEVISION}</li> 916 * <li>{@link #PLATFORM_DEFAULT}</li> 917 * </ul> 918 */ getPlatformType(Context context)919 public static int getPlatformType(Context context) { 920 if (context.getResources().getBoolean(com.android.internal.R.bool.config_voice_capable)) { 921 return PLATFORM_VOICE; 922 } else if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) { 923 return PLATFORM_TELEVISION; 924 } else { 925 return PLATFORM_DEFAULT; 926 } 927 } 928 929 /** 930 * @hide 931 * @return whether the system uses a single volume stream. 932 */ isSingleVolume(Context context)933 public static boolean isSingleVolume(Context context) { 934 boolean forceSingleVolume = context.getResources().getBoolean( 935 com.android.internal.R.bool.config_single_volume); 936 return getPlatformType(context) == PLATFORM_TELEVISION || forceSingleVolume; 937 } 938 939 public static final int DEFAULT_MUTE_STREAMS_AFFECTED = 940 (1 << STREAM_MUSIC) | 941 (1 << STREAM_RING) | 942 (1 << STREAM_NOTIFICATION) | 943 (1 << STREAM_SYSTEM) | 944 (1 << STREAM_VOICE_CALL); 945 946 /** 947 * Event posted by AudioTrack and AudioRecord JNI (JNIDeviceCallback) when routing changes. 948 * Keep in sync with core/jni/android_media_DeviceCallback.h. 949 */ 950 final static int NATIVE_EVENT_ROUTING_CHANGE = 1000; 951 } 952 953