AudioManager.java revision bc68256fea95c25258d8faad6bb697c364ad5a90
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; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 22e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heoimport android.annotation.SystemApi; 23f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Triviimport android.app.PendingIntent; 24b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurentimport android.bluetooth.BluetoothDevice; 25d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Triviimport android.content.ComponentName; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 27f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Triviimport android.content.Intent; 28f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Triviimport android.media.RemoteController.OnClientUpdateListener; 29a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Triviimport android.media.audiopolicy.AudioPolicy; 30a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Triviimport android.media.audiopolicy.AudioPolicyConfig; 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; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 46d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Triviimport android.view.KeyEvent; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Triviimport java.util.HashMap; 49a198a29250acb7c3e918f1566727190966bb336fEric Laurentimport java.util.ArrayList; 50d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 51700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioManager provides access to volume and ringer mode control. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use <code>Context.getSystemService(Context.AUDIO_SERVICE)</code> to get 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an instance of this class. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AudioManager { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 6186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato private long mVolumeKeyUpTime; 62cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood private final boolean mUseMasterVolume; 63b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate private final boolean mUseVolumeKeySounds; 64ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent private final boolean mUseFixedVolume; 6579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn private final Binder mToken = new Binder(); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String TAG = "AudioManager"; 67700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent AudioPortEventHandler mAudioPortEventHandler; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent, a hint for applications that audio is about to become 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 'noisy' due to a change in audio outputs. For example, this intent may 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sent when a wired headset is unplugged, or when an A2DP audio 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sink is disconnected, and the audio system is about to automatically 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * switch audio route to the speaker. Applications that are controlling 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * audio streams may consider pausing, reducing volume or some other action 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on receipt of this intent so as not to surprise the user with audio 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the speaker. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY"; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sticky broadcast intent action indicating that the ringer mode has 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changed. Includes the new ringer mode. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_RINGER_MODE 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new ringer mode. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_CHANGED_ACTION 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_NORMAL 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_SILENT 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RINGER_MODE_VIBRATE 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE"; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the vibrate setting has 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changed. Includes the vibrate type and its new setting. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIBRATE_TYPE 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIBRATE_SETTING 107cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 108cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode and listen to {@link #RINGER_MODE_CHANGED_ACTION} instead. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1110dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String VIBRATE_SETTING_CHANGED_ACTION = 1120dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.VIBRATE_SETTING_CHANGED"; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide Broadcast intent when the volume for a particular stream type changes. 1163114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * Includes the stream, the new volume and previous volumes. 1173114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * Notes: 1183114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * - for internal platform use only, do not make public, 1193114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * - never used for "remote" volume changes 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VOLUME_STREAM_TYPE 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VOLUME_STREAM_VALUE 1239ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent * @see #EXTRA_PREV_VOLUME_STREAM_VALUE 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION"; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1290dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide Broadcast intent when the master volume changes. 1300dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Includes the new volume 1310dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * 1320dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @see #EXTRA_MASTER_VOLUME_VALUE 1330dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @see #EXTRA_PREV_MASTER_VOLUME_VALUE 1340dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 1350dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1360dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String MASTER_VOLUME_CHANGED_ACTION = 1370dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.MASTER_VOLUME_CHANGED_ACTION"; 1380dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 1390dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 1400dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide Broadcast intent when the master mute state changes. 1410dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Includes the the new volume 1420dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * 1430dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @see #EXTRA_MASTER_VOLUME_MUTED 1440dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 1450dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1460dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String MASTER_MUTE_CHANGED_ACTION = 1470dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.MASTER_MUTE_CHANGED_ACTION"; 1480dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 1490dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new vibrate setting for a particular type. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_CHANGED_ACTION 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIBRATE_TYPE 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_ON 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_OFF 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_ONLY_SILENT 157cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 158cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode and listen to {@link #RINGER_MODE_CHANGED_ACTION} instead. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING"; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The vibrate type whose setting has changed. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_SETTING_CHANGED_ACTION 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_TYPE_NOTIFICATION 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #VIBRATE_TYPE_RINGER 168cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 169cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode and listen to {@link #RINGER_MODE_CHANGED_ACTION} instead. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE"; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide The stream type for the volume changed intent. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE"; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide The volume associated with the stream for the volume changed intent. 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_VOLUME_STREAM_VALUE = 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.media.EXTRA_VOLUME_STREAM_VALUE"; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent /** 1859ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent * @hide The previous volume associated with the stream for the volume changed intent. 1869ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent */ 1879ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent public static final String EXTRA_PREV_VOLUME_STREAM_VALUE = 1889ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent "android.media.EXTRA_PREV_VOLUME_STREAM_VALUE"; 1890dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 1900dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 1910dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide The new master volume value for the master volume changed intent. 1920dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Value is integer between 0 and 100 inclusive. 1930dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 1940dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String EXTRA_MASTER_VOLUME_VALUE = 1950dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.EXTRA_MASTER_VOLUME_VALUE"; 1960dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 1970dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 1980dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide The previous master volume value for the master volume changed intent. 1990dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Value is integer between 0 and 100 inclusive. 2000dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 2010dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String EXTRA_PREV_MASTER_VOLUME_VALUE = 2020dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.EXTRA_PREV_MASTER_VOLUME_VALUE"; 2030dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood 2040dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood /** 2050dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * @hide The new master volume mute state for the master mute changed intent. 2060dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood * Value is boolean 2070dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood */ 2080dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood public static final String EXTRA_MASTER_VOLUME_MUTED = 2090dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood "android.media.EXTRA_MASTER_VOLUME_MUTED"; 2109ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent 211c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 212c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Broadcast Action: Wired Headset plugged in or unplugged. 213c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 214c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * You <em>cannot</em> receive this through components declared 215c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * in manifests, only by explicitly registering for it with 216c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter) 217c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Context.registerReceiver()}. 218c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 219c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>The intent will have the following extra values: 220c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <ul> 221c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>state</em> - 0 for unplugged, 1 for plugged. </li> 222c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>name</em> - Headset type, human readable string </li> 223c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>microphone</em> - 1 if headset has a microphone, 0 otherwise </li> 224c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 225c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 226c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 227c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 228c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_HEADSET_PLUG = 229c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.intent.action.HEADSET_PLUG"; 230c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 231c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 232bc68256fea95c25258d8faad6bb697c364ad5a90Eemi Haukkala * Broadcast Action: A sticky broadcast indicating an HDMI cable was plugged or unplugged. 233c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 234c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * The intent will have the following extra values: {@link #EXTRA_AUDIO_PLUG_STATE}, 235c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link #EXTRA_MAX_CHANNEL_COUNT}, {@link #EXTRA_ENCODINGS}. 236c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>It can only be received by explicitly registering for it with 237c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)}. 238c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 239c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 240c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_HDMI_AUDIO_PLUG = 241c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.media.action.HDMI_AUDIO_PLUG"; 242c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 243c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 244c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Extra used in {@link #ACTION_HDMI_AUDIO_PLUG} to communicate whether HDMI is plugged in 245c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * or unplugged. 246c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * An integer value of 1 indicates a plugged-in state, 0 is unplugged. 247c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 248deddda5d62498bbaa9789c622be7a08be83f2f51Jean-Michel Trivi public static final String EXTRA_AUDIO_PLUG_STATE = "android.media.extra.AUDIO_PLUG_STATE"; 249c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 250c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 251c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Extra used in {@link #ACTION_HDMI_AUDIO_PLUG} to define the maximum number of channels 252c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * supported by the HDMI device. 253c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * The corresponding integer value is only available when the device is plugged in (as expressed 254c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * by {@link #EXTRA_AUDIO_PLUG_STATE}). 255c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 256deddda5d62498bbaa9789c622be7a08be83f2f51Jean-Michel Trivi public static final String EXTRA_MAX_CHANNEL_COUNT = "android.media.extra.MAX_CHANNEL_COUNT"; 257c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 258c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 259c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Extra used in {@link #ACTION_HDMI_AUDIO_PLUG} to define the audio encodings supported by 260c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * the connected HDMI device. 261c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * The corresponding array of encoding values is only available when the device is plugged in 262c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * (as expressed by {@link #EXTRA_AUDIO_PLUG_STATE}). Encoding values are defined in 263c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link AudioFormat} (for instance see {@link AudioFormat#ENCODING_PCM_16BIT}). Use 264c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * {@link android.content.Intent#getIntArrayExtra(String)} to retrieve the encoding values. 265c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 266deddda5d62498bbaa9789c622be7a08be83f2f51Jean-Michel Trivi public static final String EXTRA_ENCODINGS = "android.media.extra.ENCODINGS"; 267c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 268c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 269c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Broadcast Action: An analog audio speaker/headset plugged in or unplugged. 270c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 271c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>The intent will have the following extra values: 272c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <ul> 273c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>state</em> - 0 for unplugged, 1 for plugged. </li> 274c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>name</em> - Headset type, human readable string </li> 275c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 276c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 277c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * @hide 278c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 279c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 280c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_ANALOG_AUDIO_DOCK_PLUG = 281c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.media.action.ANALOG_AUDIO_DOCK_PLUG"; 282c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 283c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 284c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Broadcast Action: A digital audio speaker/headset plugged in or unplugged. 285c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 286c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>The intent will have the following extra values: 287c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <ul> 288c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>state</em> - 0 for unplugged, 1 for plugged. </li> 289c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>name</em> - Headset type, human readable string </li> 290c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 291c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 292c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * @hide 293c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 294c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 295c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_DIGITAL_AUDIO_DOCK_PLUG = 296c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.media.action.DIGITAL_AUDIO_DOCK_PLUG"; 297c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 298c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 299c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Broadcast Action: A USB audio accessory was plugged in or unplugged. 300c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 301c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>The intent will have the following extra values: 302c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <ul> 303c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>state</em> - 0 for unplugged, 1 for plugged. </li> 304c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>card</em> - ALSA card number (integer) </li> 305c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>device</em> - ALSA device number (integer) </li> 306c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 307c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 308c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * @hide 309c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 310c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 311c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_USB_AUDIO_ACCESSORY_PLUG = 312c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.media.action.USB_AUDIO_ACCESSORY_PLUG"; 313c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 314c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi /** 315c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * Broadcast Action: A USB audio device was plugged in or unplugged. 316c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * 317c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <p>The intent will have the following extra values: 318c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <ul> 319c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>state</em> - 0 for unplugged, 1 for plugged. </li> 320c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>card</em> - ALSA card number (integer) </li> 321c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * <li><em>device</em> - ALSA device number (integer) </li> 322c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 323c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * </ul> 324c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi * @hide 325c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi */ 326c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 327c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi public static final String ACTION_USB_AUDIO_DEVICE_PLUG = 328c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi "android.media.action.USB_AUDIO_DEVICE_PLUG"; 329c5258433dd353769ccfa2e5e769a7379378a3a0bJean-Michel Trivi 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for phone calls */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for system sounds */ 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for the phone ring */ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_RING = AudioSystem.STREAM_RING; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for music playback */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for alarms */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The audio stream for notifications */ 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide The audio stream for phone calls when connected to bluetooth */ 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STREAM_BLUETOOTH_SCO = AudioSystem.STREAM_BLUETOOTH_SCO; 344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */ 345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public static final int STREAM_SYSTEM_ENFORCED = AudioSystem.STREAM_SYSTEM_ENFORCED; 346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** The audio stream for DTMF Tones */ 347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public static final int STREAM_DTMF = AudioSystem.STREAM_DTMF; 348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** @hide The audio stream for text to speech (TTS) */ 349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public static final int STREAM_TTS = AudioSystem.STREAM_TTS; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Number of audio streams */ 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use AudioSystem.getNumStreamTypes() instead 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int NUM_STREAMS = AudioSystem.NUM_STREAMS; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide Default volume index values for audio streams */ 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int[] DEFAULT_STREAM_VOLUME = new int[] { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4, // STREAM_VOICE_CALL 3609d85d5adf90e7363304e2d4a22d60a2114bb7ab9Eric Laurent 7, // STREAM_SYSTEM 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5, // STREAM_RING 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11, // STREAM_MUSIC 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6, // STREAM_ALARM 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5, // STREAM_NOTIFICATION 365a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 7, // STREAM_BLUETOOTH_SCO 3669d85d5adf90e7363304e2d4a22d60a2114bb7ab9Eric Laurent 7, // STREAM_SYSTEM_ENFORCED 367a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 11, // STREAM_DTMF 368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 11 // STREAM_TTS 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Increase the ringer volume. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ADJUST_RAISE = 1; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decrease the ringer volume. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ADJUST_LOWER = -1; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Maintain the previous ringer volume. This may be useful when needing to 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * show the volume toast without actually modifying the volume. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ADJUST_SAME = 0; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Flags should be powers of 2! 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Show a toast containing the current volume. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_SHOW_UI = 1 << 0; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to include ringer modes as possible options when changing volume. 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, if true and volume level is 0 and the volume is adjusted 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with {@link #ADJUST_LOWER}, then the ringer mode may switch the silent or 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate mode. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default this is on for the ring stream. If this flag is included, 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this behavior will be present regardless of the stream type being 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affected by the ringer mode. 417105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_ALLOW_RINGER_MODES = 1 << 1; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to play a sound when changing the volume. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this is given to {@link #adjustVolume(int, int)} or 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #adjustSuggestedStreamVolume(int, int, int)}, it may be ignored 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in some cases (for example, the decided stream type is not 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_RING}, or the volume is being adjusted 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * downward). 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_PLAY_SOUND = 1 << 2; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes any sounds/vibrate that may be in the queue, or are playing (related to 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changing volume). 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 1 << 3; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to vibrate if going into the vibrate ringer mode. 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FLAG_VIBRATE = 1 << 4; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4504bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent * Indicates to VolumePanel that the volume slider should be disabled as user 4514bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent * cannot change the stream volume 4524bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent * @hide 4534bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent */ 4544bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent public static final int FLAG_FIXED_VOLUME = 1 << 5; 4554bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent 4564bbcc6549738f3d69831b2bd9eb4accec3e9920eEric Laurent /** 457c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie * Indicates the volume set/adjust call is for Bluetooth absolute volume 458c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie * @hide 459c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie */ 460c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie public static final int FLAG_BLUETOOTH_ABS_VOLUME = 1 << 6; 461c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie 462c9d1d5f35091226e96fcfa91817480f589eb36e2Matthew Xie /** 463a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock * Adjusting the volume was prevented due to silent mode, display a hint in the UI. 464a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock * @hide 465a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock */ 466a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock public static final int FLAG_SHOW_SILENT_HINT = 1 << 7; 467a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock 468a11b4affcad3d255aa723a89b768ea222506f2e8John Spurlock /** 46941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * Indicates the volume call is for Hdmi Cec system audio volume 47041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * @hide 47141d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang */ 47241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang public static final int FLAG_HDMI_SYSTEM_AUDIO_VOLUME = 1 << 8; 47341d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang 47441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang /** 4753c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik * Indicates that this should only be handled if media is actively playing. 4763c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik * @hide 4773c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik */ 4783c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik public static final int FLAG_ACTIVE_MEDIA_ONLY = 1 << 9; 4793c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik 4803c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik /** 481351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock * Like FLAG_SHOW_UI, but only dialog warnings and confirmations, no sliders. 482351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock * @hide 483351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock */ 484351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock public static final int FLAG_SHOW_UI_WARNINGS = 1 << 10; 485351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock 486351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock /** 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringer mode that will be silent and will not vibrate. (This overrides the 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate setting.) 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RINGER_MODE_SILENT = 0; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringer mode that will be silent and will vibrate. (This will cause the 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * phone ringer to always vibrate, but the notification vibrate to only 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate if set.) 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RINGER_MODE_VIBRATE = 1; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringer mode that may be audible and may vibrate. It will be audible if 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the volume before changing out of this mode was audible. It will vibrate 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the vibrate setting is on. 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RINGER_MODE_NORMAL = 2; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent // maximum valid ringer mode value. Values must start from 0 and be contiguous. 51672668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent private static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL; 51772668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate type that corresponds to the ringer. 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 524cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 525cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_TYPE_RINGER = 0; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate type that corresponds to notifications. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 535cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 536cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_TYPE_NOTIFICATION = 1; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate setting that suggests to never vibrate. 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 545cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 546cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_SETTING_OFF = 0; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate setting that suggests to vibrate when possible. 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 555cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 556cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_SETTING_ON = 1; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vibrate setting that suggests to only vibrate when in the vibrate ringer 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mode. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 566cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 567cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int VIBRATE_SETTING_ONLY_SILENT = 2; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Suggests using the default stream type. This may not be used in all 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * places a stream type is needed. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int USE_DEFAULT_STREAM_TYPE = Integer.MIN_VALUE; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static IAudioService sService; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AudioManager(Context context) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 584cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood mUseMasterVolume = mContext.getResources().getBoolean( 585cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood com.android.internal.R.bool.config_useMasterVolume); 586b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate mUseVolumeKeySounds = mContext.getResources().getBoolean( 587b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate com.android.internal.R.bool.config_useVolumeKeySounds); 588700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent mAudioPortEventHandler = new AudioPortEventHandler(this); 589ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent mUseFixedVolume = mContext.getResources().getBoolean( 590ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent com.android.internal.R.bool.config_useFixedVolume); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static IAudioService getService() 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = IAudioService.Stub.asInterface(b); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 604a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * Sends a simulated key event for a media button. 605a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * To simulate a key press, you must first send a KeyEvent built with a 606a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#ACTION_DOWN} action, then another event with the {@link KeyEvent#ACTION_UP} 607a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * action. 608a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * <p>The key event will be sent to the current media key event consumer which registered with 609a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link AudioManager#registerMediaButtonEventReceiver(PendingIntent)}. 610a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * @param keyEvent a {@link KeyEvent} instance whose key code is one of 611a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MUTE}, 612a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_HEADSETHOOK}, 613a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PLAY}, 614a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PAUSE}, 615a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PLAY_PAUSE}, 616a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_STOP}, 617a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_NEXT}, 618a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_PREVIOUS}, 619a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_REWIND}, 620a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_RECORD}, 621a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_FAST_FORWARD}, 622a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_CLOSE}, 623a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * {@link KeyEvent#KEYCODE_MEDIA_EJECT}, 624a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * or {@link KeyEvent#KEYCODE_MEDIA_AUDIO_TRACK}. 625a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi */ 626a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi public void dispatchMediaKeyEvent(KeyEvent keyEvent) { 627430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); 628430fc48865e5a371b08f180390946b96d73848feRoboErik helper.sendMediaButtonEvent(keyEvent, false); 6297ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 6307ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi 6317ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi /** 6327ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi * @hide 63386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 634ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void preDispatchKeyEvent(KeyEvent event, int stream) { 63586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 63686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * If the user hits another key within the play sound delay, then 63786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * cancel the sound 63886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 639ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood int keyCode = event.getKeyCode(); 64086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_VOLUME_UP 64186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato && keyCode != KeyEvent.KEYCODE_VOLUME_MUTE 6423346a802087f621c6441bc512dfcc17b07143fc6John Spurlock && mVolumeKeyUpTime + AudioService.PLAY_SOUND_DELAY 64386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato > SystemClock.uptimeMillis()) { 64486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 64586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * The user has hit another key during the delay (e.g., 300ms) 64686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * since the last volume key up, so cancel any sounds. 64786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 648cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood if (mUseMasterVolume) { 6498dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood adjustMasterVolume(ADJUST_SAME, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 650cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } else { 651cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood adjustSuggestedStreamVolume(ADJUST_SAME, 65286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato stream, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 653cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 65486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 65586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 65686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 65786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /** 65886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * @hide 65986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 660ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void handleKeyDown(KeyEvent event, int stream) { 661ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood int keyCode = event.getKeyCode(); 66286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 66386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 66486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 66586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 66686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Adjust the volume in on key down since it is more 66786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * responsive to the user. 66886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 669402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent int flags = FLAG_SHOW_UI | FLAG_VIBRATE; 670b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate 671cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood if (mUseMasterVolume) { 672cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood adjustMasterVolume( 673cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood keyCode == KeyEvent.KEYCODE_VOLUME_UP 674cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood ? ADJUST_RAISE 6758dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood : ADJUST_LOWER, 6768dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood flags); 677cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } else { 678cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood adjustSuggestedStreamVolume( 679cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood keyCode == KeyEvent.KEYCODE_VOLUME_UP 680cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood ? ADJUST_RAISE 681cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood : ADJUST_LOWER, 682cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood stream, 683cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood flags); 684402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent } 68586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 68686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_MUTE: 687ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood if (event.getRepeatCount() == 0) { 688ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood if (mUseMasterVolume) { 689ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood setMasterMute(!isMasterMute()); 690ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } else { 691ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood // TODO: Actually handle MUTE. 692ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 693ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 69486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 69586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 69686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 69786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 69886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /** 69986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * @hide 70086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 701ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void handleKeyUp(KeyEvent event, int stream) { 702ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood int keyCode = event.getKeyCode(); 70386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 70486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 70586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 70686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* 70786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Play a sound. This is done on key up since we don't want the 70886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * sound to play when a user holds down volume down to mute. 70986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 710b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate if (mUseVolumeKeySounds) { 711b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate if (mUseMasterVolume) { 712c4b78d206ffcdccac01e3436a4a3462bef9672edChristopher Tate adjustMasterVolume(ADJUST_SAME, FLAG_PLAY_SOUND); 713b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate } else { 714b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate int flags = FLAG_PLAY_SOUND; 715b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate adjustSuggestedStreamVolume( 716b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate ADJUST_SAME, 717b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate stream, 718b89ce434993cca883818ab38f98c0b29d77e7aa2Christopher Tate flags); 719cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 720402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent } 72186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mVolumeKeyUpTime = SystemClock.uptimeMillis(); 72286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 72386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 72486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 72586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 72686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /** 727ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * Indicates if the device implements a fixed volume policy. 728ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>Some devices may not have volume control and may operate at a fixed volume, 729ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * and may not enable muting or changing the volume of audio streams. 730ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * This method will return true on such devices. 731ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>The following APIs have no effect when volume is fixed: 732ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <ul> 733ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #adjustVolume(int, int)} 734ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #adjustSuggestedStreamVolume(int, int, int)} 735ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #adjustStreamVolume(int, int, int)} 736ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setStreamVolume(int, int, int)} 737ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setRingerMode(int)} 738ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setStreamSolo(int, boolean)} 739ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <li> {@link #setStreamMute(int, boolean)} 740ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * </ul> 741ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent */ 742ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent public boolean isVolumeFixed() { 743ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent return mUseFixedVolume; 744ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent } 745ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent 746ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent /** 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjusts the volume of a particular stream by one step in a direction. 748fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 749fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 750fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type to adjust. One of {@link #STREAM_VOICE_CALL}, 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #STREAM_SYSTEM}, {@link #STREAM_RING}, {@link #STREAM_MUSIC} or 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #STREAM_ALARM} 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction The direction to adjust the volume. One of 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_SAME}. 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void adjustStreamVolume(int streamType, int direction, int flags) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7654767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 76695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.adjustMasterVolume(direction, flags, mContext.getOpPackageName()); 7674767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 768ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn service.adjustStreamVolume(streamType, direction, flags, 76995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mContext.getOpPackageName()); 7704767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in adjustStreamVolume", e); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjusts the volume of the most relevant stream. For example, if a call is 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * active, it will have the highest priority regardless of if the in-call 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * screen is showing. Another example, if music is playing in the background 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and a call is not active, the music stream will be adjusted. 781fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 782fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 783fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 784ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 785ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction The direction to adjust the volume. One of 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_SAME}. 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustSuggestedStreamVolume(int, int, int) 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 793ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void adjustVolume(int direction, int flags) { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7984767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 79995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.adjustMasterVolume(direction, flags, mContext.getOpPackageName()); 8004767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 801430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); 802430fc48865e5a371b08f180390946b96d73848feRoboErik helper.sendAdjustVolumeBy(USE_DEFAULT_STREAM_TYPE, direction, flags); 8034767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in adjustVolume", e); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjusts the volume of the most relevant stream, or the given fallback 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stream. 812fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 813fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 814fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 816ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 817ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction The direction to adjust the volume. One of 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ADJUST_SAME}. 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param suggestedStreamType The stream type that will be used if there 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * isn't a relevant stream. {@link #USE_DEFAULT_STREAM_TYPE} is valid here. 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustVolume(int, int) 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #adjustStreamVolume(int, int, int) 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 827ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8324767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 83395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.adjustMasterVolume(direction, flags, mContext.getOpPackageName()); 8344767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 835430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); 836430fc48865e5a371b08f180390946b96d73848feRoboErik helper.sendAdjustVolumeBy(suggestedStreamType, direction, flags); 8374767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 839cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood Log.e(TAG, "Dead object in adjustSuggestedStreamVolume", e); 840cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 841cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 842cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 843cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood /** 844cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood * Adjusts the master volume for the device's audio amplifier. 845cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood * <p> 846cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood * 8476c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang * @param steps The number of volume steps to adjust. A positive 8486c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang * value will raise the volume. 8498dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood * @param flags One or more flags. 850e3f5979307fa52898459d9d09ee11bc1d65a4f7fJason Simmons * @hide 851cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood */ 8526c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang public void adjustMasterVolume(int steps, int flags) { 853cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood IAudioService service = getService(); 854cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood try { 85595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.adjustMasterVolume(steps, flags, mContext.getOpPackageName()); 856cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } catch (RemoteException e) { 857cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood Log.e(TAG, "Dead object in adjustMasterVolume", e); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current ringtone mode. 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current ringtone mode, one of {@link #RINGER_MODE_NORMAL}, 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}. 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setRingerMode(int) 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRingerMode() { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.getRingerMode(); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in getRingerMode", e); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return RINGER_MODE_NORMAL; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 87972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * Checks valid ringer mode values. 88072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * 88172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * @return true if the ringer mode indicated is valid, false otherwise. 88272668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * 88372668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * @see #setRingerMode(int) 88472668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent * @hide 88572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent */ 88672668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent public static boolean isValidRingerMode(int ringerMode) { 88772668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent if (ringerMode < 0 || ringerMode > RINGER_MODE_MAX) { 88872668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent return false; 88972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent } 89072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent return true; 89172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent } 89272668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent 89372668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent /** 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the maximum volume index for a particular stream. 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type whose maximum volume index is returned. 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The maximum valid volume index for the stream. 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamVolume(int) 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStreamMaxVolume(int streamType) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9034767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 9044767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood return service.getMasterMaxVolume(); 9054767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 9064767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood return service.getStreamMaxVolume(streamType); 9074767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in getStreamMaxVolume", e); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current volume index for a particular stream. 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type whose volume index is returned. 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current volume index for the stream. 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamMaxVolume(int) 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStreamVolume(int, int, int) 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStreamVolume(int streamType) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9254767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 9264767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood return service.getMasterVolume(); 9274767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 9284767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood return service.getStreamVolume(streamType); 9294767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in getStreamVolume", e); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 93725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * Get last audible volume before stream was muted. 93825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * 93925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * @hide 94025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent */ 94125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent public int getLastAudibleStreamVolume(int streamType) { 94225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent IAudioService service = getService(); 94325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent try { 9444767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 945ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood return service.getLastAudibleMasterVolume(); 9464767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 9474767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood return service.getLastAudibleStreamVolume(streamType); 9484767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 94925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } catch (RemoteException e) { 95025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent Log.e(TAG, "Dead object in getLastAudibleStreamVolume", e); 95125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return 0; 95225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 95325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 95425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 95525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent /** 9566d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent * Get the stream type whose volume is driving the UI sounds volume. 9576d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent * UI sounds are screen lock/unlock, camera shutter, key clicks... 9584f0f120316cfcee5880191264885772677fff921John Spurlock * It is assumed that this stream type is also tied to ringer mode changes. 9596d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent * @hide 9606d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent */ 9616d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent public int getMasterStreamType() { 9626d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent IAudioService service = getService(); 9636d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent try { 9646d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent return service.getMasterStreamType(); 9656d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent } catch (RemoteException e) { 9666d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent Log.e(TAG, "Dead object in getMasterStreamType", e); 9676d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent return STREAM_RING; 9686d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent } 9696d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent } 9706d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent 9716d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent /** 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the ringer mode. 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Silent mode will mute the volume and will not vibrate. Vibrate mode will 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mute the volume and vibrate. Normal mode will be audible and may vibrate 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * according to user settings. 977ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 978ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ringerMode The ringer mode, one of {@link #RINGER_MODE_NORMAL}, 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}. 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingerMode() 982ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRingerMode(int ringerMode) { 985e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock setRingerMode(ringerMode, true /*checkZen*/); 986e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock } 987e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock 988e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock /** 989e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock * @see #setRingerMode(int) 990e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock * @param checkZen Update zen mode if necessary to compensate. 991e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock * @hide 992e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock */ 993e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock public void setRingerMode(int ringerMode, boolean checkZen) { 99472668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent if (!isValidRingerMode(ringerMode)) { 99572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent return; 99672668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 999e5b42d97f6fd3eb0220ea84f21e60d530d93fc46John Spurlock service.setRingerMode(ringerMode, checkZen); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in setRingerMode", e); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the volume index for a particular stream. 1007ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 1008ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream whose volume index should be set. 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The volume index to set. See 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getStreamMaxVolume(int)} for the largest valid value. 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags One or more flags. 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamMaxVolume(int) 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getStreamVolume(int) 1015ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStreamVolume(int streamType, int index, int flags) { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10204767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood if (mUseMasterVolume) { 102195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.setMasterVolume(index, flags, mContext.getOpPackageName()); 10224767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } else { 102395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.setStreamVolume(streamType, index, flags, mContext.getOpPackageName()); 10244767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in setStreamVolume", e); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1031fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * Returns the maximum volume index for master volume. 1032fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * 1033fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @hide 1034fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood */ 1035fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood public int getMasterMaxVolume() { 1036fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood IAudioService service = getService(); 1037fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood try { 1038fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood return service.getMasterMaxVolume(); 1039fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } catch (RemoteException e) { 1040fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood Log.e(TAG, "Dead object in getMasterMaxVolume", e); 1041fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood return 0; 1042fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1043fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1044fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood 1045fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood /** 1046fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * Returns the current volume index for master volume. 1047fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * 1048fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @return The current volume index for master volume. 1049fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @hide 1050fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood */ 1051fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood public int getMasterVolume() { 1052fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood IAudioService service = getService(); 1053fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood try { 1054fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood return service.getMasterVolume(); 1055fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } catch (RemoteException e) { 1056fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood Log.e(TAG, "Dead object in getMasterVolume", e); 1057fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood return 0; 1058fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1059fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1060fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood 1061fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood /** 1062fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * Get last audible volume before master volume was muted. 1063fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * 1064fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @hide 1065fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood */ 1066fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood public int getLastAudibleMasterVolume() { 1067fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood IAudioService service = getService(); 1068fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood try { 1069fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood return service.getLastAudibleMasterVolume(); 1070fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } catch (RemoteException e) { 1071fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood Log.e(TAG, "Dead object in getLastAudibleMasterVolume", e); 1072fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood return 0; 1073fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1074fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1075fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood 1076fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood /** 1077fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * Sets the volume index for master volume. 1078fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * 1079fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @param index The volume index to set. See 1080ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn * {@link #getMasterMaxVolume()} for the largest valid value. 1081fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @param flags One or more flags. 1082ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn * @see #getMasterMaxVolume() 1083ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn * @see #getMasterVolume() 1084fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood * @hide 1085fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood */ 1086fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood public void setMasterVolume(int index, int flags) { 1087fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood IAudioService service = getService(); 1088fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood try { 108995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn service.setMasterVolume(index, flags, mContext.getOpPackageName()); 1090fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } catch (RemoteException e) { 1091fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood Log.e(TAG, "Dead object in setMasterVolume", e); 1092fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1093fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood } 1094fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood 1095fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood /** 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Solo or unsolo a particular stream. All other streams are muted. 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The solo command is protected against client process death: if a process 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with an active solo request on a stream dies, all streams that were muted 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because of this request will be unmuted automatically. 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The solo requests for a given stream are cumulative: the AudioManager 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can receive several solo requests from one or more clients and the stream 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be unsoloed only when the same number of unsolo requests are received. 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a better user experience, applications MUST unsolo a soloed stream 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in onPause() and solo is again in onResume() if appropriate. 1108ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 1109ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream to be soloed/unsoloed. 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param state The required solo state: true for solo ON, false for solo OFF 1113ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * 1114ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStreamSolo(int streamType, boolean state) { 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.setStreamSolo(streamType, state, mICallBack); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in setStreamSolo", e); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mute or unmute an audio stream. 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The mute command is protected against client process death: if a process 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with an active mute request on a stream dies, this stream will be unmuted 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically. 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The mute requests for a given stream are cumulative: the AudioManager 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can receive several mute requests from one or more clients and the stream 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be unmuted only when the same number of unmute requests are received. 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a better user experience, applications MUST unmute a muted stream 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in onPause() and mute is again in onResume() if appropriate. 1138fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1139fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1140fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 1141ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * <p>This method has no effect if the device implements a fixed volume policy 1142ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * as indicated by {@link #isVolumeFixed()}. 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream to be muted/unmuted. 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param state The required mute state: true for mute ON, false for mute OFF 1146ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * 1147ba207e76b2c5ebc01ececff351107d19a3134f3aEric Laurent * @see #isVolumeFixed() 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStreamMute(int streamType, boolean state) { 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.setStreamMute(streamType, state, mICallBack); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in setStreamMute", e); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 115925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * get stream mute state. 116025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * 116125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent * @hide 116225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent */ 116325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent public boolean isStreamMute(int streamType) { 116425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent IAudioService service = getService(); 116525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent try { 116625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return service.isStreamMute(streamType); 116725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } catch (RemoteException e) { 116825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent Log.e(TAG, "Dead object in isStreamMute", e); 116925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return false; 117025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 117125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent } 117225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 117325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent /** 1174ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * set master mute state. 1175ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * 1176ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * @hide 1177ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood */ 1178ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public void setMasterMute(boolean state) { 11790273af55cf68d54d26d154b44d105d40fed79701Justin Koh setMasterMute(state, FLAG_SHOW_UI); 11800273af55cf68d54d26d154b44d105d40fed79701Justin Koh } 11810273af55cf68d54d26d154b44d105d40fed79701Justin Koh 11820273af55cf68d54d26d154b44d105d40fed79701Justin Koh /** 11830273af55cf68d54d26d154b44d105d40fed79701Justin Koh * set master mute state with optional flags. 11840273af55cf68d54d26d154b44d105d40fed79701Justin Koh * 11850273af55cf68d54d26d154b44d105d40fed79701Justin Koh * @hide 11860273af55cf68d54d26d154b44d105d40fed79701Justin Koh */ 11870273af55cf68d54d26d154b44d105d40fed79701Justin Koh public void setMasterMute(boolean state, int flags) { 1188ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood IAudioService service = getService(); 1189ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood try { 11904a21b25fad62e4f19d13ba814263841c931f56efJulia Reynolds service.setMasterMute(state, flags, mContext.getOpPackageName(), mICallBack); 1191ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } catch (RemoteException e) { 1192ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood Log.e(TAG, "Dead object in setMasterMute", e); 1193ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 1194ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 1195ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood 1196ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood /** 1197ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * get master mute state. 1198ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * 1199ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood * @hide 1200ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood */ 1201ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood public boolean isMasterMute() { 1202ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood IAudioService service = getService(); 1203ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood try { 1204ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood return service.isMasterMute(); 1205ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } catch (RemoteException e) { 1206ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood Log.e(TAG, "Dead object in isMasterMute", e); 1207ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood return false; 1208ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 1209ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood } 1210ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood 1211ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood /** 1212402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * forces the stream controlled by hard volume keys 1213402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * specifying streamType == -1 releases control to the 1214402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * logic. 1215402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * 1216402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent * @hide 1217402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent */ 1218402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent public void forceVolumeControlStream(int streamType) { 121945c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent IAudioService service = getService(); 122045c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent try { 122145c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent service.forceVolumeControlStream(streamType, mICallBack); 122245c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent } catch (RemoteException e) { 122345c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent Log.e(TAG, "Dead object in forceVolumeControlStream", e); 122445c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent } 1225402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent } 1226402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent 1227402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent /** 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether a particular type should vibrate according to user 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings and the current ringer mode. 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This shouldn't be needed by most clients that use notifications to 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vibrate. The notification manager will not vibrate if the policy doesn't 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allow it, so the client should always set a vibrate pattern and let the 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notification manager control whether or not to actually vibrate. 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateType The type of vibrate. One of 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_NOTIFICATION} or 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_RINGER}. 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the type should vibrate at the instant this method is 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called. 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 1243cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 1244cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean shouldVibrate(int vibrateType) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.shouldVibrate(vibrateType); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in shouldVibrate", e); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether the user's vibrate setting for a vibrate type. 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This shouldn't be needed by most clients that want to vibrate, instead 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * see {@link #shouldVibrate(int)}. 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateType The type of vibrate. One of 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_NOTIFICATION} or 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_RINGER}. 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The vibrate setting, one of {@link #VIBRATE_SETTING_ON}, 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_OFF}, or 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_ONLY_SILENT}. 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVibrateSetting(int, int) 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 1270cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 1271cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getVibrateSetting(int vibrateType) { 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.getVibrateSetting(vibrateType); 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in getVibrateSetting", e); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return VIBRATE_SETTING_OFF; 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the setting for when the vibrate type should vibrate. 1285fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1286fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1287fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateType The type of vibrate. One of 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_NOTIFICATION} or 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_TYPE_RINGER}. 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vibrateSetting The vibrate setting, one of 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_ON}, 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_OFF}, or 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #VIBRATE_SETTING_ONLY_SILENT}. 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getVibrateSetting(int) 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldVibrate(int) 1298cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * @deprecated Applications should maintain their own vibrate policy based on 1299cd1cd73baec1f93d21f67fdded5466e507431ebaEric Laurent * current ringer mode that can be queried via {@link #getRingerMode()}. 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVibrateSetting(int vibrateType, int vibrateSetting) { 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.setVibrateSetting(vibrateType, vibrateSetting); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in setVibrateSetting", e); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the speakerphone on or off. 1312fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1313fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1314fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param on set <var>true</var> to turn on speakerphone; 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>false</var> to turn it off 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSpeakerphoneOn(boolean on){ 1320c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1321c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1322c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent service.setSpeakerphoneOn(on); 1323c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1324c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent Log.e(TAG, "Dead object in setSpeakerphoneOn", e); 1325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether the speakerphone is on or off. 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if speakerphone is on, false if it's off 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isSpeakerphoneOn() { 1334c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1335c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1336c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent return service.isSpeakerphoneOn(); 1337c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1338c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent Log.e(TAG, "Dead object in isSpeakerphoneOn", e); 1339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 1340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13433def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent //==================================================================== 13443def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent // Bluetooth SCO control 13453def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 13463def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Sticky broadcast intent action indicating that the bluetoooth SCO audio 134795b88fbe744d8ce53b5f54f6fcd90c55094a8d14Eric Laurent * connection state has changed. The intent contains on extra {@link #EXTRA_SCO_AUDIO_STATE} 13483def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * indicating the new state which is either {@link #SCO_AUDIO_STATE_DISCONNECTED} 13493def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * or {@link #SCO_AUDIO_STATE_CONNECTED} 13503def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * 13513def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #startBluetoothSco() 1352dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * @deprecated Use {@link #ACTION_SCO_AUDIO_STATE_UPDATED} instead 13533def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 1354dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent @Deprecated 13553def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 13563def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final String ACTION_SCO_AUDIO_STATE_CHANGED = 13573def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent "android.media.SCO_AUDIO_STATE_CHANGED"; 1358dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent 1359dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent /** 1360dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Sticky broadcast intent action indicating that the bluetoooth SCO audio 1361dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * connection state has been updated. 1362dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>This intent has two extras: 1363dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1364dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #EXTRA_SCO_AUDIO_STATE} - The new SCO audio state. </li> 1365dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}- The previous SCO audio state. </li> 1366dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 1367dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p> EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE can be any of: 1368dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1369dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #SCO_AUDIO_STATE_DISCONNECTED}, </li> 1370dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #SCO_AUDIO_STATE_CONNECTING} or </li> 1371dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> {@link #SCO_AUDIO_STATE_CONNECTED}, </li> 1372dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 1373dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * @see #startBluetoothSco() 1374dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent */ 1375dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1376dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent public static final String ACTION_SCO_AUDIO_STATE_UPDATED = 1377dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent "android.media.ACTION_SCO_AUDIO_STATE_UPDATED"; 1378dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent 13793def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1380dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED} or 1381dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the new bluetooth SCO connection state. 13823def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13833def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final String EXTRA_SCO_AUDIO_STATE = 13843def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent "android.media.extra.SCO_AUDIO_STATE"; 13853def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 13863def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1387dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the previous 1388dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * bluetooth SCO connection state. 1389dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent */ 1390dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent public static final String EXTRA_SCO_AUDIO_PREVIOUS_STATE = 1391dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent "android.media.extra.SCO_AUDIO_PREVIOUS_STATE"; 1392dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent 1393dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent /** 1394dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE 1395dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * indicating that the SCO audio channel is not established 13963def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 13973def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final int SCO_AUDIO_STATE_DISCONNECTED = 0; 13983def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1399dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} or {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE} 1400dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * indicating that the SCO audio channel is established 14013def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 14023def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final int SCO_AUDIO_STATE_CONNECTED = 1; 14033def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 1404dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE 1405dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * indicating that the SCO audio channel is being established 1406dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent */ 1407dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent public static final int SCO_AUDIO_STATE_CONNECTING = 2; 1408dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent /** 1409dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * Value for extra EXTRA_SCO_AUDIO_STATE indicating that 14103def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * there was an error trying to obtain the state 14113def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 14123def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public static final int SCO_AUDIO_STATE_ERROR = -1; 14133def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 14143def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 14153def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 14163def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Indicates if current platform supports use of SCO for off call use cases. 14173def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Application wanted to use bluetooth SCO audio when the phone is not in call 14182ac2afeac989ea1dc326b0db996d6c6c8e00cc29Jean-Michel Trivi * must first call this method to make sure that the platform supports this 14193def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * feature. 14203def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @return true if bluetooth SCO can be used for audio when not in call 14213def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * false otherwise 14223def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #startBluetoothSco() 14233def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 14243def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public boolean isBluetoothScoAvailableOffCall() { 14253def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent return mContext.getResources().getBoolean( 14263def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent com.android.internal.R.bool.config_bluetooth_sco_off_call); 14273def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14283def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 14293def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 14303def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Start bluetooth SCO audio connection. 14313def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Requires Permission: 14323def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. 14333def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>This method can be used by applications wanting to send and received audio 14343def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * to/from a bluetooth SCO headset while the phone is not in call. 14353def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>As the SCO connection establishment can take several seconds, 14363def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * applications should not rely on the connection to be available when the method 1437dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * returns but instead register to receive the intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} 14383def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * and wait for the state to be {@link #SCO_AUDIO_STATE_CONNECTED}. 1439dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>As the ACTION_SCO_AUDIO_STATE_UPDATED intent is sticky, the application can check the SCO 1440dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * audio state before calling startBluetoothSco() by reading the intent returned by the receiver 1441dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * registration. If the state is already CONNECTED, no state change will be received via the 1442dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * intent after calling startBluetoothSco(). It is however useful to call startBluetoothSco() 1443dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * so that the connection stays active in case the current initiator stops the connection. 1444dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>Unless the connection is already active as described above, the state will always 1445dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * transition from DISCONNECTED to CONNECTING and then either to CONNECTED if the connection 1446dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * succeeds or back to DISCONNECTED if the connection fails (e.g no headset is connected). 1447dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <p>When finished with the SCO connection or if the establishment fails, the application must 1448dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * call {@link #stopBluetoothSco()} to clear the request and turn down the bluetooth connection. 14493def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Even if a SCO connection is established, the following restrictions apply on audio 14503def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * output streams so that they can be routed to SCO headset: 1451dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1452dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the stream type must be {@link #STREAM_VOICE_CALL} </li> 1453dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the format must be mono </li> 1454dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the sampling must be 16kHz or 8kHz </li> 1455dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 14563def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>The following restrictions apply on input streams: 1457dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <ul> 1458dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the format must be mono </li> 1459dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * <li> the sampling must be 8kHz </li> 1460dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * </ul> 14613def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Note that the phone application always has the priority on the usage of the SCO 14623def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * connection for telephony. If this method is called while the phone is in call 14633def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * it will be ignored. Similarly, if a call is received or sent while an application 14643def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * is using the SCO connection, the connection will be lost for the application and NOT 14653def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * returned automatically when the call ends. 146683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * <p>NOTE: up to and including API version 146783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}, this method initiates a virtual 146883900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * voice call to the bluetooth headset. 146983900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * After API version {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} only a raw SCO audio 147083900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * connection is established. 14713def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #stopBluetoothSco() 1472dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent * @see #ACTION_SCO_AUDIO_STATE_UPDATED 14733def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 14743def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public void startBluetoothSco(){ 14753def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent IAudioService service = getService(); 14763def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent try { 1477c18c9138cee0f0859bcab636a004ce92ca4a9ab5Eric Laurent service.startBluetoothSco(mICallBack, mContext.getApplicationInfo().targetSdkVersion); 14783def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } catch (RemoteException e) { 14793def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent Log.e(TAG, "Dead object in startBluetoothSco", e); 14803def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14813def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 14823def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 14833def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent /** 14840daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi * @hide 148583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * Start bluetooth SCO audio connection in virtual call mode. 148683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * <p>Requires Permission: 148783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. 148883900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * <p>Similar to {@link #startBluetoothSco()} with explicit selection of virtual call mode. 148983900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * Telephony and communication applications (VoIP, Video Chat) should preferably select 149083900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * virtual call mode. 149183900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * Applications using voice input for search or commands should first try raw audio connection 149283900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * with {@link #startBluetoothSco()} and fall back to startBluetoothScoVirtualCall() in case of 149383900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * failure. 149483900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * @see #startBluetoothSco() 149583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * @see #stopBluetoothSco() 149683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent * @see #ACTION_SCO_AUDIO_STATE_UPDATED 149783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent */ 149883900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent public void startBluetoothScoVirtualCall() { 149983900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent IAudioService service = getService(); 150083900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent try { 150183900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent service.startBluetoothScoVirtualCall(mICallBack); 150283900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent } catch (RemoteException e) { 150383900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent Log.e(TAG, "Dead object in startBluetoothScoVirtualCall", e); 150483900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent } 150583900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent } 150683900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent 150783900754f357616b9e56eaf7fc85f49b8906e987Eric Laurent /** 15083def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * Stop bluetooth SCO audio connection. 15093def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>Requires Permission: 15103def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. 15113def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * <p>This method must be called by applications having requested the use of 15120daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi * bluetooth SCO audio with {@link #startBluetoothSco()} when finished with the SCO 15130daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi * connection or if connection fails. 15143def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent * @see #startBluetoothSco() 15153def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent */ 15160daab220b2379aad33321364e8a39d2e3d4c3551Jean-Michel Trivi // Also used for connections started with {@link #startBluetoothScoVirtualCall()} 15173def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent public void stopBluetoothSco(){ 15183def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent IAudioService service = getService(); 15193def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent try { 15203def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent service.stopBluetoothSco(mICallBack); 15213def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } catch (RemoteException e) { 15223def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent Log.e(TAG, "Dead object in stopBluetoothSco", e); 15233def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 15243def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent } 15253def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Request use of Bluetooth SCO headset for communications. 1528fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1529fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1530fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @param on set <var>true</var> to use bluetooth SCO for communications; 1533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * <var>false</var> to not use bluetooth SCO for communications 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBluetoothScoOn(boolean on){ 1536c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1537c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1538c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent service.setBluetoothScoOn(on); 1539c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1540c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent Log.e(TAG, "Dead object in setBluetoothScoOn", e); 1541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1545a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Checks whether communications use Bluetooth SCO. 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @return true if SCO is used for communications; 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if otherwise 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBluetoothScoOn() { 1551c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent IAudioService service = getService(); 1552c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent try { 1553c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent return service.isBluetoothScoOn(); 1554c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent } catch (RemoteException e) { 1555c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent Log.e(TAG, "Dead object in isBluetoothScoOn", e); 1556a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 1557a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1561242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * @param on set <var>true</var> to route A2DP audio to/from Bluetooth 1562242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * headset; <var>false</var> disable A2DP audio 1563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @deprecated Do not use. 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public void setBluetoothA2dpOn(boolean on){ 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1569242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * Checks whether A2DP audio routing to the Bluetooth headset is on or off. 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1571242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * @return true if A2DP audio is being routed to/from Bluetooth headset; 1572242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent * false if otherwise 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBluetoothA2dpOn() { 1575242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP,"") 1576242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent == AudioSystem.DEVICE_STATE_UNAVAILABLE) { 1577a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 1578242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent } else { 1579242b33870b51ea962a1d5c077d71c648eccc2b7aEric Laurent return true; 1580a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets audio routing to the wired headset on or off. 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param on set <var>true</var> to route audio to/from wired 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * headset; <var>false</var> disable wired headset audio 1588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @deprecated Do not use. 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public void setWiredHeadsetOn(boolean on){ 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1594497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * Checks whether a wired headset is connected or not. 1595497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * <p>This is not a valid indication that audio playback is 1596497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * actually over the wired headset as audio routing depends on other conditions. 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1598497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * @return true if a wired headset is connected. 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if otherwise 1600497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent * @deprecated Use only to check is a headset is connected or not. 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWiredHeadsetOn() { 16038b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET,"") 16046015a9715421a339c2b7bb63f9166504e3488179Eric Laurent == AudioSystem.DEVICE_STATE_UNAVAILABLE && 16058b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE,"") 1606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent == AudioSystem.DEVICE_STATE_UNAVAILABLE) { 1607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 1608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 1609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 1610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the microphone mute on or off. 1615fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1616fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * This method should only be used by applications that replace the platform-wide 1617fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * management of audio settings or the main telephony application. 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param on set <var>true</var> to mute the microphone; 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>false</var> to turn mute off 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMicrophoneMute(boolean on){ 162322c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier IAudioService service = getService(); 162422c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier try { 162522c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier service.setMicrophoneMute(on, mContext.getOpPackageName()); 162622c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier } catch (RemoteException e) { 162722c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier Log.e(TAG, "Dead object in setMicrophoneMute", e); 162822c921a910d236abf3a1705a02541a49fdaf3a14Emily Bernier } 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether the microphone mute is on or off. 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if microphone is muted, false if it's not 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isMicrophoneMute() { 1637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return AudioSystem.isMicrophoneMuted(); 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the audio mode. 1642fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * <p> 1643fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * The audio mode encompasses audio routing AND the behavior of 1644fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * the telephony layer. Therefore this method should only be used by applications that 1645fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * replace the platform-wide management of audio settings or the main telephony application. 1646fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * In particular, the {@link #MODE_IN_CALL} mode should only be used by the telephony 1647fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * application when it places a phone call, as it will cause signals from the radio layer 1648fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi * to feed the platform mixer. 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16508aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * @param mode the requested audio mode ({@link #MODE_NORMAL}, {@link #MODE_RINGTONE}, 16518aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * {@link #MODE_IN_CALL} or {@link #MODE_IN_COMMUNICATION}). 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Informs the HAL about the current audio state so that 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it can route the audio appropriately. 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMode(int mode) { 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16589272b4b4a44fe1f33e3030810618194f817caaecEric Laurent service.setMode(mode, mICallBack); 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in setMode", e); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current audio mode. 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16678aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * @return the current audio mode ({@link #MODE_NORMAL}, {@link #MODE_RINGTONE}, 16688aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi * {@link #MODE_IN_CALL} or {@link #MODE_IN_COMMUNICATION}). 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current current audio state from the HAL. 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMode() { 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return service.getMode(); 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in getMode", e); 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return MODE_INVALID; 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* modes for setMode/getMode/setRoute/getRoute */ 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Audio harware modes. 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Invalid audio mode. 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_INVALID = AudioSystem.MODE_INVALID; 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Current audio mode. Used to apply audio routing to current mode. 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_CURRENT = AudioSystem.MODE_CURRENT; 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normal audio mode: not ringing and no call established. 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_NORMAL = AudioSystem.MODE_NORMAL; 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ringing audio mode. An incoming is being signaled. 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE; 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17028f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi * In call audio mode. A telephony call is established. 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL; 17058f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi /** 17068f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi * In communication audio mode. An audio/video chat or VoIP call is established. 17078f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi */ 17088f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi public static final int MODE_IN_COMMUNICATION = AudioSystem.MODE_IN_COMMUNICATION; 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Routing bits for setRouting/getRouting API */ 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to earpiece 17134a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17144a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_EARPIECE = AudioSystem.ROUTE_EARPIECE; 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17184a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * Routing audio output to speaker 17194a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17204a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_SPEAKER = AudioSystem.ROUTE_SPEAKER; 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated use {@link #ROUTE_BLUETOOTH_SCO} 17254a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17264a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated public static final int ROUTE_BLUETOOTH = AudioSystem.ROUTE_BLUETOOTH_SCO; 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to bluetooth SCO 17314a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17324a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_BLUETOOTH_SCO = AudioSystem.ROUTE_BLUETOOTH_SCO; 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to headset 17374a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17384a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_HEADSET = AudioSystem.ROUTE_HEADSET; 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Routing audio output to bluetooth A2DP 17434a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17444a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_BLUETOOTH_A2DP = AudioSystem.ROUTE_BLUETOOTH_A2DP; 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used for mask parameter of {@link #setRouting(int,int,int)}. 17494a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 17504a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * setBluetoothScoOn() methods instead. 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public static final int ROUTE_ALL = AudioSystem.ROUTE_ALL; 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the audio routing for a specified mode 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode audio mode to change route. E.g., MODE_RINGTONE. 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param routes bit vector of routes requested, created from one or 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more of ROUTE_xxx types. Set bits indicate that route should be on 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mask bit vector of routes to change, created from one or more of 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ROUTE_xxx types. Unset bits indicate the route should be left unchanged 1762b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * 1763b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * @deprecated Do not set audio routing directly, use setSpeakerphoneOn(), 1764a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * setBluetoothScoOn() methods instead. 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1766a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRouting(int mode, int routes, int mask) { 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current audio routing bit vector for a specified mode. 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode audio mode to get route (e.g., MODE_RINGTONE) 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an audio route bit vector that can be compared with ROUTE_xxx 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bits 1776b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * @deprecated Do not query audio routing directly, use isSpeakerphoneOn(), 1777b9c9d260f21b321527c4622a123af9767630d94dEric Laurent * isBluetoothScoOn(), isBluetoothA2dpOn() and isWiredHeadsetOn() methods instead. 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1779b9c9d260f21b321527c4622a123af9767630d94dEric Laurent @Deprecated 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRouting(int mode) { 1781a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return -1; 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether any music is active. 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if any music tracks are active. 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isMusicActive() { 179025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return AudioSystem.isStreamActive(STREAM_MUSIC, 0); 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17933114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi /** 17943114ce3861f20f9a5c2c59dd2629197a1f4874a8Jean-Michel Trivi * @hide 1795679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * Checks whether any music or media is actively playing on a remote device (e.g. wireless 1796679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * display). Note that BT audio sinks are not considered remote devices. 1797679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * @return true if {@link AudioManager#STREAM_MUSIC} is active on a remote device 1798679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi */ 1799679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi public boolean isMusicActiveRemotely() { 1800679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi return AudioSystem.isStreamActiveRemotely(STREAM_MUSIC, 0); 1801679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi } 1802679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi 1803679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi /** 1804679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi * @hide 18052380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * Checks whether the current audio focus is exclusive. 18062380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * @return true if the top of the audio focus stack requested focus 18072380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * with {@link #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} 18082380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi */ 18092380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi public boolean isAudioFocusExclusive() { 18102380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi IAudioService service = getService(); 18112380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi try { 18122380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi return service.getCurrentAudioFocus() == AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE; 18132380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi } catch (RemoteException e) { 18142380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi Log.e(TAG, "Dead object in isAudioFocusExclusive()", e); 18152380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi return false; 18162380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi } 18172380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi } 18182380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi 18192380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi /** 18208a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi * Return a new audio session identifier not associated with any player or effect. 18219e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * An audio session identifier is a system wide unique identifier for a set of audio streams 18229e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * (one or more mixed together). 18239e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * <p>The primary use of the audio session ID is to associate audio effects to audio players, 18249e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * such as {@link MediaPlayer} or {@link AudioTrack}: all audio effects sharing the same audio 18259e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * session ID will be applied to the mixed audio content of the players that share the same 18269e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * audio session. 18279e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * <p>This method can for instance be used when creating one of the 18289e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * {@link android.media.audiofx.AudioEffect} objects to define the audio session of the effect, 18299e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * or to specify a session for a speech synthesis utterance 18309e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * in {@link android.speech.tts.TextToSpeech.Engine}. 18318a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi * @return a new unclaimed and unused audio session identifier, or {@link #ERROR} when the 18329e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * system failed to generate a new session, a condition in which audio playback or recording 18339e477e408433fe1bd0c695b1e7a0738a76009cfdJean-Michel Trivi * will subsequently fail as well. 18348a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi */ 1835289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi public int generateAudioSessionId() { 18368a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi int session = AudioSystem.newAudioSessionId(); 18378a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi if (session > 0) { 18388a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi return session; 18398a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi } else { 1840289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi Log.e(TAG, "Failure to generate a new audio session ID"); 18418a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi return ERROR; 18428a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi } 18438a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi } 18448a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi 1845289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi /** 1846289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * A special audio session ID to indicate that the audio session ID isn't known and the 1847289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * framework should generate a new value. This can be used when building a new 1848289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * {@link AudioTrack} instance with 1849289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi * {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}. 1850289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi */ 1851289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi public static final int AUDIO_SESSION_ID_GENERATE = AudioSystem.AUDIO_SESSION_ALLOCATE; 1852289cc8e887f786f557faab226a1e01abb9a632a6Jean-Michel Trivi 18538a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets a generic audio configuration parameter. The use of these parameters 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are platform dependant, see libaudio 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ** Temporary interface - DO NOT USE 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Replace with a more generic key:value get/set mechanism 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * param key name of parameter to set. Must not be null. 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * param value value of parameter. Must not be null. 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1867ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn * @deprecated Use {@link #setParameters(String)} instead 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent @Deprecated public void setParameter(String key, String value) { 1870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent setParameters(key+"="+value); 1871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 1872a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** 1874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Sets a variable number of parameter values to audio hardware. 1875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 1876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @param keyValuePairs list of parameters key value pairs in the form: 1877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * key1=value1;key2=value2;... 1878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 1879a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent */ 1880a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public void setParameters(String keyValuePairs) { 1881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem.setParameters(keyValuePairs); 1882a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 1883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /** 1885aac753dcf8862b416773eabaabb9d938a30f5896John Spurlock * Gets a variable number of parameter values from audio hardware. 1886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 1887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @param keys list of parameters 1888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * @return list of parameters key value pairs in the form: 1889a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * key1=value1;key2=value2;... 1890a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent */ 1891a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public String getParameters(String keys) { 1892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return AudioSystem.getParameters(keys); 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Sound effect identifiers */ 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Keyboard and direction pad click sound 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEY_CLICK = 0; 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved up 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_UP = 1; 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved down 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_DOWN = 2; 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved left 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_LEFT = 3; 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus has moved right 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_FOCUS_NAVIGATION_RIGHT = 4; 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME standard keypress sound 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_STANDARD = 5; 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME spacebar keypress sound 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_SPACEBAR = 6; 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME delete keypress sound 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_DELETE = 7; 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME return_keypress sound 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #playSoundEffect(int) 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_KEYPRESS_RETURN = 8; 1941cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh 1942cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh /** 1943cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * Invalid keypress sound 1944cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * @see #playSoundEffect(int) 1945cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh */ 1946cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh public static final int FX_KEYPRESS_INVALID = 9; 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide Number of sound effects 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1950cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh public static final int NUM_SOUND_EFFECTS = 10; 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Plays a sound effect (Key clicks, lid open/close...) 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param effectType The type of sound effect. One of 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_KEY_CLICK}, 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_UP}, 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_DOWN}, 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_LEFT}, 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_RIGHT}, 1960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_STANDARD}, 1961105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_SPACEBAR}, 1962105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_DELETE}, 1963105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_RETURN}, 1964cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * {@link #FX_KEYPRESS_INVALID}, 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: This version uses the UI settings to determine 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether sounds are heard or not. 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void playSoundEffect(int effectType) { 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19730c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk if (!querySoundEffectsEnabled(Process.myUserHandle().getIdentifier())) { 19740c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk return; 19750c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19760c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk 19770c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk IAudioService service = getService(); 19780c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk try { 19790c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk service.playSoundEffect(effectType); 19800c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } catch (RemoteException e) { 19810c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk Log.e(TAG, "Dead object in playSoundEffect"+e); 19820c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19830c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 19840c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk 19850c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk /** 19860c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * Plays a sound effect (Key clicks, lid open/close...) 19870c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * @param effectType The type of sound effect. One of 19880c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEY_CLICK}, 19890c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_UP}, 19900c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_DOWN}, 19910c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_LEFT}, 19920c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_FOCUS_NAVIGATION_RIGHT}, 19930c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_STANDARD}, 19940c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_SPACEBAR}, 19950c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_DELETE}, 19960c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_RETURN}, 19970c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * {@link #FX_KEYPRESS_INVALID}, 19980c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * @param userId The current user to pull sound settings from 19990c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * NOTE: This version uses the UI settings to determine 20000c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * whether sounds are heard or not. 20010c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk * @hide 20020c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk */ 20030c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk public void playSoundEffect(int effectType, int userId) { 20040c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { 20050c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk return; 20060c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk } 20070c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk 20080c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk if (!querySoundEffectsEnabled(userId)) { 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.playSoundEffect(effectType); 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in playSoundEffect"+e); 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Plays a sound effect (Key clicks, lid open/close...) 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param effectType The type of sound effect. One of 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_KEY_CLICK}, 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_UP}, 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_DOWN}, 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_LEFT}, 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FX_FOCUS_NAVIGATION_RIGHT}, 2028105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_STANDARD}, 2029105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_SPACEBAR}, 2030105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_DELETE}, 2031105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link #FX_KEYPRESS_RETURN}, 2032cacfe69b6845dd1c1c8682f67c3c52ef35214b2cJustin Koh * {@link #FX_KEYPRESS_INVALID}, 2033a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent * @param volume Sound effect volume. 2034a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent * The volume value is a raw scalar so UI controls should be scaled logarithmically. 2035a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent * If a volume of -1 is specified, the AudioManager.STREAM_MUSIC stream volume minus 3dB will be used. 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: This version is for applications that have their own 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings panel for enabling and controlling volume. 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void playSoundEffect(int effectType, float volume) { 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.playSoundEffectVolume(effectType, volume); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in playSoundEffect"+e); 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Settings has an in memory cache, so this is fast. 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20550c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk private boolean querySoundEffectsEnabled(int user) { 20560c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk return Settings.System.getIntForUser(mContext.getContentResolver(), 20570c37ba318847a44cb9256e55eca1160dc1fffd4dJason Monk Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0; 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load Sound effects. 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method must be called when sound effects are enabled. 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void loadSoundEffects() { 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.loadSoundEffects(); 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in loadSoundEffects"+e); 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unload Sound effects. 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method can be called to free some memory when 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sound effects are disabled. 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unloadSoundEffects() { 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAudioService service = getService(); 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.unloadSoundEffects(); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Dead object in unloadSoundEffects"+e); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20884050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent /** 20892380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * @hide 20902380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * Used to indicate no audio focus has been gained or lost. 20912380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi */ 20922380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi public static final int AUDIOFOCUS_NONE = 0; 20932380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi 20942380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi /** 2095d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Used to indicate a gain of audio focus, or a request of audio focus, of unknown duration. 20967f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2097d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 2098d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2099d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_GAIN = 1; 2100d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2101d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Used to indicate a temporary gain or request of audio focus, anticipated to last a short 2102d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * amount of time. Examples of temporary changes are the playback of driving directions, or an 2103d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * event notification. 21047f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2105d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 2106d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2107d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2; 2108078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 2109078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a temporary request of audio focus, anticipated to last a short 2110983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * amount of time, and where it is acceptable for other audio applications to keep playing 2111983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * after having lowered their output level (also referred to as "ducking"). 2112078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Examples of temporary changes are the playback of driving directions where playback of music 2113078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * in the background is acceptable. 21147f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2115078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 2116078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2117078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = 3; 2118078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 21192380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * Used to indicate a temporary request of audio focus, anticipated to last a short 21202380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * amount of time, during which no other applications, or system components, should play 21212380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * anything. Examples of exclusive and transient audio focus requests are voice 21222380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * memo recording and speech recognition, during which the system shouldn't play any 21232380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * notifications, and media playback should have paused. 21242380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int) 21252380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi */ 21262380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi public static final int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE = 4; 21272380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi /** 2128078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a loss of audio focus of unknown duration. 21297f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2130078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2131078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_LOSS = -1 * AUDIOFOCUS_GAIN; 2132078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 2133078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a transient loss of audio focus. 21347f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2135078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2136078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_LOSS_TRANSIENT = -1 * AUDIOFOCUS_GAIN_TRANSIENT; 2137078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi /** 2138078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Used to indicate a transient loss of audio focus where the loser of the audio focus can 2139983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * lower its output volume if it wants to continue playing (also referred to as "ducking"), as 2140983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * the new focus owner doesn't require others to be silent. 21417f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi * @see OnAudioFocusChangeListener#onAudioFocusChange(int) 2142078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi */ 2143078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = 2144078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi -1 * AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK; 2145d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2146d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2147d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Interface definition for a callback to be invoked when the audio focus of the system is 2148d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * updated. 2149d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2150d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public interface OnAudioFocusChangeListener { 2151d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2152d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Called on the listener to notify it the audio focus for this listener has been changed. 2153d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * The focusChange value indicates whether the focus was gained, 2154d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * whether the focus was lost, and whether that loss is transient, or whether the new focus 2155d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * holder will hold it for an unknown amount of time. 2156983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * When losing focus, listeners can use the focus change information to decide what 2157983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * behavior to adopt when losing focus. A music player could for instance elect to lower 2158983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * the volume of its music stream (duck) for transient focus losses, and pause otherwise. 2159983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * @param focusChange the type of focus change, one of {@link AudioManager#AUDIOFOCUS_GAIN}, 2160078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * {@link AudioManager#AUDIOFOCUS_LOSS}, {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT} 2161983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * and {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}. 2162d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 21637f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi public void onAudioFocusChange(int focusChange); 2164d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2165d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2166d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2167d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Map to convert focus event listener IDs, as used in the AudioService audio focus stack, 2168d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * to actual listener objects. 2169d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 217030c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final HashMap<String, OnAudioFocusChangeListener> mAudioFocusIdListenerMap = 2171d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi new HashMap<String, OnAudioFocusChangeListener>(); 2172d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2173d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Lock to prevent concurrent changes to the list of focus listeners for this AudioManager 2174d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * instance. 2175d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2176d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private final Object mFocusListenerLock = new Object(); 2177d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2178d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private OnAudioFocusChangeListener findFocusListener(String id) { 2179d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi return mAudioFocusIdListenerMap.get(id); 2180d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2181d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2182d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2183d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Handler for audio focus events coming from the audio service. 2184d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 218530c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final FocusEventHandlerDelegate mAudioFocusEventHandlerDelegate = 2186d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi new FocusEventHandlerDelegate(); 2187078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi 2188d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2189d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Helper class to handle the forwarding of audio focus events to the appropriate listener 2190d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2191d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private class FocusEventHandlerDelegate { 2192d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi private final Handler mHandler; 2193d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2194d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi FocusEventHandlerDelegate() { 2195d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi Looper looper; 2196d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi if ((looper = Looper.myLooper()) == null) { 2197d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi looper = Looper.getMainLooper(); 2198d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2199d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2200d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi if (looper != null) { 2201d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi // implement the event handler delegate to receive audio focus events 2202d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi mHandler = new Handler(looper) { 2203d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi @Override 2204d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void handleMessage(Message msg) { 2205d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi OnAudioFocusChangeListener listener = null; 2206d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi synchronized(mFocusListenerLock) { 2207d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi listener = findFocusListener((String)msg.obj); 2208d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2209d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi if (listener != null) { 22107f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi listener.onAudioFocusChange(msg.what); 2211d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2212d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2213d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi }; 2214d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } else { 2215d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi mHandler = null; 2216d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2217d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2218d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2219d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi Handler getHandler() { 2220d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return mHandler; 2221d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2222d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2223d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 222430c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final IAudioFocusDispatcher mAudioFocusDispatcher = new IAudioFocusDispatcher.Stub() { 2225d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2226d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void dispatchAudioFocusChange(int focusChange, String id) { 2227d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi Message m = mAudioFocusEventHandlerDelegate.getHandler().obtainMessage(focusChange, id); 2228d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi mAudioFocusEventHandlerDelegate.getHandler().sendMessage(m); 2229d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2230d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2231d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi }; 2232d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2233d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi private String getIdForAudioFocusListener(OnAudioFocusChangeListener l) { 2234d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi if (l == null) { 2235308e9a5d0975489982f93fd1f3728e6ed7a778d0Jean-Michel Trivi return new String(this.toString()); 2236d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } else { 2237d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return new String(this.toString() + l.toString()); 2238d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2239d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2240d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2241d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 22425f53f0883a507b9d4b9b9891af560a64f746d149Xavier Ducrohet * @hide 224346b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Registers a listener to be called when audio focus changes. Calling this method is optional 224446b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * before calling {@link #requestAudioFocus(OnAudioFocusChangeListener, int, int)}, as it 224546b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * will register the listener as well if it wasn't registered already. 224646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param l the listener to be notified of audio focus changes. 2247d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2248d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void registerAudioFocusListener(OnAudioFocusChangeListener l) { 2249d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi synchronized(mFocusListenerLock) { 2250d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi if (mAudioFocusIdListenerMap.containsKey(getIdForAudioFocusListener(l))) { 2251d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return; 2252d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2253d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi mAudioFocusIdListenerMap.put(getIdForAudioFocusListener(l), l); 2254d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2255d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2256d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2257d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 22585f53f0883a507b9d4b9b9891af560a64f746d149Xavier Ducrohet * @hide 225946b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Causes the specified listener to not be called anymore when focus is gained or lost. 226046b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param l the listener to unregister. 2261d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2262d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public void unregisterAudioFocusListener(OnAudioFocusChangeListener l) { 2263392a2bbb52688ebd25768a7784d9edca7f498110Jean-Michel Trivi 2264d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi // remove locally 2265d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi synchronized(mFocusListenerLock) { 2266d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi mAudioFocusIdListenerMap.remove(getIdForAudioFocusListener(l)); 2267d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2268d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2269d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2270d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2271d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 227246b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * A failed focus change request. 2273d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2274d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_REQUEST_FAILED = 0; 2275d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 227646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * A successful focus change request. 2277d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2278d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; 2279d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2280d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2281d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 2282d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * Request audio focus. 228346b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Send a request to obtain the audio focus 2284d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @param l the listener to be notified of audio focus changes 2285d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @param streamType the main audio stream type affected by the focus request 2286d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request 2287d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * is temporary, and focus will be abandonned shortly. Examples of transient requests are 2288078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * for the playback of driving directions, or notifications sounds. 2289983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for 2290983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi * the previous focus owner to keep playing if it ducks its audio output. 22919171db279826ee91d64eb9538a504ffed5e53b38Jean-Michel Trivi * Alternatively use {@link #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} for a temporary request 22929171db279826ee91d64eb9538a504ffed5e53b38Jean-Michel Trivi * that benefits from the system not playing disruptive sounds like notifications, for 22939171db279826ee91d64eb9538a504ffed5e53b38Jean-Michel Trivi * usecases such as voice memo recording, or speech recognition. 2294078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi * Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such 2295d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * as the playback of a song or a video. 2296d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED} 2297d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2298d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) { 2299d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi int status = AUDIOFOCUS_REQUEST_FAILED; 23002380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi if ((durationHint < AUDIOFOCUS_GAIN) || 23012380566debfc57eb1cc07db1306ccee23b84ddd4Jean-Michel Trivi (durationHint > AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)) { 230255d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi Log.e(TAG, "Invalid duration hint, audio focus request denied"); 230355d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi return status; 230455d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi } 2305d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi registerAudioFocusListener(l); 2306d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi //TODO protect request by permission check? 2307d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi IAudioService service = getService(); 2308d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi try { 2309d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi status = service.requestAudioFocus(streamType, durationHint, mICallBack, 23108f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi mAudioFocusDispatcher, getIdForAudioFocusListener(l), 231195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mContext.getOpPackageName() /* package name */); 2312d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } catch (RemoteException e) { 23134dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi Log.e(TAG, "Can't call requestAudioFocus() on AudioService due to "+e); 2314d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2315d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return status; 2316d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2317d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 23184dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi /** 23194dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @hide 23204dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * Used internally by telephony package to request audio focus. Will cause the focus request 23214dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * to be associated with the "voice communication" identifier only used in AudioService 23224dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * to identify this use case. 23234dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @param streamType use STREAM_RING for focus requests when ringing, VOICE_CALL for 23244dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * the establishment of the call 23254dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @param durationHint the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so 23264dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * media applications resume after a call 23274dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi */ 23284dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi public void requestAudioFocusForCall(int streamType, int durationHint) { 23294dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi IAudioService service = getService(); 23304dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi try { 23314dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi service.requestAudioFocus(streamType, durationHint, mICallBack, null, 2332fa9a69805b001034aa04c3b33989a7ac21522371Jean-Michel Trivi MediaFocusControl.IN_VOICE_COMM_FOCUS_ID, 233395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mContext.getOpPackageName()); 23344dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } catch (RemoteException e) { 23354dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi Log.e(TAG, "Can't call requestAudioFocusForCall() on AudioService due to "+e); 23364dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 23374dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 23384dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi 23394dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi /** 23404dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * @hide 23414dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * Used internally by telephony package to abandon audio focus, typically after a call or 23424dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * when ringing ends and the call is rejected or not answered. 23434dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi * Should match one or more calls to {@link #requestAudioFocusForCall(int, int)}. 23444dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi */ 23454dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi public void abandonAudioFocusForCall() { 23464dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi IAudioService service = getService(); 23474dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi try { 2348fa9a69805b001034aa04c3b33989a7ac21522371Jean-Michel Trivi service.abandonAudioFocus(null, MediaFocusControl.IN_VOICE_COMM_FOCUS_ID); 23494dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } catch (RemoteException e) { 23504dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi Log.e(TAG, "Can't call abandonAudioFocusForCall() on AudioService due to "+e); 23514dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 23524dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi } 2353d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2354d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi /** 235546b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Abandon audio focus. Causes the previous focus owner, if any, to receive focus. 235646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param l the listener with which focus was requested. 2357d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED} 2358d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi */ 2359d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi public int abandonAudioFocus(OnAudioFocusChangeListener l) { 2360d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi int status = AUDIOFOCUS_REQUEST_FAILED; 2361392a2bbb52688ebd25768a7784d9edca7f498110Jean-Michel Trivi unregisterAudioFocusListener(l); 2362d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi IAudioService service = getService(); 2363d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi try { 2364d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi status = service.abandonAudioFocus(mAudioFocusDispatcher, 2365d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi getIdForAudioFocusListener(l)); 2366d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } catch (RemoteException e) { 23674dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi Log.e(TAG, "Can't call abandonAudioFocus() on AudioService due to "+e); 2368d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2369d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi return status; 2370d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi } 2371d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2372d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi 2373d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi //==================================================================== 2374d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi // Remote Control 2375d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi /** 237646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Register a component to be the sole receiver of MEDIA_BUTTON intents. 2377d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} 2378d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi * that will receive the media button intent. This broadcast receiver must be declared 2379f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * in the application manifest. The package of the component must match that of 2380f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * the context you're registering from. 2381b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead. 2382d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi */ 2383b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2384d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi public void registerMediaButtonEventReceiver(ComponentName eventReceiver) { 23858f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi if (eventReceiver == null) { 23868f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 23878f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 2388f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi if (!eventReceiver.getPackageName().equals(mContext.getPackageName())) { 2389f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Log.e(TAG, "registerMediaButtonEventReceiver() error: " + 2390f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi "receiver and context package names don't match"); 2391f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi return; 2392f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2393f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // construct a PendingIntent for the media button and register it 2394f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 2395f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // the associated intent will be handled by the component being registered 2396f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi mediaButtonIntent.setComponent(eventReceiver); 2397f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi PendingIntent pi = PendingIntent.getBroadcast(mContext, 2398f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); 2399f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi registerMediaButtonIntent(pi, eventReceiver); 2400f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2401f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 2402f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi /** 2403961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * Register a component to be the sole receiver of MEDIA_BUTTON intents. This is like 2404961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * {@link #registerMediaButtonEventReceiver(android.content.ComponentName)}, but allows 2405961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * the buttons to go to any PendingIntent. Note that you should only use this form if 2406961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * you know you will continue running for the full time until unregistering the 2407961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * PendingIntent. 2408961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * @param eventReceiver target that will receive media button intents. The PendingIntent 2409b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * will be sent an {@link Intent#ACTION_MEDIA_BUTTON} event when a media button action 2410b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * occurs, with {@link Intent#EXTRA_KEY_EVENT} added and holding the key code of the 2411b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * media button that was pressed. 2412b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead. 2413961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn */ 2414b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2415961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn public void registerMediaButtonEventReceiver(PendingIntent eventReceiver) { 2416961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn if (eventReceiver == null) { 2417961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn return; 2418961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2419961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn registerMediaButtonIntent(eventReceiver, null); 2420961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2421961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn 2422961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn /** 2423f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * @hide 2424f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * no-op if (pi == null) or (eventReceiver == null) 2425f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi */ 2426f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi public void registerMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) { 2427961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn if (pi == null) { 2428f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Log.e(TAG, "Cannot call registerMediaButtonIntent() with a null parameter"); 2429f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi return; 2430f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2431430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); 24326f0e4ddd66fcdcc13944d8970d0b560e2626508bRoboErik helper.addMediaButtonListener(pi, eventReceiver, mContext); 2433722b808662eb20fa91151f1e3aa05fd911d1d226Jean-Michel Trivi } 2434722b808662eb20fa91151f1e3aa05fd911d1d226Jean-Michel Trivi 2435722b808662eb20fa91151f1e3aa05fd911d1d226Jean-Michel Trivi /** 243646b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * Unregister the receiver of MEDIA_BUTTON intents. 243746b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} 243846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi * that was registered with {@link #registerMediaButtonEventReceiver(ComponentName)}. 2439b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 2440d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi */ 2441b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2442d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) { 24438f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi if (eventReceiver == null) { 24448f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 24458f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 2446f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // construct a PendingIntent for the media button and unregister it 2447f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 2448f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi // the associated intent will be handled by the component being registered 2449f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi mediaButtonIntent.setComponent(eventReceiver); 2450f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi PendingIntent pi = PendingIntent.getBroadcast(mContext, 2451f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); 2452b839b83c7349533b4cb7278fd3d792b47199ba36Jean-Michel Trivi unregisterMediaButtonIntent(pi); 2453f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi } 2454f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi 2455f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi /** 2456961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * Unregister the receiver of MEDIA_BUTTON intents. 2457961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * @param eventReceiver same PendingIntent that was registed with 2458961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn * {@link #registerMediaButtonEventReceiver(PendingIntent)}. 2459b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 2460961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn */ 2461b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 2462961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn public void unregisterMediaButtonEventReceiver(PendingIntent eventReceiver) { 2463961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn if (eventReceiver == null) { 2464961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn return; 2465961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2466b839b83c7349533b4cb7278fd3d792b47199ba36Jean-Michel Trivi unregisterMediaButtonIntent(eventReceiver); 2467961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn } 2468961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn 2469961cae92540763226648813d111c5b5c3b0f1597Dianne Hackborn /** 2470f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi * @hide 2471f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi */ 2472b839b83c7349533b4cb7278fd3d792b47199ba36Jean-Michel Trivi public void unregisterMediaButtonIntent(PendingIntent pi) { 2473430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); 2474430fc48865e5a371b08f180390946b96d73848feRoboErik helper.removeMediaButtonListener(pi); 2475d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi } 2476d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi 2477178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi /** 2478178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi * Registers the remote control client for providing information to display on the remote 2479178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi * controls. 2480466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * @param rcClient The remote control client from which remote controls will receive 2481466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * information to display. 2482466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * @see RemoteControlClient 2483b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 24848f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi */ 2485b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 24864426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi public void registerRemoteControlClient(RemoteControlClient rcClient) { 2487f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) { 24888f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 24898f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 2490430fc48865e5a371b08f180390946b96d73848feRoboErik rcClient.registerWithSession(MediaSessionLegacyHelper.getHelper(mContext)); 24918f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 24928f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi 24938f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi /** 2494fcd693a21d862ea765006f8987b8dd4b125b28c5Jean-Michel Trivi * Unregisters the remote control client that was providing information to display on the 2495466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * remote controls. 2496466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi * @param rcClient The remote control client to unregister. 24974426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi * @see #registerRemoteControlClient(RemoteControlClient) 2498b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use {@link MediaSession} instead. 24998f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi */ 2500b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 25014426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi public void unregisterRemoteControlClient(RemoteControlClient rcClient) { 2502f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) { 25038f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi return; 25048f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 2505430fc48865e5a371b08f180390946b96d73848feRoboErik rcClient.unregisterWithSession(MediaSessionLegacyHelper.getHelper(mContext)); 25068f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi } 25078f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi 250844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi /** 2509a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * Registers a {@link RemoteController} instance for it to receive media 2510a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * metadata updates and playback state information from applications using 2511a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * {@link RemoteControlClient}, and control their playback. 2512a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * <p> 2513a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * Registration requires the {@link OnClientUpdateListener} listener to be 2514a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * one of the enabled notification listeners (see 2515f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi * {@link android.service.notification.NotificationListenerService}). 2516a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * 2517a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * @param rctlr the object to register. 2518a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * @return true if the {@link RemoteController} was successfully registered, 2519a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * false if an error occurred, due to an internal system error, or 2520a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * insufficient permissions. 2521b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use 2522a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * {@link MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, ComponentName)} 2523a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * and {@link MediaController} instead. 25247ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi */ 2525b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 25267ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi public boolean registerRemoteController(RemoteController rctlr) { 25277ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi if (rctlr == null) { 25287ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi return false; 25297ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 2530430fc48865e5a371b08f180390946b96d73848feRoboErik rctlr.startListeningToSessions(); 2531430fc48865e5a371b08f180390946b96d73848feRoboErik return true; 25327ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 25337ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi 25347ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi /** 2535a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * Unregisters a {@link RemoteController}, causing it to no longer receive 2536a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * media metadata and playback state information, and no longer be capable 2537a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * of controlling playback. 2538a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * 2539a83487e8c618f3c267c3fe3a72d4eb9f1388d07eJean-Michel Trivi * @param rctlr the object to unregister. 2540b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik * @deprecated Use 2541a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * {@link MediaSessionManager#removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener)} 2542a66c40bf6e0fb79ead6d8a9fc29c5671fa7b1206RoboErik * instead. 25437ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi */ 2544b214efbb9170a9f6a4991684a63ca59680074cc7RoboErik @Deprecated 25457ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi public void unregisterRemoteController(RemoteController rctlr) { 25467ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi if (rctlr == null) { 25477ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi return; 25487ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 2549430fc48865e5a371b08f180390946b96d73848feRoboErik rctlr.stopListeningToSessions(); 25507ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi } 25517ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi 25527ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi /** 25537ddd226e7c6e759feaf2747a90be1cc06acf37a3Jean-Michel Trivi * @hide 255444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * Registers a remote control display that will be sent information by remote control clients. 25554a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * Use this method if your IRemoteControlDisplay is not going to display artwork, otherwise 25564a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * use {@link #registerRemoteControlDisplay(IRemoteControlDisplay, int, int)} to pass the 25574a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * artwork size directly, or 25584a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * {@link #remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay, int, int)} later if artwork 25594a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * is not yet needed. 2560f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission. 25614a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * @param rcd the IRemoteControlDisplay 256244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi */ 256344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) { 25644a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi // passing a negative value for art work width and height as they are unknown at this stage 25654a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi registerRemoteControlDisplay(rcd, /*w*/-1, /*h*/ -1); 25664a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi } 25674a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi 25684a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi /** 25694a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * @hide 25704a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * Registers a remote control display that will be sent information by remote control clients. 2571f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission. 25724a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * @param rcd 25734a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * @param w the maximum width of the expected bitmap. Negative values indicate it is 25744a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * useless to send artwork. 25754a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * @param h the maximum height of the expected bitmap. Negative values indicate it is 25764a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi * useless to send artwork. 25774a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi */ 25784a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi public void registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) { 257944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi if (rcd == null) { 258044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi return; 258144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 258244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi IAudioService service = getService(); 258344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi try { 25844a5700556191c835116ec2a6997a4f16f464ac9dJean-Michel Trivi service.registerRemoteControlDisplay(rcd, w, h); 258544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } catch (RemoteException e) { 258644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi Log.e(TAG, "Dead object in registerRemoteControlDisplay " + e); 258744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 258844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 258944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi 259044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi /** 259144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * @hide 259244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * Unregisters a remote control display that was sent information by remote control clients. 259344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * @param rcd 259444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi */ 259544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) { 259644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi if (rcd == null) { 259744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi return; 259844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 259944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi IAudioService service = getService(); 260044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi try { 260144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi service.unregisterRemoteControlDisplay(rcd); 260244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } catch (RemoteException e) { 260344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi Log.e(TAG, "Dead object in unregisterRemoteControlDisplay " + e); 260444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 260544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 260644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi 260744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi /** 260844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * @hide 260944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * Sets the artwork size a remote control display expects when receiving bitmaps. 261044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * @param rcd 261144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * @param w the maximum width of the expected bitmap. Negative values indicate it is 261244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * useless to send artwork. 261344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * @param h the maximum height of the expected bitmap. Negative values indicate it is 261444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi * useless to send artwork. 261544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi */ 261644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi public void remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay rcd, int w, int h) { 261744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi if (rcd == null) { 261844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi return; 261944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 262044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi IAudioService service = getService(); 262144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi try { 262244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi service.remoteControlDisplayUsesBitmapSize(rcd, w, h); 262344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } catch (RemoteException e) { 262444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi Log.e(TAG, "Dead object in remoteControlDisplayUsesBitmapSize " + e); 262544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 262644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi } 2627ced110ec5970c632f523dfc0350b6071461ea9bcNeel Parekh 2628b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi /** 26293261b537c5fdec824575a1f6ad6d8942715e82e2Jean-Michel Trivi * @hide 2630c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * Controls whether a remote control display needs periodic checks of the RemoteControlClient 2631c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * playback position to verify that the estimated position has not drifted from the actual 2632c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * position. By default the check is not performed. 2633c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * The IRemoteControlDisplay must have been previously registered for this to have any effect. 2634c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * @param rcd the IRemoteControlDisplay for which the anti-drift mechanism will be enabled 2635c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * or disabled. No effect is null. 2636c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * @param wantsSync if true, RemoteControlClient instances which expose their playback position 2637c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * to the framework will regularly compare the estimated playback position with the actual 2638c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * position, and will update the IRemoteControlDisplay implementation whenever a drift is 2639c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi * detected. 2640c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi */ 2641c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi public void remoteControlDisplayWantsPlaybackPositionSync(IRemoteControlDisplay rcd, 2642c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi boolean wantsSync) { 2643c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi if (rcd == null) { 2644c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi return; 2645c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi } 2646c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi IAudioService service = getService(); 2647c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi try { 2648c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi service.remoteControlDisplayWantsPlaybackPositionSync(rcd, wantsSync); 2649c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi } catch (RemoteException e) { 2650c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi Log.e(TAG, "Dead object in remoteControlDisplayWantsPlaybackPositionSync " + e); 2651c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi } 2652c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi } 2653c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi 2654c3c4babf8424f65b3d3d2700f60fae6e94e9cd00Jean-Michel Trivi /** 2655a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @hide 2656a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * CANDIDATE FOR PUBLIC API 2657a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * Register the given {@link AudioPolicy}. 2658a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * This call is synchronous and blocks until the registration process successfully completed 2659a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * or failed to complete. 2660a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @param policy the {@link AudioPolicy} to register. 2661a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @return {@link #ERROR} if there was an error communicating with the registration service 2662a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * or if the user doesn't have the required 2663a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * {@link android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission, 2664a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * {@link #SUCCESS} otherwise. 2665a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi */ 2666a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi public int registerAudioPolicy(AudioPolicy policy) { 2667a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi if (policy == null) { 2668a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioPolicy argument"); 2669a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2670a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi IAudioService service = getService(); 2671a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi try { 2672a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi if (!service.registerAudioPolicy(policy.getConfig(), policy.token())) { 2673a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi return ERROR; 2674a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2675a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } catch (RemoteException e) { 2676a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi Log.e(TAG, "Dead object in registerAudioPolicyAsync()", e); 2677a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi return ERROR; 2678a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2679a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi return SUCCESS; 2680a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2681a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi 2682a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi /** 2683a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @hide 2684a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * CANDIDATE FOR PUBLIC API 2685a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * @param policy the {@link AudioPolicy} to unregister. 2686a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi */ 2687a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi public void unregisterAudioPolicyAsync(AudioPolicy policy) { 2688a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi if (policy == null) { 2689a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi throw new IllegalArgumentException("Illegal null AudioPolicy argument"); 2690a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2691a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi IAudioService service = getService(); 2692a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi try { 2693a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi service.unregisterAudioPolicyAsync(policy.token()); 2694a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } catch (RemoteException e) { 2695a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi Log.e(TAG, "Dead object in unregisterAudioPolicyAsync()", e); 2696a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2697a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi } 2698a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi 2699a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi 2700a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi /** 27014050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * @hide 27024050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * Reload audio settings. This method is called by Settings backup 27034050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * agent when audio settings are restored and causes the AudioService 27044050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent * to read and apply restored settings. 27054050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent */ 27064050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent public void reloadAudioSettings() { 27074050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent IAudioService service = getService(); 27084050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent try { 27094050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent service.reloadAudioSettings(); 27104050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent } catch (RemoteException e) { 27114050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent Log.e(TAG, "Dead object in reloadAudioSettings"+e); 27124050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent } 27134050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent } 27144050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent 27155a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du /** 27165a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * @hide 27175a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * Notifies AudioService that it is connected to an A2DP device that supports absolute volume, 27185a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * so that AudioService can send volume change events to the A2DP device, rather than handling 27195a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du * them. 27205a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du */ 27215a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du public void avrcpSupportsAbsoluteVolume(String address, boolean support) { 27225a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du IAudioService service = getService(); 27235a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du try { 27245a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du service.avrcpSupportsAbsoluteVolume(address, support); 27255a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du } catch (RemoteException e) { 27265a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du Log.e(TAG, "Dead object in avrcpSupportsAbsoluteVolume", e); 27275a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du } 27285a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du } 27295a0cf7a27f3953a1266af48543ccd9024f4cd89fJohn Du 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 273330c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final IBinder mICallBack = new Binder(); 27347f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten 27357f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten /** 27367f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * Checks whether the phone is in silent mode, with or without vibrate. 27377f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * 27387f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * @return true if phone is in silent mode, with or without vibrate. 27397f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * 27407f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * @see #getRingerMode() 27417f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * 27427f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten * @hide pending API Council approval 27437f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten */ 27447f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten public boolean isSilentMode() { 27457f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten int ringerMode = getRingerMode(); 27467f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten boolean silentMode = 27477f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten (ringerMode == RINGER_MODE_SILENT) || 27487f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten (ringerMode == RINGER_MODE_VIBRATE); 27497f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten return silentMode; 27507f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten } 27517f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten 27528b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten // This section re-defines new output device constants from AudioSystem, because the AudioSystem 27538b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten // class is not used by other parts of the framework, which instead use definitions and methods 27548b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten // from AudioManager. AudioSystem is an internal class used by AudioManager and AudioService. 27558b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 2756948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2757d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim * The audio device code for representing "no device." */ 2758d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim public static final int DEVICE_NONE = AudioSystem.DEVICE_NONE; 2759d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim /** @hide 2760948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for the small speaker at the front of the device used 27618b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * when placing calls. Does not refer to an in-ear headphone without attached microphone, 27628b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * such as earbuds, earphones, or in-ear monitors (IEM). Those would be handled as a 27638b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_WIRED_HEADPHONE}. 27648b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 27658b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_EARPIECE = AudioSystem.DEVICE_OUT_EARPIECE; 2766948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2767948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for the built-in speaker */ 27688b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_SPEAKER = AudioSystem.DEVICE_OUT_SPEAKER; 2769948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2770948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a wired headset with attached microphone */ 27718b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_WIRED_HEADSET = AudioSystem.DEVICE_OUT_WIRED_HEADSET; 2772948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2773948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a wired headphone without attached microphone */ 27748b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_WIRED_HEADPHONE = AudioSystem.DEVICE_OUT_WIRED_HEADPHONE; 2775948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2776948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for generic Bluetooth SCO, for voice */ 27778b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_SCO = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO; 2778948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2779948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth SCO Headset Profile (HSP) and 2780948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Hands-Free Profile (HFP), for voice 27818b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 27828b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 27838b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET; 2784948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2785948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth SCO car audio, for voice */ 27868b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 27878b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT; 2788948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2789948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for generic Bluetooth A2DP, for music */ 27908b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_A2DP = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP; 2791948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2792948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth A2DP headphones, for music */ 27938b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 27948b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES; 2795948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2796948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for Bluetooth A2DP external speaker, for music */ 27978b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 27988b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER; 2799948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2800948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for S/PDIF (legacy) or HDMI 2801948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Deprecated: replaced by {@link #DEVICE_OUT_HDMI} */ 28028b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_AUX_DIGITAL = AudioSystem.DEVICE_OUT_AUX_DIGITAL; 2803948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2804948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for HDMI */ 2805948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_HDMI = AudioSystem.DEVICE_OUT_HDMI; 2806948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2807948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for an analog wired headset attached via a 28088b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * docking station 28098b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 28108b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_ANLG_DOCK_HEADSET = AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET; 2811948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2812948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a digital wired headset attached via a 28138b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * docking station 28148b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 28158b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_DGTL_DOCK_HEADSET = AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET; 2816948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2817948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a USB audio accessory. The accessory is in USB host 281859f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent * mode and the Android device in USB device mode 281959f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent */ 282059f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent public static final int DEVICE_OUT_USB_ACCESSORY = AudioSystem.DEVICE_OUT_USB_ACCESSORY; 2821948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2822948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for a USB audio device. The device is in USB device 282359f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent * mode and the Android device in USB host mode 282459f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent */ 282559f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent public static final int DEVICE_OUT_USB_DEVICE = AudioSystem.DEVICE_OUT_USB_DEVICE; 2826948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2827948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for projection output. 2828948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2829948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_REMOTE_SUBMIX = AudioSystem.DEVICE_OUT_REMOTE_SUBMIX; 2830948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2831948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code the telephony voice TX path. 2832948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2833948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_TELEPHONY_TX = AudioSystem.DEVICE_OUT_TELEPHONY_TX; 2834948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2835948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for an analog jack with line impedance detected. 2836948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2837948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_LINE = AudioSystem.DEVICE_OUT_LINE; 2838948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2839948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for HDMI Audio Return Channel. 2840948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2841948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_HDMI_ARC = AudioSystem.DEVICE_OUT_HDMI_ARC; 2842948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2843948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for S/PDIF digital connection. 2844948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2845948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_SPDIF = AudioSystem.DEVICE_OUT_SPDIF; 2846948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2847948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio output device code for built-in FM transmitter. 2848948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2849948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_OUT_FM = AudioSystem.DEVICE_OUT_FM; 2850948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2851948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * This is not used as a returned value from {@link #getDevicesForStream}, but could be 28528b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * used in the future in a set method to select whatever default device is chosen by the 28538b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * platform-specific implementation. 28548b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 28558b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public static final int DEVICE_OUT_DEFAULT = AudioSystem.DEVICE_OUT_DEFAULT; 28568b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 2857948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2858948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for default built-in microphone 2859948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2860948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_BUILTIN_MIC = AudioSystem.DEVICE_IN_BUILTIN_MIC; 2861948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2862948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a Bluetooth SCO headset 2863948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2864948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_BLUETOOTH_SCO_HEADSET = 2865948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET; 2866948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2867948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for wired headset microphone 2868948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2869948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_WIRED_HEADSET = 2870948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_WIRED_HEADSET; 2871948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2872948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for HDMI 2873948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2874948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_HDMI = 2875948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_HDMI; 2876948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2877948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for telephony voice RX path 2878948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2879948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_TELEPHONY_RX = 2880948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_TELEPHONY_RX; 2881948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2882948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for built-in microphone pointing to the back 2883948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2884948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_BACK_MIC = 2885948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_BACK_MIC; 2886948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2887948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for analog from a docking station 2888948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2889948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_ANLG_DOCK_HEADSET = 2890948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_ANLG_DOCK_HEADSET; 2891948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2892948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for digital from a docking station 2893948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2894948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_DGTL_DOCK_HEADSET = 2895948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_DGTL_DOCK_HEADSET; 2896948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2897948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a USB audio accessory. The accessory is in USB host 2898948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * mode and the Android device in USB device mode 2899948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2900948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_USB_ACCESSORY = 2901948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_USB_ACCESSORY; 2902948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2903948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a USB audio device. The device is in USB device 2904948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * mode and the Android device in USB host mode 2905948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2906948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_USB_DEVICE = 2907948d32748caaac5be06c991ebf00f74265a7849fEric Laurent AudioSystem.DEVICE_IN_USB_DEVICE; 2908948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2909948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a FM radio tuner 2910948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2911948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_FM_TUNER = AudioSystem.DEVICE_IN_FM_TUNER; 2912948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2913948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a TV tuner 2914948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2915948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_TV_TUNER = AudioSystem.DEVICE_IN_TV_TUNER; 2916948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2917948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for an analog jack with line impedance detected 2918948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2919948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_LINE = AudioSystem.DEVICE_IN_LINE; 2920948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** @hide 2921948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * The audio input device code for a S/PDIF digital connection 2922948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2923948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static final int DEVICE_IN_SPDIF = AudioSystem.DEVICE_IN_SPDIF; 2924112c19ee8b459439c3462767199832e5394b37a8Terry Heo /** @hide 2925112c19ee8b459439c3462767199832e5394b37a8Terry Heo * The audio input device code for audio loopback 2926112c19ee8b459439c3462767199832e5394b37a8Terry Heo */ 2927112c19ee8b459439c3462767199832e5394b37a8Terry Heo public static final int DEVICE_IN_LOOPBACK = AudioSystem.DEVICE_IN_LOOPBACK; 2928948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 2929948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** 2930948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Return true if the device code corresponds to an output device. 2931948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * @hide 2932948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2933948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static boolean isOutputDevice(int device) 2934948d32748caaac5be06c991ebf00f74265a7849fEric Laurent { 2935948d32748caaac5be06c991ebf00f74265a7849fEric Laurent return (device & AudioSystem.DEVICE_BIT_IN) == 0; 2936948d32748caaac5be06c991ebf00f74265a7849fEric Laurent } 2937948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 2938948d32748caaac5be06c991ebf00f74265a7849fEric Laurent /** 2939948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * Return true if the device code corresponds to an input device. 2940948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * @hide 2941948d32748caaac5be06c991ebf00f74265a7849fEric Laurent */ 2942948d32748caaac5be06c991ebf00f74265a7849fEric Laurent public static boolean isInputDevice(int device) 2943948d32748caaac5be06c991ebf00f74265a7849fEric Laurent { 2944948d32748caaac5be06c991ebf00f74265a7849fEric Laurent return (device & AudioSystem.DEVICE_BIT_IN) == AudioSystem.DEVICE_BIT_IN; 2945948d32748caaac5be06c991ebf00f74265a7849fEric Laurent } 2946948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 2947948d32748caaac5be06c991ebf00f74265a7849fEric Laurent 29488b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten /** 29498b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * Return the enabled devices for the specified output stream type. 29508b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 29518b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * @param streamType The stream type to query. One of 29528b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_VOICE_CALL}, 29538b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_SYSTEM}, 29548b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_RING}, 29558b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_MUSIC}, 29568b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_ALARM}, 29578b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_NOTIFICATION}, 29588b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #STREAM_DTMF}. 29598b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 29608b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * @return The bit-mask "or" of audio output device codes for all enabled devices on this 29618b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * stream. Zero or more of 29628b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_EARPIECE}, 29638b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_SPEAKER}, 29648b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_WIRED_HEADSET}, 29658b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_WIRED_HEADPHONE}, 29668b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_SCO}, 29678b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_SCO_HEADSET}, 29688b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_SCO_CARKIT}, 29698b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_A2DP}, 29708b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES}, 29718b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER}, 2972948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_HDMI}, 29738b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_ANLG_DOCK_HEADSET}, 29748b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_DGTL_DOCK_HEADSET}. 2975948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_USB_ACCESSORY}. 2976948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_USB_DEVICE}. 2977948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_REMOTE_SUBMIX}. 2978948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_TELEPHONY_TX}. 2979948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_LINE}. 2980948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_HDMI_ARC}. 2981948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_SPDIF}. 2982948d32748caaac5be06c991ebf00f74265a7849fEric Laurent * {@link #DEVICE_OUT_FM}. 29838b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@link #DEVICE_OUT_DEFAULT} is not used here. 29848b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 29858b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * The implementation may support additional device codes beyond those listed, so 29868b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * the application should ignore any bits which it does not recognize. 29878b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * Note that the information may be imprecise when the implementation 29888b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * cannot distinguish whether a particular device is enabled. 29898b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * 29908b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten * {@hide} 29918b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten */ 29928b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten public int getDevicesForStream(int streamType) { 29938b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten switch (streamType) { 29948b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_VOICE_CALL: 29958b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_SYSTEM: 29968b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_RING: 29978b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_MUSIC: 29988b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_ALARM: 29998b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_NOTIFICATION: 30008b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten case STREAM_DTMF: 30018b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten return AudioSystem.getDevicesForStream(streamType); 30028b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten default: 30038b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten return 0; 30048b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten } 30058b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten } 30068b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 3007b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent /** 3008b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * Indicate wired accessory connection state change. 3009b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param device type of device connected/disconnected (AudioManager.DEVICE_OUT_xxx) 3010b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param state new connection state: 1 connected, 0 disconnected 3011b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param name device name 3012b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * {@hide} 3013b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent */ 3014b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent public void setWiredDeviceConnectionState(int device, int state, String name) { 3015b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent IAudioService service = getService(); 3016b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent try { 3017b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent service.setWiredDeviceConnectionState(device, state, name); 3018b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } catch (RemoteException e) { 3019b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent Log.e(TAG, "Dead object in setWiredDeviceConnectionState "+e); 3020b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3021b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3022b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent 3023b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent /** 30240a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * Indicate A2DP source or sink connection state change. 3025b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param device Bluetooth device connected/disconnected 3026b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @param state new connection state (BluetoothProfile.STATE_xxx) 30270a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * @param profile profile for the A2DP device 30280a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * (either {@link android.bluetooth.BluetoothProfile.A2DP} or 30290a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood * {@link android.bluetooth.BluetoothProfile.A2DP_SINK}) 3030b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * @return a delay in ms that the caller should wait before broadcasting 3031b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED intent. 3032b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent * {@hide} 3033b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent */ 30340a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, 30350a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood int profile) { 3036b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent IAudioService service = getService(); 3037b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent int delay = 0; 3038b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent try { 30390a40ec2192e4836b2fcb6ba51a7688aa6bd4ee98Mike Lockwood delay = service.setBluetoothA2dpDeviceConnectionState(device, state, profile); 3040b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } catch (RemoteException e) { 3041b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent Log.e(TAG, "Dead object in setBluetoothA2dpDeviceConnectionState "+e); 3042b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } finally { 3043b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent return delay; 3044b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3045b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent } 3046b1fbaaccb656ef09a8770c28df15e3e91a452e64Eric Laurent 3047098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey /** {@hide} */ 3048098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey public IRingtonePlayer getRingtonePlayer() { 3049098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey try { 3050098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey return getService().getRingtonePlayer(); 3051098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey } catch (RemoteException e) { 3052098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey return null; 3053098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey } 3054098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey } 3055228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 3056228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten /** 305762796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * Used as a key for {@link #getProperty} to request the native or optimal output sample rate 305862796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * for this device's primary output stream, in decimal Hz. 3059228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten */ 3060228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten public static final String PROPERTY_OUTPUT_SAMPLE_RATE = 3061228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten "android.media.property.OUTPUT_SAMPLE_RATE"; 3062228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 3063228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten /** 306462796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * Used as a key for {@link #getProperty} to request the native or optimal output buffer size 306562796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * for this device's primary output stream, in decimal PCM frames. 3066228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten */ 3067228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten public static final String PROPERTY_OUTPUT_FRAMES_PER_BUFFER = 3068228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten "android.media.property.OUTPUT_FRAMES_PER_BUFFER"; 3069228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 3070228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten /** 307162796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * Returns the value of the property with the specified key. 3072228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten * @param key One of the strings corresponding to a property key: either 307362796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * {@link #PROPERTY_OUTPUT_SAMPLE_RATE} or 307462796aac596f556a1871358bb8ce93af9d55c5a5Glenn Kasten * {@link #PROPERTY_OUTPUT_FRAMES_PER_BUFFER} 3075228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten * @return A string representing the associated value for that property key, 3076228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten * or null if there is no value for that key. 3077228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten */ 3078228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten public String getProperty(String key) { 3079c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten if (PROPERTY_OUTPUT_SAMPLE_RATE.equals(key)) { 3080c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten int outputSampleRate = AudioSystem.getPrimaryOutputSamplingRate(); 3081c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return outputSampleRate > 0 ? Integer.toString(outputSampleRate) : null; 3082c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten } else if (PROPERTY_OUTPUT_FRAMES_PER_BUFFER.equals(key)) { 3083c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten int outputFramesPerBuffer = AudioSystem.getPrimaryOutputFrameCount(); 3084c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return outputFramesPerBuffer > 0 ? Integer.toString(outputFramesPerBuffer) : null; 3085c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten } else { 3086c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten // null or unknown key 3087c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return null; 3088c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten } 3089228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten } 3090228c9847a31b79f8baa80302731cdbf6a2b3c0d4Glenn Kasten 309161dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman /** 309261dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * Returns the estimated latency for the given stream type in milliseconds. 309361dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * 309461dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * DO NOT UNHIDE. The existing approach for doing A/V sync has too many problems. We need 309561dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * a better solution. 309661dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman * @hide 309761dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman */ 309861dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman public int getOutputLatency(int streamType) { 309961dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman return AudioSystem.getOutputLatency(streamType); 310061dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman } 310161dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman 31023346a802087f621c6441bc512dfcc17b07143fc6John Spurlock /** 31033346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * Registers a global volume controller interface. Currently limited to SystemUI. 31043346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * 31053346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * @hide 31063346a802087f621c6441bc512dfcc17b07143fc6John Spurlock */ 31073346a802087f621c6441bc512dfcc17b07143fc6John Spurlock public void setVolumeController(IVolumeController controller) { 31083346a802087f621c6441bc512dfcc17b07143fc6John Spurlock try { 31093346a802087f621c6441bc512dfcc17b07143fc6John Spurlock getService().setVolumeController(controller); 31103346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } catch (RemoteException e) { 31113346a802087f621c6441bc512dfcc17b07143fc6John Spurlock Log.w(TAG, "Error setting volume controller", e); 31123346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 31133346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 31143346a802087f621c6441bc512dfcc17b07143fc6John Spurlock 31153346a802087f621c6441bc512dfcc17b07143fc6John Spurlock /** 311633f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * Notify audio manager about volume controller visibility changes. 311733f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * Currently limited to SystemUI. 311833f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * 311933f4e04e32fac42f158733d6a731e50490fa9951John Spurlock * @hide 312033f4e04e32fac42f158733d6a731e50490fa9951John Spurlock */ 312133f4e04e32fac42f158733d6a731e50490fa9951John Spurlock public void notifyVolumeControllerVisible(IVolumeController controller, boolean visible) { 312233f4e04e32fac42f158733d6a731e50490fa9951John Spurlock try { 312333f4e04e32fac42f158733d6a731e50490fa9951John Spurlock getService().notifyVolumeControllerVisible(controller, visible); 312433f4e04e32fac42f158733d6a731e50490fa9951John Spurlock } catch (RemoteException e) { 312533f4e04e32fac42f158733d6a731e50490fa9951John Spurlock Log.w(TAG, "Error notifying about volume controller visibility", e); 312633f4e04e32fac42f158733d6a731e50490fa9951John Spurlock } 312733f4e04e32fac42f158733d6a731e50490fa9951John Spurlock } 312833f4e04e32fac42f158733d6a731e50490fa9951John Spurlock 312933f4e04e32fac42f158733d6a731e50490fa9951John Spurlock /** 31303346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * Only useful for volume controllers. 31313346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * @hide 31323346a802087f621c6441bc512dfcc17b07143fc6John Spurlock */ 31333346a802087f621c6441bc512dfcc17b07143fc6John Spurlock public boolean isStreamAffectedByRingerMode(int streamType) { 31343346a802087f621c6441bc512dfcc17b07143fc6John Spurlock try { 31353346a802087f621c6441bc512dfcc17b07143fc6John Spurlock return getService().isStreamAffectedByRingerMode(streamType); 31363346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } catch (RemoteException e) { 31373346a802087f621c6441bc512dfcc17b07143fc6John Spurlock Log.w(TAG, "Error calling isStreamAffectedByRingerMode", e); 31383346a802087f621c6441bc512dfcc17b07143fc6John Spurlock return false; 31393346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 31403346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 31413346a802087f621c6441bc512dfcc17b07143fc6John Spurlock 31423346a802087f621c6441bc512dfcc17b07143fc6John Spurlock /** 31433346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * Only useful for volume controllers. 31443346a802087f621c6441bc512dfcc17b07143fc6John Spurlock * @hide 31453346a802087f621c6441bc512dfcc17b07143fc6John Spurlock */ 31463346a802087f621c6441bc512dfcc17b07143fc6John Spurlock public void disableSafeMediaVolume() { 31473346a802087f621c6441bc512dfcc17b07143fc6John Spurlock try { 31483346a802087f621c6441bc512dfcc17b07143fc6John Spurlock getService().disableSafeMediaVolume(); 31493346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } catch (RemoteException e) { 31503346a802087f621c6441bc512dfcc17b07143fc6John Spurlock Log.w(TAG, "Error disabling safe media volume", e); 31513346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 31523346a802087f621c6441bc512dfcc17b07143fc6John Spurlock } 3153a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3154a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 315541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * Set Hdmi Cec system audio mode. 315641d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * 315741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * @param on whether to be on system audio mode 31586f34f5ab8ab1b1db7887e5405d8b0031e105ab05Jungshik Jang * @return output device type. 0 (DEVICE_NONE) if failed to set device. 315941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang * @hide 316041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang */ 316112307ca810e8100981b2b60e3f2c6a7e451b9774Jungshik Jang public int setHdmiSystemAudioSupported(boolean on) { 316241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang try { 316312307ca810e8100981b2b60e3f2c6a7e451b9774Jungshik Jang return getService().setHdmiSystemAudioSupported(on); 316441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang } catch (RemoteException e) { 316541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang Log.w(TAG, "Error setting system audio mode", e); 31666f34f5ab8ab1b1db7887e5405d8b0031e105ab05Jungshik Jang return AudioSystem.DEVICE_NONE; 316741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang } 316841d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang } 316941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang 317041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang /** 3171e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo * Returns true if Hdmi Cec system audio mode is supported. 3172e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo * 3173e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo * @hide 3174e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo */ 3175e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo @SystemApi 3176e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo public boolean isHdmiSystemAudioSupported() { 3177e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo try { 3178e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo return getService().isHdmiSystemAudioSupported(); 3179e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo } catch (RemoteException e) { 3180e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo Log.w(TAG, "Error querying system audio mode", e); 3181e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo return false; 3182e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo } 3183e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo } 3184e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo 3185e7d6d97f0d95b9e8982b0d4d9f5e8ce688291940Terry Heo /** 3186a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Return codes for listAudioPorts(), createAudioPatch() ... 3187a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3188a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3189a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3190a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * CANDIDATE FOR PUBLIC API 3191a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3192a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int SUCCESS = AudioSystem.SUCCESS; 31938a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi /** 31948a21f5dd79e93aa4e4b08ab4f33b9255d7c06961Jean-Michel Trivi * A default error code. 3195a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3196a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR = AudioSystem.ERROR; 3197a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3198a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi * CANDIDATE FOR PUBLIC API 3199a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3200a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_BAD_VALUE = AudioSystem.BAD_VALUE; 3201a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3202a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3203a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_INVALID_OPERATION = AudioSystem.INVALID_OPERATION; 3204a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3205a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3206a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_PERMISSION_DENIED = AudioSystem.PERMISSION_DENIED; 3207a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** @hide 3208a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3209a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_NO_INIT = AudioSystem.NO_INIT; 3210ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent /** 3211ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent * An error code indicating that the object reporting it is no longer valid and needs to 3212ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent * be recreated. 3213a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3214a198a29250acb7c3e918f1566727190966bb336fEric Laurent public static final int ERROR_DEAD_OBJECT = AudioSystem.DEAD_OBJECT; 3215a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3216a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3217a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Returns a list of descriptors for all audio ports managed by the audio framework. 3218a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Audio ports are nodes in the audio framework or audio hardware that can be configured 3219a198a29250acb7c3e918f1566727190966bb336fEric Laurent * or connected and disconnected with createAudioPatch() or releaseAudioPatch(). 3220a198a29250acb7c3e918f1566727190966bb336fEric Laurent * See AudioPort for a list of attributes of each audio port. 3221a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param ports An AudioPort ArrayList where the list will be returned. 3222a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3223a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3224a198a29250acb7c3e918f1566727190966bb336fEric Laurent public int listAudioPorts(ArrayList<AudioPort> ports) { 3225b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return updateAudioPortCache(ports, null); 3226a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3227a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3228a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3229a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Specialized version of listAudioPorts() listing only audio devices (AudioDevicePort) 3230a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @see listAudioPorts(ArrayList<AudioPort>) 3231a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3232a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3233a198a29250acb7c3e918f1566727190966bb336fEric Laurent public int listAudioDevicePorts(ArrayList<AudioPort> devices) { 3234b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); 3235b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int status = updateAudioPortCache(ports, null); 3236b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (status == SUCCESS) { 3237b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent devices.clear(); 3238b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int i = 0; i < ports.size(); i++) { 3239b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (ports.get(i) instanceof AudioDevicePort) { 3240b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent devices.add(ports.get(i)); 3241b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3242b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3243b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3244b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return status; 3245a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3246a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3247a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3248a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Create a connection between two or more devices. The framework will reject the request if 3249a198a29250acb7c3e918f1566727190966bb336fEric Laurent * device types are not compatible or the implementation does not support the requested 3250a198a29250acb7c3e918f1566727190966bb336fEric Laurent * configuration. 3251a198a29250acb7c3e918f1566727190966bb336fEric Laurent * NOTE: current implementation is limited to one source and one sink per patch. 3252a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patch AudioPatch array where the newly created patch will be returned. 3253a198a29250acb7c3e918f1566727190966bb336fEric Laurent * As input, if patch[0] is not null, the specified patch will be replaced by the 3254a198a29250acb7c3e918f1566727190966bb336fEric Laurent * new patch created. This avoids calling releaseAudioPatch() when modifying a 3255a198a29250acb7c3e918f1566727190966bb336fEric Laurent * patch and allows the implementation to optimize transitions. 3256a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param sources List of source audio ports. All must be AudioPort.ROLE_SOURCE. 3257a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param sinks List of sink audio ports. All must be AudioPort.ROLE_SINK. 3258a198a29250acb7c3e918f1566727190966bb336fEric Laurent * 3259a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @return - {@link #SUCCESS} if connection is successful. 3260a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_BAD_VALUE} if incompatible device types are passed. 3261a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_INVALID_OPERATION} if the requested connection is not supported. 3262a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_PERMISSION_DENIED} if the client does not have permission to create 3263a198a29250acb7c3e918f1566727190966bb336fEric Laurent * a patch. 3264a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_DEAD_OBJECT} if the server process is dead 3265a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR} if patch cannot be connected for any other reason. 3266a198a29250acb7c3e918f1566727190966bb336fEric Laurent * 3267a198a29250acb7c3e918f1566727190966bb336fEric Laurent * patch[0] contains the newly created patch 3268a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3269a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3270a198a29250acb7c3e918f1566727190966bb336fEric Laurent public int createAudioPatch(AudioPatch[] patch, 3271a198a29250acb7c3e918f1566727190966bb336fEric Laurent AudioPortConfig[] sources, 3272a198a29250acb7c3e918f1566727190966bb336fEric Laurent AudioPortConfig[] sinks) { 3273b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return AudioSystem.createAudioPatch(patch, sources, sinks); 3274a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3275a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3276a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3277a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Releases an existing audio patch connection. 3278a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patch The audio patch to disconnect. 3279a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @return - {@link #SUCCESS} if disconnection is successful. 3280a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_BAD_VALUE} if the specified patch does not exist. 3281a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_PERMISSION_DENIED} if the client does not have permission to release 3282a198a29250acb7c3e918f1566727190966bb336fEric Laurent * a patch. 3283a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR_DEAD_OBJECT} if the server process is dead 3284a198a29250acb7c3e918f1566727190966bb336fEric Laurent * - {@link #ERROR} if patch cannot be released for any other reason. 3285a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3286a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3287a198a29250acb7c3e918f1566727190966bb336fEric Laurent public int releaseAudioPatch(AudioPatch patch) { 3288b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return AudioSystem.releaseAudioPatch(patch); 3289a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3290a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3291a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3292a198a29250acb7c3e918f1566727190966bb336fEric Laurent * List all existing connections between audio ports. 3293a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patches An AudioPatch array where the list will be returned. 3294a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3295a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3296a198a29250acb7c3e918f1566727190966bb336fEric Laurent public int listAudioPatches(ArrayList<AudioPatch> patches) { 3297b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return updateAudioPortCache(null, patches); 3298a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3299a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3300a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3301a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Set the gain on the specified AudioPort. The AudioGainConfig config is build by 3302a198a29250acb7c3e918f1566727190966bb336fEric Laurent * AudioGain.buildConfig() 3303a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3304a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3305a198a29250acb7c3e918f1566727190966bb336fEric Laurent public int setAudioPortGain(AudioPort port, AudioGainConfig gain) { 33063a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent if (port == null || gain == null) { 33073a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent return ERROR_BAD_VALUE; 33083a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent } 33093a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent AudioPortConfig activeConfig = port.activeConfig(); 33103a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent AudioPortConfig config = new AudioPortConfig(port, activeConfig.samplingRate(), 33113a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent activeConfig.channelMask(), activeConfig.format(), gain); 33123a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent config.mConfigMask = AudioPortConfig.GAIN; 33133a24199a0fe9479802ff6096d82cb3745efa1f1fEric Laurent return AudioSystem.setAudioPortConfig(config); 3314a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3315a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3316a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3317a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Listener registered by client to be notified upon new audio port connections, 3318a198a29250acb7c3e918f1566727190966bb336fEric Laurent * disconnections or attributes update. 3319a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3320a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3321a198a29250acb7c3e918f1566727190966bb336fEric Laurent public interface OnAudioPortUpdateListener { 3322a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3323a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Callback method called upon audio port list update. 3324a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param portList the updated list of audio ports 3325a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3326fdaed9dcb63171379fd7c5a6208014bac505dbc6Eric Laurent public void onAudioPortListUpdate(AudioPort[] portList); 3327a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3328a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3329a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Callback method called upon audio patch list update. 3330a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @param patchList the updated list of audio patches 3331a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3332fdaed9dcb63171379fd7c5a6208014bac505dbc6Eric Laurent public void onAudioPatchListUpdate(AudioPatch[] patchList); 3333a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3334a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3335a198a29250acb7c3e918f1566727190966bb336fEric Laurent * Callback method called when the mediaserver dies 3336a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3337fdaed9dcb63171379fd7c5a6208014bac505dbc6Eric Laurent public void onServiceDied(); 3338a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3339a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3340a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3341700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent * Register an audio port list update listener. 3342a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3343a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3344a198a29250acb7c3e918f1566727190966bb336fEric Laurent public void registerAudioPortUpdateListener(OnAudioPortUpdateListener l) { 3345700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent mAudioPortEventHandler.registerListener(l); 3346a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3347a198a29250acb7c3e918f1566727190966bb336fEric Laurent 3348a198a29250acb7c3e918f1566727190966bb336fEric Laurent /** 3349700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent * Unregister an audio port list update listener. 3350a198a29250acb7c3e918f1566727190966bb336fEric Laurent * @hide 3351a198a29250acb7c3e918f1566727190966bb336fEric Laurent */ 3352a198a29250acb7c3e918f1566727190966bb336fEric Laurent public void unregisterAudioPortUpdateListener(OnAudioPortUpdateListener l) { 3353700e73471d85348b52ecf213c36bb24b93997ec7Eric Laurent mAudioPortEventHandler.unregisterListener(l); 3354a198a29250acb7c3e918f1566727190966bb336fEric Laurent } 3355b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3356b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // 3357b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // AudioPort implementation 3358b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // 3359b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3360b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent static final int AUDIOPORT_GENERATION_INIT = 0; 3361b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent Integer mAudioPortGeneration = new Integer(AUDIOPORT_GENERATION_INIT); 3362b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPort> mAudioPortsCached = new ArrayList<AudioPort>(); 3363b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPatch> mAudioPatchesCached = new ArrayList<AudioPatch>(); 3364b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3365b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int resetAudioPortGeneration() { 3366b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int generation; 3367b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent synchronized (mAudioPortGeneration) { 3368b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent generation = mAudioPortGeneration; 3369b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent mAudioPortGeneration = AUDIOPORT_GENERATION_INIT; 3370b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3371b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return generation; 3372b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3373b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3374b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches) { 3375b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent synchronized (mAudioPortGeneration) { 3376b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3377b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (mAudioPortGeneration == AUDIOPORT_GENERATION_INIT) { 3378b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int[] patchGeneration = new int[1]; 3379b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int[] portGeneration = new int[1]; 3380b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int status; 3381b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPort> newPorts = new ArrayList<AudioPort>(); 3382b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ArrayList<AudioPatch> newPatches = new ArrayList<AudioPatch>(); 3383b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3384b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent do { 3385b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPorts.clear(); 3386b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent status = AudioSystem.listAudioPorts(newPorts, portGeneration); 3387b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (status != SUCCESS) { 3388b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return status; 3389b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3390b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPatches.clear(); 3391b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent status = AudioSystem.listAudioPatches(newPatches, patchGeneration); 3392b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (status != SUCCESS) { 3393b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return status; 3394b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3395b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } while (patchGeneration[0] != portGeneration[0]); 3396b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3397b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int i = 0; i < newPatches.size(); i++) { 3398b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int j = 0; j < newPatches.get(i).sources().length; j++) { 3399b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent AudioPortConfig portCfg = updatePortConfig(newPatches.get(i).sources()[j], 3400b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent newPorts); 3401b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (portCfg == null) { 3402b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return ERROR; 3403b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3404b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPatches.get(i).sources()[j] = portCfg; 3405b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3406b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (int j = 0; j < newPatches.get(i).sinks().length; j++) { 3407b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent AudioPortConfig portCfg = updatePortConfig(newPatches.get(i).sinks()[j], 3408b4e0909fc4fb08f513cb2b39a919b189621be87cEric Laurent newPorts); 3409b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (portCfg == null) { 3410b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return ERROR; 3411b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3412b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent newPatches.get(i).sinks()[j] = portCfg; 3413b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3414b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3415b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3416b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent mAudioPortsCached = newPorts; 3417b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent mAudioPatchesCached = newPatches; 3418b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent mAudioPortGeneration = portGeneration[0]; 3419b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3420b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (ports != null) { 3421b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ports.clear(); 3422b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent ports.addAll(mAudioPortsCached); 3423b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3424b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (patches != null) { 3425b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent patches.clear(); 3426b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent patches.addAll(mAudioPatchesCached); 3427b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3428b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3429b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return SUCCESS; 3430b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3431b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent 3432b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioPortConfig updatePortConfig(AudioPortConfig portCfg, ArrayList<AudioPort> ports) { 3433b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioPort port = portCfg.port(); 3434b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent int k; 3435b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent for (k = 0; k < ports.size(); k++) { 3436b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // compare handles because the port returned by JNI is not of the correct 3437b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // subclass 3438b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (ports.get(k).handle().equals(port.handle())) { 3439b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent port = ports.get(k); 3440b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent break; 3441b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3442b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3443b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (k == ports.size()) { 3444b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent // this hould never happen 3445b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent Log.e(TAG, "updatePortConfig port not found for handle: "+port.handle().id()); 3446b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return null; 3447b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3448b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioGainConfig gainCfg = portCfg.gain(); 3449b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent if (gainCfg != null) { 3450b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent AudioGain gain = port.gain(gainCfg.index()); 3451b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg = gain.buildConfig(gainCfg.mode(), 3452b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg.channelMask(), 3453b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg.values(), 3454b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg.rampDurationMs()); 3455b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 3456b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent return port.buildConfig(portCfg.samplingRate(), 3457b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent portCfg.channelMask(), 3458b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent portCfg.format(), 3459b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent gainCfg); 3460b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent } 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3462