Loading services/core/java/com/android/server/tv/TvInputHardwareManager.java +66 −50 Original line number Original line Diff line number Diff line Loading @@ -667,7 +667,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { public void onServiceDied() { public void onServiceDied() { synchronized (mImplLock) { synchronized (mImplLock) { mAudioSource = null; mAudioSource = null; mAudioSink = null; mAudioSink.clear(); mAudioPatch = null; mAudioPatch = null; } } } } Loading @@ -675,7 +675,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { private int mOverrideAudioType = AudioManager.DEVICE_NONE; private int mOverrideAudioType = AudioManager.DEVICE_NONE; private String mOverrideAudioAddress = ""; private String mOverrideAudioAddress = ""; private AudioDevicePort mAudioSource; private AudioDevicePort mAudioSource; private AudioDevicePort mAudioSink; private List<AudioDevicePort> mAudioSink = new ArrayList<>(); private AudioPatch mAudioPatch = null; private AudioPatch mAudioPatch = null; private float mCommittedVolume = 0.0f; private float mCommittedVolume = 0.0f; private float mSourceVolume = 0.0f; private float mSourceVolume = 0.0f; Loading @@ -691,22 +691,23 @@ class TvInputHardwareManager implements TvInputHal.Callback { mAudioManager.registerAudioPortUpdateListener(mAudioListener); mAudioManager.registerAudioPortUpdateListener(mAudioListener); if (mInfo.getAudioType() != AudioManager.DEVICE_NONE) { if (mInfo.getAudioType() != AudioManager.DEVICE_NONE) { mAudioSource = findAudioDevicePort(mInfo.getAudioType(), mInfo.getAudioAddress()); mAudioSource = findAudioDevicePort(mInfo.getAudioType(), mInfo.getAudioAddress()); mAudioSink = findAudioSinkFromAudioPolicy(); findAudioSinkFromAudioPolicy(mAudioSink); } } } } private AudioDevicePort findAudioSinkFromAudioPolicy() { private void findAudioSinkFromAudioPolicy(List<AudioDevicePort> sinks) { sinks.clear(); ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>(); ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>(); if (mAudioManager.listAudioDevicePorts(devicePorts) == AudioManager.SUCCESS) { if (mAudioManager.listAudioDevicePorts(devicePorts) != AudioManager.SUCCESS) { return; } int sinkDevice = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC); int sinkDevice = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC); for (AudioPort port : devicePorts) { for (AudioPort port : devicePorts) { AudioDevicePort devicePort = (AudioDevicePort) port; AudioDevicePort devicePort = (AudioDevicePort) port; if ((devicePort.type() & sinkDevice) != 0) { if ((devicePort.type() & sinkDevice) != 0) { return devicePort; sinks.add(devicePort); } } } } } return null; } } private AudioDevicePort findAudioDevicePort(int type, String address) { private AudioDevicePort findAudioDevicePort(int type, String address) { Loading Loading @@ -792,7 +793,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { // We can't do updated = updateAudioSinkLocked() || updateAudioSourceLocked() here // We can't do updated = updateAudioSinkLocked() || updateAudioSourceLocked() here // because Java won't evaluate the latter if the former is true. // because Java won't evaluate the latter if the former is true. if (mAudioSource == null || mAudioSink == null || mActiveConfig == null) { if (mAudioSource == null || mAudioSink.isEmpty() || mActiveConfig == null) { if (mAudioPatch != null) { if (mAudioPatch != null) { mAudioManager.releaseAudioPatch(mAudioPatch); mAudioManager.releaseAudioPatch(mAudioPatch); mAudioPatch = null; mAudioPatch = null; Loading Loading @@ -831,14 +832,17 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } AudioPortConfig sourceConfig = mAudioSource.activeConfig(); AudioPortConfig sourceConfig = mAudioSource.activeConfig(); AudioPortConfig sinkConfig = mAudioSink.activeConfig(); List<AudioPortConfig> sinkConfigs = new ArrayList<>(); AudioPatch[] audioPatchArray = new AudioPatch[] { mAudioPatch }; AudioPatch[] audioPatchArray = new AudioPatch[] { mAudioPatch }; boolean shouldRecreateAudioPatch = sourceUpdated || sinkUpdated; boolean shouldRecreateAudioPatch = sourceUpdated || sinkUpdated; for (AudioDevicePort audioSink : mAudioSink) { AudioPortConfig sinkConfig = audioSink.activeConfig(); int sinkSamplingRate = mDesiredSamplingRate; int sinkSamplingRate = mDesiredSamplingRate; int sinkChannelMask = mDesiredChannelMask; int sinkChannelMask = mDesiredChannelMask; int sinkFormat = mDesiredFormat; int sinkFormat = mDesiredFormat; // If sinkConfig != null and values are set to default, fill in the sinkConfig values. // If sinkConfig != null and values are set to default, // fill in the sinkConfig values. if (sinkConfig != null) { if (sinkConfig != null) { if (sinkSamplingRate == 0) { if (sinkSamplingRate == 0) { sinkSamplingRate = sinkConfig.samplingRate(); sinkSamplingRate = sinkConfig.samplingRate(); Loading @@ -856,20 +860,25 @@ class TvInputHardwareManager implements TvInputHal.Callback { || sinkConfig.channelMask() != sinkChannelMask || sinkConfig.channelMask() != sinkChannelMask || sinkConfig.format() != sinkFormat) { || sinkConfig.format() != sinkFormat) { // Check for compatibility and reset to default if necessary. // Check for compatibility and reset to default if necessary. if (!intArrayContains(mAudioSink.samplingRates(), sinkSamplingRate) if (!intArrayContains(audioSink.samplingRates(), sinkSamplingRate) && mAudioSink.samplingRates().length > 0) { && audioSink.samplingRates().length > 0) { sinkSamplingRate = mAudioSink.samplingRates()[0]; sinkSamplingRate = audioSink.samplingRates()[0]; } } if (!intArrayContains(mAudioSink.channelMasks(), sinkChannelMask)) { if (!intArrayContains(audioSink.channelMasks(), sinkChannelMask)) { sinkChannelMask = AudioFormat.CHANNEL_OUT_DEFAULT; sinkChannelMask = AudioFormat.CHANNEL_OUT_DEFAULT; } } if (!intArrayContains(mAudioSink.formats(), sinkFormat)) { if (!intArrayContains(audioSink.formats(), sinkFormat)) { sinkFormat = AudioFormat.ENCODING_DEFAULT; sinkFormat = AudioFormat.ENCODING_DEFAULT; } } sinkConfig = mAudioSink.buildConfig(sinkSamplingRate, sinkChannelMask, sinkConfig = audioSink.buildConfig(sinkSamplingRate, sinkChannelMask, sinkFormat, null); sinkFormat, null); shouldRecreateAudioPatch = true; shouldRecreateAudioPatch = true; } } sinkConfigs.add(sinkConfig); } // sinkConfigs.size() == mAudioSink.size(), and mAudioSink is guaranteed to be // non-empty at the beginning of this method. AudioPortConfig sinkConfig = sinkConfigs.get(0); if (sourceConfig == null || sourceGainConfig != null) { if (sourceConfig == null || sourceGainConfig != null) { int sourceSamplingRate = 0; int sourceSamplingRate = 0; if (intArrayContains(mAudioSource.samplingRates(), sinkConfig.samplingRate())) { if (intArrayContains(mAudioSource.samplingRates(), sinkConfig.samplingRate())) { Loading Loading @@ -899,7 +908,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { mAudioManager.createAudioPatch( mAudioManager.createAudioPatch( audioPatchArray, audioPatchArray, new AudioPortConfig[] { sourceConfig }, new AudioPortConfig[] { sourceConfig }, new AudioPortConfig[] { sinkConfig }); sinkConfigs.toArray(new AudioPortConfig[0])); mAudioPatch = audioPatchArray[0]; mAudioPatch = audioPatchArray[0]; if (sourceGainConfig != null) { if (sourceGainConfig != null) { mAudioManager.setAudioPortGain(mAudioSource, sourceGainConfig); mAudioManager.setAudioPortGain(mAudioSource, sourceGainConfig); Loading Loading @@ -977,17 +986,24 @@ class TvInputHardwareManager implements TvInputHal.Callback { if (mInfo.getAudioType() == AudioManager.DEVICE_NONE) { if (mInfo.getAudioType() == AudioManager.DEVICE_NONE) { return false; return false; } } AudioDevicePort previousSink = mAudioSink; List<AudioDevicePort> previousSink = mAudioSink; mAudioSink = new ArrayList<>(); if (mOverrideAudioType == AudioManager.DEVICE_NONE) { if (mOverrideAudioType == AudioManager.DEVICE_NONE) { mAudioSink = findAudioSinkFromAudioPolicy(); findAudioSinkFromAudioPolicy(mAudioSink); } else { } else { AudioDevicePort audioSink = AudioDevicePort audioSink = findAudioDevicePort(mOverrideAudioType, mOverrideAudioAddress); findAudioDevicePort(mOverrideAudioType, mOverrideAudioAddress); if (audioSink != null) { if (audioSink != null) { mAudioSink = audioSink; mAudioSink.add(audioSink); } } } // Returns true if mAudioSink and previousSink differs. if (mAudioSink.size() != previousSink.size()) { return true; } } return mAudioSink == null ? (previousSink != null) : !mAudioSink.equals(previousSink); previousSink.removeAll(mAudioSink); return !previousSink.isEmpty(); } } private void handleAudioSinkUpdated() { private void handleAudioSinkUpdated() { Loading Loading
services/core/java/com/android/server/tv/TvInputHardwareManager.java +66 −50 Original line number Original line Diff line number Diff line Loading @@ -667,7 +667,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { public void onServiceDied() { public void onServiceDied() { synchronized (mImplLock) { synchronized (mImplLock) { mAudioSource = null; mAudioSource = null; mAudioSink = null; mAudioSink.clear(); mAudioPatch = null; mAudioPatch = null; } } } } Loading @@ -675,7 +675,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { private int mOverrideAudioType = AudioManager.DEVICE_NONE; private int mOverrideAudioType = AudioManager.DEVICE_NONE; private String mOverrideAudioAddress = ""; private String mOverrideAudioAddress = ""; private AudioDevicePort mAudioSource; private AudioDevicePort mAudioSource; private AudioDevicePort mAudioSink; private List<AudioDevicePort> mAudioSink = new ArrayList<>(); private AudioPatch mAudioPatch = null; private AudioPatch mAudioPatch = null; private float mCommittedVolume = 0.0f; private float mCommittedVolume = 0.0f; private float mSourceVolume = 0.0f; private float mSourceVolume = 0.0f; Loading @@ -691,22 +691,23 @@ class TvInputHardwareManager implements TvInputHal.Callback { mAudioManager.registerAudioPortUpdateListener(mAudioListener); mAudioManager.registerAudioPortUpdateListener(mAudioListener); if (mInfo.getAudioType() != AudioManager.DEVICE_NONE) { if (mInfo.getAudioType() != AudioManager.DEVICE_NONE) { mAudioSource = findAudioDevicePort(mInfo.getAudioType(), mInfo.getAudioAddress()); mAudioSource = findAudioDevicePort(mInfo.getAudioType(), mInfo.getAudioAddress()); mAudioSink = findAudioSinkFromAudioPolicy(); findAudioSinkFromAudioPolicy(mAudioSink); } } } } private AudioDevicePort findAudioSinkFromAudioPolicy() { private void findAudioSinkFromAudioPolicy(List<AudioDevicePort> sinks) { sinks.clear(); ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>(); ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>(); if (mAudioManager.listAudioDevicePorts(devicePorts) == AudioManager.SUCCESS) { if (mAudioManager.listAudioDevicePorts(devicePorts) != AudioManager.SUCCESS) { return; } int sinkDevice = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC); int sinkDevice = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC); for (AudioPort port : devicePorts) { for (AudioPort port : devicePorts) { AudioDevicePort devicePort = (AudioDevicePort) port; AudioDevicePort devicePort = (AudioDevicePort) port; if ((devicePort.type() & sinkDevice) != 0) { if ((devicePort.type() & sinkDevice) != 0) { return devicePort; sinks.add(devicePort); } } } } } return null; } } private AudioDevicePort findAudioDevicePort(int type, String address) { private AudioDevicePort findAudioDevicePort(int type, String address) { Loading Loading @@ -792,7 +793,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { // We can't do updated = updateAudioSinkLocked() || updateAudioSourceLocked() here // We can't do updated = updateAudioSinkLocked() || updateAudioSourceLocked() here // because Java won't evaluate the latter if the former is true. // because Java won't evaluate the latter if the former is true. if (mAudioSource == null || mAudioSink == null || mActiveConfig == null) { if (mAudioSource == null || mAudioSink.isEmpty() || mActiveConfig == null) { if (mAudioPatch != null) { if (mAudioPatch != null) { mAudioManager.releaseAudioPatch(mAudioPatch); mAudioManager.releaseAudioPatch(mAudioPatch); mAudioPatch = null; mAudioPatch = null; Loading Loading @@ -831,14 +832,17 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } AudioPortConfig sourceConfig = mAudioSource.activeConfig(); AudioPortConfig sourceConfig = mAudioSource.activeConfig(); AudioPortConfig sinkConfig = mAudioSink.activeConfig(); List<AudioPortConfig> sinkConfigs = new ArrayList<>(); AudioPatch[] audioPatchArray = new AudioPatch[] { mAudioPatch }; AudioPatch[] audioPatchArray = new AudioPatch[] { mAudioPatch }; boolean shouldRecreateAudioPatch = sourceUpdated || sinkUpdated; boolean shouldRecreateAudioPatch = sourceUpdated || sinkUpdated; for (AudioDevicePort audioSink : mAudioSink) { AudioPortConfig sinkConfig = audioSink.activeConfig(); int sinkSamplingRate = mDesiredSamplingRate; int sinkSamplingRate = mDesiredSamplingRate; int sinkChannelMask = mDesiredChannelMask; int sinkChannelMask = mDesiredChannelMask; int sinkFormat = mDesiredFormat; int sinkFormat = mDesiredFormat; // If sinkConfig != null and values are set to default, fill in the sinkConfig values. // If sinkConfig != null and values are set to default, // fill in the sinkConfig values. if (sinkConfig != null) { if (sinkConfig != null) { if (sinkSamplingRate == 0) { if (sinkSamplingRate == 0) { sinkSamplingRate = sinkConfig.samplingRate(); sinkSamplingRate = sinkConfig.samplingRate(); Loading @@ -856,20 +860,25 @@ class TvInputHardwareManager implements TvInputHal.Callback { || sinkConfig.channelMask() != sinkChannelMask || sinkConfig.channelMask() != sinkChannelMask || sinkConfig.format() != sinkFormat) { || sinkConfig.format() != sinkFormat) { // Check for compatibility and reset to default if necessary. // Check for compatibility and reset to default if necessary. if (!intArrayContains(mAudioSink.samplingRates(), sinkSamplingRate) if (!intArrayContains(audioSink.samplingRates(), sinkSamplingRate) && mAudioSink.samplingRates().length > 0) { && audioSink.samplingRates().length > 0) { sinkSamplingRate = mAudioSink.samplingRates()[0]; sinkSamplingRate = audioSink.samplingRates()[0]; } } if (!intArrayContains(mAudioSink.channelMasks(), sinkChannelMask)) { if (!intArrayContains(audioSink.channelMasks(), sinkChannelMask)) { sinkChannelMask = AudioFormat.CHANNEL_OUT_DEFAULT; sinkChannelMask = AudioFormat.CHANNEL_OUT_DEFAULT; } } if (!intArrayContains(mAudioSink.formats(), sinkFormat)) { if (!intArrayContains(audioSink.formats(), sinkFormat)) { sinkFormat = AudioFormat.ENCODING_DEFAULT; sinkFormat = AudioFormat.ENCODING_DEFAULT; } } sinkConfig = mAudioSink.buildConfig(sinkSamplingRate, sinkChannelMask, sinkConfig = audioSink.buildConfig(sinkSamplingRate, sinkChannelMask, sinkFormat, null); sinkFormat, null); shouldRecreateAudioPatch = true; shouldRecreateAudioPatch = true; } } sinkConfigs.add(sinkConfig); } // sinkConfigs.size() == mAudioSink.size(), and mAudioSink is guaranteed to be // non-empty at the beginning of this method. AudioPortConfig sinkConfig = sinkConfigs.get(0); if (sourceConfig == null || sourceGainConfig != null) { if (sourceConfig == null || sourceGainConfig != null) { int sourceSamplingRate = 0; int sourceSamplingRate = 0; if (intArrayContains(mAudioSource.samplingRates(), sinkConfig.samplingRate())) { if (intArrayContains(mAudioSource.samplingRates(), sinkConfig.samplingRate())) { Loading Loading @@ -899,7 +908,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { mAudioManager.createAudioPatch( mAudioManager.createAudioPatch( audioPatchArray, audioPatchArray, new AudioPortConfig[] { sourceConfig }, new AudioPortConfig[] { sourceConfig }, new AudioPortConfig[] { sinkConfig }); sinkConfigs.toArray(new AudioPortConfig[0])); mAudioPatch = audioPatchArray[0]; mAudioPatch = audioPatchArray[0]; if (sourceGainConfig != null) { if (sourceGainConfig != null) { mAudioManager.setAudioPortGain(mAudioSource, sourceGainConfig); mAudioManager.setAudioPortGain(mAudioSource, sourceGainConfig); Loading Loading @@ -977,17 +986,24 @@ class TvInputHardwareManager implements TvInputHal.Callback { if (mInfo.getAudioType() == AudioManager.DEVICE_NONE) { if (mInfo.getAudioType() == AudioManager.DEVICE_NONE) { return false; return false; } } AudioDevicePort previousSink = mAudioSink; List<AudioDevicePort> previousSink = mAudioSink; mAudioSink = new ArrayList<>(); if (mOverrideAudioType == AudioManager.DEVICE_NONE) { if (mOverrideAudioType == AudioManager.DEVICE_NONE) { mAudioSink = findAudioSinkFromAudioPolicy(); findAudioSinkFromAudioPolicy(mAudioSink); } else { } else { AudioDevicePort audioSink = AudioDevicePort audioSink = findAudioDevicePort(mOverrideAudioType, mOverrideAudioAddress); findAudioDevicePort(mOverrideAudioType, mOverrideAudioAddress); if (audioSink != null) { if (audioSink != null) { mAudioSink = audioSink; mAudioSink.add(audioSink); } } } // Returns true if mAudioSink and previousSink differs. if (mAudioSink.size() != previousSink.size()) { return true; } } return mAudioSink == null ? (previousSink != null) : !mAudioSink.equals(previousSink); previousSink.removeAll(mAudioSink); return !previousSink.isEmpty(); } } private void handleAudioSinkUpdated() { private void handleAudioSinkUpdated() { Loading