Merge "TIF: TvInputHardwareManager to listen to volume changes" into lmp-mr1-dev
This commit is contained in:
@@ -19,7 +19,10 @@ package com.android.server.tv;
|
|||||||
import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED;
|
import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED;
|
||||||
import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED;
|
import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.hardware.hdmi.HdmiControlManager;
|
import android.hardware.hdmi.HdmiControlManager;
|
||||||
import android.hardware.hdmi.HdmiDeviceInfo;
|
import android.hardware.hdmi.HdmiDeviceInfo;
|
||||||
import android.hardware.hdmi.HdmiHotplugEvent;
|
import android.hardware.hdmi.HdmiHotplugEvent;
|
||||||
@@ -74,6 +77,7 @@ import java.util.Map;
|
|||||||
class TvInputHardwareManager implements TvInputHal.Callback {
|
class TvInputHardwareManager implements TvInputHal.Callback {
|
||||||
private static final String TAG = TvInputHardwareManager.class.getSimpleName();
|
private static final String TAG = TvInputHardwareManager.class.getSimpleName();
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
private final Listener mListener;
|
private final Listener mListener;
|
||||||
private final TvInputHal mHal = new TvInputHal(this);
|
private final TvInputHal mHal = new TvInputHal(this);
|
||||||
private final SparseArray<Connection> mConnections = new SparseArray<>();
|
private final SparseArray<Connection> mConnections = new SparseArray<>();
|
||||||
@@ -92,6 +96,15 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
private final IHdmiDeviceEventListener mHdmiDeviceEventListener = new HdmiDeviceEventListener();
|
private final IHdmiDeviceEventListener mHdmiDeviceEventListener = new HdmiDeviceEventListener();
|
||||||
private final IHdmiSystemAudioModeChangeListener mHdmiSystemAudioModeChangeListener =
|
private final IHdmiSystemAudioModeChangeListener mHdmiSystemAudioModeChangeListener =
|
||||||
new HdmiSystemAudioModeChangeListener();
|
new HdmiSystemAudioModeChangeListener();
|
||||||
|
private final BroadcastReceiver mVolumeReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
handleVolumeChange(context, intent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private int mCurrentIndex = 0;
|
||||||
|
private int mCurrentMaxIndex = 0;
|
||||||
|
private final boolean mUseMasterVolume;
|
||||||
|
|
||||||
// TODO: Should handle STANDBY case.
|
// TODO: Should handle STANDBY case.
|
||||||
private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray();
|
private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray();
|
||||||
@@ -103,8 +116,11 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
public TvInputHardwareManager(Context context, Listener listener) {
|
public TvInputHardwareManager(Context context, Listener listener) {
|
||||||
|
mContext = context;
|
||||||
mListener = listener;
|
mListener = listener;
|
||||||
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||||
|
mUseMasterVolume = mContext.getResources().getBoolean(
|
||||||
|
com.android.internal.R.bool.config_useMasterVolume);
|
||||||
mHal.init();
|
mHal.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +141,13 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
} else {
|
} else {
|
||||||
Slog.w(TAG, "HdmiControlService is not available");
|
Slog.w(TAG, "HdmiControlService is not available");
|
||||||
}
|
}
|
||||||
|
if (!mUseMasterVolume) {
|
||||||
|
final IntentFilter filter = new IntentFilter();
|
||||||
|
filter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
|
||||||
|
filter.addAction(AudioManager.STREAM_MUTE_CHANGED_ACTION);
|
||||||
|
mContext.registerReceiver(mVolumeReceiver, filter);
|
||||||
|
}
|
||||||
|
updateVolume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,6 +506,47 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateVolume() {
|
||||||
|
mCurrentMaxIndex = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
|
||||||
|
mCurrentIndex = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleVolumeChange(Context context, Intent intent) {
|
||||||
|
String action = intent.getAction();
|
||||||
|
if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
|
||||||
|
int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
|
||||||
|
if (streamType != AudioManager.STREAM_MUSIC) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int index = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0);
|
||||||
|
if (index == mCurrentIndex) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mCurrentIndex = index;
|
||||||
|
} else if (action.equals(AudioManager.STREAM_MUTE_CHANGED_ACTION)) {
|
||||||
|
int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
|
||||||
|
if (streamType != AudioManager.STREAM_MUSIC) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// volume index will be updated at onMediaStreamVolumeChanged() through updateVolume().
|
||||||
|
} else {
|
||||||
|
Slog.w(TAG, "Unrecognized intent: " + intent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
synchronized (mLock) {
|
||||||
|
for (int i = 0; i < mConnections.size(); ++i) {
|
||||||
|
TvInputHardwareImpl hardwareImpl = mConnections.valueAt(i).getHardwareImplLocked();
|
||||||
|
if (hardwareImpl != null) {
|
||||||
|
hardwareImpl.onMediaStreamVolumeChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private float getMediaStreamVolume() {
|
||||||
|
return mUseMasterVolume ? 1.0f : ((float) mCurrentIndex / (float) mCurrentMaxIndex);
|
||||||
|
}
|
||||||
|
|
||||||
private class Connection implements IBinder.DeathRecipient {
|
private class Connection implements IBinder.DeathRecipient {
|
||||||
private final TvInputHardwareInfo mHardwareInfo;
|
private final TvInputHardwareInfo mHardwareInfo;
|
||||||
private TvInputInfo mInfo;
|
private TvInputInfo mInfo;
|
||||||
@@ -611,7 +675,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
private AudioDevicePort mAudioSink;
|
private AudioDevicePort mAudioSink;
|
||||||
private AudioPatch mAudioPatch = null;
|
private AudioPatch mAudioPatch = null;
|
||||||
private float mCommittedVolume = 0.0f;
|
private float mCommittedVolume = 0.0f;
|
||||||
private float mVolume = 0.0f;
|
private float mSourceVolume = 0.0f;
|
||||||
|
|
||||||
private TvStreamConfig mActiveConfig = null;
|
private TvStreamConfig mActiveConfig = null;
|
||||||
|
|
||||||
@@ -733,8 +797,10 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateVolume();
|
||||||
|
float volume = mSourceVolume * getMediaStreamVolume();
|
||||||
AudioGainConfig sourceGainConfig = null;
|
AudioGainConfig sourceGainConfig = null;
|
||||||
if (mAudioSource.gains().length > 0 && mVolume != mCommittedVolume) {
|
if (mAudioSource.gains().length > 0 && volume != mCommittedVolume) {
|
||||||
AudioGain sourceGain = null;
|
AudioGain sourceGain = null;
|
||||||
for (AudioGain gain : mAudioSource.gains()) {
|
for (AudioGain gain : mAudioSource.gains()) {
|
||||||
if ((gain.mode() & AudioGain.MODE_JOINT) != 0) {
|
if ((gain.mode() & AudioGain.MODE_JOINT) != 0) {
|
||||||
@@ -747,17 +813,13 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
int steps = (sourceGain.maxValue() - sourceGain.minValue())
|
int steps = (sourceGain.maxValue() - sourceGain.minValue())
|
||||||
/ sourceGain.stepValue();
|
/ sourceGain.stepValue();
|
||||||
int gainValue = sourceGain.minValue();
|
int gainValue = sourceGain.minValue();
|
||||||
if (mVolume < 1.0f) {
|
if (volume < 1.0f) {
|
||||||
gainValue += sourceGain.stepValue() * (int) (mVolume * steps + 0.5);
|
gainValue += sourceGain.stepValue() * (int) (volume * steps + 0.5);
|
||||||
} else {
|
} else {
|
||||||
gainValue = sourceGain.maxValue();
|
gainValue = sourceGain.maxValue();
|
||||||
}
|
}
|
||||||
int numChannels = 0;
|
// size of gain values is 1 in MODE_JOINT
|
||||||
for (int mask = sourceGain.channelMask(); mask > 0; mask >>= 1) {
|
int[] gainValues = new int[] { gainValue };
|
||||||
numChannels += (mask & 1);
|
|
||||||
}
|
|
||||||
int[] gainValues = new int[numChannels];
|
|
||||||
Arrays.fill(gainValues, gainValue);
|
|
||||||
sourceGainConfig = sourceGain.buildConfig(AudioGain.MODE_JOINT,
|
sourceGainConfig = sourceGain.buildConfig(AudioGain.MODE_JOINT,
|
||||||
sourceGain.channelMask(), gainValues, 0);
|
sourceGain.channelMask(), gainValues, 0);
|
||||||
} else {
|
} else {
|
||||||
@@ -830,7 +892,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
shouldRecreateAudioPatch = true;
|
shouldRecreateAudioPatch = true;
|
||||||
}
|
}
|
||||||
if (shouldRecreateAudioPatch) {
|
if (shouldRecreateAudioPatch) {
|
||||||
mCommittedVolume = mVolume;
|
mCommittedVolume = volume;
|
||||||
mAudioManager.createAudioPatch(
|
mAudioManager.createAudioPatch(
|
||||||
audioPatchArray,
|
audioPatchArray,
|
||||||
new AudioPortConfig[] { sourceConfig },
|
new AudioPortConfig[] { sourceConfig },
|
||||||
@@ -848,7 +910,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
if (mReleased) {
|
if (mReleased) {
|
||||||
throw new IllegalStateException("Device already released.");
|
throw new IllegalStateException("Device already released.");
|
||||||
}
|
}
|
||||||
mVolume = volume;
|
mSourceVolume = volume;
|
||||||
updateAudioConfigLocked();
|
updateAudioConfigLocked();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -945,6 +1007,12 @@ class TvInputHardwareManager implements TvInputHal.Callback {
|
|||||||
updateAudioConfigLocked();
|
updateAudioConfigLocked();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onMediaStreamVolumeChanged() {
|
||||||
|
synchronized (mImplLock) {
|
||||||
|
updateAudioConfigLocked();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Listener {
|
interface Listener {
|
||||||
|
|||||||
Reference in New Issue
Block a user