diff --git a/core/api/current.txt b/core/api/current.txt index 97d47077dbbe9..0af5918e444b3 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -20475,6 +20475,7 @@ package android.media { field public static final int ENCODED_SURROUND_OUTPUT_AUTO = 0; // 0x0 field public static final int ENCODED_SURROUND_OUTPUT_MANUAL = 3; // 0x3 field public static final int ENCODED_SURROUND_OUTPUT_NEVER = 1; // 0x1 + field public static final int ENCODED_SURROUND_OUTPUT_UNKNOWN = -1; // 0xffffffff field public static final int ERROR = -1; // 0xffffffff field public static final int ERROR_DEAD_OBJECT = -6; // 0xfffffffa field public static final String EXTRA_AUDIO_PLUG_STATE = "android.media.extra.AUDIO_PLUG_STATE"; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index eb562b7067f2e..c97f097e02c32 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -13825,6 +13825,12 @@ public final class Settings { */ public static final int ENCODED_SURROUND_OUTPUT_MANUAL = 3; + /** + * The maximum value for surround sound output mode in Android S. + * @hide + */ + public static final int ENCODED_SURROUND_SC_MAX = ENCODED_SURROUND_OUTPUT_MANUAL; + /** * Set to ENCODED_SURROUND_OUTPUT_AUTO, * ENCODED_SURROUND_OUTPUT_NEVER, diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index a717a90c1c37f..5332d751b2656 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -569,6 +569,7 @@ public class AudioManager { /** @hide */ @IntDef(prefix = {"ENCODED_SURROUND_OUTPUT_"}, value = { + ENCODED_SURROUND_OUTPUT_UNKNOWN, ENCODED_SURROUND_OUTPUT_AUTO, ENCODED_SURROUND_OUTPUT_NEVER, ENCODED_SURROUND_OUTPUT_ALWAYS, @@ -577,6 +578,11 @@ public class AudioManager { @Retention(RetentionPolicy.SOURCE) public @interface EncodedSurroundOutputMode {} + /** + * The mode for surround sound formats is unknown. + */ + public static final int ENCODED_SURROUND_OUTPUT_UNKNOWN = -1; + /** * The surround sound formats are available for use if they are detected. This is the default * mode. @@ -6873,7 +6879,8 @@ public class AudioManager { @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public @EncodedSurroundOutputMode int getEncodedSurroundMode() { try { - return getService().getEncodedSurroundMode(); + return getService().getEncodedSurroundMode( + getContext().getApplicationInfo().targetSdkVersion); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 36cf989d3a466..7a6369cd7c6d6 100755 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -164,7 +164,7 @@ interface IAudioService { boolean setEncodedSurroundMode(int mode); - int getEncodedSurroundMode(); + int getEncodedSurroundMode(int targetSdkVersion); oneway void avrcpSupportsAbsoluteVolume(String address, boolean support); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 2de2fdf1f188a..4cec83d4c026c 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1925,7 +1925,7 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#setEncodedSurroundMode(int) */ @Override - public boolean setEncodedSurroundMode(int mode) { + public boolean setEncodedSurroundMode(@AudioManager.EncodedSurroundOutputMode int mode) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Missing WRITE_SETTINGS permission"); @@ -1936,7 +1936,7 @@ public class AudioService extends IAudioService.Stub synchronized (mSettingsLock) { Settings.Global.putInt(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, - mode); + toEncodedSurroundSetting(mode)); } } finally { Binder.restoreCallingIdentity(token); @@ -1946,7 +1946,7 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#getEncodedSurroundMode() */ @Override - public int getEncodedSurroundMode() { + public int getEncodedSurroundMode(int targetSdkVersion) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Missing WRITE_SETTINGS permission"); @@ -1955,9 +1955,10 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { - return Settings.Global.getInt(mContentResolver, + int encodedSurroundSetting = Settings.Global.getInt(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, AudioManager.ENCODED_SURROUND_OUTPUT_AUTO); + return toEncodedSurroundOutputMode(encodedSurroundSetting, targetSdkVersion); } } finally { Binder.restoreCallingIdentity(token); @@ -1981,6 +1982,41 @@ public class AudioService extends IAudioService.Stub return formats; } + @SuppressWarnings("AndroidFrameworkCompatChange") + @AudioManager.EncodedSurroundOutputMode + private int toEncodedSurroundOutputMode(int encodedSurroundSetting, int targetSdkVersion) { + if (targetSdkVersion <= Build.VERSION_CODES.S + && encodedSurroundSetting > Settings.Global.ENCODED_SURROUND_SC_MAX) { + return AudioManager.ENCODED_SURROUND_OUTPUT_UNKNOWN; + } + switch (encodedSurroundSetting) { + case Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO: + return AudioManager.ENCODED_SURROUND_OUTPUT_AUTO; + case Settings.Global.ENCODED_SURROUND_OUTPUT_NEVER: + return AudioManager.ENCODED_SURROUND_OUTPUT_NEVER; + case Settings.Global.ENCODED_SURROUND_OUTPUT_ALWAYS: + return AudioManager.ENCODED_SURROUND_OUTPUT_ALWAYS; + case Settings.Global.ENCODED_SURROUND_OUTPUT_MANUAL: + return AudioManager.ENCODED_SURROUND_OUTPUT_MANUAL; + default: + return AudioManager.ENCODED_SURROUND_OUTPUT_UNKNOWN; + } + } + + private int toEncodedSurroundSetting( + @AudioManager.EncodedSurroundOutputMode int encodedSurroundOutputMode) { + switch (encodedSurroundOutputMode) { + case AudioManager.ENCODED_SURROUND_OUTPUT_NEVER: + return Settings.Global.ENCODED_SURROUND_OUTPUT_NEVER; + case AudioManager.ENCODED_SURROUND_OUTPUT_ALWAYS: + return Settings.Global.ENCODED_SURROUND_OUTPUT_ALWAYS; + case AudioManager.ENCODED_SURROUND_OUTPUT_MANUAL: + return Settings.Global.ENCODED_SURROUND_OUTPUT_MANUAL; + default: + return Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO; + } + } + private boolean isSurroundFormat(int audioFormat) { for (int sf : AudioFormat.SURROUND_SOUND_ENCODING) { if (sf == audioFormat) {