Loading services/core/java/com/android/server/audio/SoundDoseHelper.java +44 −47 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.util.MathUtils; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; Loading @@ -52,7 +53,6 @@ import com.android.server.utils.EventLogger; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; Loading Loading @@ -112,6 +112,8 @@ public class SoundDoseHelper { private static final long GLOBAL_TIME_OFFSET_UNINITIALIZED = -1; private static final int SAFE_MEDIA_VOLUME_UNINITIALIZED = -1; private final EventLogger mLogger = new EventLogger(AudioService.LOG_NB_EVENTS_SOUND_DOSE, "CSD updates"); Loading @@ -132,15 +134,6 @@ public class SoundDoseHelper { // For now using the same value for CSD supported devices private float mSafeMediaVolumeDbfs; private static class SafeDeviceVolumeInfo { int mDeviceType; int mSafeVolumeIndex = -1; SafeDeviceVolumeInfo(int deviceType) { mDeviceType = deviceType; } } /** * mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced. * Contains a safe volume index for a given device type. Loading @@ -152,25 +145,7 @@ public class SoundDoseHelper { * This level corresponds to a loudness of 85 dB SPL for the warning to be displayed when * the headset is compliant to EN 60950 with a max loudness of 100dB SPL. */ private final HashMap<Integer, SafeDeviceVolumeInfo> mSafeMediaVolumeDevices = new HashMap<>() {{ put(AudioSystem.DEVICE_OUT_WIRED_HEADSET, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_WIRED_HEADSET)); put(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE)); put(AudioSystem.DEVICE_OUT_USB_HEADSET, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_USB_HEADSET)); put(AudioSystem.DEVICE_OUT_BLE_HEADSET, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLE_HEADSET)); put(AudioSystem.DEVICE_OUT_BLE_BROADCAST, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLE_BROADCAST)); put(AudioSystem.DEVICE_OUT_HEARING_AID, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_HEARING_AID)); put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES)); put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); }}; private final SparseIntArray mSafeMediaVolumeDevices = new SparseIntArray(); // mMusicActiveMs is the cumulative time of music activity since safe volume was disabled. // When this time reaches UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX, the safe media volume is re-enabled Loading Loading @@ -291,6 +266,7 @@ public class SoundDoseHelper { mEnableCsd = mContext.getResources().getBoolean(R.bool.config_audio_csd_enabled_default); initCsd(); initSafeVolumes(); mSafeMediaVolumeState = mSettings.getGlobalInt(audioService.getContentResolver(), Settings.Global.AUDIO_SAFE_VOLUME_STATE, SAFE_MEDIA_VOLUME_NOT_CONFIGURED); Loading @@ -305,6 +281,25 @@ public class SoundDoseHelper { Context.ALARM_SERVICE); } void initSafeVolumes() { mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_WIRED_HEADSET, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_USB_HEADSET, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLE_HEADSET, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLE_BROADCAST, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_HEARING_AID, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, SAFE_MEDIA_VOLUME_UNINITIALIZED); } float getRs2Value() { if (!mEnableCsd) { return 0.f; Loading Loading @@ -435,12 +430,12 @@ public class SoundDoseHelper { } /*package*/ int safeMediaVolumeIndex(int device) { final SafeDeviceVolumeInfo vi = mSafeMediaVolumeDevices.get(device); if (vi == null) { final int vol = mSafeMediaVolumeDevices.get(device); if (vol == SAFE_MEDIA_VOLUME_UNINITIALIZED) { return MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]; } return vi.mSafeVolumeIndex; return vol; } /*package*/ void restoreMusicActiveMs() { Loading @@ -465,14 +460,15 @@ public class SoundDoseHelper { AudioService.VolumeStreamState streamState = mAudioService.getVssVolumeForStream( AudioSystem.STREAM_MUSIC); for (SafeDeviceVolumeInfo vi : mSafeMediaVolumeDevices.values()) { int index = streamState.getIndex(vi.mDeviceType); int safeIndex = safeMediaVolumeIndex(vi.mDeviceType); for (int i = 0; i < mSafeMediaVolumeDevices.size(); ++i) { int deviceType = mSafeMediaVolumeDevices.keyAt(i); int index = streamState.getIndex(deviceType); int safeIndex = safeMediaVolumeIndex(deviceType); if (index > safeIndex) { streamState.setIndex(safeIndex, vi.mDeviceType, caller, streamState.setIndex(safeIndex, deviceType, caller, true /*hasModifyAudioSettings*/); mAudioHandler.sendMessageAtTime( mAudioHandler.obtainMessage(MSG_SET_DEVICE_VOLUME, vi.mDeviceType, mAudioHandler.obtainMessage(MSG_SET_DEVICE_VOLUME, deviceType, /*arg2=*/0, streamState), /*delay=*/0); } } Loading @@ -494,7 +490,7 @@ public class SoundDoseHelper { private boolean checkSafeMediaVolume_l(int streamType, int index, int device) { return (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && (AudioService.mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && (mSafeMediaVolumeDevices.containsKey(device)) && safeDevicesContains(device) && (index > safeMediaVolumeIndex(device)); } Loading Loading @@ -546,7 +542,7 @@ public class SoundDoseHelper { synchronized (mSafeMediaVolumeStateLock) { if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { int device = mAudioService.getDeviceForStream(AudioSystem.STREAM_MUSIC); if (mSafeMediaVolumeDevices.containsKey(device) && isStreamActive) { if (safeDevicesContains(device) && isStreamActive) { scheduleMusicActiveCheck(); int index = mAudioService.getVssVolumeForDevice(AudioSystem.STREAM_MUSIC, device); Loading Loading @@ -589,14 +585,15 @@ public class SoundDoseHelper { } /*package*/ void initSafeMediaVolumeIndex() { for (SafeDeviceVolumeInfo vi : mSafeMediaVolumeDevices.values()) { vi.mSafeVolumeIndex = getSafeDeviceMediaVolumeIndex(vi.mDeviceType); for (int i = 0; i < mSafeMediaVolumeDevices.size(); ++i) { int deviceType = mSafeMediaVolumeDevices.keyAt(i); mSafeMediaVolumeDevices.put(deviceType, getSafeDeviceMediaVolumeIndex(deviceType)); } } /*package*/ int getSafeMediaVolumeIndex(int device) { if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE && mSafeMediaVolumeDevices.containsKey(device)) { && safeDevicesContains(device)) { return safeMediaVolumeIndex(device); } else { return -1; Loading @@ -614,7 +611,7 @@ public class SoundDoseHelper { } /*package*/ boolean safeDevicesContains(int device) { return mSafeMediaVolumeDevices.containsKey(device); return mSafeMediaVolumeDevices.indexOfKey(device) >= 0; } /*package*/ void invalidatPendingVolumeCommand() { Loading Loading @@ -665,9 +662,9 @@ public class SoundDoseHelper { pw.print(" mSafeMediaVolumeState="); pw.println(safeMediaVolumeStateToString(mSafeMediaVolumeState)); pw.print(" mSafeMediaVolumeIndex="); pw.println(mSafeMediaVolumeIndex); for (SafeDeviceVolumeInfo vi : mSafeMediaVolumeDevices.values()) { pw.print(" mSafeMediaVolumeIndex["); pw.print(vi.mDeviceType); pw.print("]="); pw.println(vi.mSafeVolumeIndex); for (int i = 0; i < mSafeMediaVolumeDevices.size(); ++i) { pw.print(" mSafeMediaVolumeIndex["); pw.print(mSafeMediaVolumeDevices.keyAt(i)); pw.print("]="); pw.println(mSafeMediaVolumeDevices.valueAt(i)); } pw.print(" mSafeMediaVolumeDbfs="); pw.println(mSafeMediaVolumeDbfs); pw.print(" mMusicActiveMs="); pw.println(mMusicActiveMs); Loading Loading @@ -721,7 +718,7 @@ public class SoundDoseHelper { } if (AudioService.mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC && mSafeMediaVolumeDevices.containsKey(device)) { && safeDevicesContains(device)) { soundDose.updateAttenuation( AudioSystem.getStreamVolumeDB(AudioSystem.STREAM_MUSIC, (newIndex + 5) / 10, Loading Loading
services/core/java/com/android/server/audio/SoundDoseHelper.java +44 −47 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.util.MathUtils; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; Loading @@ -52,7 +53,6 @@ import com.android.server.utils.EventLogger; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; Loading Loading @@ -112,6 +112,8 @@ public class SoundDoseHelper { private static final long GLOBAL_TIME_OFFSET_UNINITIALIZED = -1; private static final int SAFE_MEDIA_VOLUME_UNINITIALIZED = -1; private final EventLogger mLogger = new EventLogger(AudioService.LOG_NB_EVENTS_SOUND_DOSE, "CSD updates"); Loading @@ -132,15 +134,6 @@ public class SoundDoseHelper { // For now using the same value for CSD supported devices private float mSafeMediaVolumeDbfs; private static class SafeDeviceVolumeInfo { int mDeviceType; int mSafeVolumeIndex = -1; SafeDeviceVolumeInfo(int deviceType) { mDeviceType = deviceType; } } /** * mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced. * Contains a safe volume index for a given device type. Loading @@ -152,25 +145,7 @@ public class SoundDoseHelper { * This level corresponds to a loudness of 85 dB SPL for the warning to be displayed when * the headset is compliant to EN 60950 with a max loudness of 100dB SPL. */ private final HashMap<Integer, SafeDeviceVolumeInfo> mSafeMediaVolumeDevices = new HashMap<>() {{ put(AudioSystem.DEVICE_OUT_WIRED_HEADSET, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_WIRED_HEADSET)); put(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE)); put(AudioSystem.DEVICE_OUT_USB_HEADSET, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_USB_HEADSET)); put(AudioSystem.DEVICE_OUT_BLE_HEADSET, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLE_HEADSET)); put(AudioSystem.DEVICE_OUT_BLE_BROADCAST, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLE_BROADCAST)); put(AudioSystem.DEVICE_OUT_HEARING_AID, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_HEARING_AID)); put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES)); put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, new SafeDeviceVolumeInfo(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); }}; private final SparseIntArray mSafeMediaVolumeDevices = new SparseIntArray(); // mMusicActiveMs is the cumulative time of music activity since safe volume was disabled. // When this time reaches UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX, the safe media volume is re-enabled Loading Loading @@ -291,6 +266,7 @@ public class SoundDoseHelper { mEnableCsd = mContext.getResources().getBoolean(R.bool.config_audio_csd_enabled_default); initCsd(); initSafeVolumes(); mSafeMediaVolumeState = mSettings.getGlobalInt(audioService.getContentResolver(), Settings.Global.AUDIO_SAFE_VOLUME_STATE, SAFE_MEDIA_VOLUME_NOT_CONFIGURED); Loading @@ -305,6 +281,25 @@ public class SoundDoseHelper { Context.ALARM_SERVICE); } void initSafeVolumes() { mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_WIRED_HEADSET, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_USB_HEADSET, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLE_HEADSET, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLE_BROADCAST, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_HEARING_AID, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, SAFE_MEDIA_VOLUME_UNINITIALIZED); mSafeMediaVolumeDevices.append(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, SAFE_MEDIA_VOLUME_UNINITIALIZED); } float getRs2Value() { if (!mEnableCsd) { return 0.f; Loading Loading @@ -435,12 +430,12 @@ public class SoundDoseHelper { } /*package*/ int safeMediaVolumeIndex(int device) { final SafeDeviceVolumeInfo vi = mSafeMediaVolumeDevices.get(device); if (vi == null) { final int vol = mSafeMediaVolumeDevices.get(device); if (vol == SAFE_MEDIA_VOLUME_UNINITIALIZED) { return MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]; } return vi.mSafeVolumeIndex; return vol; } /*package*/ void restoreMusicActiveMs() { Loading @@ -465,14 +460,15 @@ public class SoundDoseHelper { AudioService.VolumeStreamState streamState = mAudioService.getVssVolumeForStream( AudioSystem.STREAM_MUSIC); for (SafeDeviceVolumeInfo vi : mSafeMediaVolumeDevices.values()) { int index = streamState.getIndex(vi.mDeviceType); int safeIndex = safeMediaVolumeIndex(vi.mDeviceType); for (int i = 0; i < mSafeMediaVolumeDevices.size(); ++i) { int deviceType = mSafeMediaVolumeDevices.keyAt(i); int index = streamState.getIndex(deviceType); int safeIndex = safeMediaVolumeIndex(deviceType); if (index > safeIndex) { streamState.setIndex(safeIndex, vi.mDeviceType, caller, streamState.setIndex(safeIndex, deviceType, caller, true /*hasModifyAudioSettings*/); mAudioHandler.sendMessageAtTime( mAudioHandler.obtainMessage(MSG_SET_DEVICE_VOLUME, vi.mDeviceType, mAudioHandler.obtainMessage(MSG_SET_DEVICE_VOLUME, deviceType, /*arg2=*/0, streamState), /*delay=*/0); } } Loading @@ -494,7 +490,7 @@ public class SoundDoseHelper { private boolean checkSafeMediaVolume_l(int streamType, int index, int device) { return (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && (AudioService.mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && (mSafeMediaVolumeDevices.containsKey(device)) && safeDevicesContains(device) && (index > safeMediaVolumeIndex(device)); } Loading Loading @@ -546,7 +542,7 @@ public class SoundDoseHelper { synchronized (mSafeMediaVolumeStateLock) { if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { int device = mAudioService.getDeviceForStream(AudioSystem.STREAM_MUSIC); if (mSafeMediaVolumeDevices.containsKey(device) && isStreamActive) { if (safeDevicesContains(device) && isStreamActive) { scheduleMusicActiveCheck(); int index = mAudioService.getVssVolumeForDevice(AudioSystem.STREAM_MUSIC, device); Loading Loading @@ -589,14 +585,15 @@ public class SoundDoseHelper { } /*package*/ void initSafeMediaVolumeIndex() { for (SafeDeviceVolumeInfo vi : mSafeMediaVolumeDevices.values()) { vi.mSafeVolumeIndex = getSafeDeviceMediaVolumeIndex(vi.mDeviceType); for (int i = 0; i < mSafeMediaVolumeDevices.size(); ++i) { int deviceType = mSafeMediaVolumeDevices.keyAt(i); mSafeMediaVolumeDevices.put(deviceType, getSafeDeviceMediaVolumeIndex(deviceType)); } } /*package*/ int getSafeMediaVolumeIndex(int device) { if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE && mSafeMediaVolumeDevices.containsKey(device)) { && safeDevicesContains(device)) { return safeMediaVolumeIndex(device); } else { return -1; Loading @@ -614,7 +611,7 @@ public class SoundDoseHelper { } /*package*/ boolean safeDevicesContains(int device) { return mSafeMediaVolumeDevices.containsKey(device); return mSafeMediaVolumeDevices.indexOfKey(device) >= 0; } /*package*/ void invalidatPendingVolumeCommand() { Loading Loading @@ -665,9 +662,9 @@ public class SoundDoseHelper { pw.print(" mSafeMediaVolumeState="); pw.println(safeMediaVolumeStateToString(mSafeMediaVolumeState)); pw.print(" mSafeMediaVolumeIndex="); pw.println(mSafeMediaVolumeIndex); for (SafeDeviceVolumeInfo vi : mSafeMediaVolumeDevices.values()) { pw.print(" mSafeMediaVolumeIndex["); pw.print(vi.mDeviceType); pw.print("]="); pw.println(vi.mSafeVolumeIndex); for (int i = 0; i < mSafeMediaVolumeDevices.size(); ++i) { pw.print(" mSafeMediaVolumeIndex["); pw.print(mSafeMediaVolumeDevices.keyAt(i)); pw.print("]="); pw.println(mSafeMediaVolumeDevices.valueAt(i)); } pw.print(" mSafeMediaVolumeDbfs="); pw.println(mSafeMediaVolumeDbfs); pw.print(" mMusicActiveMs="); pw.println(mMusicActiveMs); Loading Loading @@ -721,7 +718,7 @@ public class SoundDoseHelper { } if (AudioService.mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC && mSafeMediaVolumeDevices.containsKey(device)) { && safeDevicesContains(device)) { soundDose.updateAttenuation( AudioSystem.getStreamVolumeDB(AudioSystem.STREAM_MUSIC, (newIndex + 5) / 10, Loading