Loading media/java/android/media/AudioManager.java +32 −11 Original line number Diff line number Diff line Loading @@ -106,6 +106,7 @@ public class AudioManager { private Context mOriginalContext; private Context mApplicationContext; private int mOriginalContextDeviceId = DEVICE_ID_DEFAULT; private @Nullable VirtualDeviceManager mVirtualDeviceManager; // Lazy initialized. private static final String TAG = "AudioManager"; private static final boolean DEBUG = false; Loading Loading @@ -844,6 +845,7 @@ public class AudioManager { } private void setContext(Context context) { mOriginalContextDeviceId = context.getDeviceId(); mApplicationContext = context.getApplicationContext(); if (mApplicationContext != null) { mOriginalContext = null; Loading Loading @@ -3958,7 +3960,7 @@ public class AudioManager { } /** * Checks whether this {@link AudioManager} instance is asociated with {@link VirtualDevice} * Checks whether this {@link AudioManager} instance is associated with {@link VirtualDevice} * configured with custom device policy for audio. If there is such device, request to play * sound effect is forwarded to {@link VirtualDeviceManager}. * Loading @@ -3967,18 +3969,24 @@ public class AudioManager { * false otherwise. */ private boolean delegateSoundEffectToVdm(@SystemSoundEffect int effectType) { int deviceId = getContext().getDeviceId(); if (deviceId != DEVICE_ID_DEFAULT) { if (hasCustomPolicyVirtualDeviceContext()) { VirtualDeviceManager vdm = getVirtualDeviceManager(); if (vdm != null && vdm.getDevicePolicy(deviceId, POLICY_TYPE_AUDIO) != DEVICE_POLICY_DEFAULT) { vdm.playSoundEffect(deviceId, effectType); vdm.playSoundEffect(mOriginalContextDeviceId, effectType); return true; } return false; } private boolean hasCustomPolicyVirtualDeviceContext() { if (mOriginalContextDeviceId == DEVICE_ID_DEFAULT) { return false; } VirtualDeviceManager vdm = getVirtualDeviceManager(); return vdm != null && vdm.getDevicePolicy(mOriginalContextDeviceId, POLICY_TYPE_AUDIO) != DEVICE_POLICY_DEFAULT; } /** * Load Sound effects. * This method must be called when sound effects are enabled. Loading Loading @@ -4677,6 +4685,16 @@ public class AudioManager { throw new IllegalArgumentException( "Illegal null audio policy when locking audio focus"); } if (hasCustomPolicyVirtualDeviceContext()) { // If the focus request was made within context associated with VirtualDevice // configured with custom device policy for audio, bypass audio service focus handling. // The custom device policy for audio means that audio associated with this device // is likely rerouted to VirtualAudioDevice and playback on the VirtualAudioDevice // shouldn't affect non-virtual audio tracks (and vice versa). return AUDIOFOCUS_REQUEST_GRANTED; } registerAudioFocusRequest(afr); final IAudioService service = getService(); final int status; Loading Loading @@ -4949,16 +4967,19 @@ public class AudioManager { @SuppressLint("RequiresPermission") // no permission enforcement, but only "undoes" what would // have been done by a matching requestAudioFocus public int abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa) { int status = AUDIOFOCUS_REQUEST_FAILED; if (hasCustomPolicyVirtualDeviceContext()) { // If this AudioManager instance is running within VirtualDevice context configured // with custom device policy for audio, the audio focus handling is bypassed. return AUDIOFOCUS_REQUEST_GRANTED; } unregisterAudioFocusRequest(l); final IAudioService service = getService(); try { status = service.abandonAudioFocus(mAudioFocusDispatcher, return service.abandonAudioFocus(mAudioFocusDispatcher, getIdForAudioFocusListener(l), aa, getContext().getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } return status; } //==================================================================== Loading Loading
media/java/android/media/AudioManager.java +32 −11 Original line number Diff line number Diff line Loading @@ -106,6 +106,7 @@ public class AudioManager { private Context mOriginalContext; private Context mApplicationContext; private int mOriginalContextDeviceId = DEVICE_ID_DEFAULT; private @Nullable VirtualDeviceManager mVirtualDeviceManager; // Lazy initialized. private static final String TAG = "AudioManager"; private static final boolean DEBUG = false; Loading Loading @@ -844,6 +845,7 @@ public class AudioManager { } private void setContext(Context context) { mOriginalContextDeviceId = context.getDeviceId(); mApplicationContext = context.getApplicationContext(); if (mApplicationContext != null) { mOriginalContext = null; Loading Loading @@ -3958,7 +3960,7 @@ public class AudioManager { } /** * Checks whether this {@link AudioManager} instance is asociated with {@link VirtualDevice} * Checks whether this {@link AudioManager} instance is associated with {@link VirtualDevice} * configured with custom device policy for audio. If there is such device, request to play * sound effect is forwarded to {@link VirtualDeviceManager}. * Loading @@ -3967,18 +3969,24 @@ public class AudioManager { * false otherwise. */ private boolean delegateSoundEffectToVdm(@SystemSoundEffect int effectType) { int deviceId = getContext().getDeviceId(); if (deviceId != DEVICE_ID_DEFAULT) { if (hasCustomPolicyVirtualDeviceContext()) { VirtualDeviceManager vdm = getVirtualDeviceManager(); if (vdm != null && vdm.getDevicePolicy(deviceId, POLICY_TYPE_AUDIO) != DEVICE_POLICY_DEFAULT) { vdm.playSoundEffect(deviceId, effectType); vdm.playSoundEffect(mOriginalContextDeviceId, effectType); return true; } return false; } private boolean hasCustomPolicyVirtualDeviceContext() { if (mOriginalContextDeviceId == DEVICE_ID_DEFAULT) { return false; } VirtualDeviceManager vdm = getVirtualDeviceManager(); return vdm != null && vdm.getDevicePolicy(mOriginalContextDeviceId, POLICY_TYPE_AUDIO) != DEVICE_POLICY_DEFAULT; } /** * Load Sound effects. * This method must be called when sound effects are enabled. Loading Loading @@ -4677,6 +4685,16 @@ public class AudioManager { throw new IllegalArgumentException( "Illegal null audio policy when locking audio focus"); } if (hasCustomPolicyVirtualDeviceContext()) { // If the focus request was made within context associated with VirtualDevice // configured with custom device policy for audio, bypass audio service focus handling. // The custom device policy for audio means that audio associated with this device // is likely rerouted to VirtualAudioDevice and playback on the VirtualAudioDevice // shouldn't affect non-virtual audio tracks (and vice versa). return AUDIOFOCUS_REQUEST_GRANTED; } registerAudioFocusRequest(afr); final IAudioService service = getService(); final int status; Loading Loading @@ -4949,16 +4967,19 @@ public class AudioManager { @SuppressLint("RequiresPermission") // no permission enforcement, but only "undoes" what would // have been done by a matching requestAudioFocus public int abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa) { int status = AUDIOFOCUS_REQUEST_FAILED; if (hasCustomPolicyVirtualDeviceContext()) { // If this AudioManager instance is running within VirtualDevice context configured // with custom device policy for audio, the audio focus handling is bypassed. return AUDIOFOCUS_REQUEST_GRANTED; } unregisterAudioFocusRequest(l); final IAudioService service = getService(); try { status = service.abandonAudioFocus(mAudioFocusDispatcher, return service.abandonAudioFocus(mAudioFocusDispatcher, getIdForAudioFocusListener(l), aa, getContext().getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } return status; } //==================================================================== Loading