19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Triviimport android.Manifest; 20958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Triviimport android.annotation.NonNull; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 23e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heoimport android.annotation.SystemApi; 2448034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynoldsimport android.app.NotificationManager; 25f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Triviimport android.app.PendingIntent; 26b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurentimport android.bluetooth.BluetoothDevice; 27d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Triviimport android.content.ComponentName; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 29f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Triviimport android.content.Intent; 30a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Triviimport android.media.audiopolicy.AudioPolicy; 31b214efbb9170a9f6a4991684a63ca59680074cc7RoboErikimport android.media.session.MediaController; 32b214efbb9170a9f6a4991684a63ca59680074cc7RoboErikimport android.media.session.MediaSession; 33f1372428f2df781c71c71caa2f6a4db6f847cf10RoboErikimport android.media.session.MediaSessionLegacyHelper; 34b214efbb9170a9f6a4991684a63ca59680074cc7RoboErikimport android.media.session.MediaSessionManager; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 38d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Triviimport android.os.Looper; 39d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Triviimport android.os.Message; 400c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monkimport android.os.Process; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 4286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.os.SystemClock; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 4470e0c58c2269cd29dfd6420d690da13dc03fd457Kenny Guyimport android.os.UserHandle; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 46e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLeanimport android.util.ArrayMap; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 48e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLeanimport android.util.Pair; 49d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Triviimport android.view.KeyEvent; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51a198a29250acb7c3e918f1566727190966bb336fEric Laurentimport java.util.ArrayList; 52e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLeanimport java.util.Collection; 53b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kimimport java.util.HashMap; 54b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kimimport java.util.Iterator; 55d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Triviimport java.util.List; 56700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioManager provides access to volume and ringer mode control. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use <code>Context.getSystemService(Context.AUDIO_SERVICE)</code> to get 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an instance of this class. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AudioManager { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen private Context mOriginalContext; 6629f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen private Context mApplicationContext; 6786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato private long mVolumeKeyUpTime; 68b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate private final boolean mUseVolumeKeySounds; 69ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent private final boolean mUseFixedVolume; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String TAG = "AudioManager"; 71f076db407029e734703d8676f806bea94393e824Eric Laurent private static final AudioPortEventHandler sAudioPortEventHandler = new AudioPortEventHandler(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent, a hint for applications that audio is about to become 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 'noisy' due to a change in audio outputs. For example, this intent may 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sent when a wired headset is unplugged, or when an A2DP audio 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sink is disconnected, and the audio system is about to automatically 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * switch audio route to the speaker. Applications that are controlling 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * audio streams may consider pausing, reducing volume or some other action 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on receipt of this intent so as not to surprise the user with audio 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the speaker. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY"; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sticky broadcast intent action indicating that the ringer mode has 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changed. Includes the new ringer mode. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_RINGER_MODE 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED"; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 96bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock * @hide 97bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock * Sticky broadcast intent action indicating that the internal ringer mode has 98bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock * changed. Includes the new ringer mode. 99bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock * 100bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock * @see #EXTRA_RINGER_MODE 101bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock */ 102bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 103bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock public static final String INTERNAL_RINGER_MODE_CHANGED_ACTION = 104bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock "android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION"; 105bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock 106bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new ringer mode. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_CHANGED_ACTION 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_NORMAL 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_SILENT 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_VIBRATE 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE"; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the vibrate setting has 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changed. Includes the vibrate type and its new setting. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIBRATE_TYPE 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIBRATE_SETTING 122cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 123cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode and listen to {@link #RINGER_MODE_CHANGED_ACTION} instead. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1260dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String VIBRATE_SETTING_CHANGED_ACTION = 1270dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.VIBRATE_SETTING_CHANGED"; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide Broadcast intent when the volume for a particular stream type changes. 1313114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * Includes the stream, the new volume and previous volumes. 1323114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * Notes: 1333114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * - for internal platform use only, do not make public, 1343114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * - never used for "remote" volume changes 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VOLUME_STREAM_TYPE 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VOLUME_STREAM_VALUE 1389ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent * @see #EXTRA_PREV_VOLUME_STREAM_VALUE 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION"; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1448a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @hide Broadcast intent when the devices for a particular stream type changes. 1458a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * Includes the stream, the new devices and previous devices. 1468a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * Notes: 1478a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * - for internal platform use only, do not make public, 1488a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * - never used for "remote" volume changes 1498a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * 1508a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @see #EXTRA_VOLUME_STREAM_TYPE 1518a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @see #EXTRA_VOLUME_STREAM_DEVICES 1528a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @see #EXTRA_PREV_VOLUME_STREAM_DEVICES 1538a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @see #getDevicesForStream 1548a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock */ 1558a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1568a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock public static final String STREAM_DEVICES_CHANGED_ACTION = 1578a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock "android.media.STREAM_DEVICES_CHANGED_ACTION"; 1588a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock 1598a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock /** 1607c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * @hide Broadcast intent when a stream mute state changes. 1617c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * Includes the stream that changed and the new mute state 1627c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * 1637c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * @see #EXTRA_VOLUME_STREAM_TYPE 1647c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * @see #EXTRA_STREAM_VOLUME_MUTED 1657c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik */ 1667c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1677c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik public static final String STREAM_MUTE_CHANGED_ACTION = 1687c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik "android.media.STREAM_MUTE_CHANGED_ACTION"; 1697c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik 1707c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik /** 1710dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide Broadcast intent when the master mute state changes. 1720dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Includes the the new volume 1730dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * 1740dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @see #EXTRA_MASTER_VOLUME_MUTED 1750dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 1760dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1770dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String MASTER_MUTE_CHANGED_ACTION = 1780dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.MASTER_MUTE_CHANGED_ACTION"; 1790dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 1800dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new vibrate setting for a particular type. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_CHANGED_ACTION 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIBRATE_TYPE 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_ON 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_OFF 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_ONLY_SILENT 188cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 189cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode and listen to {@link #RINGER_MODE_CHANGED_ACTION} instead. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING"; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The vibrate type whose setting has changed. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_CHANGED_ACTION 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_TYPE_NOTIFICATION 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_TYPE_RINGER 199cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 200cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode and listen to {@link #RINGER_MODE_CHANGED_ACTION} instead. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE"; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide The stream type for the volume changed intent. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE"; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 210560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi * @hide 211560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi * The stream type alias for the volume changed intent. 212560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi * For instance the intent may indicate a change of the {@link #STREAM_NOTIFICATION} stream 213560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi * type (as indicated by the {@link #EXTRA_VOLUME_STREAM_TYPE} extra), but this is also 214560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi * reflected by a change of the volume of its alias, {@link #STREAM_RING} on some devices, 215560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi * {@link #STREAM_MUSIC} on others (e.g. a television). 216560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi */ 217560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi public static final String EXTRA_VOLUME_STREAM_TYPE_ALIAS = 218560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi "android.media.EXTRA_VOLUME_STREAM_TYPE_ALIAS"; 219560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi 220560877d498b3b142bb0d555bb2fe48ead3fa9b0fJean-Michel Trivi /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide The volume associated with the stream for the volume changed intent. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VOLUME_STREAM_VALUE = 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.media.EXTRA_VOLUME_STREAM_VALUE"; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent /** 2279ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent * @hide The previous volume associated with the stream for the volume changed intent. 2289ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent */ 2299ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent public static final String EXTRA_PREV_VOLUME_STREAM_VALUE = 2309ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent "android.media.EXTRA_PREV_VOLUME_STREAM_VALUE"; 2310dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 2320dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 2338a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @hide The devices associated with the stream for the stream devices changed intent. 2348a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock */ 2358a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock public static final String EXTRA_VOLUME_STREAM_DEVICES = 2368a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock "android.media.EXTRA_VOLUME_STREAM_DEVICES"; 2378a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock 2388a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock /** 2398a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock * @hide The previous devices associated with the stream for the stream devices changed intent. 2408a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock */ 2418a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock public static final String EXTRA_PREV_VOLUME_STREAM_DEVICES = 2428a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock "android.media.EXTRA_PREV_VOLUME_STREAM_DEVICES"; 2438a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock 2448a52c4491dfbb8354a92c0a1e6abc86848e187c6John Spurlock /** 2450dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide The new master volume mute state for the master mute changed intent. 2460dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Value is boolean 2470dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 2480dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String EXTRA_MASTER_VOLUME_MUTED = 2490dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.EXTRA_MASTER_VOLUME_MUTED"; 2509ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent 251c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 2527c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * @hide The new stream volume mute state for the stream mute changed intent. 2537c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik * Value is boolean 2547c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik */ 2557c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik public static final String EXTRA_STREAM_VOLUME_MUTED = 2567c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik "android.media.EXTRA_STREAM_VOLUME_MUTED"; 2577c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik 2587c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik /** 259c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Broadcast Action: Wired Headset plugged in or unplugged. 260c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 261c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * You <em>cannot</em> receive this through components declared 262c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * in manifests, only by explicitly registering for it with 263c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter) 264c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Context.registerReceiver()}. 265c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 266c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>The intent will have the following extra values: 267c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <ul> 268c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>state</em> - 0 for unplugged, 1 for plugged. </li> 269c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>name</em> - Headset type, human readable string </li> 270c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>microphone</em> - 1 if headset has a microphone, 0 otherwise </li> 271c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 272c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 273c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 274c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 275c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_HEADSET_PLUG = 276c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.intent.action.HEADSET_PLUG"; 277c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 278c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 279bc68256fea95c25258d8faad6bb697c364ad5a90Eemi Haukkala * Broadcast Action: A sticky broadcast indicating an HDMI cable was plugged or unplugged. 280c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 281c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * The intent will have the following extra values: {@link #EXTRA_AUDIO_PLUG_STATE}, 282c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link #EXTRA_MAX_CHANNEL_COUNT}, {@link #EXTRA_ENCODINGS}. 283c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>It can only be received by explicitly registering for it with 284c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)}. 285c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 286c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 287c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_HDMI_AUDIO_PLUG = 288c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.media.action.HDMI_AUDIO_PLUG"; 289c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 290c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 291c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Extra used in {@link #ACTION_HDMI_AUDIO_PLUG} to communicate whether HDMI is plugged in 292c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * or unplugged. 293c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * An integer value of 1 indicates a plugged-in state, 0 is unplugged. 294c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 295deddda5d62498bbaa9789c622be7a08be83f2f51Jean-Michel Trivi public static final String EXTRA_AUDIO_PLUG_STATE = "android.media.extra.AUDIO_PLUG_STATE"; 296c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 297c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 298c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Extra used in {@link #ACTION_HDMI_AUDIO_PLUG} to define the maximum number of channels 299c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * supported by the HDMI device. 300c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * The corresponding integer value is only available when the device is plugged in (as expressed 301c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * by {@link #EXTRA_AUDIO_PLUG_STATE}). 302c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 303deddda5d62498bbaa9789c622be7a08be83f2f51Jean-Michel Trivi public static final String EXTRA_MAX_CHANNEL_COUNT = "android.media.extra.MAX_CHANNEL_COUNT"; 304c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 305c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 306c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Extra used in {@link #ACTION_HDMI_AUDIO_PLUG} to define the audio encodings supported by 307c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * the connected HDMI device. 308c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * The corresponding array of encoding values is only available when the device is plugged in 309c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * (as expressed by {@link #EXTRA_AUDIO_PLUG_STATE}). Encoding values are defined in 310c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link AudioFormat} (for instance see {@link AudioFormat#ENCODING_PCM_16BIT}). Use 311c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link android.content.Intent#getIntArrayExtra(String)} to retrieve the encoding values. 312c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 313deddda5d62498bbaa9789c622be7a08be83f2f51Jean-Michel Trivi public static final String EXTRA_ENCODINGS = "android.media.extra.ENCODINGS"; 314c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for phone calls */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for system sounds */ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for the phone ring */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_RING = AudioSystem.STREAM_RING; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for music playback */ 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for alarms */ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for notifications */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide The audio stream for phone calls when connected to bluetooth */ 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_BLUETOOTH_SCO = AudioSystem.STREAM_BLUETOOTH_SCO; 329a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */ 330a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public static final int STREAM_SYSTEM_ENFORCED = AudioSystem.STREAM_SYSTEM_ENFORCED; 331a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** The audio stream for DTMF Tones */ 332a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public static final int STREAM_DTMF = AudioSystem.STREAM_DTMF; 333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** @hide The audio stream for text to speech (TTS) */ 334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public static final int STREAM_TTS = AudioSystem.STREAM_TTS; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Number of audio streams */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use AudioSystem.getNumStreamTypes() instead 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int NUM_STREAMS = AudioSystem.NUM_STREAMS; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Increase the ringer volume. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ADJUST_RAISE = 1; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decrease the ringer volume. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ADJUST_LOWER = -1; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Maintain the previous ringer volume. This may be useful when needing to 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * show the volume toast without actually modifying the volume. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ADJUST_SAME = 0; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3664197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik /** 3674197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * Mute the volume. Has no effect if the stream is already muted. 3684197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * 3694197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustVolume(int, int) 3704197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustStreamVolume(int, int, int) 3714197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik */ 3724197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik public static final int ADJUST_MUTE = -100; 3734197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik 3744197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik /** 3754197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * Unmute the volume. Has no effect if the stream is not muted. 3764197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * 3774197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustVolume(int, int) 3784197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustStreamVolume(int, int, int) 3794197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik */ 3804197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik public static final int ADJUST_UNMUTE = 100; 3814197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik 3824197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik /** 3834197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * Toggle the mute state. If muted the stream will be unmuted. If not muted 3844197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * the stream will be muted. 3854197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * 3864197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustVolume(int, int) 3874197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustStreamVolume(int, int, int) 3884197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik */ 3894197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik public static final int ADJUST_TOGGLE_MUTE = 101; 3904197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Flags should be powers of 2! 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Show a toast containing the current volume. 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_SHOW_UI = 1 << 0; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to include ringer modes as possible options when changing volume. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, if true and volume level is 0 and the volume is adjusted 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with {@link #ADJUST_LOWER}, then the ringer mode may switch the silent or 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate mode. 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default this is on for the ring stream. If this flag is included, 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this behavior will be present regardless of the stream type being 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affected by the ringer mode. 412105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_ALLOW_RINGER_MODES = 1 << 1; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to play a sound when changing the volume. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this is given to {@link #adjustVolume(int, int)} or 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #adjustSuggestedStreamVolume(int, int, int)}, it may be ignored 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in some cases (for example, the decided stream type is not 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_RING}, or the volume is being adjusted 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * downward). 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_PLAY_SOUND = 1 << 2; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes any sounds/vibrate that may be in the queue, or are playing (related to 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changing volume). 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 1 << 3; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to vibrate if going into the vibrate ringer mode. 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_VIBRATE = 1 << 4; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4454bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent * Indicates to VolumePanel that the volume slider should be disabled as user 4464bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent * cannot change the stream volume 4474bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent * @hide 4484bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent */ 4494bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent public static final int FLAG_FIXED_VOLUME = 1 << 5; 4504bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent 4514bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent /** 452c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie * Indicates the volume set/adjust call is for Bluetooth absolute volume 453c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie * @hide 454c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie */ 455c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie public static final int FLAG_BLUETOOTH_ABS_VOLUME = 1 << 6; 456c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie 457c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie /** 458a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock * Adjusting the volume was prevented due to silent mode, display a hint in the UI. 459a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock * @hide 460a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock */ 461a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock public static final int FLAG_SHOW_SILENT_HINT = 1 << 7; 462a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock 463a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock /** 46441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * Indicates the volume call is for Hdmi Cec system audio volume 46541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * @hide 46641d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang */ 46741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang public static final int FLAG_HDMI_SYSTEM_AUDIO_VOLUME = 1 << 8; 46841d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang 46941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang /** 4703c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik * Indicates that this should only be handled if media is actively playing. 4713c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik * @hide 4723c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik */ 4733c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik public static final int FLAG_ACTIVE_MEDIA_ONLY = 1 << 9; 4743c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik 4753c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik /** 476351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock * Like FLAG_SHOW_UI, but only dialog warnings and confirmations, no sliders. 477351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock * @hide 478351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock */ 479351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock public static final int FLAG_SHOW_UI_WARNINGS = 1 << 10; 480351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock 481351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock /** 482661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock * Adjusting the volume down from vibrated was prevented, display a hint in the UI. 483661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock * @hide 484661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock */ 485661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock public static final int FLAG_SHOW_VIBRATE_HINT = 1 << 11; 486661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock 487b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock /** 488b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock * Adjusting the volume due to a hardware key press. 489b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock * @hide 490b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock */ 491b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock public static final int FLAG_FROM_KEY = 1 << 12; 492b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock 493661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock private static final String[] FLAG_NAMES = { 494661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_SHOW_UI", 495661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_ALLOW_RINGER_MODES", 496661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_PLAY_SOUND", 497661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_REMOVE_SOUND_AND_VIBRATE", 498661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_VIBRATE", 499661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_FIXED_VOLUME", 500661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_BLUETOOTH_ABS_VOLUME", 501661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_SHOW_SILENT_HINT", 502661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_HDMI_SYSTEM_AUDIO_VOLUME", 503661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_ACTIVE_MEDIA_ONLY", 504661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_SHOW_UI_WARNINGS", 505661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock "FLAG_SHOW_VIBRATE_HINT", 506b94f2d6cad92c4f6ad184920e06a260d87eb3b6aJohn Spurlock "FLAG_FROM_KEY", 507661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock }; 508661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock 509661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock /** @hide */ 510661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock public static String flagsToString(int flags) { 511661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock final StringBuilder sb = new StringBuilder(); 512661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock for (int i = 0; i < FLAG_NAMES.length; i++) { 513661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock final int flag = 1 << i; 514661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock if ((flags & flag) != 0) { 515661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock if (sb.length() > 0) { 516661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock sb.append(','); 517661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 518661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock sb.append(FLAG_NAMES[i]); 519661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock flags &= ~flag; 520661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 521661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 522661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock if (flags != 0) { 523661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock if (sb.length() > 0) { 524661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock sb.append(','); 525661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 526661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock sb.append(flags); 527661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 528661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock return sb.toString(); 529661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 530661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock 531661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock /** 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringer mode that will be silent and will not vibrate. (This overrides the 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate setting.) 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RINGER_MODE_SILENT = 0; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringer mode that will be silent and will vibrate. (This will cause the 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * phone ringer to always vibrate, but the notification vibrate to only 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate if set.) 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RINGER_MODE_VIBRATE = 1; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringer mode that may be audible and may vibrate. It will be audible if 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the volume before changing out of this mode was audible. It will vibrate 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the vibrate setting is on. 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RINGER_MODE_NORMAL = 2; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock /** 5619755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock * Maximum valid ringer mode value. Values must start from 0 and be contiguous. 5629755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock * @hide 5639755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock */ 5649755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock public static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL; 56572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate type that corresponds to the ringer. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 572cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 573cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_TYPE_RINGER = 0; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate type that corresponds to notifications. 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 583cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 584cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_TYPE_NOTIFICATION = 1; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate setting that suggests to never vibrate. 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 593cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 594cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_SETTING_OFF = 0; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate setting that suggests to vibrate when possible. 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 603cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 604cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_SETTING_ON = 1; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate setting that suggests to only vibrate when in the vibrate ringer 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mode. 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 614cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 615cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_SETTING_ONLY_SILENT = 2; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suggests using the default stream type. This may not be used in all 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * places a stream type is needed. 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int USE_DEFAULT_STREAM_TYPE = Integer.MIN_VALUE; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static IAudioService sService; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AudioManager(Context context) { 63129f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen setContext(context); 63229f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen mUseVolumeKeySounds = getContext().getResources().getBoolean( 633b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate com.android.internal.R.bool.config_useVolumeKeySounds); 63429f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen mUseFixedVolume = getContext().getResources().getBoolean( 635ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent com.android.internal.R.bool.config_useFixedVolume); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63829f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen private Context getContext() { 63929f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen if (mApplicationContext == null) { 64029f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen setContext(mOriginalContext); 64129f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen } 64229f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen if (mApplicationContext != null) { 64329f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen return mApplicationContext; 64429f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen } 64529f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen return mOriginalContext; 64629f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen } 64729f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen 64829f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen private void setContext(Context context) { 64929f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen mApplicationContext = context.getApplicationContext(); 65029f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen if (mApplicationContext != null) { 65129f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen mOriginalContext = null; 65229f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen } else { 65329f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen mOriginalContext = context; 65429f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen } 65529f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen } 65629f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static IAudioService getService() 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = IAudioService.Stub.asInterface(b); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 668a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * Sends a simulated key event for a media button. 669a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * To simulate a key press, you must first send a KeyEvent built with a 670a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#ACTION_DOWN} action, then another event with the {@link KeyEvent#ACTION_UP} 671a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * action. 672a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * <p>The key event will be sent to the current media key event consumer which registered with 673a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link AudioManager#registerMediaButtonEventReceiver(PendingIntent)}. 674a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * @param keyEvent a {@link KeyEvent} instance whose key code is one of 675a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MUTE}, 676a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_HEADSETHOOK}, 677a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PLAY}, 678a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PAUSE}, 679a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PLAY_PAUSE}, 680a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_STOP}, 681a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_NEXT}, 682a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PREVIOUS}, 683a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_REWIND}, 684a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_RECORD}, 685a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_FAST_FORWARD}, 686a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_CLOSE}, 687a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_EJECT}, 688a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * or {@link KeyEvent#KEYCODE_MEDIA_AUDIO_TRACK}. 689a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi */ 690a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi public void dispatchMediaKeyEvent(KeyEvent keyEvent) { 69129f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext()); 692430fc48865e5a371b08f180390946b96d73848feRoboErik helper.sendMediaButtonEvent(keyEvent, false); 6937ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 6947ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi 6957ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi /** 6967ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi * @hide 69786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 698ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void preDispatchKeyEvent(KeyEvent event, int stream) { 69986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 70086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * If the user hits another key within the play sound delay, then 70186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * cancel the sound 70286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 703ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood int keyCode = event.getKeyCode(); 70486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_VOLUME_UP 70586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato && keyCode != KeyEvent.KEYCODE_VOLUME_MUTE 7066156017c2217d0fbbbb03434986250ec6bbd69d8John Spurlock && mVolumeKeyUpTime + AudioSystem.PLAY_SOUND_DELAY > SystemClock.uptimeMillis()) { 70786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 70886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * The user has hit another key during the delay (e.g., 300ms) 70986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * since the last volume key up, so cancel any sounds. 71086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 711ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock adjustSuggestedStreamVolume(ADJUST_SAME, 712ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock stream, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 71386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 71486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 71586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 71686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /** 71786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * @hide 71886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 719ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void handleKeyDown(KeyEvent event, int stream) { 720ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood int keyCode = event.getKeyCode(); 72186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 72286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 72386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 72486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 72586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Adjust the volume in on key down since it is more 72686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * responsive to the user. 72786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 728ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock adjustSuggestedStreamVolume( 729ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock keyCode == KeyEvent.KEYCODE_VOLUME_UP 730ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock ? ADJUST_RAISE 731ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock : ADJUST_LOWER, 732ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock stream, 733ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock FLAG_SHOW_UI | FLAG_VIBRATE); 73486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 73586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_MUTE: 736ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood if (event.getRepeatCount() == 0) { 73729f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen MediaSessionLegacyHelper.getHelper(getContext()) 738926ebb860a8b5cbdec17f07404272be7c484fd79Marco Nelissen .sendVolumeKeyEvent(event, false); 739ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 74086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 74186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 74286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 74386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 74486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /** 74586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * @hide 74686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 747ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void handleKeyUp(KeyEvent event, int stream) { 748ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood int keyCode = event.getKeyCode(); 74986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 75086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 75186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 75286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 75386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Play a sound. This is done on key up since we don't want the 75486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * sound to play when a user holds down volume down to mute. 75586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 756b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate if (mUseVolumeKeySounds) { 757ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock adjustSuggestedStreamVolume( 758ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock ADJUST_SAME, 759ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock stream, 760ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock FLAG_PLAY_SOUND); 761402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent } 76286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mVolumeKeyUpTime = SystemClock.uptimeMillis(); 76386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 7647c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik case KeyEvent.KEYCODE_VOLUME_MUTE: 76529f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen MediaSessionLegacyHelper.getHelper(getContext()) 766926ebb860a8b5cbdec17f07404272be7c484fd79Marco Nelissen .sendVolumeKeyEvent(event, false); 7677c82ced4fc5b66c09a19eed9a5499039530142fbRoboErik break; 76886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 76986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 77086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 77186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /** 772ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * Indicates if the device implements a fixed volume policy. 773ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>Some devices may not have volume control and may operate at a fixed volume, 774ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * and may not enable muting or changing the volume of audio streams. 775ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * This method will return true on such devices. 776ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>The following APIs have no effect when volume is fixed: 777ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <ul> 778ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #adjustVolume(int, int)} 779ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #adjustSuggestedStreamVolume(int, int, int)} 780ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #adjustStreamVolume(int, int, int)} 781ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setStreamVolume(int, int, int)} 782ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setRingerMode(int)} 783ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setStreamSolo(int, boolean)} 784ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setStreamMute(int, boolean)} 785ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * </ul> 786ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent */ 787ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent public boolean isVolumeFixed() { 788ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent return mUseFixedVolume; 789ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent } 790ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent 791ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent /** 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjusts the volume of a particular stream by one step in a direction. 793fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 794fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 795fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type to adjust. One of {@link #STREAM_VOICE_CALL}, 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #STREAM_SYSTEM}, {@link #STREAM_RING}, {@link #STREAM_MUSIC} or 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #STREAM_ALARM} 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction The direction to adjust the volume. One of 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_SAME}. 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void adjustStreamVolume(int streamType, int direction, int flags) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 810ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock service.adjustStreamVolume(streamType, direction, flags, 8118dc50416a209e76bca38694d59d5779ffcf08d92Marco Nelissen getContext().getOpPackageName()); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 813f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjusts the volume of the most relevant stream. For example, if a call is 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * active, it will have the highest priority regardless of if the in-call 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * screen is showing. Another example, if music is playing in the background 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and a call is not active, the music stream will be adjusted. 822fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 8234197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method should only be used by applications that replace the 8244197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * platform-wide management of audio settings or the main telephony 8254197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * application. 8264197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <p> 8274197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method has no effect if the device implements a fixed volume policy 828ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 8294197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction The direction to adjust the volume. One of 8314197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, 8324197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_SAME}, {@link #ADJUST_MUTE}, 8334197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_UNMUTE}, or {@link #ADJUST_TOGGLE_MUTE}. 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustSuggestedStreamVolume(int, int, int) 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 838ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void adjustVolume(int direction, int flags) { 8418dc50416a209e76bca38694d59d5779ffcf08d92Marco Nelissen MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext()); 842ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock helper.sendAdjustVolumeBy(USE_DEFAULT_STREAM_TYPE, direction, flags); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjusts the volume of the most relevant stream, or the given fallback 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stream. 848fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 8494197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method should only be used by applications that replace the 8504197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * platform-wide management of audio settings or the main telephony 8514197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * application. 8524197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <p> 8534197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method has no effect if the device implements a fixed volume policy 854ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 8554197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction The direction to adjust the volume. One of 8574197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, 8584197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_SAME}, {@link #ADJUST_MUTE}, 8594197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_UNMUTE}, or {@link #ADJUST_TOGGLE_MUTE}. 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param suggestedStreamType The stream type that will be used if there 8614197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * isn't a relevant stream. {@link #USE_DEFAULT_STREAM_TYPE} is 8624197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * valid here. 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 867ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) { 8708dc50416a209e76bca38694d59d5779ffcf08d92Marco Nelissen MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext()); 871ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock helper.sendAdjustVolumeBy(suggestedStreamType, direction, flags); 872cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 873cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 874ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock /** @hide */ 875ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock public void setMasterMute(boolean mute, int flags) { 876cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood IAudioService service = getService(); 877cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood try { 87870e0c58c2269cd29dfd6420d690da13dc03fd457Kenny Guy service.setMasterMute(mute, flags, getContext().getOpPackageName(), 87970e0c58c2269cd29dfd6420d690da13dc03fd457Kenny Guy UserHandle.getCallingUserId()); 880cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } catch (RemoteException e) { 881f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current ringtone mode. 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current ringtone mode, one of {@link #RINGER_MODE_NORMAL}, 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}. 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRingerMode() { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 895661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock return service.getRingerModeExternal(); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 897f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 90272668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * Checks valid ringer mode values. 90372668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * 90472668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * @return true if the ringer mode indicated is valid, false otherwise. 90572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * 90672668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * @see #setRingerMode(int) 90772668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * @hide 90872668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent */ 90972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent public static boolean isValidRingerMode(int ringerMode) { 91072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent if (ringerMode < 0 || ringerMode > RINGER_MODE_MAX) { 91172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent return false; 91272668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent } 9139755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock IAudioService service = getService(); 9149755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock try { 9159755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock return service.isValidRingerMode(ringerMode); 9169755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock } catch (RemoteException e) { 917f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 9189755937ed90f06db45ff5fe4510950ae1516f8f9John Spurlock } 91972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent } 92072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent 92172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent /** 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the maximum volume index for a particular stream. 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type whose maximum volume index is returned. 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The maximum valid volume index for the stream. 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamVolume(int) 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStreamMaxVolume(int streamType) { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 931ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock return service.getStreamMaxVolume(streamType); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 933f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 938b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock * Returns the minimum volume index for a particular stream. 939b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock * 940b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock * @param streamType The stream type whose minimum volume index is returned. 941b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock * @return The minimum valid volume index for the stream. 942b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock * @see #getStreamVolume(int) 943b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock * @hide 944b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock */ 945b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock public int getStreamMinVolume(int streamType) { 946b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock IAudioService service = getService(); 947b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock try { 948b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock return service.getStreamMinVolume(streamType); 949b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock } catch (RemoteException e) { 950f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 951b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock } 952b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock } 953b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock 954b6e19e3e0f0170d058636101e23f964196f6f4b2John Spurlock /** 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current volume index for a particular stream. 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type whose volume index is returned. 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current volume index for the stream. 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamMaxVolume(int) 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStreamVolume(int streamType) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 965ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock return service.getStreamVolume(streamType); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 967f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 97225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * Get last audible volume before stream was muted. 97325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * 97425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * @hide 97525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent */ 97625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent public int getLastAudibleStreamVolume(int streamType) { 97725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent IAudioService service = getService(); 97825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent try { 979ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock return service.getLastAudibleStreamVolume(streamType); 98025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } catch (RemoteException e) { 981f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 98225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 98325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 98425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 98525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent /** 9866d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent * Get the stream type whose volume is driving the UI sounds volume. 9876d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent * UI sounds are screen lock/unlock, camera shutter, key clicks... 9884f0f120316cfcee5880191264885772677fff921John Spurlock * It is assumed that this stream type is also tied to ringer mode changes. 9896d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent * @hide 9906d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent */ 991ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock public int getUiSoundsStreamType() { 9926d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent IAudioService service = getService(); 9936d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent try { 994ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock return service.getUiSoundsStreamType(); 9956d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent } catch (RemoteException e) { 996f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 9976d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent } 9986d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent } 9996d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent 10006d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent /** 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the ringer mode. 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Silent mode will mute the volume and will not vibrate. Vibrate mode will 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mute the volume and vibrate. Normal mode will be audible and may vibrate 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * according to user settings. 1006ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 1007ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 100848034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynolds * * <p>From N onward, ringer mode adjustments that would toggle Do Not Disturb are not allowed 100948034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynolds * unless the app has been granted Do Not Disturb Access. 101048034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynolds * See {@link NotificationManager#isNotificationPolicyAccessGranted()}. 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ringerMode The ringer mode, one of {@link #RINGER_MODE_NORMAL}, 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}. 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 1014ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRingerMode(int ringerMode) { 101772668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent if (!isValidRingerMode(ringerMode)) { 101872668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent return; 101972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 102229f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen service.setRingerModeExternal(ringerMode, getContext().getOpPackageName()); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1024f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the volume index for a particular stream. 1030ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 1031ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 103248034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynolds * <p>From N onward, volume adjustments that would toggle Do Not Disturb are not allowed unless 103348034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynolds * the app has been granted Do Not Disturb Access. 103448034f89b75ecfa4871855afd7b4f701ff927d28Julia Reynolds * See {@link NotificationManager#isNotificationPolicyAccessGranted()}. 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream whose volume index should be set. 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The volume index to set. See 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getStreamMaxVolume(int)} for the largest valid value. 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamMaxVolume(int) 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamVolume(int) 1041ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStreamVolume(int streamType, int index, int flags) { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10468dc50416a209e76bca38694d59d5779ffcf08d92Marco Nelissen service.setStreamVolume(streamType, index, flags, getContext().getOpPackageName()); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1048f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10534197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * Solo or unsolo a particular stream. 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 10554197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * Do not use. This method has been deprecated and is now a no-op. 10564197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #requestAudioFocus} should be used for exclusive audio playback. 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream to be soloed/unsoloed. 10594197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @param state The required solo state: true for solo ON, false for solo 10604197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * OFF 1061ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 10624197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @deprecated Do not use. If you need exclusive audio playback use 10634197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #requestAudioFocus}. 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10654197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik @Deprecated 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStreamSolo(int streamType, boolean state) { 10674197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik Log.w(TAG, "setStreamSolo has been deprecated. Do not use."); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mute or unmute an audio stream. 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 10734197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method should only be used by applications that replace the 10744197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * platform-wide management of audio settings or the main telephony 10754197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * application. 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 10774197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method has no effect if the device implements a fixed volume policy 1078ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 10794197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <p> 10804197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * This method was deprecated in API level 22. Prior to API level 22 this 10814197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * method had significantly different behavior and should be used carefully. 10824197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * The following applies only to pre-22 platforms: 10834197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <ul> 10844197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <li>The mute command is protected against client process death: if a 10854197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * process with an active mute request on a stream dies, this stream will be 10864197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * unmuted automatically.</li> 10874197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <li>The mute requests for a given stream are cumulative: the AudioManager 10884197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * can receive several mute requests from one or more clients and the stream 10894197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * will be unmuted only when the same number of unmute requests are 10904197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * received.</li> 10914197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * <li>For a better user experience, applications MUST unmute a muted stream 10924197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * in onPause() and mute is again in onResume() if appropriate.</li> 10934197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * </ul> 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream to be muted/unmuted. 10964197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @param state The required mute state: true for mute ON, false for mute 10974197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * OFF 1098ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 10994197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @deprecated Use {@link #adjustStreamVolume(int, int, int)} with 11004197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * {@link #ADJUST_MUTE} or {@link #ADJUST_UNMUTE} instead. 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11024197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik @Deprecated 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStreamMute(int streamType, boolean state) { 11044197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik Log.w(TAG, "setStreamMute is deprecated. adjustStreamVolume should be used instead."); 11054197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik int direction = state ? ADJUST_MUTE : ADJUST_UNMUTE; 11064197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik if (streamType == AudioManager.USE_DEFAULT_STREAM_TYPE) { 11074197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik adjustSuggestedStreamVolume(direction, streamType, 0); 11084197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik } else { 11094197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik adjustStreamVolume(streamType, direction, 0); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11144197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * Returns the current mute state for a particular stream. 111525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * 11164197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @param streamType The stream to get mute state for. 11174197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @return The mute state for the given stream. 11184197cb60bc74629fe4c04ab10cb3b1c9a7427d24RoboErik * @see #adjustStreamVolume(int, int, int) 111925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent */ 112025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent public boolean isStreamMute(int streamType) { 112125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent IAudioService service = getService(); 112225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent try { 1123ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock return service.isStreamMute(streamType); 112425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } catch (RemoteException e) { 1125f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 112625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 112725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 112825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 112925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent /** 1130ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * get master mute state. 1131ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * 1132ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * @hide 1133ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood */ 1134ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public boolean isMasterMute() { 1135ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood IAudioService service = getService(); 1136ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood try { 1137ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood return service.isMasterMute(); 1138ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } catch (RemoteException e) { 1139f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 1140ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 1141ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 1142ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood 1143ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood /** 1144402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * forces the stream controlled by hard volume keys 1145402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * specifying streamType == -1 releases control to the 1146402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * logic. 1147402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * 1148402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * @hide 1149402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent */ 1150402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent public void forceVolumeControlStream(int streamType) { 115145c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent IAudioService service = getService(); 115245c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent try { 115345c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent service.forceVolumeControlStream(streamType, mICallBack); 115445c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent } catch (RemoteException e) { 1155f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 115645c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent } 1157402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent } 1158402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent 1159402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent /** 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether a particular type should vibrate according to user 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings and the current ringer mode. 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This shouldn't be needed by most clients that use notifications to 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate. The notification manager will not vibrate if the policy doesn't 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allow it, so the client should always set a vibrate pattern and let the 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notification manager control whether or not to actually vibrate. 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateType The type of vibrate. One of 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_NOTIFICATION} or 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_RINGER}. 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the type should vibrate at the instant this method is 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called. 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 1175cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 1176cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean shouldVibrate(int vibrateType) { 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.shouldVibrate(vibrateType); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1183f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether the user's vibrate setting for a vibrate type. 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This shouldn't be needed by most clients that want to vibrate, instead 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * see {@link #shouldVibrate(int)}. 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateType The type of vibrate. One of 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_NOTIFICATION} or 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_RINGER}. 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The vibrate setting, one of {@link #VIBRATE_SETTING_ON}, 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_OFF}, or 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_ONLY_SILENT}. 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 1201cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 1202cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getVibrateSetting(int vibrateType) { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.getVibrateSetting(vibrateType); 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1209f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the setting for when the vibrate type should vibrate. 1215fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1216fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1217fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateType The type of vibrate. One of 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_NOTIFICATION} or 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_RINGER}. 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateSetting The vibrate setting, one of 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_ON}, 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_OFF}, or 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_ONLY_SILENT}. 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 1228cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 1229cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVibrateSetting(int vibrateType, int vibrateSetting) { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.setVibrateSetting(vibrateType, vibrateSetting); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1236f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the speakerphone on or off. 1242fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1243fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1244fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param on set <var>true</var> to turn on speakerphone; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>false</var> to turn it off 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSpeakerphoneOn(boolean on){ 1250c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1251c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1252c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent service.setSpeakerphoneOn(on); 1253c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1254f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 1255a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether the speakerphone is on or off. 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if speakerphone is on, false if it's off 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isSpeakerphoneOn() { 1264c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1265c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1266c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent return service.isSpeakerphoneOn(); 1267c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1268f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 1269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12723def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent //==================================================================== 12733def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent // Bluetooth SCO control 12743def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 12753def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Sticky broadcast intent action indicating that the bluetoooth SCO audio 127695b88fbe744d8ce53b5f54f6fcd90c55094a8d14Eric Laurent * connection state has changed. The intent contains on extra {@link #EXTRA_SCO_AUDIO_STATE} 12773def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * indicating the new state which is either {@link #SCO_AUDIO_STATE_DISCONNECTED} 12783def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * or {@link #SCO_AUDIO_STATE_CONNECTED} 12793def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * 12803def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #startBluetoothSco() 1281dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * @deprecated Use {@link #ACTION_SCO_AUDIO_STATE_UPDATED} instead 12823def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 1283dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent @Deprecated 12843def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 12853def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final String ACTION_SCO_AUDIO_STATE_CHANGED = 12863def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent "android.media.SCO_AUDIO_STATE_CHANGED"; 1287dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent 1288dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent /** 1289dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Sticky broadcast intent action indicating that the bluetoooth SCO audio 1290dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * connection state has been updated. 1291dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>This intent has two extras: 1292dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1293dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #EXTRA_SCO_AUDIO_STATE} - The new SCO audio state. </li> 1294dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}- The previous SCO audio state. </li> 1295dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 1296dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p> EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE can be any of: 1297dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1298dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #SCO_AUDIO_STATE_DISCONNECTED}, </li> 1299dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #SCO_AUDIO_STATE_CONNECTING} or </li> 1300dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #SCO_AUDIO_STATE_CONNECTED}, </li> 1301dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 1302dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * @see #startBluetoothSco() 1303dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent */ 1304dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1305dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent public static final String ACTION_SCO_AUDIO_STATE_UPDATED = 1306dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent "android.media.ACTION_SCO_AUDIO_STATE_UPDATED"; 1307dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent 13083def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1309dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED} or 1310dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the new bluetooth SCO connection state. 13113def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13123def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final String EXTRA_SCO_AUDIO_STATE = 13133def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent "android.media.extra.SCO_AUDIO_STATE"; 13143def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 13153def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1316dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the previous 1317dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * bluetooth SCO connection state. 1318dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent */ 1319dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent public static final String EXTRA_SCO_AUDIO_PREVIOUS_STATE = 1320dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent "android.media.extra.SCO_AUDIO_PREVIOUS_STATE"; 1321dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent 1322dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent /** 1323dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE 1324dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * indicating that the SCO audio channel is not established 13253def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13263def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final int SCO_AUDIO_STATE_DISCONNECTED = 0; 13273def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1328dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} or {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE} 1329dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * indicating that the SCO audio channel is established 13303def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13313def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final int SCO_AUDIO_STATE_CONNECTED = 1; 13323def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1333dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE 1334dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * indicating that the SCO audio channel is being established 1335dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent */ 1336dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent public static final int SCO_AUDIO_STATE_CONNECTING = 2; 1337dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent /** 1338dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra EXTRA_SCO_AUDIO_STATE indicating that 13393def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * there was an error trying to obtain the state 13403def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13413def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final int SCO_AUDIO_STATE_ERROR = -1; 13423def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 13433def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 13443def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 13453def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Indicates if current platform supports use of SCO for off call use cases. 13463def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Application wanted to use bluetooth SCO audio when the phone is not in call 13472ac2afeac989ea1dc326b0db996d6c6c8e00cc29Jean-Michel Trivi * must first call this method to make sure that the platform supports this 13483def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * feature. 13493def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @return true if bluetooth SCO can be used for audio when not in call 13503def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * false otherwise 13513def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #startBluetoothSco() 13523def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13533def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public boolean isBluetoothScoAvailableOffCall() { 135429f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen return getContext().getResources().getBoolean( 13553def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent com.android.internal.R.bool.config_bluetooth_sco_off_call); 13563def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 13573def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 13583def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 13593def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Start bluetooth SCO audio connection. 13603def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Requires Permission: 13613def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. 13623def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>This method can be used by applications wanting to send and received audio 13633def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * to/from a bluetooth SCO headset while the phone is not in call. 13643def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>As the SCO connection establishment can take several seconds, 13653def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * applications should not rely on the connection to be available when the method 1366dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * returns but instead register to receive the intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} 13673def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * and wait for the state to be {@link #SCO_AUDIO_STATE_CONNECTED}. 1368dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>As the ACTION_SCO_AUDIO_STATE_UPDATED intent is sticky, the application can check the SCO 1369dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * audio state before calling startBluetoothSco() by reading the intent returned by the receiver 1370dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * registration. If the state is already CONNECTED, no state change will be received via the 1371dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * intent after calling startBluetoothSco(). It is however useful to call startBluetoothSco() 1372dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * so that the connection stays active in case the current initiator stops the connection. 1373dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>Unless the connection is already active as described above, the state will always 1374dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * transition from DISCONNECTED to CONNECTING and then either to CONNECTED if the connection 1375dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * succeeds or back to DISCONNECTED if the connection fails (e.g no headset is connected). 1376dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>When finished with the SCO connection or if the establishment fails, the application must 1377dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * call {@link #stopBluetoothSco()} to clear the request and turn down the bluetooth connection. 13783def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Even if a SCO connection is established, the following restrictions apply on audio 13793def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * output streams so that they can be routed to SCO headset: 1380dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1381dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the stream type must be {@link #STREAM_VOICE_CALL} </li> 1382dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the format must be mono </li> 1383dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the sampling must be 16kHz or 8kHz </li> 1384dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 13853def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>The following restrictions apply on input streams: 1386dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1387dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the format must be mono </li> 1388dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the sampling must be 8kHz </li> 1389dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 13903def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Note that the phone application always has the priority on the usage of the SCO 13913def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * connection for telephony. If this method is called while the phone is in call 13923def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * it will be ignored. Similarly, if a call is received or sent while an application 13933def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * is using the SCO connection, the connection will be lost for the application and NOT 13943def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * returned automatically when the call ends. 139583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * <p>NOTE: up to and including API version 139683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}, this method initiates a virtual 139783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * voice call to the bluetooth headset. 139883900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * After API version {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} only a raw SCO audio 139983900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * connection is established. 14003def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #stopBluetoothSco() 1401dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * @see #ACTION_SCO_AUDIO_STATE_UPDATED 14023def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 14033def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public void startBluetoothSco(){ 14043def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent IAudioService service = getService(); 14053def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent try { 1406926ebb860a8b5cbdec17f07404272be7c484fd79Marco Nelissen service.startBluetoothSco(mICallBack, 140729f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen getContext().getApplicationInfo().targetSdkVersion); 14083def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } catch (RemoteException e) { 1409f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 14103def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14113def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14123def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 14133def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 14140daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi * @hide 141583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * Start bluetooth SCO audio connection in virtual call mode. 141683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * <p>Requires Permission: 141783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. 141883900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * <p>Similar to {@link #startBluetoothSco()} with explicit selection of virtual call mode. 141983900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * Telephony and communication applications (VoIP, Video Chat) should preferably select 142083900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * virtual call mode. 142183900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * Applications using voice input for search or commands should first try raw audio connection 142283900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * with {@link #startBluetoothSco()} and fall back to startBluetoothScoVirtualCall() in case of 142383900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * failure. 142483900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * @see #startBluetoothSco() 142583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * @see #stopBluetoothSco() 142683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * @see #ACTION_SCO_AUDIO_STATE_UPDATED 142783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent */ 142883900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent public void startBluetoothScoVirtualCall() { 142983900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent IAudioService service = getService(); 143083900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent try { 143183900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent service.startBluetoothScoVirtualCall(mICallBack); 143283900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent } catch (RemoteException e) { 1433f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 143483900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent } 143583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent } 143683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent 143783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent /** 14383def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Stop bluetooth SCO audio connection. 14393def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Requires Permission: 14403def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. 14413def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>This method must be called by applications having requested the use of 14420daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi * bluetooth SCO audio with {@link #startBluetoothSco()} when finished with the SCO 14430daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi * connection or if connection fails. 14443def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #startBluetoothSco() 14453def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 14460daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi // Also used for connections started with {@link #startBluetoothScoVirtualCall()} 14473def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public void stopBluetoothSco(){ 14483def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent IAudioService service = getService(); 14493def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent try { 14503def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent service.stopBluetoothSco(mICallBack); 14513def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } catch (RemoteException e) { 1452f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 14533def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14543def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14553def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Request use of Bluetooth SCO headset for communications. 1458fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1459fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1460fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @param on set <var>true</var> to use bluetooth SCO for communications; 1463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * <var>false</var> to not use bluetooth SCO for communications 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBluetoothScoOn(boolean on){ 1466c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1467c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1468c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent service.setBluetoothScoOn(on); 1469c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1470f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 1471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1475a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Checks whether communications use Bluetooth SCO. 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @return true if SCO is used for communications; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if otherwise 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBluetoothScoOn() { 1481c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1482c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1483c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent return service.isBluetoothScoOn(); 1484c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1485f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 1486a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1490242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * @param on set <var>true</var> to route A2DP audio to/from Bluetooth 1491242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * headset; <var>false</var> disable A2DP audio 1492a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @deprecated Do not use. 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1494a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public void setBluetoothA2dpOn(boolean on){ 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1498242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * Checks whether A2DP audio routing to the Bluetooth headset is on or off. 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1500242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * @return true if A2DP audio is being routed to/from Bluetooth headset; 1501242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * false if otherwise 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBluetoothA2dpOn() { 1504242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP,"") 15059656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent == AudioSystem.DEVICE_STATE_AVAILABLE) { 15069656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent return true; 15079656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent } else if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES,"") 15089656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent == AudioSystem.DEVICE_STATE_AVAILABLE) { 15099656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent return true; 15109656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent } else if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER,"") 15119656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent == AudioSystem.DEVICE_STATE_AVAILABLE) { 1512242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent return true; 1513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 15149656df2b2ec70b2b0e0b644dd380c2f402fb6aa8Eric Laurent return false; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets audio routing to the wired headset on or off. 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param on set <var>true</var> to route audio to/from wired 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * headset; <var>false</var> disable wired headset audio 1522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @deprecated Do not use. 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public void setWiredHeadsetOn(boolean on){ 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1528497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * Checks whether a wired headset is connected or not. 1529497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * <p>This is not a valid indication that audio playback is 1530497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * actually over the wired headset as audio routing depends on other conditions. 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1532497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * @return true if a wired headset is connected. 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if otherwise 1534497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * @deprecated Use only to check is a headset is connected or not. 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWiredHeadsetOn() { 15378b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET,"") 15386015a9715421a339c2b7bb63f9166504e3488179Eric Laurent == AudioSystem.DEVICE_STATE_UNAVAILABLE && 15398b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE,"") 1540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent == AudioSystem.DEVICE_STATE_UNAVAILABLE) { 1541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 1542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 1543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 1544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the microphone mute on or off. 1549fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1550fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1551fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param on set <var>true</var> to mute the microphone; 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>false</var> to turn mute off 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 155670e0c58c2269cd29dfd6420d690da13dc03fd457Kenny Guy public void setMicrophoneMute(boolean on) { 155722c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier IAudioService service = getService(); 155822c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier try { 155970e0c58c2269cd29dfd6420d690da13dc03fd457Kenny Guy service.setMicrophoneMute(on, getContext().getOpPackageName(), 156070e0c58c2269cd29dfd6420d690da13dc03fd457Kenny Guy UserHandle.getCallingUserId()); 156122c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier } catch (RemoteException e) { 1562f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 156322c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier } 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether the microphone mute is on or off. 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if microphone is muted, false if it's not 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isMicrophoneMute() { 1572a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return AudioSystem.isMicrophoneMuted(); 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the audio mode. 1577fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1578fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * The audio mode encompasses audio routing AND the behavior of 1579fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * the telephony layer. Therefore this method should only be used by applications that 1580fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * replace the platform-wide management of audio settings or the main telephony application. 1581fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * In particular, the {@link #MODE_IN_CALL} mode should only be used by the telephony 1582fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * application when it places a phone call, as it will cause signals from the radio layer 1583fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * to feed the platform mixer. 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15858aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * @param mode the requested audio mode ({@link #MODE_NORMAL}, {@link #MODE_RINGTONE}, 15868aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * {@link #MODE_IN_CALL} or {@link #MODE_IN_COMMUNICATION}). 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Informs the HAL about the current audio state so that 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it can route the audio appropriately. 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMode(int mode) { 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1593a80ac05f85962949d5072831200d86a7023575fbMarco Nelissen service.setMode(mode, mICallBack, mApplicationContext.getOpPackageName()); 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1595f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current audio mode. 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16028aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * @return the current audio mode ({@link #MODE_NORMAL}, {@link #MODE_RINGTONE}, 16038aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * {@link #MODE_IN_CALL} or {@link #MODE_IN_COMMUNICATION}). 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current current audio state from the HAL. 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMode() { 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.getMode(); 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1611f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* modes for setMode/getMode/setRoute/getRoute */ 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Audio harware modes. 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Invalid audio mode. 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_INVALID = AudioSystem.MODE_INVALID; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Current audio mode. Used to apply audio routing to current mode. 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_CURRENT = AudioSystem.MODE_CURRENT; 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normal audio mode: not ringing and no call established. 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_NORMAL = AudioSystem.MODE_NORMAL; 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringing audio mode. An incoming is being signaled. 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE; 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16368f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi * In call audio mode. A telephony call is established. 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL; 16398f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi /** 16408f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi * In communication audio mode. An audio/video chat or VoIP call is established. 16418f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi */ 16428f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi public static final int MODE_IN_COMMUNICATION = AudioSystem.MODE_IN_COMMUNICATION; 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Routing bits for setRouting/getRouting API */ 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to earpiece 16474a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16484a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_EARPIECE = AudioSystem.ROUTE_EARPIECE; 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16524a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * Routing audio output to speaker 16534a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16544a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_SPEAKER = AudioSystem.ROUTE_SPEAKER; 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated use {@link #ROUTE_BLUETOOTH_SCO} 16594a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16604a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated public static final int ROUTE_BLUETOOTH = AudioSystem.ROUTE_BLUETOOTH_SCO; 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to bluetooth SCO 16654a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16664a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1668a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_BLUETOOTH_SCO = AudioSystem.ROUTE_BLUETOOTH_SCO; 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to headset 16714a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16724a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1674a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_HEADSET = AudioSystem.ROUTE_HEADSET; 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to bluetooth A2DP 16774a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16784a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_BLUETOOTH_A2DP = AudioSystem.ROUTE_BLUETOOTH_A2DP; 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used for mask parameter of {@link #setRouting(int,int,int)}. 16834a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 16844a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_ALL = AudioSystem.ROUTE_ALL; 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the audio routing for a specified mode 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode audio mode to change route. E.g., MODE_RINGTONE. 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param routes bit vector of routes requested, created from one or 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more of ROUTE_xxx types. Set bits indicate that route should be on 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mask bit vector of routes to change, created from one or more of 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ROUTE_xxx types. Unset bits indicate the route should be left unchanged 1696b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * 1697b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 1698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * setBluetoothScoOn() methods instead. 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRouting(int mode, int routes, int mask) { 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current audio routing bit vector for a specified mode. 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode audio mode to get route (e.g., MODE_RINGTONE) 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an audio route bit vector that can be compared with ROUTE_xxx 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bits 1710b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * @deprecated Do not query audio routing directly, use isSpeakerphoneOn(), 1711b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * isBluetoothScoOn(), isBluetoothA2dpOn() and isWiredHeadsetOn() methods instead. 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1713b9c9d260f21b321527c4622a123af9767630d94dEric Laurent @Deprecated 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRouting(int mode) { 1715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return -1; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether any music is active. 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if any music tracks are active. 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isMusicActive() { 172425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return AudioSystem.isStreamActive(STREAM_MUSIC, 0); 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17273114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi /** 17283114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * @hide 1729679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * Checks whether any music or media is actively playing on a remote device (e.g. wireless 1730679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * display). Note that BT audio sinks are not considered remote devices. 1731679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * @return true if {@link AudioManager#STREAM_MUSIC} is active on a remote device 1732679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi */ 1733679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi public boolean isMusicActiveRemotely() { 1734679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi return AudioSystem.isStreamActiveRemotely(STREAM_MUSIC, 0); 1735679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi } 1736679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi 1737679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi /** 1738679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * @hide 17392380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * Checks whether the current audio focus is exclusive. 17402380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * @return true if the top of the audio focus stack requested focus 17412380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * with {@link #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} 17422380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi */ 17432380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi public boolean isAudioFocusExclusive() { 17442380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi IAudioService service = getService(); 17452380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi try { 17462380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi return service.getCurrentAudioFocus() == AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE; 17472380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi } catch (RemoteException e) { 1748f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 17492380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi } 17502380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi } 17512380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi 17522380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi /** 17538a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi * Return a new audio session identifier not associated with any player or effect. 17549e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * An audio session identifier is a system wide unique identifier for a set of audio streams 17559e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * (one or more mixed together). 17569e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * <p>The primary use of the audio session ID is to associate audio effects to audio players, 17579e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * such as {@link MediaPlayer} or {@link AudioTrack}: all audio effects sharing the same audio 17589e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * session ID will be applied to the mixed audio content of the players that share the same 17599e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * audio session. 17609e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * <p>This method can for instance be used when creating one of the 17619e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * {@link android.media.audiofx.AudioEffect} objects to define the audio session of the effect, 17629e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * or to specify a session for a speech synthesis utterance 17639e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * in {@link android.speech.tts.TextToSpeech.Engine}. 17648a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi * @return a new unclaimed and unused audio session identifier, or {@link #ERROR} when the 17659e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * system failed to generate a new session, a condition in which audio playback or recording 17669e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * will subsequently fail as well. 17678a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi */ 1768289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi public int generateAudioSessionId() { 17698a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi int session = AudioSystem.newAudioSessionId(); 17708a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi if (session > 0) { 17718a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi return session; 17728a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi } else { 1773289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi Log.e(TAG, "Failure to generate a new audio session ID"); 17748a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi return ERROR; 17758a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi } 17768a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi } 17778a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi 1778289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi /** 1779289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * A special audio session ID to indicate that the audio session ID isn't known and the 1780289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * framework should generate a new value. This can be used when building a new 1781289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * {@link AudioTrack} instance with 1782289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}. 1783289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi */ 1784289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi public static final int AUDIO_SESSION_ID_GENERATE = AudioSystem.AUDIO_SESSION_ALLOCATE; 1785289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi 17868a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets a generic audio configuration parameter. The use of these parameters 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are platform dependant, see libaudio 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ** Temporary interface - DO NOT USE 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Replace with a more generic key:value get/set mechanism 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * param key name of parameter to set. Must not be null. 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * param value value of parameter. Must not be null. 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1800ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn * @deprecated Use {@link #setParameters(String)} instead 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1802a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public void setParameter(String key, String value) { 1803a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent setParameters(key+"="+value); 1804a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 1805a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1806a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** 1807a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Sets a variable number of parameter values to audio hardware. 1808a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 1809a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @param keyValuePairs list of parameters key value pairs in the form: 1810a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * key1=value1;key2=value2;... 1811a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 1812a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent */ 1813a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public void setParameters(String keyValuePairs) { 1814a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem.setParameters(keyValuePairs); 1815a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 1816a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1817a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** 1818aac753dcf8862b416773eabaabb9d938a30f5896John Spurlock * Gets a variable number of parameter values from audio hardware. 1819a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 1820a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @param keys list of parameters 1821a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @return list of parameters key value pairs in the form: 1822a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * key1=value1;key2=value2;... 1823a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent */ 1824a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public String getParameters(String keys) { 1825a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return AudioSystem.getParameters(keys); 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Sound effect identifiers */ 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Keyboard and direction pad click sound 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEY_CLICK = 0; 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved up 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_UP = 1; 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved down 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_DOWN = 2; 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved left 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_LEFT = 3; 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved right 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_RIGHT = 4; 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME standard keypress sound 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_STANDARD = 5; 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME spacebar keypress sound 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_SPACEBAR = 6; 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME delete keypress sound 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_DELETE = 7; 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME return_keypress sound 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_RETURN = 8; 1874cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh 1875cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh /** 1876cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * Invalid keypress sound 1877cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * @see #playSoundEffect(int) 1878cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh */ 1879cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh public static final int FX_KEYPRESS_INVALID = 9; 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide Number of sound effects 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1883cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh public static final int NUM_SOUND_EFFECTS = 10; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Plays a sound effect (Key clicks, lid open/close...) 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param effectType The type of sound effect. One of 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_KEY_CLICK}, 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_UP}, 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_DOWN}, 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_LEFT}, 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_RIGHT}, 1893105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_STANDARD}, 1894105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_SPACEBAR}, 1895105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_DELETE}, 1896105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_RETURN}, 1897cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * {@link #FX_KEYPRESS_INVALID}, 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: This version uses the UI settings to determine 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether sounds are heard or not. 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void playSoundEffect(int effectType) { 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19060c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk if (!querySoundEffectsEnabled(Process.myUserHandle().getIdentifier())) { 19070c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk return; 19080c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19090c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk 19100c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk IAudioService service = getService(); 19110c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk try { 19120c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk service.playSoundEffect(effectType); 19130c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } catch (RemoteException e) { 1914f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 19150c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19160c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19170c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk 19180c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk /** 19190c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * Plays a sound effect (Key clicks, lid open/close...) 19200c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * @param effectType The type of sound effect. One of 19210c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEY_CLICK}, 19220c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_UP}, 19230c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_DOWN}, 19240c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_LEFT}, 19250c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_RIGHT}, 19260c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_STANDARD}, 19270c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_SPACEBAR}, 19280c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_DELETE}, 19290c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_RETURN}, 19300c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_INVALID}, 19310c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * @param userId The current user to pull sound settings from 19320c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * NOTE: This version uses the UI settings to determine 19330c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * whether sounds are heard or not. 19340c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * @hide 19350c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk */ 19360c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk public void playSoundEffect(int effectType, int userId) { 19370c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { 19380c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk return; 19390c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19400c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk 19410c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk if (!querySoundEffectsEnabled(userId)) { 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.playSoundEffect(effectType); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1949f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Plays a sound effect (Key clicks, lid open/close...) 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param effectType The type of sound effect. One of 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_KEY_CLICK}, 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_UP}, 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_DOWN}, 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_LEFT}, 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_RIGHT}, 1961105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_STANDARD}, 1962105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_SPACEBAR}, 1963105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_DELETE}, 1964105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_RETURN}, 1965cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * {@link #FX_KEYPRESS_INVALID}, 1966a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent * @param volume Sound effect volume. 1967a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent * The volume value is a raw scalar so UI controls should be scaled logarithmically. 1968a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent * If a volume of -1 is specified, the AudioManager.STREAM_MUSIC stream volume minus 3dB will be used. 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: This version is for applications that have their own 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings panel for enabling and controlling volume. 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void playSoundEffect(int effectType, float volume) { 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.playSoundEffectVolume(effectType, volume); 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1981f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Settings has an in memory cache, so this is fast. 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19880c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk private boolean querySoundEffectsEnabled(int user) { 198929f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen return Settings.System.getIntForUser(getContext().getContentResolver(), 19900c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0; 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load Sound effects. 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method must be called when sound effects are enabled. 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void loadSoundEffects() { 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.loadSoundEffects(); 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2003f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unload Sound effects. 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method can be called to free some memory when 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sound effects are disabled. 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unloadSoundEffects() { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.unloadSoundEffects(); 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2017f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20214050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent /** 20222380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * @hide 20232380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * Used to indicate no audio focus has been gained or lost. 20242380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi */ 20252380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi public static final int AUDIOFOCUS_NONE = 0; 20262380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi 20272380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi /** 2028d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Used to indicate a gain of audio focus, or a request of audio focus, of unknown duration. 20297f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2030d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 2031d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2032d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_GAIN = 1; 2033d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2034d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Used to indicate a temporary gain or request of audio focus, anticipated to last a short 2035d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * amount of time. Examples of temporary changes are the playback of driving directions, or an 2036d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * event notification. 20377f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2038d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 2039d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2040d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2; 2041078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 2042078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a temporary request of audio focus, anticipated to last a short 2043983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * amount of time, and where it is acceptable for other audio applications to keep playing 2044983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * after having lowered their output level (also referred to as "ducking"). 2045078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Examples of temporary changes are the playback of driving directions where playback of music 2046078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * in the background is acceptable. 20477f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2048078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 2049078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2050078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = 3; 2051078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 20522380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * Used to indicate a temporary request of audio focus, anticipated to last a short 20532380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * amount of time, during which no other applications, or system components, should play 20542380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * anything. Examples of exclusive and transient audio focus requests are voice 20552380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * memo recording and speech recognition, during which the system shouldn't play any 20562380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * notifications, and media playback should have paused. 20572380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 20582380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi */ 20592380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi public static final int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE = 4; 20602380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi /** 2061078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a loss of audio focus of unknown duration. 20627f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2063078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2064078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_LOSS = -1 * AUDIOFOCUS_GAIN; 2065078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 2066078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a transient loss of audio focus. 20677f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2068078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2069078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_LOSS_TRANSIENT = -1 * AUDIOFOCUS_GAIN_TRANSIENT; 2070078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 2071078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a transient loss of audio focus where the loser of the audio focus can 2072983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * lower its output volume if it wants to continue playing (also referred to as "ducking"), as 2073983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * the new focus owner doesn't require others to be silent. 20747f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2075078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2076078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = 2077078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi -1 * AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK; 2078d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2079d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2080d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Interface definition for a callback to be invoked when the audio focus of the system is 2081d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * updated. 2082d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2083d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public interface OnAudioFocusChangeListener { 2084d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2085d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Called on the listener to notify it the audio focus for this listener has been changed. 2086d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * The focusChange value indicates whether the focus was gained, 2087d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * whether the focus was lost, and whether that loss is transient, or whether the new focus 2088d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * holder will hold it for an unknown amount of time. 2089983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * When losing focus, listeners can use the focus change information to decide what 2090983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * behavior to adopt when losing focus. A music player could for instance elect to lower 2091983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * the volume of its music stream (duck) for transient focus losses, and pause otherwise. 2092983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * @param focusChange the type of focus change, one of {@link AudioManager#AUDIOFOCUS_GAIN}, 2093078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * {@link AudioManager#AUDIOFOCUS_LOSS}, {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT} 2094983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * and {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}. 2095d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 20967f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi public void onAudioFocusChange(int focusChange); 2097d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2098d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2099d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2100d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Map to convert focus event listener IDs, as used in the AudioService audio focus stack, 2101d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * to actual listener objects. 2102d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 210330c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final HashMap<String, OnAudioFocusChangeListener> mAudioFocusIdListenerMap = 2104d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi new HashMap<String, OnAudioFocusChangeListener>(); 2105d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2106d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Lock to prevent concurrent changes to the list of focus listeners for this AudioManager 2107d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * instance. 2108d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2109d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private final Object mFocusListenerLock = new Object(); 2110d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2111d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private OnAudioFocusChangeListener findFocusListener(String id) { 2112d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi return mAudioFocusIdListenerMap.get(id); 2113d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2114d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2115d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 21163b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi * Handler for events (audio focus change, recording config change) coming from the 21173b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi * audio service. 2118d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 21193b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi private final ServiceEventHandlerDelegate mServiceEventHandlerDelegate = 2120b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi new ServiceEventHandlerDelegate(null); 2121078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi 2122d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 21233b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi * Event types 2124d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 21253b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi private final static int MSSG_FOCUS_CHANGE = 0; 21263b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi private final static int MSSG_RECORDING_CONFIG_CHANGE = 1; 21273b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi 21283b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi /** 21293b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi * Helper class to handle the forwarding of audio service events to the appropriate listener 21303b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi */ 21313b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi private class ServiceEventHandlerDelegate { 2132d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private final Handler mHandler; 2133d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2134b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi ServiceEventHandlerDelegate(Handler handler) { 2135d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi Looper looper; 2136b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (handler == null) { 2137b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if ((looper = Looper.myLooper()) == null) { 2138b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi looper = Looper.getMainLooper(); 2139b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2140b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } else { 2141b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi looper = handler.getLooper(); 2142d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2143d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2144d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi if (looper != null) { 21453b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi // implement the event handler delegate to receive events from audio service 2146d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi mHandler = new Handler(looper) { 2147d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi @Override 2148d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void handleMessage(Message msg) { 21493b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi switch (msg.what) { 21503b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi case MSSG_FOCUS_CHANGE: 21513b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi OnAudioFocusChangeListener listener = null; 21523b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi synchronized(mFocusListenerLock) { 21533b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi listener = findFocusListener((String)msg.obj); 21543b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi } 21553b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi if (listener != null) { 21563b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi Log.d(TAG, "AudioManager dispatching onAudioFocusChange(" 2157449362e065a1715a5a3380acc5d9a479790fcdfaJean-Michel Trivi + msg.arg1 + ") for " + msg.obj); 21583b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi listener.onAudioFocusChange(msg.arg1); 21593b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi } 21603b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi break; 21613b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi case MSSG_RECORDING_CONFIG_CHANGE: 216228ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi final RecordConfigChangeCallbackData cbData = 216328ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi (RecordConfigChangeCallbackData) msg.obj; 216428ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi if (cbData.mCb != null) { 2165e6a505b775420841ed0eefcaac156693c7845cdcJean-Michel Trivi cbData.mCb.onRecordingConfigChanged(cbData.mConfigs); 2166d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 21673b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi break; 21683b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi default: 21693b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi Log.e(TAG, "Unknown event " + msg.what); 2170d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2171d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2172d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi }; 2173d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } else { 2174d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi mHandler = null; 2175d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2176d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2177d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2178d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi Handler getHandler() { 2179d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return mHandler; 2180d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2181d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2182d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 218330c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final IAudioFocusDispatcher mAudioFocusDispatcher = new IAudioFocusDispatcher.Stub() { 2184d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2185d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void dispatchAudioFocusChange(int focusChange, String id) { 2186d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final Message m = mServiceEventHandlerDelegate.getHandler().obtainMessage( 21873b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi MSSG_FOCUS_CHANGE/*what*/, focusChange/*arg1*/, 0/*arg2 ignored*/, id/*obj*/); 21883b61d2dfe37898072c227013d427ce69f9158eabJean-Michel Trivi mServiceEventHandlerDelegate.getHandler().sendMessage(m); 2189d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2190d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2191d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi }; 2192d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2193d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi private String getIdForAudioFocusListener(OnAudioFocusChangeListener l) { 2194d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi if (l == null) { 2195308e9a5d0975489982f93fd1f3728e6ed7a778d0Jean-Michel Trivi return new String(this.toString()); 2196d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } else { 2197d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return new String(this.toString() + l.toString()); 2198d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2199d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2200d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2201d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 22025f53f0883a507b9d4b9b9891af560a64f746d149Xavier Ducrohet * @hide 220346b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Registers a listener to be called when audio focus changes. Calling this method is optional 220446b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * before calling {@link #requestAudioFocus(OnAudioFocusChangeListener, int, int)}, as it 220546b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * will register the listener as well if it wasn't registered already. 220646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param l the listener to be notified of audio focus changes. 2207d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2208d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void registerAudioFocusListener(OnAudioFocusChangeListener l) { 2209d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi synchronized(mFocusListenerLock) { 2210d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi if (mAudioFocusIdListenerMap.containsKey(getIdForAudioFocusListener(l))) { 2211d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return; 2212d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2213d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi mAudioFocusIdListenerMap.put(getIdForAudioFocusListener(l), l); 2214d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2215d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2216d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2217d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 22185f53f0883a507b9d4b9b9891af560a64f746d149Xavier Ducrohet * @hide 221946b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Causes the specified listener to not be called anymore when focus is gained or lost. 222046b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param l the listener to unregister. 2221d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2222d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void unregisterAudioFocusListener(OnAudioFocusChangeListener l) { 2223392a2bbb52688ebd25768a7784d9edca7f498110Jean-Michel Trivi 2224d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi // remove locally 2225d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi synchronized(mFocusListenerLock) { 2226d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi mAudioFocusIdListenerMap.remove(getIdForAudioFocusListener(l)); 2227d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2228d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2229d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2230d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2231d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 223246b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * A failed focus change request. 2233d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2234d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_REQUEST_FAILED = 0; 2235d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 223646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * A successful focus change request. 2237d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2238d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; 2239fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi /** 2240fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @hide 2241fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * A focus change request whose granting is delayed: the request was successful, but the 2242fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * requester will only be granted audio focus once the condition that prevented immediate 2243fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * granting has ended. 2244fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * See {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} 2245fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi */ 2246fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi public static final int AUDIOFOCUS_REQUEST_DELAYED = 2; 2247d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2248d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2249d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2250d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Request audio focus. 225146b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Send a request to obtain the audio focus 2252d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @param l the listener to be notified of audio focus changes 2253d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @param streamType the main audio stream type affected by the focus request 2254d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request 2255d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * is temporary, and focus will be abandonned shortly. Examples of transient requests are 2256078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * for the playback of driving directions, or notifications sounds. 2257983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for 2258983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * the previous focus owner to keep playing if it ducks its audio output. 22599171db279826ee91d64eb9538a504ffed5e53b38Jean-Michel Trivi * Alternatively use {@link #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} for a temporary request 22609171db279826ee91d64eb9538a504ffed5e53b38Jean-Michel Trivi * that benefits from the system not playing disruptive sounds like notifications, for 22619171db279826ee91d64eb9538a504ffed5e53b38Jean-Michel Trivi * usecases such as voice memo recording, or speech recognition. 2262078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such 2263d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * as the playback of a song or a video. 2264d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED} 2265d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2266d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) { 2267d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi int status = AUDIOFOCUS_REQUEST_FAILED; 2268fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi 2269fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi try { 2270fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi // status is guaranteed to be either AUDIOFOCUS_REQUEST_FAILED or 2271fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi // AUDIOFOCUS_REQUEST_GRANTED as focus is requested without the 2272fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi // AUDIOFOCUS_FLAG_DELAY_OK flag 2273fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi status = requestAudioFocus(l, 2274fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi new AudioAttributes.Builder() 2275fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi .setInternalLegacyStreamType(streamType).build(), 2276fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi durationHint, 2277fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi 0 /* flags, legacy behavior */); 2278fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi } catch (IllegalArgumentException e) { 2279fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi Log.e(TAG, "Audio focus request denied due to ", e); 2280fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi } 2281fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi 2282fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi return status; 2283fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi } 2284fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi 2285958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi // when adding new flags, add them to the relevant AUDIOFOCUS_FLAGS_APPS or SYSTEM masks 22860212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi /** 22870212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * @hide 22880212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * Use this flag when requesting audio focus to indicate it is ok for the requester to not be 22890212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * granted audio focus immediately (as indicated by {@link #AUDIOFOCUS_REQUEST_DELAYED}) when 22900212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * the system is in a state where focus cannot change, but be granted focus later when 22910212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * this condition ends. 22920212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi */ 2293958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi @SystemApi 2294fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi public static final int AUDIOFOCUS_FLAG_DELAY_OK = 0x1 << 0; 22950212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi /** 22960212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * @hide 22970212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * Use this flag when requesting audio focus to indicate that the requester 22980212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * will pause its media playback (if applicable) when losing audio focus with 22990212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * {@link #AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}, rather than ducking. 23000212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * <br>On some platforms, the ducking may be handled without the application being aware of it 23010212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * (i.e. it will not transiently lose focus). For applications that for instance play spoken 23020212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * content, such as audio book or podcast players, ducking may never be acceptable, and will 23030212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * thus always pause. This flag enables them to be declared as such whenever they request focus. 23040212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi */ 23050212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi @SystemApi 23060212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 0x1 << 1; 23070212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi /** 23080212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * @hide 23090212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * Use this flag to lock audio focus so granting is temporarily disabled. 23100212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * <br>This flag can only be used by owners of a registered 23110212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * {@link android.media.audiopolicy.AudioPolicy} in 23120212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int, AudioPolicy)} 23130212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi */ 2314958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi @SystemApi 23150212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi public static final int AUDIOFOCUS_FLAG_LOCK = 0x1 << 2; 2316958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi /** @hide */ 23170212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi public static final int AUDIOFOCUS_FLAGS_APPS = AUDIOFOCUS_FLAG_DELAY_OK 23180212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi | AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS; 2319958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi /** @hide */ 2320958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi public static final int AUDIOFOCUS_FLAGS_SYSTEM = AUDIOFOCUS_FLAG_DELAY_OK 23210212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi | AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS | AUDIOFOCUS_FLAG_LOCK; 2322fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi 2323fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi /** 2324fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @hide 2325958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * Request audio focus. 2326958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * Send a request to obtain the audio focus. This method differs from 2327958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, int, int)} in that it can express 2328958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * that the requester accepts delayed grants of audio focus. 2329fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @param l the listener to be notified of audio focus changes. It is not allowed to be null 2330fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * when the request is flagged with {@link #AUDIOFOCUS_FLAG_DELAY_OK}. 2331fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @param requestAttributes non null {@link AudioAttributes} describing the main reason for 2332fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * requesting audio focus. 2333fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request 2334fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * is temporary, and focus will be abandonned shortly. Examples of transient requests are 2335fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * for the playback of driving directions, or notifications sounds. 2336fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for 2337fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * the previous focus owner to keep playing if it ducks its audio output. 2338fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * Alternatively use {@link #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} for a temporary request 2339fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * that benefits from the system not playing disruptive sounds like notifications, for 2340fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * usecases such as voice memo recording, or speech recognition. 2341fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such 2342fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * as the playback of a song or a video. 23430212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * @param flags 0 or a combination of {link #AUDIOFOCUS_FLAG_DELAY_OK} 23440212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * and {@link #AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS}. 2345958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * <br>Use 0 when not using any flags for the request, which behaves like 2346958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, int, int)}, where either audio 2347958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * focus is granted immediately, or the grant request fails because the system is in a 2348958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * state where focus cannot change (e.g. a phone call). 2349fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @return {@link #AUDIOFOCUS_REQUEST_FAILED}, {@link #AUDIOFOCUS_REQUEST_GRANTED} 2350fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * or {@link #AUDIOFOCUS_REQUEST_DELAYED}. 2351fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * The return value is never {@link #AUDIOFOCUS_REQUEST_DELAYED} when focus is requested 2352fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * without the {@link #AUDIOFOCUS_FLAG_DELAY_OK} flag. 2353fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi * @throws IllegalArgumentException 2354fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi */ 2355958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi @SystemApi 2356fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi public int requestAudioFocus(OnAudioFocusChangeListener l, 2357958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi @NonNull AudioAttributes requestAttributes, 2358fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi int durationHint, 2359fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi int flags) throws IllegalArgumentException { 2360958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi if (flags != (flags & AUDIOFOCUS_FLAGS_APPS)) { 2361958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi throw new IllegalArgumentException("Invalid flags 0x" 2362958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi + Integer.toHexString(flags).toUpperCase()); 2363958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi } 2364958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi return requestAudioFocus(l, requestAttributes, durationHint, 2365958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi flags & AUDIOFOCUS_FLAGS_APPS, 2366958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi null /* no AudioPolicy*/); 2367958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi } 2368958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi 2369958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi /** 2370958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @hide 2371958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * Request or lock audio focus. 2372958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * This method is to be used by system components that have registered an 2373958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link android.media.audiopolicy.AudioPolicy} to request audio focus, but also to "lock" it 2374958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * so focus granting is temporarily disabled. 2375958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param l see the description of the same parameter in 2376958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} 2377958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param requestAttributes non null {@link AudioAttributes} describing the main reason for 2378958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * requesting audio focus. 2379958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param durationHint see the description of the same parameter in 2380958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} 2381958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param flags 0 or a combination of {link #AUDIOFOCUS_FLAG_DELAY_OK}, 23820212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi * {@link #AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS}, and {@link #AUDIOFOCUS_FLAG_LOCK}. 2383958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * <br>Use 0 when not using any flags for the request, which behaves like 2384958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, int, int)}, where either audio 2385958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * focus is granted immediately, or the grant request fails because the system is in a 2386958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * state where focus cannot change (e.g. a phone call). 2387958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param ap a registered {@link android.media.audiopolicy.AudioPolicy} instance when locking 2388958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * focus, or null. 2389958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @return see the description of the same return value in 2390958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} 2391958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @throws IllegalArgumentException 2392958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi */ 23931b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi @SystemApi 2394958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi public int requestAudioFocus(OnAudioFocusChangeListener l, 2395958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi @NonNull AudioAttributes requestAttributes, 2396958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi int durationHint, 2397958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi int flags, 2398958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi AudioPolicy ap) throws IllegalArgumentException { 2399fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi // parameter checking 2400fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi if (requestAttributes == null) { 2401fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioAttributes argument"); 2402fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi } 24032380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi if ((durationHint < AUDIOFOCUS_GAIN) || 24042380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi (durationHint > AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)) { 2405fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi throw new IllegalArgumentException("Invalid duration hint"); 2406fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi } 2407958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi if (flags != (flags & AUDIOFOCUS_FLAGS_SYSTEM)) { 2408fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi throw new IllegalArgumentException("Illegal flags 0x" 2409fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi + Integer.toHexString(flags).toUpperCase()); 241055d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi } 2411fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi if (((flags & AUDIOFOCUS_FLAG_DELAY_OK) == AUDIOFOCUS_FLAG_DELAY_OK) && (l == null)) { 2412fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi throw new IllegalArgumentException( 2413fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi "Illegal null focus listener when flagged as accepting delayed focus grant"); 2414fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi } 2415958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi if (((flags & AUDIOFOCUS_FLAG_LOCK) == AUDIOFOCUS_FLAG_LOCK) && (ap == null)) { 2416958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi throw new IllegalArgumentException( 2417958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi "Illegal null audio policy when locking audio focus"); 2418958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi } 2419fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi 2420fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi int status = AUDIOFOCUS_REQUEST_FAILED; 2421d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi registerAudioFocusListener(l); 2422d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi IAudioService service = getService(); 2423d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi try { 2424fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi status = service.requestAudioFocus(requestAttributes, durationHint, mICallBack, 24258f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi mAudioFocusDispatcher, getIdForAudioFocusListener(l), 242629f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen getContext().getOpPackageName() /* package name */, flags, 24270212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi ap != null ? ap.cb() : null); 2428d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } catch (RemoteException e) { 2429f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2430d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2431d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return status; 2432d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2433d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 24344dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi /** 24354dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @hide 24364dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * Used internally by telephony package to request audio focus. Will cause the focus request 24374dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * to be associated with the "voice communication" identifier only used in AudioService 24384dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * to identify this use case. 24394dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @param streamType use STREAM_RING for focus requests when ringing, VOICE_CALL for 24404dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * the establishment of the call 24414dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @param durationHint the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so 24424dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * media applications resume after a call 24434dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi */ 24444dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi public void requestAudioFocusForCall(int streamType, int durationHint) { 24454dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi IAudioService service = getService(); 24464dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi try { 2447fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi service.requestAudioFocus(new AudioAttributes.Builder() 2448fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi .setInternalLegacyStreamType(streamType).build(), 2449fd6ad747e6c268753d0edf7a5a59b6815b190854Jean-Michel Trivi durationHint, mICallBack, null, 24506156017c2217d0fbbbb03434986250ec6bbd69d8John Spurlock AudioSystem.IN_VOICE_COMM_FOCUS_ID, 245129f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen getContext().getOpPackageName(), 2452958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi AUDIOFOCUS_FLAG_LOCK, 2453958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi null /* policy token */); 24544dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } catch (RemoteException e) { 2455f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 24564dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 24574dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 24584dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi 24594dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi /** 24604dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @hide 24614dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * Used internally by telephony package to abandon audio focus, typically after a call or 24624dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * when ringing ends and the call is rejected or not answered. 24634dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * Should match one or more calls to {@link #requestAudioFocusForCall(int, int)}. 24644dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi */ 24654dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi public void abandonAudioFocusForCall() { 24664dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi IAudioService service = getService(); 24674dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi try { 24686156017c2217d0fbbbb03434986250ec6bbd69d8John Spurlock service.abandonAudioFocus(null, AudioSystem.IN_VOICE_COMM_FOCUS_ID, 2469958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi null /*AudioAttributes, legacy behavior*/); 24704dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } catch (RemoteException e) { 2471f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 24724dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 24734dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 2474d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2475d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 247646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Abandon audio focus. Causes the previous focus owner, if any, to receive focus. 247746b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param l the listener with which focus was requested. 2478d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED} 2479d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2480d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public int abandonAudioFocus(OnAudioFocusChangeListener l) { 2481958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi return abandonAudioFocus(l, null /*AudioAttributes, legacy behavior*/); 2482958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi } 2483958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi 2484958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi /** 2485958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @hide 2486958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * Abandon audio focus. Causes the previous focus owner, if any, to receive focus. 2487958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param l the listener with which focus was requested. 2488958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @param aa the {@link AudioAttributes} with which audio focus was requested 2489958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED} 2490958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi */ 2491958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi @SystemApi 2492958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi public int abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa) { 2493d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi int status = AUDIOFOCUS_REQUEST_FAILED; 2494392a2bbb52688ebd25768a7784d9edca7f498110Jean-Michel Trivi unregisterAudioFocusListener(l); 2495d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi IAudioService service = getService(); 2496d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi try { 2497d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi status = service.abandonAudioFocus(mAudioFocusDispatcher, 2498958876fe55ea0fdeb73c72240a2f2bab32833443Jean-Michel Trivi getIdForAudioFocusListener(l), aa); 2499d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } catch (RemoteException e) { 2500f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2501d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2502d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return status; 2503d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2504d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2505d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi //==================================================================== 2506d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi // Remote Control 2507d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi /** 250846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Register a component to be the sole receiver of MEDIA_BUTTON intents. 2509d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} 2510d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi * that will receive the media button intent. This broadcast receiver must be declared 2511f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * in the application manifest. The package of the component must match that of 2512f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * the context you're registering from. 2513b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead. 2514d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi */ 2515b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2516d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi public void registerMediaButtonEventReceiver(ComponentName eventReceiver) { 25178f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi if (eventReceiver == null) { 25188f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 25198f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 252029f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen if (!eventReceiver.getPackageName().equals(getContext().getPackageName())) { 2521f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Log.e(TAG, "registerMediaButtonEventReceiver() error: " + 2522f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi "receiver and context package names don't match"); 2523f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi return; 2524f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2525f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // construct a PendingIntent for the media button and register it 2526f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 2527f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // the associated intent will be handled by the component being registered 2528f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi mediaButtonIntent.setComponent(eventReceiver); 252929f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen PendingIntent pi = PendingIntent.getBroadcast(getContext(), 2530f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); 2531f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi registerMediaButtonIntent(pi, eventReceiver); 2532f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2533f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 2534f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi /** 2535961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * Register a component to be the sole receiver of MEDIA_BUTTON intents. This is like 2536961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * {@link #registerMediaButtonEventReceiver(android.content.ComponentName)}, but allows 2537961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * the buttons to go to any PendingIntent. Note that you should only use this form if 2538961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * you know you will continue running for the full time until unregistering the 2539961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * PendingIntent. 2540961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * @param eventReceiver target that will receive media button intents. The PendingIntent 2541b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * will be sent an {@link Intent#ACTION_MEDIA_BUTTON} event when a media button action 2542b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * occurs, with {@link Intent#EXTRA_KEY_EVENT} added and holding the key code of the 2543b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * media button that was pressed. 2544b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead. 2545961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn */ 2546b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2547961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn public void registerMediaButtonEventReceiver(PendingIntent eventReceiver) { 2548961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn if (eventReceiver == null) { 2549961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn return; 2550961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2551961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn registerMediaButtonIntent(eventReceiver, null); 2552961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2553961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn 2554961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn /** 2555f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * @hide 2556f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * no-op if (pi == null) or (eventReceiver == null) 2557f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi */ 2558f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi public void registerMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) { 2559961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn if (pi == null) { 2560f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Log.e(TAG, "Cannot call registerMediaButtonIntent() with a null parameter"); 2561f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi return; 2562f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 256329f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext()); 256429f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen helper.addMediaButtonListener(pi, eventReceiver, getContext()); 2565722b808662eb20fa91151f1e3aa05fd911d1d226Jean-Michel Trivi } 2566722b808662eb20fa91151f1e3aa05fd911d1d226Jean-Michel Trivi 2567722b808662eb20fa91151f1e3aa05fd911d1d226Jean-Michel Trivi /** 256846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Unregister the receiver of MEDIA_BUTTON intents. 256946b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} 257046b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * that was registered with {@link #registerMediaButtonEventReceiver(ComponentName)}. 2571b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 2572d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi */ 2573b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2574d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) { 25758f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi if (eventReceiver == null) { 25768f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 25778f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 2578f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // construct a PendingIntent for the media button and unregister it 2579f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 2580f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // the associated intent will be handled by the component being registered 2581f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi mediaButtonIntent.setComponent(eventReceiver); 258229f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen PendingIntent pi = PendingIntent.getBroadcast(getContext(), 2583f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); 2584b839b83c7349533b4cb7278fd3d792b47199ba36Jean-Michel Trivi unregisterMediaButtonIntent(pi); 2585f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2586f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 2587f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi /** 2588961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * Unregister the receiver of MEDIA_BUTTON intents. 2589961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * @param eventReceiver same PendingIntent that was registed with 2590961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * {@link #registerMediaButtonEventReceiver(PendingIntent)}. 2591b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 2592961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn */ 2593b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2594961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn public void unregisterMediaButtonEventReceiver(PendingIntent eventReceiver) { 2595961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn if (eventReceiver == null) { 2596961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn return; 2597961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2598b839b83c7349533b4cb7278fd3d792b47199ba36Jean-Michel Trivi unregisterMediaButtonIntent(eventReceiver); 2599961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2600961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn 2601961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn /** 2602f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * @hide 2603f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi */ 2604b839b83c7349533b4cb7278fd3d792b47199ba36Jean-Michel Trivi public void unregisterMediaButtonIntent(PendingIntent pi) { 260529f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext()); 2606430fc48865e5a371b08f180390946b96d73848feRoboErik helper.removeMediaButtonListener(pi); 2607d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi } 2608d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi 2609178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi /** 2610178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi * Registers the remote control client for providing information to display on the remote 2611178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi * controls. 2612466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * @param rcClient The remote control client from which remote controls will receive 2613466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * information to display. 2614466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * @see RemoteControlClient 2615b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 26168f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi */ 2617b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 26184426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi public void registerRemoteControlClient(RemoteControlClient rcClient) { 2619f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) { 26208f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 26218f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 262229f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen rcClient.registerWithSession(MediaSessionLegacyHelper.getHelper(getContext())); 26238f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 26248f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi 26258f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi /** 2626fcd693a21d862ea765006f8987b8dd4b125b28c5Jean-Michel Trivi * Unregisters the remote control client that was providing information to display on the 2627466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * remote controls. 2628466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * @param rcClient The remote control client to unregister. 26294426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi * @see #registerRemoteControlClient(RemoteControlClient) 2630b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 26318f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi */ 2632b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 26334426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi public void unregisterRemoteControlClient(RemoteControlClient rcClient) { 2634f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) { 26358f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 26368f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 263729f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen rcClient.unregisterWithSession(MediaSessionLegacyHelper.getHelper(getContext())); 26388f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 26398f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi 264044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi /** 2641a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * Registers a {@link RemoteController} instance for it to receive media 2642a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * metadata updates and playback state information from applications using 2643a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * {@link RemoteControlClient}, and control their playback. 2644a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * <p> 2645ee5ad729b90deff435f9875337cbc434be4f8fe7John Spurlock * Registration requires the {@link RemoteController.OnClientUpdateListener} listener to be 2646a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * one of the enabled notification listeners (see 2647f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi * {@link android.service.notification.NotificationListenerService}). 2648a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * 2649a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * @param rctlr the object to register. 2650a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * @return true if the {@link RemoteController} was successfully registered, 2651a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * false if an error occurred, due to an internal system error, or 2652a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * insufficient permissions. 2653b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use 2654a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * {@link MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, ComponentName)} 2655a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * and {@link MediaController} instead. 26567ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi */ 2657b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 26587ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi public boolean registerRemoteController(RemoteController rctlr) { 26597ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi if (rctlr == null) { 26607ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi return false; 26617ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 2662430fc48865e5a371b08f180390946b96d73848feRoboErik rctlr.startListeningToSessions(); 2663430fc48865e5a371b08f180390946b96d73848feRoboErik return true; 26647ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 26657ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi 26667ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi /** 2667a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * Unregisters a {@link RemoteController}, causing it to no longer receive 2668a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * media metadata and playback state information, and no longer be capable 2669a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * of controlling playback. 2670a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * 2671a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * @param rctlr the object to unregister. 2672b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use 2673a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * {@link MediaSessionManager#removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener)} 2674a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * instead. 26757ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi */ 2676b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 26777ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi public void unregisterRemoteController(RemoteController rctlr) { 26787ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi if (rctlr == null) { 26797ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi return; 26807ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 2681430fc48865e5a371b08f180390946b96d73848feRoboErik rctlr.stopListeningToSessions(); 26827ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 26837ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi 2684c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi 2685d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi //==================================================================== 2686d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi // Audio policy 2687c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi /** 2688a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @hide 2689a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * Register the given {@link AudioPolicy}. 2690a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * This call is synchronous and blocks until the registration process successfully completed 2691a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * or failed to complete. 26921b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi * @param policy the non-null {@link AudioPolicy} to register. 2693a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @return {@link #ERROR} if there was an error communicating with the registration service 2694a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * or if the user doesn't have the required 2695a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * {@link android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission, 2696a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * {@link #SUCCESS} otherwise. 2697a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi */ 26981b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi @SystemApi 26991b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi public int registerAudioPolicy(@NonNull AudioPolicy policy) { 2700a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi if (policy == null) { 2701a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioPolicy argument"); 2702a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2703a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi IAudioService service = getService(); 2704a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi try { 27050212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi String regId = service.registerAudioPolicy(policy.getConfig(), policy.cb(), 27060212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi policy.hasFocusListener()); 27078fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi if (regId == null) { 2708a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi return ERROR; 27098fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi } else { 27108fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi policy.setRegistration(regId); 2711a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 27128fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi // successful registration 2713a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } catch (RemoteException e) { 2714f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2715a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2716a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi return SUCCESS; 2717a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2718a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi 2719a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi /** 2720a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @hide 27211b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi * @param policy the non-null {@link AudioPolicy} to unregister. 2722a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi */ 27231b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi @SystemApi 27241b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi public void unregisterAudioPolicyAsync(@NonNull AudioPolicy policy) { 2725a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi if (policy == null) { 2726a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioPolicy argument"); 2727a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2728a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi IAudioService service = getService(); 2729a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi try { 27300212be5150fb9fb3c340f3c7e51f6126372cc6f9Jean-Michel Trivi service.unregisterAudioPolicyAsync(policy.cb()); 27311b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi policy.setRegistration(null); 2732a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } catch (RemoteException e) { 2733f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2734a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2735a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2736a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi 2737a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi 2738d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi //==================================================================== 2739d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi // Recording configuration 2740d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2741b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Interface for receiving update notifications about the recording configuration. Extend 2742b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * this abstract class and register it with 2743b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * {@link AudioManager#registerAudioRecordingCallback(AudioRecordingCallback, Handler)} 2744b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * to be notified. 2745598c0c9f659184971e974de6a0184a3000e7900cJean-Michel Trivi * Use {@link AudioManager#getActiveRecordingConfigurations()} to query the current 2746598c0c9f659184971e974de6a0184a3000e7900cJean-Michel Trivi * configuration. 27477872affa9689284eb02f019b6bf1900cf7d921e5Jean-Michel Trivi * @see AudioRecordingConfiguration 2748d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2749d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi public static abstract class AudioRecordingCallback { 2750d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2751b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Called whenever the device recording configuration has changed. 2752f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi * @param configs list containing the results of 2753598c0c9f659184971e974de6a0184a3000e7900cJean-Michel Trivi * {@link AudioManager#getActiveRecordingConfigurations()}. 2754d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2755f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {} 2756d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2757d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2758b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi private static class AudioRecordingCallbackInfo { 2759b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi final AudioRecordingCallback mCb; 2760b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi final Handler mHandler; 2761b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi AudioRecordingCallbackInfo(AudioRecordingCallback cb, Handler handler) { 2762b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi mCb = cb; 2763b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi mHandler = handler; 2764b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2765b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2766b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi 276728ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi private final static class RecordConfigChangeCallbackData { 276828ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi final AudioRecordingCallback mCb; 2769f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi final List<AudioRecordingConfiguration> mConfigs; 277028ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi 277128ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi RecordConfigChangeCallbackData(AudioRecordingCallback cb, 2772f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi List<AudioRecordingConfiguration> configs) { 277328ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi mCb = cb; 277428ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi mConfigs = configs; 277528ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi } 277628ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi } 277728ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi 2778d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2779b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Register a callback to be notified of audio recording changes through 2780b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * {@link AudioRecordingCallback} 2781b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * @param cb non-null callback to register 2782b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * @param handler the {@link Handler} object for the thread on which to execute 2783b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * the callback. If <code>null</code>, the {@link Handler} associated with the main 2784b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * {@link Looper} will be used. 2785d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2786b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi public void registerAudioRecordingCallback(@NonNull AudioRecordingCallback cb, Handler handler) 2787b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi { 2788d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi if (cb == null) { 2789d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioRecordingCallback argument"); 2790d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2791b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi 2792d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi synchronized(mRecordCallbackLock) { 2793d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi // lazy initialization of the list of recording callbacks 2794d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi if (mRecordCallbackList == null) { 2795b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi mRecordCallbackList = new ArrayList<AudioRecordingCallbackInfo>(); 2796d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2797d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final int oldCbCount = mRecordCallbackList.size(); 2798b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (!hasRecordCallback_sync(cb)) { 2799b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi mRecordCallbackList.add(new AudioRecordingCallbackInfo(cb, 2800b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi new ServiceEventHandlerDelegate(handler).getHandler())); 2801d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final int newCbCount = mRecordCallbackList.size(); 2802d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi if ((oldCbCount == 0) && (newCbCount > 0)) { 2803d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi // register binder for callbacks 2804d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final IAudioService service = getService(); 2805d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi try { 2806d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi service.registerRecordingCallback(mRecCb); 2807d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } catch (RemoteException e) { 2808f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2809d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2810d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2811d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } else { 2812d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi Log.w(TAG, "attempt to call registerAudioRecordingCallback() on a previously" 2813d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi + "registered callback"); 2814d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2815d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2816d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2817d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2818d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2819b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Unregister an audio recording callback previously registered with 2820b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * {@link #registerAudioRecordingCallback(AudioRecordingCallback, Handler)}. 2821b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * @param cb non-null callback to unregister 2822d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2823d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi public void unregisterAudioRecordingCallback(@NonNull AudioRecordingCallback cb) { 2824d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi if (cb == null) { 2825d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioRecordingCallback argument"); 2826d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2827d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi synchronized(mRecordCallbackLock) { 2828d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi if (mRecordCallbackList == null) { 2829d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi return; 2830d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2831d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final int oldCbCount = mRecordCallbackList.size(); 2832b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (removeRecordCallback_sync(cb)) { 2833d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final int newCbCount = mRecordCallbackList.size(); 2834d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi if ((oldCbCount > 0) && (newCbCount == 0)) { 2835d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi // unregister binder for callbacks 2836d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final IAudioService service = getService(); 2837d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi try { 2838d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi service.unregisterRecordingCallback(mRecCb); 2839d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } catch (RemoteException e) { 2840f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2841d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2842d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2843d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } else { 2844d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi Log.w(TAG, "attempt to call unregisterAudioRecordingCallback() on a callback" 2845d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi + " already unregistered or never registered"); 2846d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2847d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2848d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2849d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2850d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2851b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Returns the current active audio recording configurations of the device. 2852f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi * @return a non-null list of recording configurations. An empty list indicates there is 2853d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi * no recording active when queried. 28547872affa9689284eb02f019b6bf1900cf7d921e5Jean-Michel Trivi * @see AudioRecordingConfiguration 2855d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2856f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi public @NonNull List<AudioRecordingConfiguration> getActiveRecordingConfigurations() { 2857d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi final IAudioService service = getService(); 2858d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi try { 2859598c0c9f659184971e974de6a0184a3000e7900cJean-Michel Trivi return service.getActiveRecordingConfigurations(); 2860d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } catch (RemoteException e) { 2861f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 2862d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2863d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2864d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2865d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2866d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi * constants for the recording events, to keep in sync 2867d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi * with frameworks/av/include/media/AudioPolicy.h 2868d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2869d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** @hide */ 2870d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi public final static int RECORD_CONFIG_EVENT_START = 1; 2871d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** @hide */ 2872d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi public final static int RECORD_CONFIG_EVENT_STOP = 0; 2873d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2874d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi /** 2875d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi * All operations on this list are sync'd on mRecordCallbackLock. 2876b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * List is lazy-initialized in 2877b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * {@link #registerAudioRecordingCallback(AudioRecordingCallback, Handler)}. 2878d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi * List can be null. 2879d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi */ 2880b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi private List<AudioRecordingCallbackInfo> mRecordCallbackList; 2881d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi private final Object mRecordCallbackLock = new Object(); 2882d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2883b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi /** 2884b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Must be called synchronized on mRecordCallbackLock 2885b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi */ 2886b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi private boolean hasRecordCallback_sync(@NonNull AudioRecordingCallback cb) { 2887b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (mRecordCallbackList != null) { 2888b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi for (int i=0 ; i < mRecordCallbackList.size() ; i++) { 2889b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (cb.equals(mRecordCallbackList.get(i).mCb)) { 2890b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi return true; 2891b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2892b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2893b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2894b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi return false; 2895b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2896b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi 2897b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi /** 2898b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi * Must be called synchronized on mRecordCallbackLock 2899b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi */ 2900b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi private boolean removeRecordCallback_sync(@NonNull AudioRecordingCallback cb) { 2901b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (mRecordCallbackList != null) { 2902b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi for (int i=0 ; i < mRecordCallbackList.size() ; i++) { 2903b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (cb.equals(mRecordCallbackList.get(i).mCb)) { 2904b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi mRecordCallbackList.remove(i); 2905b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi return true; 2906b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2907b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2908b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2909b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi return false; 2910b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2911b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi 2912d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi private final IRecordingConfigDispatcher mRecCb = new IRecordingConfigDispatcher.Stub() { 2913d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2914f04fab160a044e4e7d936c0457a156d7911f924cJean-Michel Trivi public void dispatchRecordingConfigChange(List<AudioRecordingConfiguration> configs) { 2915b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi synchronized(mRecordCallbackLock) { 2916b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (mRecordCallbackList != null) { 2917b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi for (int i=0 ; i < mRecordCallbackList.size() ; i++) { 2918b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi final AudioRecordingCallbackInfo arci = mRecordCallbackList.get(i); 2919b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi if (arci.mHandler != null) { 2920b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi final Message m = arci.mHandler.obtainMessage( 292128ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi MSSG_RECORDING_CONFIG_CHANGE/*what*/, 292228ff76b455d35f99e68bee41b629c11ccf4f46d0Jean-Michel Trivi new RecordConfigChangeCallbackData(arci.mCb, configs)/*obj*/); 2923b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi arci.mHandler.sendMessage(m); 2924b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2925b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2926b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2927b919f6fd714a76e104b5933e944ab4ecc8e996c4Jean-Michel Trivi } 2928d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi } 2929d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2930d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi }; 2931d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2932d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi //===================================================================== 2933d3c71f075b139024e2bea39bbd75e3b976bfb7cbJean-Michel Trivi 2934a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi /** 29354050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * @hide 29364050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * Reload audio settings. This method is called by Settings backup 29374050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * agent when audio settings are restored and causes the AudioService 29384050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * to read and apply restored settings. 29394050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent */ 29404050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent public void reloadAudioSettings() { 29414050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent IAudioService service = getService(); 29424050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent try { 29434050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent service.reloadAudioSettings(); 29444050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent } catch (RemoteException e) { 2945f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 29464050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent } 29474050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent } 29484050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent 29495a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du /** 29505a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * @hide 29515a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * Notifies AudioService that it is connected to an A2DP device that supports absolute volume, 29525a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * so that AudioService can send volume change events to the A2DP device, rather than handling 29535a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * them. 29545a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du */ 29555a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du public void avrcpSupportsAbsoluteVolume(String address, boolean support) { 29565a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du IAudioService service = getService(); 29575a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du try { 29585a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du service.avrcpSupportsAbsoluteVolume(address, support); 29595a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du } catch (RemoteException e) { 2960f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 29615a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du } 29625a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du } 29635a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 296730c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final IBinder mICallBack = new Binder(); 29687f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten 29697f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten /** 29707f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * Checks whether the phone is in silent mode, with or without vibrate. 29717f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * 29727f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * @return true if phone is in silent mode, with or without vibrate. 29737f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * 29747f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * @see #getRingerMode() 29757f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * 29767f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * @hide pending API Council approval 29777f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten */ 29787f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten public boolean isSilentMode() { 29797f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten int ringerMode = getRingerMode(); 29807f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten boolean silentMode = 29817f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten (ringerMode == RINGER_MODE_SILENT) || 29827f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten (ringerMode == RINGER_MODE_VIBRATE); 29837f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten return silentMode; 29847f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten } 29857f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten 29868b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten // This section re-defines new output device constants from AudioSystem, because the AudioSystem 29878b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten // class is not used by other parts of the framework, which instead use definitions and methods 29888b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten // from AudioManager. AudioSystem is an internal class used by AudioManager and AudioService. 29898b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 2990948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2991d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim * The audio device code for representing "no device." */ 2992d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim public static final int DEVICE_NONE = AudioSystem.DEVICE_NONE; 2993d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim /** @hide 2994948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for the small speaker at the front of the device used 29958b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * when placing calls. Does not refer to an in-ear headphone without attached microphone, 29968b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * such as earbuds, earphones, or in-ear monitors (IEM). Those would be handled as a 29978b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_WIRED_HEADPHONE}. 29988b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 29998b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_EARPIECE = AudioSystem.DEVICE_OUT_EARPIECE; 3000948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3001948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for the built-in speaker */ 30028b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_SPEAKER = AudioSystem.DEVICE_OUT_SPEAKER; 3003948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3004948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a wired headset with attached microphone */ 30058b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_WIRED_HEADSET = AudioSystem.DEVICE_OUT_WIRED_HEADSET; 3006948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3007948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a wired headphone without attached microphone */ 30088b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_WIRED_HEADPHONE = AudioSystem.DEVICE_OUT_WIRED_HEADPHONE; 3009948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3010948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for generic Bluetooth SCO, for voice */ 30118b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_SCO = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO; 3012948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3013948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth SCO Headset Profile (HSP) and 3014948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Hands-Free Profile (HFP), for voice 30158b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 30168b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 30178b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET; 3018948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3019948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth SCO car audio, for voice */ 30208b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 30218b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT; 3022948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3023948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for generic Bluetooth A2DP, for music */ 30248b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_A2DP = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP; 3025948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3026948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth A2DP headphones, for music */ 30278b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 30288b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES; 3029948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3030948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth A2DP external speaker, for music */ 30318b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 30328b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER; 3033948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3034948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for S/PDIF (legacy) or HDMI 3035948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Deprecated: replaced by {@link #DEVICE_OUT_HDMI} */ 30368b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_AUX_DIGITAL = AudioSystem.DEVICE_OUT_AUX_DIGITAL; 3037948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3038948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for HDMI */ 3039948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_HDMI = AudioSystem.DEVICE_OUT_HDMI; 3040948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3041948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for an analog wired headset attached via a 30428b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * docking station 30438b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 30448b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_ANLG_DOCK_HEADSET = AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET; 3045948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3046948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a digital wired headset attached via a 30478b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * docking station 30488b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 30498b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_DGTL_DOCK_HEADSET = AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET; 3050948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3051948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a USB audio accessory. The accessory is in USB host 305259f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent * mode and the Android device in USB device mode 305359f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent */ 305459f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent public static final int DEVICE_OUT_USB_ACCESSORY = AudioSystem.DEVICE_OUT_USB_ACCESSORY; 3055948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3056948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a USB audio device. The device is in USB device 305759f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent * mode and the Android device in USB host mode 305859f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent */ 305959f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent public static final int DEVICE_OUT_USB_DEVICE = AudioSystem.DEVICE_OUT_USB_DEVICE; 3060948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3061948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for projection output. 3062948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3063948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_REMOTE_SUBMIX = AudioSystem.DEVICE_OUT_REMOTE_SUBMIX; 3064948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3065948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code the telephony voice TX path. 3066948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3067948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_TELEPHONY_TX = AudioSystem.DEVICE_OUT_TELEPHONY_TX; 3068948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3069948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for an analog jack with line impedance detected. 3070948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3071948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_LINE = AudioSystem.DEVICE_OUT_LINE; 3072948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3073948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for HDMI Audio Return Channel. 3074948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3075948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_HDMI_ARC = AudioSystem.DEVICE_OUT_HDMI_ARC; 3076948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3077948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for S/PDIF digital connection. 3078948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3079948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_SPDIF = AudioSystem.DEVICE_OUT_SPDIF; 3080948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3081948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for built-in FM transmitter. 3082948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3083948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_FM = AudioSystem.DEVICE_OUT_FM; 3084948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3085948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * This is not used as a returned value from {@link #getDevicesForStream}, but could be 30868b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * used in the future in a set method to select whatever default device is chosen by the 30878b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * platform-specific implementation. 30888b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 30898b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_DEFAULT = AudioSystem.DEVICE_OUT_DEFAULT; 30908b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 3091948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3092948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for default built-in microphone 3093948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3094948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_BUILTIN_MIC = AudioSystem.DEVICE_IN_BUILTIN_MIC; 3095948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3096948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a Bluetooth SCO headset 3097948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3098948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_BLUETOOTH_SCO_HEADSET = 3099948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET; 3100948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3101948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for wired headset microphone 3102948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3103948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_WIRED_HEADSET = 3104948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_WIRED_HEADSET; 3105948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3106948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for HDMI 3107948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3108948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_HDMI = 3109948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_HDMI; 3110948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3111948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for telephony voice RX path 3112948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3113948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_TELEPHONY_RX = 3114948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_TELEPHONY_RX; 3115948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3116948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for built-in microphone pointing to the back 3117948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3118948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_BACK_MIC = 3119948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_BACK_MIC; 3120948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3121948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for analog from a docking station 3122948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3123948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_ANLG_DOCK_HEADSET = 3124948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_ANLG_DOCK_HEADSET; 3125948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3126948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for digital from a docking station 3127948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3128948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_DGTL_DOCK_HEADSET = 3129948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_DGTL_DOCK_HEADSET; 3130948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3131948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a USB audio accessory. The accessory is in USB host 3132948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * mode and the Android device in USB device mode 3133948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3134948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_USB_ACCESSORY = 3135948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_USB_ACCESSORY; 3136948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3137948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a USB audio device. The device is in USB device 3138948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * mode and the Android device in USB host mode 3139948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3140948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_USB_DEVICE = 3141948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_USB_DEVICE; 3142948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3143948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a FM radio tuner 3144948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3145948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_FM_TUNER = AudioSystem.DEVICE_IN_FM_TUNER; 3146948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3147948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a TV tuner 3148948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3149948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_TV_TUNER = AudioSystem.DEVICE_IN_TV_TUNER; 3150948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3151948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for an analog jack with line impedance detected 3152948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3153948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_LINE = AudioSystem.DEVICE_IN_LINE; 3154948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 3155948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a S/PDIF digital connection 3156948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3157948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_SPDIF = AudioSystem.DEVICE_IN_SPDIF; 3158112c19ee8b459439c3462767199832e5394b37a8Terry Heo /** @hide 3159112c19ee8b459439c3462767199832e5394b37a8Terry Heo * The audio input device code for audio loopback 3160112c19ee8b459439c3462767199832e5394b37a8Terry Heo */ 3161112c19ee8b459439c3462767199832e5394b37a8Terry Heo public static final int DEVICE_IN_LOOPBACK = AudioSystem.DEVICE_IN_LOOPBACK; 3162948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 3163948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** 3164948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Return true if the device code corresponds to an output device. 3165948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * @hide 3166948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3167948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static boolean isOutputDevice(int device) 3168948d32748caaac5be06c991ebf00f74265a7849fEric Laurent { 3169948d32748caaac5be06c991ebf00f74265a7849fEric Laurent return (device & AudioSystem.DEVICE_BIT_IN) == 0; 3170948d32748caaac5be06c991ebf00f74265a7849fEric Laurent } 3171948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 3172948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** 3173948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Return true if the device code corresponds to an input device. 3174948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * @hide 3175948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 3176948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static boolean isInputDevice(int device) 3177948d32748caaac5be06c991ebf00f74265a7849fEric Laurent { 3178948d32748caaac5be06c991ebf00f74265a7849fEric Laurent return (device & AudioSystem.DEVICE_BIT_IN) == AudioSystem.DEVICE_BIT_IN; 3179948d32748caaac5be06c991ebf00f74265a7849fEric Laurent } 3180948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 3181948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 31828b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten /** 31838b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * Return the enabled devices for the specified output stream type. 31848b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 31858b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * @param streamType The stream type to query. One of 31868b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_VOICE_CALL}, 31878b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_SYSTEM}, 31888b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_RING}, 31898b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_MUSIC}, 31908b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_ALARM}, 31918b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_NOTIFICATION}, 31928b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_DTMF}. 31938b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 31948b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * @return The bit-mask "or" of audio output device codes for all enabled devices on this 31958b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * stream. Zero or more of 31968b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_EARPIECE}, 31978b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_SPEAKER}, 31988b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_WIRED_HEADSET}, 31998b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_WIRED_HEADPHONE}, 32008b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_SCO}, 32018b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_SCO_HEADSET}, 32028b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_SCO_CARKIT}, 32038b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_A2DP}, 32048b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES}, 32058b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER}, 3206948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_HDMI}, 32078b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_ANLG_DOCK_HEADSET}, 32088b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_DGTL_DOCK_HEADSET}. 3209948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_USB_ACCESSORY}. 3210948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_USB_DEVICE}. 3211948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_REMOTE_SUBMIX}. 3212948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_TELEPHONY_TX}. 3213948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_LINE}. 3214948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_HDMI_ARC}. 3215948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_SPDIF}. 3216948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_FM}. 32178b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_DEFAULT} is not used here. 32188b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 32198b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * The implementation may support additional device codes beyond those listed, so 32208b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * the application should ignore any bits which it does not recognize. 32218b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * Note that the information may be imprecise when the implementation 32228b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * cannot distinguish whether a particular device is enabled. 32238b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 32248b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@hide} 32258b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 32268b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public int getDevicesForStream(int streamType) { 32278b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten switch (streamType) { 32288b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_VOICE_CALL: 32298b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_SYSTEM: 32308b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_RING: 32318b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_MUSIC: 32328b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_ALARM: 32338b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_NOTIFICATION: 32348b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_DTMF: 32358b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten return AudioSystem.getDevicesForStream(streamType); 32368b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten default: 32378b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten return 0; 32388b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten } 32398b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten } 32408b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 3241b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent /** 3242b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * Indicate wired accessory connection state change. 3243b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param device type of device connected/disconnected (AudioManager.DEVICE_OUT_xxx) 3244b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param state new connection state: 1 connected, 0 disconnected 3245b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param name device name 3246b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * {@hide} 3247b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent */ 324810804eb2818ab59b763a37b4f6151693c2ebba7bPaul McLean public void setWiredDeviceConnectionState(int type, int state, String address, String name) { 3249b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent IAudioService service = getService(); 3250b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent try { 32519087433753a5068819dcd3e86bdc2cce82bb8040John Spurlock service.setWiredDeviceConnectionState(type, state, address, name, 3252a80ac05f85962949d5072831200d86a7023575fbMarco Nelissen mApplicationContext.getOpPackageName()); 3253b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } catch (RemoteException e) { 3254f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3255b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3256b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3257b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent 3258b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent /** 32590a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * Indicate A2DP source or sink connection state change. 3260b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param device Bluetooth device connected/disconnected 3261b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param state new connection state (BluetoothProfile.STATE_xxx) 32620a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * @param profile profile for the A2DP device 32630a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * (either {@link android.bluetooth.BluetoothProfile.A2DP} or 32640a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * {@link android.bluetooth.BluetoothProfile.A2DP_SINK}) 3265b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @return a delay in ms that the caller should wait before broadcasting 3266b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED intent. 3267b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * {@hide} 3268b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent */ 32690a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, 32700a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood int profile) { 3271b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent IAudioService service = getService(); 3272b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent int delay = 0; 3273b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent try { 32740a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood delay = service.setBluetoothA2dpDeviceConnectionState(device, state, profile); 3275b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } catch (RemoteException e) { 3276f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3277b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3278b304ba5bc8fbc6034cf232cbbeeb3a34a5ce5b9fEric Laurent return delay; 3279b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3280b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent 3281098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey /** {@hide} */ 3282098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey public IRingtonePlayer getRingtonePlayer() { 3283098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey try { 3284098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey return getService().getRingtonePlayer(); 3285098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey } catch (RemoteException e) { 3286f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3287098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey } 3288098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey } 3289228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 3290228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten /** 329162796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * Used as a key for {@link #getProperty} to request the native or optimal output sample rate 32922ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * for this device's low latency output stream, in decimal Hz. Latency-sensitive apps 32932ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * should use this value as a default, and offer the user the option to override it. 32942ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * The low latency output stream is typically either the device's primary output stream, 32952ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * or another output stream with smaller buffers. 3296228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten */ 32971cbf9b3741ec486c3ffce08f145501eb1ca73640Glenn Kasten // FIXME Deprecate 3298228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten public static final String PROPERTY_OUTPUT_SAMPLE_RATE = 3299228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten "android.media.property.OUTPUT_SAMPLE_RATE"; 3300228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 3301228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten /** 330262796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * Used as a key for {@link #getProperty} to request the native or optimal output buffer size 33032ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * for this device's low latency output stream, in decimal PCM frames. Latency-sensitive apps 33042ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * should use this value as a minimum, and offer the user the option to override it. 33052ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * The low latency output stream is typically either the device's primary output stream, 33062ed8f215f1aee43245ed697ed036ada1196e2a93Glenn Kasten * or another output stream with smaller buffers. 3307228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten */ 33081cbf9b3741ec486c3ffce08f145501eb1ca73640Glenn Kasten // FIXME Deprecate 3309228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten public static final String PROPERTY_OUTPUT_FRAMES_PER_BUFFER = 3310228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten "android.media.property.OUTPUT_FRAMES_PER_BUFFER"; 3311228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 3312228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten /** 3313d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra * Used as a key for {@link #getProperty} to determine if the default microphone audio source 3314d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra * supports near-ultrasound frequencies (range of 18 - 21 kHz). 3315d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra */ 3316d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra public static final String PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND = 3317d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra "android.media.property.SUPPORT_MIC_NEAR_ULTRASOUND"; 3318d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra 3319d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra /** 3320d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra * Used as a key for {@link #getProperty} to determine if the default speaker audio path 3321d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra * supports near-ultrasound frequencies (range of 18 - 21 kHz). 3322d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra */ 3323d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra public static final String PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND = 3324d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra "android.media.property.SUPPORT_SPEAKER_NEAR_ULTRASOUND"; 3325d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra 3326d08715e50342af02751a93735cca9d1bf76798dfArunesh Mishra /** 3327a7cc59c3187711d390c5a483d26c463a1bcbd331rago * Used as a key for {@link #getProperty} to determine if the unprocessed audio source is 3328a7cc59c3187711d390c5a483d26c463a1bcbd331rago * available and supported with the expected frequency range and level response. 3329a7cc59c3187711d390c5a483d26c463a1bcbd331rago */ 3330a7cc59c3187711d390c5a483d26c463a1bcbd331rago public static final String PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED = 3331a7cc59c3187711d390c5a483d26c463a1bcbd331rago "android.media.property.SUPPORT_AUDIO_SOURCE_UNPROCESSED"; 3332a7cc59c3187711d390c5a483d26c463a1bcbd331rago /** 333362796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * Returns the value of the property with the specified key. 3334228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten * @param key One of the strings corresponding to a property key: either 33350b986af895ac42e4ad46919cd6c59fcfce443cdbGlenn Kasten * {@link #PROPERTY_OUTPUT_SAMPLE_RATE}, 33360b986af895ac42e4ad46919cd6c59fcfce443cdbGlenn Kasten * {@link #PROPERTY_OUTPUT_FRAMES_PER_BUFFER}, 3337a7cc59c3187711d390c5a483d26c463a1bcbd331rago * {@link #PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND}, 3338a7cc59c3187711d390c5a483d26c463a1bcbd331rago * {@link #PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND}, or 3339a7cc59c3187711d390c5a483d26c463a1bcbd331rago * {@link #PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED}. 3340228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten * @return A string representing the associated value for that property key, 3341228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten * or null if there is no value for that key. 3342228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten */ 3343228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten public String getProperty(String key) { 3344c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten if (PROPERTY_OUTPUT_SAMPLE_RATE.equals(key)) { 3345c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten int outputSampleRate = AudioSystem.getPrimaryOutputSamplingRate(); 3346c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return outputSampleRate > 0 ? Integer.toString(outputSampleRate) : null; 3347c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten } else if (PROPERTY_OUTPUT_FRAMES_PER_BUFFER.equals(key)) { 3348c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten int outputFramesPerBuffer = AudioSystem.getPrimaryOutputFrameCount(); 3349c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return outputFramesPerBuffer > 0 ? Integer.toString(outputFramesPerBuffer) : null; 3350bc92227d6cd8380ae49815ac08220de4997d5e50Arunesh Mishra } else if (PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND.equals(key)) { 33516e4fb34e27546c0ff96d1257233e5b702236658aArunesh Mishra // Will throw a RuntimeException Resources.NotFoundException if this config value is 33526e4fb34e27546c0ff96d1257233e5b702236658aArunesh Mishra // not found. 33536e4fb34e27546c0ff96d1257233e5b702236658aArunesh Mishra return String.valueOf(getContext().getResources().getBoolean( 33546e4fb34e27546c0ff96d1257233e5b702236658aArunesh Mishra com.android.internal.R.bool.config_supportMicNearUltrasound)); 3355bc92227d6cd8380ae49815ac08220de4997d5e50Arunesh Mishra } else if (PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND.equals(key)) { 33566e4fb34e27546c0ff96d1257233e5b702236658aArunesh Mishra return String.valueOf(getContext().getResources().getBoolean( 33576e4fb34e27546c0ff96d1257233e5b702236658aArunesh Mishra com.android.internal.R.bool.config_supportSpeakerNearUltrasound)); 3358a7cc59c3187711d390c5a483d26c463a1bcbd331rago } else if (PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED.equals(key)) { 3359a7cc59c3187711d390c5a483d26c463a1bcbd331rago return String.valueOf(getContext().getResources().getBoolean( 3360a7cc59c3187711d390c5a483d26c463a1bcbd331rago com.android.internal.R.bool.config_supportAudioSourceUnprocessed)); 3361c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten } else { 3362c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten // null or unknown key 3363c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return null; 3364c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten } 3365228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten } 3366228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 336761dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman /** 336861dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * Returns the estimated latency for the given stream type in milliseconds. 336961dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * 337061dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * DO NOT UNHIDE. The existing approach for doing A/V sync has too many problems. We need 337161dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * a better solution. 337261dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * @hide 337361dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman */ 337461dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman public int getOutputLatency(int streamType) { 337561dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman return AudioSystem.getOutputLatency(streamType); 337661dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman } 337761dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman 33783346a802087f621c6441bc512dfcc17b07143fc6John Spurlock /** 33793346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * Registers a global volume controller interface. Currently limited to SystemUI. 33803346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * 33813346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * @hide 33823346a802087f621c6441bc512dfcc17b07143fc6John Spurlock */ 33833346a802087f621c6441bc512dfcc17b07143fc6John Spurlock public void setVolumeController(IVolumeController controller) { 33843346a802087f621c6441bc512dfcc17b07143fc6John Spurlock try { 33853346a802087f621c6441bc512dfcc17b07143fc6John Spurlock getService().setVolumeController(controller); 33863346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } catch (RemoteException e) { 3387f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 33883346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 33893346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 33903346a802087f621c6441bc512dfcc17b07143fc6John Spurlock 33913346a802087f621c6441bc512dfcc17b07143fc6John Spurlock /** 339233f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * Notify audio manager about volume controller visibility changes. 339333f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * Currently limited to SystemUI. 339433f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * 339533f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * @hide 339633f4e04e32fac42f158733d6a731e50490fa9951John Spurlock */ 339733f4e04e32fac42f158733d6a731e50490fa9951John Spurlock public void notifyVolumeControllerVisible(IVolumeController controller, boolean visible) { 339833f4e04e32fac42f158733d6a731e50490fa9951John Spurlock try { 339933f4e04e32fac42f158733d6a731e50490fa9951John Spurlock getService().notifyVolumeControllerVisible(controller, visible); 340033f4e04e32fac42f158733d6a731e50490fa9951John Spurlock } catch (RemoteException e) { 3401f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 340233f4e04e32fac42f158733d6a731e50490fa9951John Spurlock } 340333f4e04e32fac42f158733d6a731e50490fa9951John Spurlock } 340433f4e04e32fac42f158733d6a731e50490fa9951John Spurlock 340533f4e04e32fac42f158733d6a731e50490fa9951John Spurlock /** 34063346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * Only useful for volume controllers. 34073346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * @hide 34083346a802087f621c6441bc512dfcc17b07143fc6John Spurlock */ 34093346a802087f621c6441bc512dfcc17b07143fc6John Spurlock public boolean isStreamAffectedByRingerMode(int streamType) { 34103346a802087f621c6441bc512dfcc17b07143fc6John Spurlock try { 34113346a802087f621c6441bc512dfcc17b07143fc6John Spurlock return getService().isStreamAffectedByRingerMode(streamType); 34123346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } catch (RemoteException e) { 3413f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 34143346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 34153346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 34163346a802087f621c6441bc512dfcc17b07143fc6John Spurlock 34173346a802087f621c6441bc512dfcc17b07143fc6John Spurlock /** 34183346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * Only useful for volume controllers. 34193346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * @hide 34203346a802087f621c6441bc512dfcc17b07143fc6John Spurlock */ 3421a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock public boolean isStreamAffectedByMute(int streamType) { 3422a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock try { 3423a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock return getService().isStreamAffectedByMute(streamType); 3424a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock } catch (RemoteException e) { 3425f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3426a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock } 3427a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock } 3428a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock 3429a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock /** 3430a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock * Only useful for volume controllers. 3431a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock * @hide 3432a9dfbe8b122d746cf8841fe1b13d31e7e0fc9c52John Spurlock */ 34333346a802087f621c6441bc512dfcc17b07143fc6John Spurlock public void disableSafeMediaVolume() { 34343346a802087f621c6441bc512dfcc17b07143fc6John Spurlock try { 3435a80ac05f85962949d5072831200d86a7023575fbMarco Nelissen getService().disableSafeMediaVolume(mApplicationContext.getOpPackageName()); 34363346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } catch (RemoteException e) { 3437f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 34383346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 34393346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 3440a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3441a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3442661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock * Only useful for volume controllers. 3443661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock * @hide 3444661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock */ 3445661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock public void setRingerModeInternal(int ringerMode) { 3446661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock try { 344729f16933a8a93753c83bb5f1e0b5a410ea3a29f2Marco Nelissen getService().setRingerModeInternal(ringerMode, getContext().getOpPackageName()); 3448661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } catch (RemoteException e) { 3449f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3450661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 3451661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 3452661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock 3453661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock /** 3454661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock * Only useful for volume controllers. 3455661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock * @hide 3456661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock */ 3457661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock public int getRingerModeInternal() { 3458661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock try { 3459661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock return getService().getRingerModeInternal(); 3460661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } catch (RemoteException e) { 3461f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3462661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 3463661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock } 3464661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock 3465661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock /** 3466a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock * Only useful for volume controllers. 3467a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock * @hide 3468a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock */ 3469a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock public void setVolumePolicy(VolumePolicy policy) { 3470a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock try { 3471a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock getService().setVolumePolicy(policy); 3472a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock } catch (RemoteException e) { 3473f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3474a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock } 3475a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock } 3476a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock 3477a48d779dad4c48aa2f97ad021ae3a5649c058312John Spurlock /** 347841d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * Set Hdmi Cec system audio mode. 347941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * 348041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * @param on whether to be on system audio mode 34816f34f5ab8ab1b1db7887e5405d8b0031e105ab05Jungshik Jang * @return output device type. 0 (DEVICE_NONE) if failed to set device. 348241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * @hide 348341d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang */ 348412307ca810e8100981b2b60e3f2c6a7e451b9774Jungshik Jang public int setHdmiSystemAudioSupported(boolean on) { 348541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang try { 348612307ca810e8100981b2b60e3f2c6a7e451b9774Jungshik Jang return getService().setHdmiSystemAudioSupported(on); 348741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang } catch (RemoteException e) { 3488f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 348941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang } 349041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang } 349141d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang 349241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang /** 3493e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo * Returns true if Hdmi Cec system audio mode is supported. 3494e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo * 3495e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo * @hide 3496e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo */ 3497e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo @SystemApi 3498e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo public boolean isHdmiSystemAudioSupported() { 3499e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo try { 3500e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo return getService().isHdmiSystemAudioSupported(); 3501e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo } catch (RemoteException e) { 3502f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3503e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo } 3504e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo } 3505e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo 3506e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo /** 3507a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Return codes for listAudioPorts(), createAudioPatch() ... 3508a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3509a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3510a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3511a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * CANDIDATE FOR PUBLIC API 3512a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3513a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int SUCCESS = AudioSystem.SUCCESS; 35148a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi /** 35158a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi * A default error code. 3516a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3517a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR = AudioSystem.ERROR; 3518a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3519a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * CANDIDATE FOR PUBLIC API 3520a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3521a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_BAD_VALUE = AudioSystem.BAD_VALUE; 3522a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3523a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3524a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_INVALID_OPERATION = AudioSystem.INVALID_OPERATION; 3525a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3526a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3527a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_PERMISSION_DENIED = AudioSystem.PERMISSION_DENIED; 3528a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3529a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3530a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_NO_INIT = AudioSystem.NO_INIT; 3531ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent /** 3532ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent * An error code indicating that the object reporting it is no longer valid and needs to 3533ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent * be recreated. 3534a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3535a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_DEAD_OBJECT = AudioSystem.DEAD_OBJECT; 3536a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3537a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3538a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Returns a list of descriptors for all audio ports managed by the audio framework. 3539a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Audio ports are nodes in the audio framework or audio hardware that can be configured 3540a198a29250acb7c3e918f1566727190966bb336fEric Laurent * or connected and disconnected with createAudioPatch() or releaseAudioPatch(). 3541a198a29250acb7c3e918f1566727190966bb336fEric Laurent * See AudioPort for a list of attributes of each audio port. 3542a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param ports An AudioPort ArrayList where the list will be returned. 3543a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3544a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 35454bcdba848449b33d7022de527c526943aff1f5fdEric Laurent public static int listAudioPorts(ArrayList<AudioPort> ports) { 35468a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent return updateAudioPortCache(ports, null, null); 35478a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 35488a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent 35498a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent /** 35508a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * Returns a list of descriptors for all audio ports managed by the audio framework as 35518a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * it was before the last update calback. 35528a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * @param ports An AudioPort ArrayList where the list will be returned. 35538a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * @hide 35548a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent */ 35558a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent public static int listPreviousAudioPorts(ArrayList<AudioPort> ports) { 35568a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent return updateAudioPortCache(null, null, ports); 3557a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3558a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3559a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3560a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Specialized version of listAudioPorts() listing only audio devices (AudioDevicePort) 3561a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @see listAudioPorts(ArrayList<AudioPort>) 3562a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3563a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 35644bcdba848449b33d7022de527c526943aff1f5fdEric Laurent public static int listAudioDevicePorts(ArrayList<AudioDevicePort> devices) { 35658a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent if (devices == null) { 35668a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent return ERROR_BAD_VALUE; 35678a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 3568b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); 35698a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent int status = updateAudioPortCache(ports, null, null); 3570b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (status == SUCCESS) { 35718a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent filterDevicePorts(ports, devices); 35728a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 35738a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent return status; 35748a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 35758a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent 35768a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent /** 35778a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * Specialized version of listPreviousAudioPorts() listing only audio devices (AudioDevicePort) 35788a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * @see listPreviousAudioPorts(ArrayList<AudioPort>) 35798a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent * @hide 35808a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent */ 35818a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent public static int listPreviousAudioDevicePorts(ArrayList<AudioDevicePort> devices) { 35828a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent if (devices == null) { 35838a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent return ERROR_BAD_VALUE; 35848a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 35858a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); 35868a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent int status = updateAudioPortCache(null, null, ports); 35878a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent if (status == SUCCESS) { 35888a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent filterDevicePorts(ports, devices); 3589b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3590b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return status; 3591a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3592a198a29250acb7c3e918f1566727190966bb336fEric Laurent 35938a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent private static void filterDevicePorts(ArrayList<AudioPort> ports, 35948a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent ArrayList<AudioDevicePort> devices) { 35958a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent devices.clear(); 35968a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent for (int i = 0; i < ports.size(); i++) { 35978a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent if (ports.get(i) instanceof AudioDevicePort) { 35988a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent devices.add((AudioDevicePort)ports.get(i)); 35998a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 36008a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 36018a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 36028a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent 3603a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3604a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Create a connection between two or more devices. The framework will reject the request if 3605a198a29250acb7c3e918f1566727190966bb336fEric Laurent * device types are not compatible or the implementation does not support the requested 3606a198a29250acb7c3e918f1566727190966bb336fEric Laurent * configuration. 3607a198a29250acb7c3e918f1566727190966bb336fEric Laurent * NOTE: current implementation is limited to one source and one sink per patch. 3608a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patch AudioPatch array where the newly created patch will be returned. 3609a198a29250acb7c3e918f1566727190966bb336fEric Laurent * As input, if patch[0] is not null, the specified patch will be replaced by the 3610a198a29250acb7c3e918f1566727190966bb336fEric Laurent * new patch created. This avoids calling releaseAudioPatch() when modifying a 3611a198a29250acb7c3e918f1566727190966bb336fEric Laurent * patch and allows the implementation to optimize transitions. 3612a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param sources List of source audio ports. All must be AudioPort.ROLE_SOURCE. 3613a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param sinks List of sink audio ports. All must be AudioPort.ROLE_SINK. 3614a198a29250acb7c3e918f1566727190966bb336fEric Laurent * 3615a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @return - {@link #SUCCESS} if connection is successful. 3616a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_BAD_VALUE} if incompatible device types are passed. 3617a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_INVALID_OPERATION} if the requested connection is not supported. 3618a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_PERMISSION_DENIED} if the client does not have permission to create 3619a198a29250acb7c3e918f1566727190966bb336fEric Laurent * a patch. 3620a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_DEAD_OBJECT} if the server process is dead 3621a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR} if patch cannot be connected for any other reason. 3622a198a29250acb7c3e918f1566727190966bb336fEric Laurent * 3623a198a29250acb7c3e918f1566727190966bb336fEric Laurent * patch[0] contains the newly created patch 3624a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3625a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 36264bcdba848449b33d7022de527c526943aff1f5fdEric Laurent public static int createAudioPatch(AudioPatch[] patch, 3627a198a29250acb7c3e918f1566727190966bb336fEric Laurent AudioPortConfig[] sources, 3628a198a29250acb7c3e918f1566727190966bb336fEric Laurent AudioPortConfig[] sinks) { 3629b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return AudioSystem.createAudioPatch(patch, sources, sinks); 3630a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3631a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3632a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3633a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Releases an existing audio patch connection. 3634a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patch The audio patch to disconnect. 3635a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @return - {@link #SUCCESS} if disconnection is successful. 3636a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_BAD_VALUE} if the specified patch does not exist. 3637a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_PERMISSION_DENIED} if the client does not have permission to release 3638a198a29250acb7c3e918f1566727190966bb336fEric Laurent * a patch. 3639a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_DEAD_OBJECT} if the server process is dead 3640a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR} if patch cannot be released for any other reason. 3641a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3642a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 36434bcdba848449b33d7022de527c526943aff1f5fdEric Laurent public static int releaseAudioPatch(AudioPatch patch) { 3644b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return AudioSystem.releaseAudioPatch(patch); 3645a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3646a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3647a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3648a198a29250acb7c3e918f1566727190966bb336fEric Laurent * List all existing connections between audio ports. 3649a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patches An AudioPatch array where the list will be returned. 3650a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3651a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 36524bcdba848449b33d7022de527c526943aff1f5fdEric Laurent public static int listAudioPatches(ArrayList<AudioPatch> patches) { 36538a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent return updateAudioPortCache(null, patches, null); 3654a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3655a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3656a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3657a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Set the gain on the specified AudioPort. The AudioGainConfig config is build by 3658a198a29250acb7c3e918f1566727190966bb336fEric Laurent * AudioGain.buildConfig() 3659a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3660a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 36614bcdba848449b33d7022de527c526943aff1f5fdEric Laurent public static int setAudioPortGain(AudioPort port, AudioGainConfig gain) { 36623a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent if (port == null || gain == null) { 36633a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent return ERROR_BAD_VALUE; 36643a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent } 36653a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent AudioPortConfig activeConfig = port.activeConfig(); 36663a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent AudioPortConfig config = new AudioPortConfig(port, activeConfig.samplingRate(), 36673a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent activeConfig.channelMask(), activeConfig.format(), gain); 36683a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent config.mConfigMask = AudioPortConfig.GAIN; 36693a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent return AudioSystem.setAudioPortConfig(config); 3670a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3671a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3672a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3673a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Listener registered by client to be notified upon new audio port connections, 3674a198a29250acb7c3e918f1566727190966bb336fEric Laurent * disconnections or attributes update. 3675a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3676a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3677a198a29250acb7c3e918f1566727190966bb336fEric Laurent public interface OnAudioPortUpdateListener { 3678a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3679a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Callback method called upon audio port list update. 3680a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param portList the updated list of audio ports 3681a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3682fdaed9dcb63171379fd7c5a6208014bac505dbc6Eric Laurent public void onAudioPortListUpdate(AudioPort[] portList); 3683a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3684a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3685a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Callback method called upon audio patch list update. 3686a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patchList the updated list of audio patches 3687a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3688fdaed9dcb63171379fd7c5a6208014bac505dbc6Eric Laurent public void onAudioPatchListUpdate(AudioPatch[] patchList); 3689a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3690a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3691a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Callback method called when the mediaserver dies 3692a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3693fdaed9dcb63171379fd7c5a6208014bac505dbc6Eric Laurent public void onServiceDied(); 3694a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3695a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3696a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3697700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent * Register an audio port list update listener. 3698a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3699a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3700a198a29250acb7c3e918f1566727190966bb336fEric Laurent public void registerAudioPortUpdateListener(OnAudioPortUpdateListener l) { 3701c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent sAudioPortEventHandler.init(); 3702f076db407029e734703d8676f806bea94393e824Eric Laurent sAudioPortEventHandler.registerListener(l); 3703a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3704a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3705a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3706700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent * Unregister an audio port list update listener. 3707a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3708a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3709a198a29250acb7c3e918f1566727190966bb336fEric Laurent public void unregisterAudioPortUpdateListener(OnAudioPortUpdateListener l) { 3710f076db407029e734703d8676f806bea94393e824Eric Laurent sAudioPortEventHandler.unregisterListener(l); 3711a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3712b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3713b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // 3714b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // AudioPort implementation 3715b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // 3716b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3717b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent static final int AUDIOPORT_GENERATION_INIT = 0; 3718f076db407029e734703d8676f806bea94393e824Eric Laurent static Integer sAudioPortGeneration = new Integer(AUDIOPORT_GENERATION_INIT); 3719f076db407029e734703d8676f806bea94393e824Eric Laurent static ArrayList<AudioPort> sAudioPortsCached = new ArrayList<AudioPort>(); 37208a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent static ArrayList<AudioPort> sPreviousAudioPortsCached = new ArrayList<AudioPort>(); 3721f076db407029e734703d8676f806bea94393e824Eric Laurent static ArrayList<AudioPatch> sAudioPatchesCached = new ArrayList<AudioPatch>(); 3722b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3723f076db407029e734703d8676f806bea94393e824Eric Laurent static int resetAudioPortGeneration() { 3724b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int generation; 3725f076db407029e734703d8676f806bea94393e824Eric Laurent synchronized (sAudioPortGeneration) { 3726f076db407029e734703d8676f806bea94393e824Eric Laurent generation = sAudioPortGeneration; 3727f076db407029e734703d8676f806bea94393e824Eric Laurent sAudioPortGeneration = AUDIOPORT_GENERATION_INIT; 3728b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3729b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return generation; 3730b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3731b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 37328a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent static int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches, 37338a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent ArrayList<AudioPort> previousPorts) { 3734c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent sAudioPortEventHandler.init(); 3735f076db407029e734703d8676f806bea94393e824Eric Laurent synchronized (sAudioPortGeneration) { 3736b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3737f076db407029e734703d8676f806bea94393e824Eric Laurent if (sAudioPortGeneration == AUDIOPORT_GENERATION_INIT) { 3738b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int[] patchGeneration = new int[1]; 3739b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int[] portGeneration = new int[1]; 3740b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int status; 3741b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPort> newPorts = new ArrayList<AudioPort>(); 3742b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPatch> newPatches = new ArrayList<AudioPatch>(); 3743b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3744b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent do { 3745b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPorts.clear(); 3746b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent status = AudioSystem.listAudioPorts(newPorts, portGeneration); 3747b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (status != SUCCESS) { 3748b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim Log.w(TAG, "updateAudioPortCache: listAudioPorts failed"); 3749b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return status; 3750b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3751b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPatches.clear(); 3752b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent status = AudioSystem.listAudioPatches(newPatches, patchGeneration); 3753b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (status != SUCCESS) { 3754b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim Log.w(TAG, "updateAudioPortCache: listAudioPatches failed"); 3755b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return status; 3756b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3757b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } while (patchGeneration[0] != portGeneration[0]); 3758b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3759b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int i = 0; i < newPatches.size(); i++) { 3760b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int j = 0; j < newPatches.get(i).sources().length; j++) { 3761b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent AudioPortConfig portCfg = updatePortConfig(newPatches.get(i).sources()[j], 3762b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent newPorts); 3763b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPatches.get(i).sources()[j] = portCfg; 3764b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3765b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int j = 0; j < newPatches.get(i).sinks().length; j++) { 3766b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent AudioPortConfig portCfg = updatePortConfig(newPatches.get(i).sinks()[j], 3767b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent newPorts); 3768b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim newPatches.get(i).sinks()[j] = portCfg; 3769b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim } 3770b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim } 3771b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim for (Iterator<AudioPatch> i = newPatches.iterator(); i.hasNext(); ) { 3772b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim AudioPatch newPatch = i.next(); 3773b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim boolean hasInvalidPort = false; 3774b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim for (AudioPortConfig portCfg : newPatch.sources()) { 3775b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (portCfg == null) { 3776b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim hasInvalidPort = true; 3777b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim break; 3778b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3779b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim } 3780b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim for (AudioPortConfig portCfg : newPatch.sinks()) { 3781b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim if (portCfg == null) { 3782b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim hasInvalidPort = true; 3783b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim break; 3784b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim } 3785b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim } 3786b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim if (hasInvalidPort) { 3787b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim // Temporarily remove patches with invalid ports. One who created the patch 3788b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim // is responsible for dealing with the port change. 3789b561ccedd89f92b249c06522e960b135a02107d8Wonsik Kim i.remove(); 3790b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3791b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3792b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 37938a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent sPreviousAudioPortsCached = sAudioPortsCached; 3794f076db407029e734703d8676f806bea94393e824Eric Laurent sAudioPortsCached = newPorts; 3795f076db407029e734703d8676f806bea94393e824Eric Laurent sAudioPatchesCached = newPatches; 3796f076db407029e734703d8676f806bea94393e824Eric Laurent sAudioPortGeneration = portGeneration[0]; 3797b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3798b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (ports != null) { 3799b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ports.clear(); 3800f076db407029e734703d8676f806bea94393e824Eric Laurent ports.addAll(sAudioPortsCached); 3801b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3802b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (patches != null) { 3803b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent patches.clear(); 3804f076db407029e734703d8676f806bea94393e824Eric Laurent patches.addAll(sAudioPatchesCached); 3805b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 38068a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent if (previousPorts != null) { 38078a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent previousPorts.clear(); 38088a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent previousPorts.addAll(sPreviousAudioPortsCached); 38098a1e7a881ee73b9b1e492e7014c3eaefe81cfbd7Eric Laurent } 3810b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3811b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return SUCCESS; 3812b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3813b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3814f076db407029e734703d8676f806bea94393e824Eric Laurent static AudioPortConfig updatePortConfig(AudioPortConfig portCfg, ArrayList<AudioPort> ports) { 3815b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioPort port = portCfg.port(); 3816b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int k; 3817b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (k = 0; k < ports.size(); k++) { 3818b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // compare handles because the port returned by JNI is not of the correct 3819b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // subclass 3820b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (ports.get(k).handle().equals(port.handle())) { 3821b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent port = ports.get(k); 3822b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent break; 3823b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3824b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3825b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (k == ports.size()) { 3826b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // this hould never happen 3827b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent Log.e(TAG, "updatePortConfig port not found for handle: "+port.handle().id()); 3828b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return null; 3829b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3830b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioGainConfig gainCfg = portCfg.gain(); 3831b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (gainCfg != null) { 3832b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioGain gain = port.gain(gainCfg.index()); 3833b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg = gain.buildConfig(gainCfg.mode(), 3834b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg.channelMask(), 3835b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg.values(), 3836b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg.rampDurationMs()); 3837b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3838b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return port.buildConfig(portCfg.samplingRate(), 3839b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent portCfg.channelMask(), 3840b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent portCfg.format(), 3841b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg); 3842b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3843e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3844e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean private OnAmPortUpdateListener mPortListener = null; 3845e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3846e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 3847e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * The message sent to apps when the contents of the device list changes if they provide 3848e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * a {#link Handler} object to addOnAudioDeviceConnectionListener(). 3849e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 3850cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean private final static int MSG_DEVICES_CALLBACK_REGISTERED = 0; 3851cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean private final static int MSG_DEVICES_DEVICES_ADDED = 1; 3852cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean private final static int MSG_DEVICES_DEVICES_REMOVED = 2; 3853e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 38548e6c9f46172458624349755c9b1bc051f420d36dPaul McLean /** 38558e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * The list of {@link AudioDeviceCallback} objects to receive add/remove notifications. 38568e6c9f46172458624349755c9b1bc051f420d36dPaul McLean */ 3857033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean private ArrayMap<AudioDeviceCallback, NativeEventHandlerDelegate> 3858033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean mDeviceCallbacks = 3859033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean new ArrayMap<AudioDeviceCallback, NativeEventHandlerDelegate>(); 3860e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3861e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 38628e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * The following are flags to allow users of {@link AudioManager#getDevices(int)} to filter 38638e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * the results list to only those device types they are interested in. 38648e6c9f46172458624349755c9b1bc051f420d36dPaul McLean */ 38658e6c9f46172458624349755c9b1bc051f420d36dPaul McLean /** 3866e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Specifies to the {@link AudioManager#getDevices(int)} method to include 3867e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * source (i.e. input) audio devices. 3868e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 3869e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public static final int GET_DEVICES_INPUTS = 0x0001; 3870e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3871e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 3872e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Specifies to the {@link AudioManager#getDevices(int)} method to include 3873e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * sink (i.e. output) audio devices. 3874e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 3875e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public static final int GET_DEVICES_OUTPUTS = 0x0002; 3876e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3877e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 3878e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Specifies to the {@link AudioManager#getDevices(int)} method to include both 3879e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * source and sink devices. 3880e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 3881e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public static final int GET_DEVICES_ALL = GET_DEVICES_OUTPUTS | GET_DEVICES_INPUTS; 3882e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3883e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 3884e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Determines if a given AudioDevicePort meets the specified filter criteria. 3885e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * @param port The port to test. 3886e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * @param flags A set of bitflags specifying the criteria to test. 3887e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * @see {@link GET_DEVICES_OUTPUTS} and {@link GET_DEVICES_INPUTS} 3888e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean **/ 3889e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean private static boolean checkFlags(AudioDevicePort port, int flags) { 3890e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean return port.role() == AudioPort.ROLE_SINK && (flags & GET_DEVICES_OUTPUTS) != 0 || 3891e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean port.role() == AudioPort.ROLE_SOURCE && (flags & GET_DEVICES_INPUTS) != 0; 3892e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3893e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 38941135457a3d656057fc65effd706ae238a5f99a50Paul McLean private static boolean checkTypes(AudioDevicePort port) { 38951135457a3d656057fc65effd706ae238a5f99a50Paul McLean return AudioDeviceInfo.convertInternalDeviceToDeviceType(port.type()) != 38961135457a3d656057fc65effd706ae238a5f99a50Paul McLean AudioDeviceInfo.TYPE_UNKNOWN && 38971135457a3d656057fc65effd706ae238a5f99a50Paul McLean port.type() != AudioSystem.DEVICE_IN_BACK_MIC; 38981135457a3d656057fc65effd706ae238a5f99a50Paul McLean } 38991135457a3d656057fc65effd706ae238a5f99a50Paul McLean 3900e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 39018e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Returns an array of {@link AudioDeviceInfo} objects corresponding to the audio devices 39028e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * currently connected to the system and meeting the criteria specified in the 39038e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * <code>flags</code> parameter. 3904e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * @param flags A set of bitflags specifying the criteria to test. 390554de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * @see #GET_DEVICES_OUTPUTS 390654de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * @see #GET_DEVICES_INPUTS 390754de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * @see #GET_DEVICES_ALL 3908e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * @return A (possibly zero-length) array of AudioDeviceInfo objects. 3909e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 3910e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public AudioDeviceInfo[] getDevices(int flags) { 3911e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean return getDevicesStatic(flags); 3912e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3913e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 39148e6c9f46172458624349755c9b1bc051f420d36dPaul McLean /** 39158e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Does the actual computation to generate an array of (externally-visible) AudioDeviceInfo 39168e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * objects from the current (internal) AudioDevicePort list. 39178e6c9f46172458624349755c9b1bc051f420d36dPaul McLean */ 3918033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean private static AudioDeviceInfo[] 3919033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean infoListFromPortList(ArrayList<AudioDevicePort> ports, int flags) { 3920e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 39218e6c9f46172458624349755c9b1bc051f420d36dPaul McLean // figure out how many AudioDeviceInfo we need space for... 3922e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean int numRecs = 0; 3923e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean for (AudioDevicePort port : ports) { 39241135457a3d656057fc65effd706ae238a5f99a50Paul McLean if (checkTypes(port) && checkFlags(port, flags)) { 3925e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean numRecs++; 3926e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3927e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3928e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 39298e6c9f46172458624349755c9b1bc051f420d36dPaul McLean // Now load them up... 3930e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean AudioDeviceInfo[] deviceList = new AudioDeviceInfo[numRecs]; 3931e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean int slot = 0; 3932e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean for (AudioDevicePort port : ports) { 39331135457a3d656057fc65effd706ae238a5f99a50Paul McLean if (checkTypes(port) && checkFlags(port, flags)) { 3934e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean deviceList[slot++] = new AudioDeviceInfo(port); 3935e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3936e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3937e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3938e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean return deviceList; 3939e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 3940e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 3941033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean /* 39428e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Calculate the list of ports that are in ports_B, but not in ports_A. This is used by 39438e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * the add/remove callback mechanism to provide a list of the newly added or removed devices 39448e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * rather than the whole list and make the app figure it out. 39458e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Note that calling this method with: 39468e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * ports_A == PREVIOUS_ports and ports_B == CURRENT_ports will calculated ADDED ports. 39478e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * ports_A == CURRENT_ports and ports_B == PREVIOUS_ports will calculated REMOVED ports. 3948033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean */ 3949033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean private static AudioDeviceInfo[] calcListDeltas( 3950033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean ArrayList<AudioDevicePort> ports_A, ArrayList<AudioDevicePort> ports_B, int flags) { 3951033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3952033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean ArrayList<AudioDevicePort> delta_ports = new ArrayList<AudioDevicePort>(); 3953033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3954033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean AudioDevicePort cur_port = null; 3955033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean for (int cur_index = 0; cur_index < ports_B.size(); cur_index++) { 3956033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean boolean cur_port_found = false; 3957033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean cur_port = ports_B.get(cur_index); 3958033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean for (int prev_index = 0; 3959033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean prev_index < ports_A.size() && !cur_port_found; 3960033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean prev_index++) { 3961033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean cur_port_found = (cur_port.id() == ports_A.get(prev_index).id()); 3962033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 3963033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3964033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean if (!cur_port_found) { 3965033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean delta_ports.add(cur_port); 3966033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 3967033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 3968033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3969033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean return infoListFromPortList(delta_ports, flags); 3970033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 3971033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3972033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean /** 3973033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean * Generates a list of AudioDeviceInfo objects corresponding to the audio devices currently 3974033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean * connected to the system and meeting the criteria specified in the <code>flags</code> 3975033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean * parameter. 39768e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * This is an internal function. The public API front is getDevices(int). 3977033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean * @param flags A set of bitflags specifying the criteria to test. 397854de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * @see #GET_DEVICES_OUTPUTS 397954de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * @see #GET_DEVICES_INPUTS 398054de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * @see #GET_DEVICES_ALL 3981033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean * @return A (possibly zero-length) array of AudioDeviceInfo objects. 3982033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean * @hide 3983033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean */ 3984033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean public static AudioDeviceInfo[] getDevicesStatic(int flags) { 3985033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean ArrayList<AudioDevicePort> ports = new ArrayList<AudioDevicePort>(); 3986033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean int status = AudioManager.listAudioDevicePorts(ports); 3987033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean if (status != AudioManager.SUCCESS) { 3988033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean // fail and bail! 39898e6c9f46172458624349755c9b1bc051f420d36dPaul McLean return new AudioDeviceInfo[0]; // Always return an array. 3990033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 3991033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3992033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean return infoListFromPortList(ports, flags); 3993033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 3994033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 3995e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 39968e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Registers an {@link AudioDeviceCallback} object to receive notifications of changes 3997e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * to the set of connected audio devices. 39988e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * @param callback The {@link AudioDeviceCallback} object to receive connect/disconnect 39998e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * notifications. 40008e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * @param handler Specifies the {@link Handler} object for the thread on which to execute 40018e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * the callback. If <code>null</code>, the {@link Handler} associated with the main 40028e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * {@link Looper} will be used. 4003e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4004033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean public void registerAudioDeviceCallback(AudioDeviceCallback callback, 4005e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean android.os.Handler handler) { 40061691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent synchronized (mDeviceCallbacks) { 40071691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent if (callback != null && !mDeviceCallbacks.containsKey(callback)) { 4008c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent if (mDeviceCallbacks.size() == 0) { 4009c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent if (mPortListener == null) { 4010c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent mPortListener = new OnAmPortUpdateListener(); 4011c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent } 4012c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent registerAudioPortUpdateListener(mPortListener); 4013c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent } 4014cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean NativeEventHandlerDelegate delegate = 4015cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean new NativeEventHandlerDelegate(callback, handler); 4016cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean mDeviceCallbacks.put(callback, delegate); 4017cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean broadcastDeviceListChange(delegate.getHandler()); 4018e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4019e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4020e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4021e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4022e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 40238e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Unregisters an {@link AudioDeviceCallback} object which has been previously registered 4024e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * to receive notifications of changes to the set of connected audio devices. 40258e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * @param callback The {@link AudioDeviceCallback} object that was previously registered 402654de77470de4f605eef7f4b4e01718b301fe275eElliot Waite * with {@link AudioManager#registerAudioDeviceCallback} to be unregistered. 4027e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4028033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean public void unregisterAudioDeviceCallback(AudioDeviceCallback callback) { 4029033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean synchronized (mDeviceCallbacks) { 4030033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean if (mDeviceCallbacks.containsKey(callback)) { 4031033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean mDeviceCallbacks.remove(callback); 4032c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent if (mDeviceCallbacks.size() == 0) { 4033c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent unregisterAudioPortUpdateListener(mPortListener); 4034c573bc5d3da12b52b0c45416f884d8d21b0ef500Eric Laurent } 4035e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4036e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4037e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4038e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4039cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean // Since we need to calculate the changes since THE LAST NOTIFICATION, and not since the 4040cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean // (unpredictable) last time updateAudioPortCache() was called by someone, keep a list 4041cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean // of the ports that exist at the time of the last notification. 4042cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean private ArrayList<AudioDevicePort> mPreviousPorts = new ArrayList<AudioDevicePort>(); 4043cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean 4044e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 40458e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Internal method to compute and generate add/remove messages and then send to any 40468e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * registered callbacks. 4047e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4048cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean private void broadcastDeviceListChange(Handler handler) { 4049033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean int status; 4050033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 4051cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean // Get the new current set of ports 4052033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean ArrayList<AudioDevicePort> current_ports = new ArrayList<AudioDevicePort>(); 4053033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean status = AudioManager.listAudioDevicePorts(current_ports); 4054033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean if (status != AudioManager.SUCCESS) { 4055033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean return; 4056033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 4057033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 4058cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean if (handler != null) { 4059cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean // This is the callback for the registration, so send the current list 4060cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean AudioDeviceInfo[] deviceList = 4061cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean infoListFromPortList(current_ports, GET_DEVICES_ALL); 4062cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean handler.sendMessage( 4063cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean Message.obtain(handler, MSG_DEVICES_CALLBACK_REGISTERED, deviceList)); 4064cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean } else { 4065cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean AudioDeviceInfo[] added_devices = 4066cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean calcListDeltas(mPreviousPorts, current_ports, GET_DEVICES_ALL); 4067cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean AudioDeviceInfo[] removed_devices = 4068cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean calcListDeltas(current_ports, mPreviousPorts, GET_DEVICES_ALL); 4069cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean 4070cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean if (added_devices.length != 0 || removed_devices.length != 0) { 4071cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean synchronized (mDeviceCallbacks) { 40721691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent for (int i = 0; i < mDeviceCallbacks.size(); i++) { 40731691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent handler = mDeviceCallbacks.valueAt(i).getHandler(); 40741691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent if (handler != null) { 40751691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent if (added_devices.length != 0) { 40761691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent handler.sendMessage(Message.obtain(handler, 40771691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent MSG_DEVICES_DEVICES_ADDED, 40781691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent added_devices)); 40791691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent } 40801691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent if (removed_devices.length != 0) { 40811691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent handler.sendMessage(Message.obtain(handler, 40821691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent MSG_DEVICES_DEVICES_REMOVED, 40831691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent removed_devices)); 40841691f73de547e1bb7a6130a8d9f159452ed83d99Eric Laurent } 4085cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean } 4086033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 4087033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 4088e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4089e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4090cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean 4091cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean mPreviousPorts = current_ports; 4092e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4093e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4094e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 4095e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Handles Port list update notifications from the AudioManager 4096e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4097e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean private class OnAmPortUpdateListener implements AudioManager.OnAudioPortUpdateListener { 4098e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean static final String TAG = "OnAmPortUpdateListener"; 4099e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public void onAudioPortListUpdate(AudioPort[] portList) { 4100cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean broadcastDeviceListChange(null); 4101e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4102e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4103e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 4104e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Callback method called upon audio patch list update. 41058e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * Note: We don't do anything with Patches at this time, so ignore this notification. 41068e6c9f46172458624349755c9b1bc051f420d36dPaul McLean * @param patchList the updated list of audio patches. 4107e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4108e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public void onAudioPatchListUpdate(AudioPatch[] patchList) {} 4109e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4110e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 4111e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Callback method called when the mediaserver dies 4112e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4113e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public void onServiceDied() { 4114cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean broadcastDeviceListChange(null); 4115e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4116e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4117e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4118e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean //--------------------------------------------------------- 4119e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean // Inner classes 4120e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean //-------------------- 4121e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean /** 4122e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * Helper class to handle the forwarding of native events to the appropriate listener 4123e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean * (potentially) handled in a different thread. 4124e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean */ 4125e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean private class NativeEventHandlerDelegate { 4126e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean private final Handler mHandler; 4127e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4128033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean NativeEventHandlerDelegate(final AudioDeviceCallback callback, 4129e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean Handler handler) { 4130e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean // find the looper for our new event handler 4131e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean Looper looper; 4132e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean if (handler != null) { 4133e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean looper = handler.getLooper(); 4134e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } else { 4135e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean // no given handler, use the looper the addListener call was called in 4136e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean looper = Looper.getMainLooper(); 4137e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4138e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4139e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean // construct the event handler with this looper 4140e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean if (looper != null) { 4141e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean // implement the event handler delegate 4142e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean mHandler = new Handler(looper) { 4143e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean @Override 4144e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean public void handleMessage(Message msg) { 4145e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean switch(msg.what) { 4146cbeb8a2a3ebf2eef6877e6f78ec16797125c20baPaul McLean case MSG_DEVICES_CALLBACK_REGISTERED: 4147033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean case MSG_DEVICES_DEVICES_ADDED: 4148033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean if (callback != null) { 4149033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean callback.onAudioDevicesAdded((AudioDeviceInfo[])msg.obj); 4150e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4151e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean break; 4152033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 4153033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean case MSG_DEVICES_DEVICES_REMOVED: 4154033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean if (callback != null) { 4155033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean callback.onAudioDevicesRemoved((AudioDeviceInfo[])msg.obj); 4156033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean } 4157033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean break; 4158033468868dfa89e6c8dae2f8ad7365538329da42Paul McLean 4159e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean default: 4160e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean Log.e(TAG, "Unknown native event type: " + msg.what); 4161e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean break; 4162e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4163e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4164e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean }; 4165e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } else { 4166e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean mHandler = null; 4167e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4168e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4169e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean 4170e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean Handler getHandler() { 4171e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean return mHandler; 4172e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 4173e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean } 41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4175