Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67add1d2 authored by Wonsik Kim's avatar Wonsik Kim Committed by android-build-merger
Browse files

Merge "TIF: TvInputHardwareManager puts multiple sink ports into audio patch" into lmp-mr1-dev

automerge: 0313a0e9

* commit '0313a0e9':
  TIF: TvInputHardwareManager puts multiple sink ports into audio patch
parents a710b839 0313a0e9
Loading
Loading
Loading
Loading
+66 −50
Original line number Original line Diff line number Diff line
@@ -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;
                }
                }
            }
            }
@@ -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;
@@ -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) {
@@ -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;
@@ -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();
@@ -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())) {
@@ -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);
@@ -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() {