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

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

audio: enable concurrent capture for voice recognition

Add AUDIO_SOURCE_VOICE_RECOGNITION to the list of use
cases allowed for concurrent capture. As AUDIO_SOURCE_HOTWORD is
enabled for concurrent capture it makes sense to enable a client
to transition to voice recognition after the hotword has been detected
in a concurrent capture situation.

Also fixed some concurrent capture scenarii

Bug: 22702906
Test: build and check "OK Google" detection
Change-Id: Ic6dd41372fe74122395764beca7ca9a65197464b
parent b9c28c72
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ public:
    void clearPreemptedSessions();
    bool isActive() const;
    bool isSourceActive(audio_source_t source) const;
    audio_source_t inputSource() const;
    audio_source_t inputSource(bool activeOnly = false) const;
    bool isSoundTrigger() const;
    status_t addAudioSession(audio_session_t session,
                             const sp<AudioSession>& audioSession);
+2 −4
Original line number Diff line number Diff line
@@ -63,11 +63,9 @@ audio_port_handle_t AudioInputDescriptor::getId() const
    return mId;
}

audio_source_t AudioInputDescriptor::inputSource() const
audio_source_t AudioInputDescriptor::inputSource(bool activeOnly) const
{
    // TODO: return highest priority input source
    return mSessions.size() > 0 ? mSessions.valueAt(0)->inputSource() :
                       AUDIO_SOURCE_DEFAULT;
    return getHighestPrioritySource(activeOnly);
}

void AudioInputDescriptor::toAudioPortConfig(struct audio_port_config *dstConfig,
+14 −6
Original line number Diff line number Diff line
@@ -1651,13 +1651,15 @@ audio_io_handle_t AudioPolicyManager::getInputForDevice(audio_devices_t device,
            } else if (isSoundTrigger) {
                break;
            }

            // force close input if current source is now the highest priority request on this input
            // and current input properties are not exactly as requested.
            if ((desc->mSamplingRate != samplingRate ||
            if (!isConcurrentSource(inputSource) && !isConcurrentSource(desc->inputSource()) &&
                    ((desc->mSamplingRate != samplingRate ||
                    desc->mChannelMask != channelMask ||
                    !audio_formats_match(desc->mFormat, format)) &&
                    (source_priority(desc->getHighestPrioritySource(false /*activeOnly*/)) <
                     source_priority(inputSource))) {
                     source_priority(inputSource)))) {
                ALOGV("%s: ", __FUNCTION__);
                AudioSessionCollection sessions = desc->getAudioSessions(false /*activeOnly*/);
                for (size_t j = 0; j < sessions.size(); j++) {
@@ -1715,6 +1717,14 @@ audio_io_handle_t AudioPolicyManager::getInputForDevice(audio_devices_t device,
    return input;
}

//static
bool AudioPolicyManager::isConcurrentSource(audio_source_t source)
{
    return (source == AUDIO_SOURCE_HOTWORD) ||
            (source == AUDIO_SOURCE_VOICE_RECOGNITION) ||
            (source == AUDIO_SOURCE_FM_TUNER);
}

bool AudioPolicyManager::isConcurentCaptureAllowed(const sp<AudioInputDescriptor>& inputDesc,
        const sp<AudioSession>& audioSession)
{
@@ -1734,16 +1744,14 @@ bool AudioPolicyManager::isConcurentCaptureAllowed(const sp<AudioInputDescriptor
    // 3) All other active captures are either for re-routing or HOTWORD

    if (is_virtual_input_device(inputDesc->mDevice) ||
            audioSession->inputSource() == AUDIO_SOURCE_HOTWORD ||
            audioSession->inputSource() == AUDIO_SOURCE_FM_TUNER) {
            isConcurrentSource(audioSession->inputSource())) {
        return true;
    }

    Vector< sp<AudioInputDescriptor> > activeInputs = mInputs.getActiveInputs();
    for (size_t i = 0; i <  activeInputs.size(); i++) {
        sp<AudioInputDescriptor> activeInput = activeInputs[i];
        if ((activeInput->inputSource() != AUDIO_SOURCE_HOTWORD) &&
                (activeInput->inputSource() != AUDIO_SOURCE_FM_TUNER) &&
        if (!isConcurrentSource(activeInput->inputSource(true)) &&
                !is_virtual_input_device(activeInput->mDevice)) {
            return false;
        }
+2 −0
Original line number Diff line number Diff line
@@ -507,6 +507,8 @@ protected:

        void clearAudioSources(uid_t uid);

        static bool isConcurrentSource(audio_source_t source);

        bool isConcurentCaptureAllowed(const sp<AudioInputDescriptor>& inputDesc,
                const sp<AudioSession>& audioSession);