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

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

audio policy: add call redirection audio modes

Add two audio modes corresponding to a call redirection
scenario:
- AUDIO_MODE_CALL_REDIRECT: PSTN call redirection
- AUDIO_MODE_COMMUNICATION_REDIRECT: VoIP call redirection

When in call redirect mode, call audio uplink and downlink are not
routed to regular audio sinks (e.g. earpiece) or sources (e.g. built in
mic) but disconnected. A privileged app can use system APIs to inject
and extract call audio and redirect the call to another device.

All other media use cases operate as if no call was active.

Those modes are system only and not used by the audio HAL: the HAL
behavior when mode is AUDIO_MODE_CALL_REDIRECT is the same as for
AUDIO_MODE_CALL_SCREEN and when mode is AUDIO_MODE_COMMUNICATION_REDIRECT
is the same as AUDIO_MODE_NORMAL.

Bug: 189472651
Test: make
Change-Id: Ief82b74796e8d6452c3b669aa5a2ecd558c9b48e
parent 79ede93e
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -3033,6 +3033,10 @@ aidl2legacy_AudioMode_audio_mode_t(AudioMode aidl) {
            return AUDIO_MODE_IN_COMMUNICATION;
        case AudioMode::CALL_SCREEN:
            return AUDIO_MODE_CALL_SCREEN;
        case AudioMode::SYS_RESERVED_CALL_REDIRECT:
            return AUDIO_MODE_CALL_REDIRECT;
        case AudioMode::SYS_RESERVED_COMMUNICATION_REDIRECT:
            return AUDIO_MODE_COMMUNICATION_REDIRECT;
    }
    return unexpected(BAD_VALUE);
}
@@ -3054,6 +3058,10 @@ legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
            return AudioMode::IN_COMMUNICATION;
        case AUDIO_MODE_CALL_SCREEN:
            return AudioMode::CALL_SCREEN;
        case AUDIO_MODE_CALL_REDIRECT:
            return AudioMode::SYS_RESERVED_CALL_REDIRECT;
        case AUDIO_MODE_COMMUNICATION_REDIRECT:
            return AudioMode::SYS_RESERVED_COMMUNICATION_REDIRECT;
        case AUDIO_MODE_CNT:
            break;
    }
+2 −1
Original line number Diff line number Diff line
@@ -58,7 +58,8 @@ constexpr audio_unique_id_use_t kUniqueIds[] = {

constexpr audio_mode_t kModes[] = {
    AUDIO_MODE_INVALID, AUDIO_MODE_CURRENT,          AUDIO_MODE_NORMAL,     AUDIO_MODE_RINGTONE,
    AUDIO_MODE_IN_CALL, AUDIO_MODE_IN_COMMUNICATION, AUDIO_MODE_CALL_SCREEN};
    AUDIO_MODE_IN_CALL, AUDIO_MODE_IN_COMMUNICATION, AUDIO_MODE_CALL_SCREEN,
    AUDIO_MODE_CALL_REDIRECT, AUDIO_MODE_COMMUNICATION_REDIRECT};

constexpr audio_session_t kSessionId[] = {AUDIO_SESSION_NONE, AUDIO_SESSION_OUTPUT_STAGE,
                                          AUDIO_SESSION_DEVICE};
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ const AudioModeConverter::Table AudioModeConverter::mTable[] = {
    MAKE_STRING_FROM_ENUM(AUDIO_MODE_IN_CALL),
    MAKE_STRING_FROM_ENUM(AUDIO_MODE_IN_COMMUNICATION),
    MAKE_STRING_FROM_ENUM(AUDIO_MODE_CALL_SCREEN),
    MAKE_STRING_FROM_ENUM(AUDIO_MODE_CALL_REDIRECT),
    MAKE_STRING_FROM_ENUM(AUDIO_MODE_COMMUNICATION_REDIRECT),
    TERMINATOR
};

+6 −6
Original line number Diff line number Diff line
@@ -6938,8 +6938,8 @@ bool AudioPolicyManager::isCallAudioAccessible()
{
    audio_mode_t mode = mEngine->getPhoneState();
    return (mode == AUDIO_MODE_IN_CALL)
            || (mode == AUDIO_MODE_IN_COMMUNICATION)
            || (mode == AUDIO_MODE_CALL_SCREEN);
            || (mode == AUDIO_MODE_CALL_SCREEN)
            || (mode == AUDIO_MODE_CALL_REDIRECT);
}

void AudioPolicyManager::cleanUpForDevice(const sp<DeviceDescriptor>& deviceDesc)
+9 −1
Original line number Diff line number Diff line
@@ -219,7 +219,15 @@ Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
    // can be interleaved).
    Mutex::Autolock _l(mLock);
    // TODO: check if it is more appropriate to do it in platform specific policy manager
    AudioSystem::setMode(state);

    // Audio HAL mode conversion for call redirect modes
    audio_mode_t halMode = state;
    if (state == AUDIO_MODE_CALL_REDIRECT) {
        halMode = AUDIO_MODE_CALL_SCREEN;
    } else if (state == AUDIO_MODE_COMMUNICATION_REDIRECT) {
        halMode = AUDIO_MODE_NORMAL;
    }
    AudioSystem::setMode(halMode);

    AutoCallerClear acc;
    mAudioPolicyManager->setPhoneState(state);