From 98fdb2616e176f53435201ff5ef38191a1143b0e Mon Sep 17 00:00:00 2001 From: Kriti Dang Date: Thu, 1 Apr 2021 13:26:00 +0200 Subject: [PATCH] Adding unknown constant to AudioManager ENCODED_SURROUND_OUTPUT mode constants Bug: 184044740 Test: atest AudioManagerTest Change-Id: I806df4aac6fbab5f32f66a7deac67ae8f71e3fdd --- core/api/current.txt | 1 + core/java/android/provider/Settings.java | 6 +++ media/java/android/media/AudioManager.java | 9 +++- media/java/android/media/IAudioService.aidl | 2 +- .../android/server/audio/AudioService.java | 44 +++++++++++++++++-- 5 files changed, 56 insertions(+), 6 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index a30191ce63a76..2e39a02141df5 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -20470,6 +20470,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 22d74ca33a836..bcb560a7c5fe9 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -13827,6 +13827,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 16a9626837078..e665c58f1f5af 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1892,7 +1892,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"); @@ -1903,7 +1903,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); @@ -1913,7 +1913,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"); @@ -1922,9 +1922,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); @@ -1948,6 +1949,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) {