summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/AudioFocusInfo.java5
-rw-r--r--media/java/android/media/AudioManager.java7
-rw-r--r--media/java/android/media/AudioRoutesInfo.java28
-rw-r--r--media/java/android/media/AudioSystem.java104
-rw-r--r--media/java/android/media/MediaRouter.java24
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java5
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java4
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java (renamed from media/java/android/media/AudioService.java)177
-rw-r--r--services/core/java/com/android/server/audio/FocusRequester.java (renamed from media/java/android/media/FocusRequester.java)11
-rw-r--r--services/core/java/com/android/server/audio/MediaFocusControl.java (renamed from media/java/android/media/MediaFocusControl.java)25
-rw-r--r--services/core/java/com/android/server/audio/PlayerRecord.java (renamed from media/java/android/media/PlayerRecord.java)6
-rw-r--r--services/java/com/android/server/SystemServer.java2
-rw-r--r--services/usb/java/com/android/server/usb/UsbAlsaManager.java3
14 files changed, 238 insertions, 191 deletions
diff --git a/media/java/android/media/AudioFocusInfo.java b/media/java/android/media/AudioFocusInfo.java
index fbdda3ce4dee..540c328f834b 100644
--- a/media/java/android/media/AudioFocusInfo.java
+++ b/media/java/android/media/AudioFocusInfo.java
@@ -45,8 +45,9 @@ public final class AudioFocusInfo implements Parcelable {
* @param gainRequest
* @param lossReceived
* @param flags
+ * @hide
*/
- AudioFocusInfo(AudioAttributes aa, String clientId, String packageName,
+ public AudioFocusInfo(AudioAttributes aa, String clientId, String packageName,
int gainRequest, int lossReceived, int flags) {
mAttributes = aa == null ? new AudioAttributes.Builder().build() : aa;
mClientId = clientId == null ? "" : clientId;
@@ -91,7 +92,7 @@ public final class AudioFocusInfo implements Parcelable {
public int getLossReceived() { return mLossReceived; }
/** @hide */
- void clearLossReceived() { mLossReceived = 0; }
+ public void clearLossReceived() { mLossReceived = 0; }
/**
* The flags set in the audio focus request.
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 07b19a49bc94..7084eba2b09f 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -663,8 +663,7 @@ public class AudioManager {
int keyCode = event.getKeyCode();
if (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_VOLUME_UP
&& keyCode != KeyEvent.KEYCODE_VOLUME_MUTE
- && mVolumeKeyUpTime + AudioService.PLAY_SOUND_DELAY
- > SystemClock.uptimeMillis()) {
+ && mVolumeKeyUpTime + AudioSystem.PLAY_SOUND_DELAY > SystemClock.uptimeMillis()) {
/*
* The user has hit another key during the delay (e.g., 300ms)
* since the last volume key up, so cancel any sounds.
@@ -2501,7 +2500,7 @@ public class AudioManager {
service.requestAudioFocus(new AudioAttributes.Builder()
.setInternalLegacyStreamType(streamType).build(),
durationHint, mICallBack, null,
- MediaFocusControl.IN_VOICE_COMM_FOCUS_ID,
+ AudioSystem.IN_VOICE_COMM_FOCUS_ID,
mContext.getOpPackageName(),
AUDIOFOCUS_FLAG_LOCK,
null /* policy token */);
@@ -2519,7 +2518,7 @@ public class AudioManager {
public void abandonAudioFocusForCall() {
IAudioService service = getService();
try {
- service.abandonAudioFocus(null, MediaFocusControl.IN_VOICE_COMM_FOCUS_ID,
+ service.abandonAudioFocus(null, AudioSystem.IN_VOICE_COMM_FOCUS_ID,
null /*AudioAttributes, legacy behavior*/);
} catch (RemoteException e) {
Log.e(TAG, "Can't call abandonAudioFocusForCall() on AudioService:", e);
diff --git a/media/java/android/media/AudioRoutesInfo.java b/media/java/android/media/AudioRoutesInfo.java
index 3e0ec07fc30b..6ae0d46c0d75 100644
--- a/media/java/android/media/AudioRoutesInfo.java
+++ b/media/java/android/media/AudioRoutesInfo.java
@@ -25,27 +25,27 @@ import android.text.TextUtils;
* @hide
*/
public class AudioRoutesInfo implements Parcelable {
- static final int MAIN_SPEAKER = 0;
- static final int MAIN_HEADSET = 1<<0;
- static final int MAIN_HEADPHONES = 1<<1;
- static final int MAIN_DOCK_SPEAKERS = 1<<2;
- static final int MAIN_HDMI = 1<<3;
- static final int MAIN_USB = 1<<4;
+ public static final int MAIN_SPEAKER = 0;
+ public static final int MAIN_HEADSET = 1<<0;
+ public static final int MAIN_HEADPHONES = 1<<1;
+ public static final int MAIN_DOCK_SPEAKERS = 1<<2;
+ public static final int MAIN_HDMI = 1<<3;
+ public static final int MAIN_USB = 1<<4;
- CharSequence mBluetoothName;
- int mMainType = MAIN_SPEAKER;
+ public CharSequence bluetoothName;
+ public int mainType = MAIN_SPEAKER;
public AudioRoutesInfo() {
}
public AudioRoutesInfo(AudioRoutesInfo o) {
- mBluetoothName = o.mBluetoothName;
- mMainType = o.mMainType;
+ bluetoothName = o.bluetoothName;
+ mainType = o.mainType;
}
AudioRoutesInfo(Parcel src) {
- mBluetoothName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(src);
- mMainType = src.readInt();
+ bluetoothName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(src);
+ mainType = src.readInt();
}
@Override
@@ -55,8 +55,8 @@ public class AudioRoutesInfo implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- TextUtils.writeToParcel(mBluetoothName, dest, flags);
- dest.writeInt(mMainType);
+ TextUtils.writeToParcel(bluetoothName, dest, flags);
+ dest.writeInt(mainType);
}
public static final Parcelable.Creator<AudioRoutesInfo> CREATOR
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 70846569d5cc..787320ea0bfc 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -16,7 +16,10 @@
package android.media;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.media.audiopolicy.AudioMix;
+
import java.util.ArrayList;
/* IF YOU CHANGE ANY OF THE CONSTANTS IN THIS FILE, DO NOT FORGET
@@ -65,6 +68,19 @@ public class AudioSystem
private static final int NUM_STREAM_TYPES = 10;
public static final int getNumStreamTypes() { return NUM_STREAM_TYPES; }
+ public static final String[] STREAM_NAMES = new String[] {
+ "STREAM_VOICE_CALL",
+ "STREAM_SYSTEM",
+ "STREAM_RING",
+ "STREAM_MUSIC",
+ "STREAM_ALARM",
+ "STREAM_NOTIFICATION",
+ "STREAM_BLUETOOTH_SCO",
+ "STREAM_SYSTEM_ENFORCED",
+ "STREAM_DTMF",
+ "STREAM_TTS"
+ };
+
/*
* Sets the microphone mute on or off.
*
@@ -570,5 +586,93 @@ public class AudioSystem
public static native int getAudioHwSyncForSession(int sessionId);
public static native int registerPolicyMixes(ArrayList<AudioMix> mixes, boolean register);
+
+
+ // Items shared with audio service
+
+ /**
+ * The delay before playing a sound. This small period exists so the user
+ * can press another key (non-volume keys, too) to have it NOT be audible.
+ * <p>
+ * PhoneWindow will implement this part.
+ */
+ public static final int PLAY_SOUND_DELAY = 300;
+
+ /**
+ * Constant to identify a focus stack entry that is used to hold the focus while the phone
+ * is ringing or during a call. Used by com.android.internal.telephony.CallManager when
+ * entering and exiting calls.
+ */
+ public final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls";
+
+ /**
+ * @see AudioManager#setVibrateSetting(int, int)
+ */
+ public static int getValueForVibrateSetting(int existingValue, int vibrateType,
+ int vibrateSetting) {
+
+ // First clear the existing setting. Each vibrate type has two bits in
+ // the value. Note '3' is '11' in binary.
+ existingValue &= ~(3 << (vibrateType * 2));
+
+ // Set into the old value
+ existingValue |= (vibrateSetting & 3) << (vibrateType * 2);
+
+ return existingValue;
+ }
+
+ public static int getDefaultStreamVolume(int streamType) {
+ return DEFAULT_STREAM_VOLUME[streamType];
+ }
+
+ public static int[] DEFAULT_STREAM_VOLUME = new int[] {
+ 4, // STREAM_VOICE_CALL
+ 7, // STREAM_SYSTEM
+ 5, // STREAM_RING
+ 11, // STREAM_MUSIC
+ 6, // STREAM_ALARM
+ 5, // STREAM_NOTIFICATION
+ 7, // STREAM_BLUETOOTH_SCO
+ 7, // STREAM_SYSTEM_ENFORCED
+ 11, // STREAM_DTMF
+ 11 // STREAM_TTS
+ };
+
+ public static String streamToString(int stream) {
+ if (stream >= 0 && stream < STREAM_NAMES.length) return STREAM_NAMES[stream];
+ if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) return "USE_DEFAULT_STREAM_TYPE";
+ return "UNKNOWN_STREAM_" + stream;
+ }
+
+ /** The platform has no specific capabilities */
+ public static final int PLATFORM_DEFAULT = 0;
+ /** The platform is voice call capable (a phone) */
+ public static final int PLATFORM_VOICE = 1;
+ /** The platform is a television or a set-top box */
+ public static final int PLATFORM_TELEVISION = 2;
+
+ /**
+ * Return the platform type that this is running on. One of:
+ * <ul>
+ * <li>{@link #PLATFORM_VOICE}</li>
+ * <li>{@link #PLATFORM_TELEVISION}</li>
+ * <li>{@link #PLATFORM_DEFAULT}</li>
+ * </ul>
+ */
+ public static int getPlatformType(Context context) {
+ if (context.getResources().getBoolean(com.android.internal.R.bool.config_voice_capable)) {
+ return PLATFORM_VOICE;
+ } else if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
+ return PLATFORM_TELEVISION;
+ } else {
+ return PLATFORM_DEFAULT;
+ }
+ }
+
+ public static final int DEFAULT_MUTE_STREAMS_AFFECTED =
+ (1 << STREAM_MUSIC) |
+ (1 << STREAM_RING) |
+ (1 << STREAM_NOTIFICATION) |
+ (1 << STREAM_SYSTEM);
}
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 958ffab3c39d..5285074d8298 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -171,15 +171,15 @@ public class MediaRouter {
}
void updateAudioRoutes(AudioRoutesInfo newRoutes) {
- if (newRoutes.mMainType != mCurAudioRoutesInfo.mMainType) {
- mCurAudioRoutesInfo.mMainType = newRoutes.mMainType;
+ if (newRoutes.mainType != mCurAudioRoutesInfo.mainType) {
+ mCurAudioRoutesInfo.mainType = newRoutes.mainType;
int name;
- if ((newRoutes.mMainType&AudioRoutesInfo.MAIN_HEADPHONES) != 0
- || (newRoutes.mMainType&AudioRoutesInfo.MAIN_HEADSET) != 0) {
+ if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HEADPHONES) != 0
+ || (newRoutes.mainType&AudioRoutesInfo.MAIN_HEADSET) != 0) {
name = com.android.internal.R.string.default_audio_route_name_headphones;
- } else if ((newRoutes.mMainType&AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) {
+ } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) {
name = com.android.internal.R.string.default_audio_route_name_dock_speakers;
- } else if ((newRoutes.mMainType&AudioRoutesInfo.MAIN_HDMI) != 0) {
+ } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HDMI) != 0) {
name = com.android.internal.R.string.default_media_route_name_hdmi;
} else {
name = com.android.internal.R.string.default_audio_route_name;
@@ -188,21 +188,21 @@ public class MediaRouter {
dispatchRouteChanged(sStatic.mDefaultAudioVideo);
}
- final int mainType = mCurAudioRoutesInfo.mMainType;
+ final int mainType = mCurAudioRoutesInfo.mainType;
- if (!TextUtils.equals(newRoutes.mBluetoothName, mCurAudioRoutesInfo.mBluetoothName)) {
- mCurAudioRoutesInfo.mBluetoothName = newRoutes.mBluetoothName;
- if (mCurAudioRoutesInfo.mBluetoothName != null) {
+ if (!TextUtils.equals(newRoutes.bluetoothName, mCurAudioRoutesInfo.bluetoothName)) {
+ mCurAudioRoutesInfo.bluetoothName = newRoutes.bluetoothName;
+ if (mCurAudioRoutesInfo.bluetoothName != null) {
if (sStatic.mBluetoothA2dpRoute == null) {
final RouteInfo info = new RouteInfo(sStatic.mSystemCategory);
- info.mName = mCurAudioRoutesInfo.mBluetoothName;
+ info.mName = mCurAudioRoutesInfo.bluetoothName;
info.mDescription = sStatic.mResources.getText(
com.android.internal.R.string.bluetooth_a2dp_audio_route_name);
info.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO;
sStatic.mBluetoothA2dpRoute = info;
addRouteStatic(sStatic.mBluetoothA2dpRoute);
} else {
- sStatic.mBluetoothA2dpRoute.mName = mCurAudioRoutesInfo.mBluetoothName;
+ sStatic.mBluetoothA2dpRoute.mName = mCurAudioRoutesInfo.bluetoothName;
dispatchRouteChanged(sStatic.mBluetoothA2dpRoute);
}
} else if (sStatic.mBluetoothA2dpRoute != null) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 6a05af11757b..06e26bd651e1 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -28,8 +28,8 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
+import android.media.AudioSystem;
import android.media.AudioManager;
-import android.media.AudioService;
import android.net.ConnectivityManager;
import android.os.Build;
import android.os.Environment;
@@ -568,7 +568,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
+ " VALUES(?,?);");
loadSetting(stmt, Settings.System.VOLUME_BLUETOOTH_SCO,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));
db.setTransactionSuccessful();
} finally {
db.endTransaction();
@@ -2051,11 +2051,11 @@ public class DatabaseHelper extends SQLiteOpenHelper {
int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 0);
// If the ringer vibrate value is invalid, set it to the default
if ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_OFF) {
- vibrateSetting = AudioService.getValueForVibrateSetting(0,
+ vibrateSetting = AudioSystem.getValueForVibrateSetting(0,
AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
}
// Apply the same setting to the notification vibrate value
- vibrateSetting = AudioService.getValueForVibrateSetting(vibrateSetting,
+ vibrateSetting = AudioSystem.getValueForVibrateSetting(vibrateSetting,
AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting);
SQLiteStatement stmt = null;
@@ -2199,25 +2199,25 @@ public class DatabaseHelper extends SQLiteOpenHelper {
+ " VALUES(?,?);");
loadSetting(stmt, Settings.System.VOLUME_MUSIC,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_MUSIC));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_MUSIC));
loadSetting(stmt, Settings.System.VOLUME_RING,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_RING));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_RING));
loadSetting(stmt, Settings.System.VOLUME_SYSTEM,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM));
loadSetting(
stmt,
Settings.System.VOLUME_VOICE,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL));
loadSetting(stmt, Settings.System.VOLUME_ALARM,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_ALARM));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_ALARM));
loadSetting(
stmt,
Settings.System.VOLUME_NOTIFICATION,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION));
loadSetting(
stmt,
Settings.System.VOLUME_BLUETOOTH_SCO,
- AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));
+ AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));
// By default:
// - ringtones, notification, system and music streams are affected by ringer mode
@@ -2236,7 +2236,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
ringerModeAffectedStreams);
loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
- AudioService.DEFAULT_MUTE_STREAMS_AFFECTED);
+ AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED);
} finally {
if (stmt != null) stmt.close();
}
@@ -2256,10 +2256,10 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// Vibrate on by default for ringer, on for notification
int vibrate = 0;
- vibrate = AudioService.getValueForVibrateSetting(vibrate,
+ vibrate = AudioSystem.getValueForVibrateSetting(vibrate,
AudioManager.VIBRATE_TYPE_NOTIFICATION,
AudioManager.VIBRATE_SETTING_ONLY_SILENT);
- vibrate |= AudioService.getValueForVibrateSetting(vibrate,
+ vibrate |= AudioSystem.getValueForVibrateSetting(vibrate,
AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);
} finally {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
index 19a631a467a3..0ad92b360874 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
@@ -37,7 +37,6 @@ import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.media.AudioAttributes;
import android.media.AudioManager;
-import android.media.AudioService;
import android.media.AudioSystem;
import android.media.RingtoneManager;
import android.media.ToneGenerator;
@@ -88,7 +87,7 @@ public class VolumePanel extends Handler implements DemoMode {
private static final String TAG = "VolumePanel";
private static boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
- private static final int PLAY_SOUND_DELAY = AudioService.PLAY_SOUND_DELAY;
+ private static final int PLAY_SOUND_DELAY = AudioSystem.PLAY_SOUND_DELAY;
/**
* The delay before vibrating. This small period exists so if the user is
@@ -1012,7 +1011,7 @@ public class VolumePanel extends Handler implements DemoMode {
}
private static String streamToString(int stream) {
- return AudioService.streamToString(stream);
+ return AudioSystem.streamToString(stream);
}
/**
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index dca7db173045..92468d2eecfc 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -43,7 +43,7 @@ import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.media.AudioAttributes;
import android.media.AudioManager;
-import android.media.AudioService;
+import android.media.AudioSystem;
import android.media.IAudioService;
import android.media.Ringtone;
import android.media.RingtoneManager;
@@ -1269,7 +1269,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mTriplePressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_triplePressOnPowerBehavior);
- mUseTvRouting = AudioService.getPlatformType(mContext) == AudioService.PLATFORM_TELEVISION;
+ mUseTvRouting = AudioSystem.getPlatformType(mContext) == AudioSystem.PLATFORM_TELEVISION;
mUseMasterVolume = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_useMasterVolume);
diff --git a/media/java/android/media/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index edb692304cae..eaece09c5ac7 100644
--- a/media/java/android/media/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.media;
+package com.android.server.audio;
import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
@@ -46,8 +46,30 @@ import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPlaybackClient;
import android.hardware.hdmi.HdmiTvClient;
import android.hardware.usb.UsbManager;
+import android.media.AudioAttributes;
+import android.media.AudioDevicePort;
+import android.media.AudioSystem;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioManagerInternal;
+import android.media.AudioPort;
+import android.media.AudioRoutesInfo;
+import android.media.AudioSystem;
+import android.media.IAudioFocusDispatcher;
+import android.media.IAudioRoutesObserver;
+import android.media.IAudioService;
+import android.media.IRemoteControlDisplay;
+import android.media.IRingtonePlayer;
+import android.media.IVolumeController;
+import android.media.MediaPlayer;
+import android.media.SoundPool;
+import android.media.AudioAttributes.Builder;
+import android.media.AudioManagerInternal.RingerModeDelegate;
+import android.media.AudioSystem.ErrorCallback;
+import android.media.IAudioService.Stub;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
+import android.media.SoundPool.OnLoadCompleteListener;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicyConfig;
@@ -139,14 +161,6 @@ public class AudioService extends IAudioService.Stub {
private static final int UNMUTE_STREAM_DELAY = 350;
/**
- * The delay before playing a sound. This small period exists so the user
- * can press another key (non-volume keys, too) to have it NOT be audible.
- * <p>
- * PhoneWindow will implement this part.
- */
- public static final int PLAY_SOUND_DELAY = 300;
-
- /**
* Only used in the result from {@link #checkForRingerModeChange(int, int, int)}
*/
private static final int FLAG_ADJUST_VOLUME = 1;
@@ -155,21 +169,15 @@ public class AudioService extends IAudioService.Stub {
private final ContentResolver mContentResolver;
private final AppOpsManager mAppOps;
- // the platform has no specific capabilities
- public static final int PLATFORM_DEFAULT = 0;
- // the platform is voice call capable (a phone)
- public static final int PLATFORM_VOICE = 1;
- // the platform is a television or a set-top box
- public static final int PLATFORM_TELEVISION = 2;
// the platform type affects volume and silent mode behavior
private final int mPlatformType;
private boolean isPlatformVoice() {
- return mPlatformType == PLATFORM_VOICE;
+ return mPlatformType == AudioSystem.PLATFORM_VOICE;
}
private boolean isPlatformTelevision() {
- return mPlatformType == PLATFORM_TELEVISION;
+ return mPlatformType == AudioSystem.PLATFORM_TELEVISION;
}
/** The controller for the volume UI. */
@@ -267,19 +275,6 @@ public class AudioService extends IAudioService.Stub {
15 // STREAM_TTS
};
- private static int[] DEFAULT_STREAM_VOLUME = new int[] {
- 4, // STREAM_VOICE_CALL
- 7, // STREAM_SYSTEM
- 5, // STREAM_RING
- 11, // STREAM_MUSIC
- 6, // STREAM_ALARM
- 5, // STREAM_NOTIFICATION
- 7, // STREAM_BLUETOOTH_SCO
- 7, // STREAM_SYSTEM_ENFORCED
- 11, // STREAM_DTMF
- 11 // STREAM_TTS
- };
-
/* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings
* of another stream: This avoids multiplying the volume settings for hidden
* stream types that follow other stream behavior for volume settings
@@ -346,26 +341,6 @@ public class AudioService extends IAudioService.Stub {
private final boolean mUseFixedVolume;
- // stream names used by dumpStreamStates()
- private static final String[] STREAM_NAMES = new String[] {
- "STREAM_VOICE_CALL",
- "STREAM_SYSTEM",
- "STREAM_RING",
- "STREAM_MUSIC",
- "STREAM_ALARM",
- "STREAM_NOTIFICATION",
- "STREAM_BLUETOOTH_SCO",
- "STREAM_SYSTEM_ENFORCED",
- "STREAM_DTMF",
- "STREAM_TTS"
- };
-
- public static final int DEFAULT_MUTE_STREAMS_AFFECTED =
- (1 << AudioSystem.STREAM_MUSIC) |
- (1 << AudioSystem.STREAM_RING) |
- (1 << AudioSystem.STREAM_NOTIFICATION) |
- (1 << AudioSystem.STREAM_SYSTEM);
-
private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
public void onError(int error) {
switch (error) {
@@ -570,7 +545,7 @@ public class AudioService extends IAudioService.Stub {
mContentResolver = context.getContentResolver();
mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
- mPlatformType = getPlatformType(context);
+ mPlatformType = AudioSystem.getPlatformType(context);
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mAudioEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleAudioEvent");
@@ -583,13 +558,13 @@ public class AudioService extends IAudioService.Stub {
MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]);
if (maxVolume != MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]) {
MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = maxVolume;
- DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = (maxVolume * 3) / 4;
+ AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = (maxVolume * 3) / 4;
}
maxVolume = SystemProperties.getInt("ro.config.media_vol_steps",
MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]);
if (maxVolume != MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]) {
MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = maxVolume;
- DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = (maxVolume * 3) / 4;
+ AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = (maxVolume * 3) / 4;
}
sSoundEffectVolumeDb = context.getResources().getInteger(
@@ -683,26 +658,6 @@ public class AudioService extends IAudioService.Stub {
LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());
}
- /**
- * Return the platform type that this is running on. One of:
- * <ul>
- * <li>{@link #PLATFORM_VOICE}</li>
- * <li>{@link #PLATFORM_TELEVISION}</li>
- * <li>{@link #PLATFORM_DEFAULT}</li>
- * </ul>
- */
- public static int getPlatformType(Context context) {
- if (context.getResources().getBoolean(
- com.android.internal.R.bool.config_voice_capable)) {
- return PLATFORM_VOICE;
- } else if (context.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_LEANBACK)) {
- return PLATFORM_TELEVISION;
- } else {
- return PLATFORM_DEFAULT;
- }
- }
-
public void systemReady() {
sendMsg(mAudioHandler, MSG_SYSTEM_READY, SENDMSG_QUEUE,
0, 0, null, 0);
@@ -819,7 +774,7 @@ public class AudioService extends IAudioService.Stub {
pw.println("\nStream volumes (device: index)");
int numStreamTypes = AudioSystem.getNumStreamTypes();
for (int i = 0; i < numStreamTypes; i++) {
- pw.println("- "+STREAM_NAMES[i]+":");
+ pw.println("- " + AudioSystem.STREAM_NAMES[i] + ":");
mStreamStates[i].dump(pw);
pw.println("");
}
@@ -827,22 +782,15 @@ public class AudioService extends IAudioService.Stub {
pw.println(Integer.toHexString(mMuteAffectedStreams));
}
- /** @hide */
- public static String streamToString(int stream) {
- if (stream >= 0 && stream < STREAM_NAMES.length) return STREAM_NAMES[stream];
- if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) return "USE_DEFAULT_STREAM_TYPE";
- return "UNKNOWN_STREAM_" + stream;
- }
-
private void updateStreamVolumeAlias(boolean updateVolumes) {
int dtmfStreamAlias;
switch (mPlatformType) {
- case PLATFORM_VOICE:
+ case AudioSystem.PLATFORM_VOICE:
mStreamVolumeAlias = STREAM_VOLUME_ALIAS_VOICE;
dtmfStreamAlias = AudioSystem.STREAM_RING;
break;
- case PLATFORM_TELEVISION:
+ case AudioSystem.PLATFORM_TELEVISION:
mStreamVolumeAlias = STREAM_VOLUME_ALIAS_TELEVISION;
dtmfStreamAlias = AudioSystem.STREAM_MUSIC;
break;
@@ -921,11 +869,11 @@ public class AudioService extends IAudioService.Stub {
// System.VIBRATE_ON is not used any more but defaults for mVibrateSetting
// are still needed while setVibrateSetting() and getVibrateSetting() are being
// deprecated.
- mVibrateSetting = getValueForVibrateSetting(0,
+ mVibrateSetting = AudioSystem.getValueForVibrateSetting(0,
AudioManager.VIBRATE_TYPE_NOTIFICATION,
mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT
: AudioManager.VIBRATE_SETTING_OFF);
- mVibrateSetting = getValueForVibrateSetting(mVibrateSetting,
+ mVibrateSetting = AudioSystem.getValueForVibrateSetting(mVibrateSetting,
AudioManager.VIBRATE_TYPE_RINGER,
mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT
: AudioManager.VIBRATE_SETTING_OFF);
@@ -935,7 +883,7 @@ public class AudioService extends IAudioService.Stub {
}
mMuteAffectedStreams = System.getIntForUser(cr,
- System.MUTE_STREAMS_AFFECTED, DEFAULT_MUTE_STREAMS_AFFECTED,
+ System.MUTE_STREAMS_AFFECTED, AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED,
UserHandle.USER_CURRENT);
boolean masterMute = System.getIntForUser(cr, System.VOLUME_MASTER_MUTE,
@@ -1746,10 +1694,6 @@ public class AudioService extends IAudioService.Stub {
return MAX_STREAM_VOLUME[streamType];
}
- public static int getDefaultStreamVolume(int streamType) {
- return DEFAULT_STREAM_VOLUME[streamType];
- }
-
/** @see AudioManager#getStreamVolume(int) */
public int getStreamVolume(int streamType) {
ensureValidStreamType(streamType);
@@ -2044,29 +1988,14 @@ public class AudioService extends IAudioService.Stub {
if (!mHasVibrator) return;
- mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, vibrateType, vibrateSetting);
+ mVibrateSetting = AudioSystem.getValueForVibrateSetting(mVibrateSetting, vibrateType,
+ vibrateSetting);
// Broadcast change
broadcastVibrateSetting(vibrateType);
}
- /**
- * @see #setVibrateSetting(int, int)
- */
- public static int getValueForVibrateSetting(int existingValue, int vibrateType,
- int vibrateSetting) {
-
- // First clear the existing setting. Each vibrate type has two bits in
- // the value. Note '3' is '11' in binary.
- existingValue &= ~(3 << (vibrateType * 2));
-
- // Set into the old value
- existingValue |= (vibrateSetting & 3) << (vibrateType * 2);
-
- return existingValue;
- }
-
private class SetModeDeathHandler implements IBinder.DeathRecipient {
private IBinder mCb; // To be notified of client's death
private int mPid;
@@ -3245,7 +3174,7 @@ public class AudioService extends IAudioService.Stub {
(1 << AudioSystem.STREAM_SYSTEM);
switch (mPlatformType) {
- case PLATFORM_TELEVISION:
+ case AudioSystem.PLATFORM_TELEVISION:
ringerModeAffectedStreams = 0;
break;
default:
@@ -3338,7 +3267,7 @@ public class AudioService extends IAudioService.Stub {
private int getActiveStreamType(int suggestedStreamType) {
switch (mPlatformType) {
- case PLATFORM_VOICE:
+ case AudioSystem.PLATFORM_VOICE:
if (isInCommunication()) {
if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)
== AudioSystem.FORCE_BT_SCO) {
@@ -3364,7 +3293,7 @@ public class AudioService extends IAudioService.Stub {
return AudioSystem.STREAM_MUSIC;
}
break;
- case PLATFORM_TELEVISION:
+ case AudioSystem.PLATFORM_TELEVISION:
if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {
// TV always defaults to STREAM_MUSIC
return AudioSystem.STREAM_MUSIC;
@@ -3599,7 +3528,7 @@ public class AudioService extends IAudioService.Stub {
// only be stale values
if ((mStreamType == AudioSystem.STREAM_SYSTEM) ||
(mStreamType == AudioSystem.STREAM_SYSTEM_ENFORCED)) {
- int index = 10 * DEFAULT_STREAM_VOLUME[mStreamType];
+ int index = 10 * AudioSystem.DEFAULT_STREAM_VOLUME[mStreamType];
synchronized (mCameraSoundForced) {
if (mCameraSoundForced) {
index = mIndexMax;
@@ -3623,7 +3552,7 @@ public class AudioService extends IAudioService.Stub {
// if no volume stored for current stream and device, use default volume if default
// device, continue otherwise
int defaultIndex = (device == AudioSystem.DEVICE_OUT_DEFAULT) ?
- DEFAULT_STREAM_VOLUME[mStreamType] : -1;
+ AudioSystem.DEFAULT_STREAM_VOLUME[mStreamType] : -1;
int index = Settings.System.getIntForUser(
mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT);
if (index == -1) {
@@ -4497,8 +4426,8 @@ public class AudioService extends IAudioService.Stub {
mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
synchronized (mCurAudioRoutes) {
// Remove A2DP routes as well
- if (mCurAudioRoutes.mBluetoothName != null) {
- mCurAudioRoutes.mBluetoothName = null;
+ if (mCurAudioRoutes.bluetoothName != null) {
+ mCurAudioRoutes.bluetoothName = null;
sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,
SENDMSG_NOOP, 0, 0, null, 0);
}
@@ -4578,8 +4507,8 @@ public class AudioService extends IAudioService.Stub {
makeA2dpDeviceUnavailableNow(address);
}
synchronized (mCurAudioRoutes) {
- if (mCurAudioRoutes.mBluetoothName != null) {
- mCurAudioRoutes.mBluetoothName = null;
+ if (mCurAudioRoutes.bluetoothName != null) {
+ mCurAudioRoutes.bluetoothName = null;
sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,
SENDMSG_NOOP, 0, 0, null, 0);
}
@@ -4600,8 +4529,8 @@ public class AudioService extends IAudioService.Stub {
makeA2dpDeviceAvailable(address);
synchronized (mCurAudioRoutes) {
String name = btDevice.getAliasName();
- if (!TextUtils.equals(mCurAudioRoutes.mBluetoothName, name)) {
- mCurAudioRoutes.mBluetoothName = name;
+ if (!TextUtils.equals(mCurAudioRoutes.bluetoothName, name)) {
+ mCurAudioRoutes.bluetoothName = name;
sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,
SENDMSG_NOOP, 0, 0, null, 0);
}
@@ -4757,14 +4686,14 @@ public class AudioService extends IAudioService.Stub {
synchronized (mCurAudioRoutes) {
if (connType != 0) {
- int newConn = mCurAudioRoutes.mMainType;
+ int newConn = mCurAudioRoutes.mainType;
if (state != 0) {
newConn |= connType;
} else {
newConn &= ~connType;
}
- if (newConn != mCurAudioRoutes.mMainType) {
- mCurAudioRoutes.mMainType = newConn;
+ if (newConn != mCurAudioRoutes.mainType) {
+ mCurAudioRoutes.mainType = newConn;
sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,
SENDMSG_NOOP, 0, 0, null, 0);
}
@@ -5096,7 +5025,7 @@ public class AudioService extends IAudioService.Stub {
IAudioPolicyCallback pcb) {
// permission checks
if ((flags & AudioManager.AUDIOFOCUS_FLAG_LOCK) == AudioManager.AUDIOFOCUS_FLAG_LOCK) {
- if (mMediaFocusControl.IN_VOICE_COMM_FOCUS_ID.equals(clientId)) {
+ if (AudioSystem.IN_VOICE_COMM_FOCUS_ID.equals(clientId)) {
if (PackageManager.PERMISSION_GRANTED != mContext.checkCallingOrSelfPermission(
android.Manifest.permission.MODIFY_PHONE_STATE)) {
Log.e(TAG, "Invalid permission to (un)lock audio focus", new Exception());
@@ -5564,8 +5493,8 @@ public class AudioService extends IAudioService.Stub {
dumpStreamStates(pw);
dumpRingerMode(pw);
pw.println("\nAudio routes:");
- pw.print(" mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mMainType));
- pw.print(" mBluetoothName="); pw.println(mCurAudioRoutes.mBluetoothName);
+ pw.print(" mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mainType));
+ pw.print(" mBluetoothName="); pw.println(mCurAudioRoutes.bluetoothName);
pw.println("\nOther state:");
pw.print(" mVolumeController="); pw.println(mVolumeController);
diff --git a/media/java/android/media/FocusRequester.java b/services/core/java/com/android/server/audio/FocusRequester.java
index bbe5fd225c17..49be879b93c7 100644
--- a/media/java/android/media/FocusRequester.java
+++ b/services/core/java/com/android/server/audio/FocusRequester.java
@@ -14,13 +14,18 @@
* limitations under the License.
*/
-package android.media;
+package com.android.server.audio;
import android.annotation.NonNull;
-import android.media.MediaFocusControl.AudioFocusDeathHandler;
+import android.media.AudioAttributes;
+import android.media.AudioFocusInfo;
+import android.media.AudioManager;
+import android.media.IAudioFocusDispatcher;
import android.os.IBinder;
import android.util.Log;
+import com.android.server.audio.MediaFocusControl.AudioFocusDeathHandler;
+
import java.io.PrintWriter;
/**
@@ -29,7 +34,7 @@ import java.io.PrintWriter;
* instance is managed by android.media.MediaFocusControl, from its addition to the audio focus
* stack to its release.
*/
-class FocusRequester {
+public class FocusRequester {
// on purpose not using this classe's name, as it will only be used from MediaFocusControl
private static final String TAG = "MediaFocusControl";
diff --git a/media/java/android/media/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java
index 6518bd162e39..24e1ace8c275 100644
--- a/media/java/android/media/MediaFocusControl.java
+++ b/services/core/java/com/android/server/audio/MediaFocusControl.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.media;
+package com.android.server.audio;
import android.app.Activity;
import android.app.ActivityManager;
@@ -32,7 +32,17 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
-import android.media.PlayerRecord.RemotePlaybackState;
+import android.media.AudioAttributes;
+import android.media.AudioFocusInfo;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.media.IAudioFocusDispatcher;
+import android.media.IAudioService;
+import android.media.IRemoteControlClient;
+import android.media.IRemoteControlDisplay;
+import android.media.IRemoteVolumeObserver;
+import android.media.RemoteControlClient;
+import android.media.AudioManager.OnAudioFocusChangeListener;
import android.media.audiopolicy.IAudioPolicyCallback;
import android.net.Uri;
import android.os.Binder;
@@ -53,6 +63,8 @@ import android.util.Log;
import android.util.Slog;
import android.view.KeyEvent;
+import com.android.server.audio.PlayerRecord.RemotePlaybackState;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
@@ -391,13 +403,6 @@ public class MediaFocusControl implements OnFinished {
// AudioFocus
//==========================================================================================
- /**
- * Constant to identify a focus stack entry that is used to hold the focus while the phone
- * is ringing or during a call. Used by com.android.internal.telephony.CallManager when
- * entering and exiting calls.
- */
- protected final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls";
-
private final static Object mAudioFocusLock = new Object();
private final static Object mRingingLock = new Object();
@@ -565,7 +570,7 @@ public class MediaFocusControl implements OnFinished {
}
private boolean isLockedFocusOwner(FocusRequester fr) {
- return (fr.hasSameClient(IN_VOICE_COMM_FOCUS_ID) || fr.isLockedFocusOwner());
+ return (fr.hasSameClient(AudioSystem.IN_VOICE_COMM_FOCUS_ID) || fr.isLockedFocusOwner());
}
/**
diff --git a/media/java/android/media/PlayerRecord.java b/services/core/java/com/android/server/audio/PlayerRecord.java
index 664ddcf7362c..a7dbbd188c6c 100644
--- a/media/java/android/media/PlayerRecord.java
+++ b/services/core/java/com/android/server/audio/PlayerRecord.java
@@ -14,10 +14,14 @@
* limitations under the License.
*/
-package android.media;
+package com.android.server.audio;
import android.app.PendingIntent;
import android.content.ComponentName;
+import android.media.AudioManager;
+import android.media.IRemoteControlClient;
+import android.media.IRemoteVolumeObserver;
+import android.media.RemoteControlClient;
import android.os.Binder;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 7f9af3103cee..875d39561065 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -29,7 +29,6 @@ import android.content.Intent;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
-import android.media.AudioService;
import android.media.tv.TvInputManager;
import android.os.Build;
import android.os.Environment;
@@ -60,6 +59,7 @@ import com.android.server.accessibility.AccessibilityManagerService;
import com.android.server.accounts.AccountManagerService;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.BatteryStatsService;
+import com.android.server.audio.AudioService;
import com.android.server.clipboard.ClipboardService;
import com.android.server.content.ContentService;
import com.android.server.devicepolicy.DevicePolicyManagerService;
diff --git a/services/usb/java/com/android/server/usb/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
index 9d13d3c1e348..c6f6b850f190 100644
--- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java
+++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
@@ -24,7 +24,6 @@ import android.content.res.Resources;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbInterface;
-import android.media.AudioService;
import android.media.AudioSystem;
import android.media.IAudioService;
import android.midi.MidiDeviceInfo;
@@ -38,6 +37,8 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
+import com.android.server.audio.AudioService;
+
import libcore.io.IoUtils;
import java.io.File;