diff options
author | Jinsuk Kim <jinsukkim@google.com> | 2014-12-02 07:36:10 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-12-02 07:36:10 +0000 |
commit | f2d68c8811db6fee4650ae5cd310cbe54744d9df (patch) | |
tree | 1750275ed9e7472d90b72f5310c5598ff4312395 /media | |
parent | b076324c64060161e75c35f43c688f7cf067e396 (diff) | |
parent | bfe763d1c96fe0f8e704743160a478d2e698a801 (diff) | |
download | frameworks_base-f2d68c8811db6fee4650ae5cd310cbe54744d9df.zip frameworks_base-f2d68c8811db6fee4650ae5cd310cbe54744d9df.tar.gz frameworks_base-f2d68c8811db6fee4650ae5cd310cbe54744d9df.tar.bz2 |
am bfe763d1: am b4355ec3: Merge "audioservice: system audio control in master volume mode" into lmp-mr1-dev
* commit 'bfe763d1c96fe0f8e704743160a478d2e698a801':
audioservice: system audio control in master volume mode
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/AudioService.java | 106 |
1 files changed, 59 insertions, 47 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 4da2705..417c336 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1124,20 +1124,11 @@ public class AudioService extends IAudioService.Stub { // Check if volume update should be send to Hdmi system audio. int newIndex = mStreamStates[streamType].getIndex(device); + if (streamTypeAlias == AudioSystem.STREAM_MUSIC) { + setSystemAudioVolume(oldIndex, newIndex, getStreamMaxVolume(streamType), flags); + } if (mHdmiManager != null) { synchronized (mHdmiManager) { - if (mHdmiTvClient != null && - streamTypeAlias == AudioSystem.STREAM_MUSIC && - (flags & AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME) == 0 && - oldIndex != newIndex) { - int maxIndex = getStreamMaxVolume(streamType); - synchronized (mHdmiTvClient) { - if (mHdmiSystemAudioSupported) { - mHdmiTvClient.setSystemAudioVolume( - (oldIndex + 5) / 10, (newIndex + 5) / 10, maxIndex); - } - } - } // mHdmiCecSink true => mHdmiPlaybackClient != null if (mHdmiCecSink && streamTypeAlias == AudioSystem.STREAM_MUSIC && @@ -1156,6 +1147,23 @@ public class AudioService extends IAudioService.Stub { sendVolumeUpdate(streamType, oldIndex, index, flags); } + private void setSystemAudioVolume(int oldVolume, int newVolume, int maxVolume, int flags) { + if (mHdmiManager == null + || mHdmiTvClient == null + || oldVolume == newVolume + || (flags & AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME) != 0) return; + + // Sets the audio volume of AVR when we are in system audio mode. The new volume info + // is tranformed to HDMI-CEC commands and passed through CEC bus. + synchronized (mHdmiManager) { + if (!mHdmiSystemAudioSupported) return; + synchronized (mHdmiTvClient) { + mHdmiTvClient.setSystemAudioVolume( + (oldVolume + 5) / 10, (newVolume + 5) / 10, maxVolume); + } + } + } + /** @see AudioManager#adjustMasterVolume(int, int) */ public void adjustMasterVolume(int steps, int flags, String callingPackage) { adjustMasterVolume(steps, flags, callingPackage, Binder.getCallingUid()); @@ -1267,21 +1275,8 @@ public class AudioService extends IAudioService.Stub { } } - if (mHdmiManager != null) { - synchronized (mHdmiManager) { - if (mHdmiTvClient != null && - streamTypeAlias == AudioSystem.STREAM_MUSIC && - (flags & AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME) == 0 && - oldIndex != index) { - int maxIndex = getStreamMaxVolume(streamType); - synchronized (mHdmiTvClient) { - if (mHdmiSystemAudioSupported) { - mHdmiTvClient.setSystemAudioVolume( - (oldIndex + 5) / 10, (index + 5) / 10, maxIndex); - } - } - } - } + if (streamTypeAlias == AudioSystem.STREAM_MUSIC) { + setSystemAudioVolume(oldIndex, index, getStreamMaxVolume(streamType), flags); } flags &= ~AudioManager.FLAG_FIXED_VOLUME; @@ -1422,15 +1417,8 @@ public class AudioService extends IAudioService.Stub { streamType = AudioSystem.STREAM_NOTIFICATION; } - // If Hdmi-CEC system audio mode is on, show volume bar - // only when TV receives volume notification from Audio Receiver. - if (mHdmiTvClient != null && streamType == AudioSystem.STREAM_MUSIC) { - synchronized (mHdmiTvClient) { - if (mHdmiSystemAudioSupported && - ((flags & AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME) == 0)) { - flags &= ~AudioManager.FLAG_SHOW_UI; - } - } + if (streamType == AudioSystem.STREAM_MUSIC) { + flags = updateFlagsForSystemAudio(flags); } mVolumeController.postVolumeChanged(streamType, flags); @@ -1445,9 +1433,23 @@ public class AudioService extends IAudioService.Stub { } } + // If Hdmi-CEC system audio mode is on, we show volume bar only when TV + // receives volume notification from Audio Receiver. + private int updateFlagsForSystemAudio(int flags) { + if (mHdmiTvClient != null) { + synchronized (mHdmiTvClient) { + if (mHdmiSystemAudioSupported && + ((flags & AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME) == 0)) { + flags &= ~AudioManager.FLAG_SHOW_UI; + } + } + } + return flags; + } + // UI update and Broadcast Intent private void sendMasterVolumeUpdate(int flags, int oldVolume, int newVolume) { - mVolumeController.postMasterVolumeChanged(flags); + mVolumeController.postMasterVolumeChanged(updateFlagsForSystemAudio(flags)); Intent intent = new Intent(AudioManager.MASTER_VOLUME_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_PREV_MASTER_VOLUME_VALUE, oldVolume); @@ -1457,7 +1459,7 @@ public class AudioService extends IAudioService.Stub { // UI update and Broadcast Intent private void sendMasterMuteUpdate(boolean muted, int flags) { - mVolumeController.postMasterMuteChanged(flags); + mVolumeController.postMasterMuteChanged(updateFlagsForSystemAudio(flags)); broadcastMasterMuteStatus(muted); } @@ -1517,18 +1519,26 @@ public class AudioService extends IAudioService.Stub { } if (isStreamAffectedByMute(streamType)) { - if (mHdmiManager != null) { - synchronized (mHdmiManager) { - if (streamType == AudioSystem.STREAM_MUSIC && mHdmiTvClient != null) { - synchronized (mHdmiTvClient) { - if (mHdmiSystemAudioSupported) { - mHdmiTvClient.setSystemAudioMute(state); - } - } + if (streamType == AudioSystem.STREAM_MUSIC) { + setSystemAudioMute(state); + } + mStreamStates[streamType].mute(cb, state); + } + } + + private void setSystemAudioMute(boolean state) { + if (mHdmiManager == null || mHdmiTvClient == null) return; + synchronized (mHdmiManager) { + final long token = Binder.clearCallingIdentity(); + try { + synchronized (mHdmiTvClient) { + if (mHdmiSystemAudioSupported) { + mHdmiTvClient.setSystemAudioMute(state); } } + } finally { + Binder.restoreCallingIdentity(token); } - mStreamStates[streamType].mute(cb, state); } } @@ -1649,6 +1659,7 @@ public class AudioService extends IAudioService.Stub { return; } if (state != AudioSystem.getMasterMute()) { + setSystemAudioMute(state); AudioSystem.setMasterMute(state); // Post a persist master volume msg sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME_MUTE, SENDMSG_REPLACE, state ? 1 @@ -1729,6 +1740,7 @@ public class AudioService extends IAudioService.Stub { // Post a persist master volume msg sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME, SENDMSG_REPLACE, Math.round(volume * (float)1000.0), 0, null, PERSIST_DELAY); + setSystemAudioVolume(oldVolume, newVolume, getMasterMaxVolume(), flags); } // Send the volume update regardless whether there was a change. sendMasterVolumeUpdate(flags, oldVolume, newVolume); |