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

Commit c0a889f7 authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: fix transition from VoIP to voice call on USB

Make sure no active capture takes place while in call and the
capture device is the same as the call TX device.

Bug: 23977713.

Change-Id: Ia379d5e626c150ea49f0cdd581c881dbf0b8399d
parent 0926aab4
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -402,6 +402,20 @@ void AudioPolicyManager::updateCallRouting(audio_devices_t rxDevice, int delayMs
            patch.num_sources = 2;
        }

        // terminate active capture if on the same HW module as the call TX source device
        // FIXME: would be better to refine to only inputs whose profile connects to the
        // call TX device but this information is not in the audio patch and logic here must be
        // symmetric to the one in startInput()
        audio_io_handle_t activeInput = mInputs.getActiveInput();
        if (activeInput != 0) {
            sp<AudioInputDescriptor> activeDesc = mInputs.valueFor(activeInput);
            if (activeDesc->getModuleHandle() == txSourceDeviceDesc->getModuleHandle()) {
                audio_session_t activeSession = activeDesc->mSessions.itemAt(0);
                stopInput(activeInput, activeSession);
                releaseInput(activeInput, activeSession);
            }
        }

        afPatchHandle = AUDIO_PATCH_HANDLE_NONE;
        status = mpClientInterface->createAudioPatch(&patch, &afPatchHandle, 0);
        ALOGW_IF(status != NO_ERROR, "setPhoneState() error %d creating TX audio patch",
@@ -1505,6 +1519,15 @@ status_t AudioPolicyManager::startInput(audio_io_handle_t input,
                return INVALID_OPERATION;
            }
        }

        // Do not allow capture if an active voice call is using a software patch and
        // the call TX source device is on the same HW module.
        // FIXME: would be better to refine to only inputs whose profile connects to the
        // call TX device but this information is not in the audio patch
        if (mCallTxPatch != 0 &&
            inputDesc->getModuleHandle() == mCallTxPatch->mPatch.sources[0].ext.device.hw_module) {
            return INVALID_OPERATION;
        }
    }

    // Routing?