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

Commit 56afc7a5 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

Fix connection of OUT_REMOTE_SUBMIX device on APM startInput

Fix a regression in AudioPolicyManager::startInput() where
 the OUT_REMOTE_SUBMIX audio device was never made available
 due to the test on the input descriptor, which was already
 active by the time it is tested, as the activity on the
 session has already been updated.

Add methods to AudioInputDescriptor and AudioSessionCollection
 to query the number of active sessions. Use the new method
 to optimize AudioSessionCollection::hasActiveSession()

Bug 26798796

Change-Id: I2de4e47970505e64c4c78a148a80a9f0ec19e821
parent 2e5408ac
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ public:
    status_t removeAudioSession(audio_session_t session);
    sp<AudioSession> getAudioSession(audio_session_t session) const;
    AudioSessionCollection getAudioSessions(bool activeOnly) const;
    size_t getAudioSessionCount(bool activeOnly) const;
    audio_source_t getHighestPrioritySource(bool activeOnly) const;

private:
+1 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ public:
    uint32_t getOpenCount() const;

    AudioSessionCollection getActiveSessions() const;
    size_t getActiveSessionCount() const;
    bool hasActiveSession() const;
    bool isSourceActive(audio_source_t source) const;
    audio_source_t getHighestPrioritySource(bool activeOnly) const;
+9 −0
Original line number Diff line number Diff line
@@ -158,6 +158,15 @@ AudioSessionCollection AudioInputDescriptor::getAudioSessions(bool activeOnly) c
    }
}

size_t AudioInputDescriptor::getAudioSessionCount(bool activeOnly) const
{
    if (activeOnly) {
        return mSessions.getActiveSessionCount();
    } else {
        return mSessions.size();
    }
}

status_t AudioInputDescriptor::addAudioSession(audio_session_t session,
                         const sp<AudioSession>& audioSession) {
    return mSessions.addSession(session, audioSession);
+12 −1
Original line number Diff line number Diff line
@@ -186,9 +186,20 @@ AudioSessionCollection AudioSessionCollection::getActiveSessions() const
    return activeSessions;
}

size_t AudioSessionCollection::getActiveSessionCount() const
{
    size_t activeCount = 0;
    for (size_t i = 0; i < size(); i++) {
        if (valueAt(i)->activeCount() != 0) {
            activeCount++;
        }
    }
    return activeCount;
}

bool AudioSessionCollection::hasActiveSession() const
{
    return getActiveSessions().size() != 0;
    return getActiveSessionCount() != 0;
}

bool AudioSessionCollection::isSourceActive(audio_source_t source) const
+1 −1
Original line number Diff line number Diff line
@@ -1649,7 +1649,7 @@ status_t AudioPolicyManager::startInput(audio_io_handle_t input,

        setInputDevice(input, getNewInputDevice(inputDesc), true /* force */);

        if (!inputDesc->isActive()) {
        if (inputDesc->getAudioSessionCount(true/*activeOnly*/) == 1) {
            // if input maps to a dynamic policy with an activity listener, notify of state change
            if ((inputDesc->mPolicyMix != NULL)
                    && ((inputDesc->mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0)) {