12110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie/*
22110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * Copyright (C) 2015 The Android Open Source Project
32110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie *
42110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * Licensed under the Apache License, Version 2.0 (the "License");
52110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * you may not use this file except in compliance with the License.
62110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * You may obtain a copy of the License at
72110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie *
82110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie *      http://www.apache.org/licenses/LICENSE-2.0
92110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie *
102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * Unless required by applicable law or agreed to in writing, software
112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * distributed under the License is distributed on an "AS IS" BASIS,
122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * See the License for the specific language governing permissions and
142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * limitations under the License.
152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie */
162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#define LOG_TAG "APM::AudioPolicyEngine"
182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie//#define LOG_NDEBUG 0
192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie//#define VERY_VERBOSE_LOGGING
212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#ifdef VERY_VERBOSE_LOGGING
222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#define ALOGVV ALOGV
232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#else
242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#define ALOGVV(a...) do { } while(0)
252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#endif
262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include "Engine.h"
282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <AudioPolicyManagerObserver.h>
292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <AudioPort.h>
302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <IOProfile.h>
312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <policy.h>
322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <utils/String8.h>
332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <utils/Log.h>
342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffienamespace android
362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffienamespace audio_policy
382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieEngine::Engine()
412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    : mManagerInterface(this),
422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie      mPhoneState(AUDIO_MODE_NORMAL),
432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie      mApmObserver(NULL)
442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    for (int i = 0; i < AUDIO_POLICY_FORCE_USE_CNT; i++) {
462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[i] = AUDIO_POLICY_FORCE_NONE;
472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieEngine::~Engine()
512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffievoid Engine::setObserver(AudioPolicyManagerObserver *observer)
552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    ALOG_ASSERT(observer != NULL, "Invalid Audio Policy Manager observer");
572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    mApmObserver = observer;
582110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
592110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffiestatus_t Engine::initCheck()
612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
622110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    return (mApmObserver != NULL) ?  NO_ERROR : NO_INIT;
632110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffiestatus_t Engine::setPhoneState(audio_mode_t state)
662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    ALOGV("setPhoneState() state %d", state);
682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    if (state < 0 || state >= AUDIO_MODE_CNT) {
702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGW("setPhoneState() invalid state %d", state);
712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return BAD_VALUE;
722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    if (state == mPhoneState ) {
752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGW("setPhoneState() setting same state %d", state);
762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return BAD_VALUE;
772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    // store previous phone state for management of sonification strategy below
802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    int oldState = mPhoneState;
812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    mPhoneState = state;
82d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie
832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    if (!is_state_in_call(oldState) && is_state_in_call(state)) {
842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGV("  Entering call in setPhoneState()");
85d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie        mApmObserver->getVolumeCurves().switchVolumeCurve(AUDIO_STREAM_VOICE_CALL,
86d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie                                                          AUDIO_STREAM_DTMF);
872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    } else if (is_state_in_call(oldState) && !is_state_in_call(state)) {
882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGV("  Exiting call in setPhoneState()");
89d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie        mApmObserver->getVolumeCurves().restoreOriginVolumeCurve(AUDIO_STREAM_DTMF);
902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    return NO_ERROR;
922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffiestatus_t Engine::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    switch(usage) {
972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_POLICY_FORCE_FOR_COMMUNICATION:
982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (config != AUDIO_POLICY_FORCE_SPEAKER && config != AUDIO_POLICY_FORCE_BT_SCO &&
992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_NONE) {
1002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            ALOGW("setForceUse() invalid config %d for FOR_COMMUNICATION", config);
1012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            return BAD_VALUE;
1022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
1032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[usage] = config;
1042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
1052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_POLICY_FORCE_FOR_MEDIA:
1062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (config != AUDIO_POLICY_FORCE_HEADPHONES && config != AUDIO_POLICY_FORCE_BT_A2DP &&
1072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_WIRED_ACCESSORY &&
1082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_ANALOG_DOCK &&
1092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_DIGITAL_DOCK && config != AUDIO_POLICY_FORCE_NONE &&
1102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_NO_BT_A2DP && config != AUDIO_POLICY_FORCE_SPEAKER ) {
1112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            ALOGW("setForceUse() invalid config %d for FOR_MEDIA", config);
1122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            return BAD_VALUE;
1132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
1142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[usage] = config;
1152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
1162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_POLICY_FORCE_FOR_RECORD:
1172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (config != AUDIO_POLICY_FORCE_BT_SCO && config != AUDIO_POLICY_FORCE_WIRED_ACCESSORY &&
1182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_NONE) {
1192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            ALOGW("setForceUse() invalid config %d for FOR_RECORD", config);
1202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            return BAD_VALUE;
1212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
1222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[usage] = config;
1232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
1242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_POLICY_FORCE_FOR_DOCK:
1252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (config != AUDIO_POLICY_FORCE_NONE && config != AUDIO_POLICY_FORCE_BT_CAR_DOCK &&
1262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_BT_DESK_DOCK &&
1272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_WIRED_ACCESSORY &&
1282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_ANALOG_DOCK &&
1292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_DIGITAL_DOCK) {
1302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            ALOGW("setForceUse() invalid config %d for FOR_DOCK", config);
1312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
1322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[usage] = config;
1332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
1342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_POLICY_FORCE_FOR_SYSTEM:
1352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (config != AUDIO_POLICY_FORCE_NONE &&
1362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_SYSTEM_ENFORCED) {
1372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            ALOGW("setForceUse() invalid config %d for FOR_SYSTEM", config);
1382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
1392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[usage] = config;
1402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
1412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO:
1422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (config != AUDIO_POLICY_FORCE_NONE &&
1432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            config != AUDIO_POLICY_FORCE_HDMI_SYSTEM_AUDIO_ENFORCED) {
14409bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk            ALOGW("setForceUse() invalid config %d for HDMI_SYSTEM_AUDIO", config);
14509bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk        }
14609bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk        mForceUse[usage] = config;
14709bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk        break;
14809bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk    case AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND:
14909bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk        if (config != AUDIO_POLICY_FORCE_NONE &&
15009bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk                config != AUDIO_POLICY_FORCE_ENCODED_SURROUND_NEVER &&
15109bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk                config != AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS) {
15209bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk            ALOGW("setForceUse() invalid config %d for ENCODED_SURROUND", config);
15309bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk            return BAD_VALUE;
1542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
1552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        mForceUse[usage] = config;
1562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
1572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    default:
1582110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGW("setForceUse() invalid usage %d", usage);
15909bc4612bdd5874d744c5da1183d96fbd2ad0235Phil Burk        break; // TODO return BAD_VALUE?
1602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
1612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    return NO_ERROR;
1622110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
1632110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
1642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffierouting_strategy Engine::getStrategyForStream(audio_stream_type_t stream)
1652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
1662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    // stream to strategy mapping
1672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    switch (stream) {
1682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_VOICE_CALL:
1692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_BLUETOOTH_SCO:
1702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_PHONE;
1712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_RING:
1722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_ALARM:
1732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_SONIFICATION;
1742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_NOTIFICATION:
1752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_SONIFICATION_RESPECTFUL;
1762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_DTMF:
1772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_DTMF;
1782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    default:
1792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGE("unknown stream type %d", stream);
1802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_SYSTEM:
1812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // NOTE: SYSTEM stream uses MEDIA strategy because muting music and switching outputs
1822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // while key clicks are played produces a poor result
1832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_MUSIC:
1842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_MEDIA;
1852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_ENFORCED_AUDIBLE:
1862110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_ENFORCED_AUDIBLE;
1872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_TTS:
1882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_TRANSMITTED_THROUGH_SPEAKER;
1892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_ACCESSIBILITY:
1902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_ACCESSIBILITY;
1912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_STREAM_REROUTING:
1922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_REROUTING;
1932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
1942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
1952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
1962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffierouting_strategy Engine::getStrategyForUsage(audio_usage_t usage)
1972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
1982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    // usage to strategy mapping
1992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    switch (usage) {
2002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
2012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_ACCESSIBILITY;
2022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_MEDIA:
2042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_GAME:
20536867767ba86244b0d942255b9d241b092151309Jean-Michel Trivi    case AUDIO_USAGE_ASSISTANT:
2062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
2072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
2082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_MEDIA;
2092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_VOICE_COMMUNICATION:
2112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_PHONE;
2122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
2142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_DTMF;
2152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_ALARM:
2172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
2182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_SONIFICATION;
2192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_NOTIFICATION:
2212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
2222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
2232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
2242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_NOTIFICATION_EVENT:
2252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_SONIFICATION_RESPECTFUL;
2262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_USAGE_UNKNOWN:
2282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    default:
2292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        return STRATEGY_MEDIA;
2302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
2312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
2322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieaudio_devices_t Engine::getDeviceForStrategy(routing_strategy strategy) const
2342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
2350f928fab9963f15c524f4416b3d52d2df4a93eecEric Laurent    DeviceVector availableOutputDevices = mApmObserver->getAvailableOutputDevices();
2360f928fab9963f15c524f4416b3d52d2df4a93eecEric Laurent    DeviceVector availableInputDevices = mApmObserver->getAvailableInputDevices();
2372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
238c75307b73d324d590d0dbc05b44bce9aa89b7145Eric Laurent    const SwAudioOutputCollection &outputs = mApmObserver->getOutputs();
2392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2400f928fab9963f15c524f4416b3d52d2df4a93eecEric Laurent    return getDeviceForStrategyInt(strategy, availableOutputDevices,
24128d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                                   availableInputDevices, outputs);
24228d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent}
24328d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent
24428d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent
24528d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent
24628d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurentaudio_devices_t Engine::getDeviceForStrategyInt(routing_strategy strategy,
2470f928fab9963f15c524f4416b3d52d2df4a93eecEric Laurent                                                DeviceVector availableOutputDevices,
2480f928fab9963f15c524f4416b3d52d2df4a93eecEric Laurent                                                DeviceVector availableInputDevices,
24928d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                                                const SwAudioOutputCollection &outputs) const
25028d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent{
2512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    uint32_t device = AUDIO_DEVICE_NONE;
2522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    uint32_t availableOutputDevicesType = availableOutputDevices.types();
2532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    switch (strategy) {
2552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_TRANSMITTED_THROUGH_SPEAKER:
2572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device = availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER;
2582110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
2592110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_SONIFICATION_RESPECTFUL:
2612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (isInCall()) {
26228d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
26328d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_SONIFICATION, availableOutputDevices, availableInputDevices, outputs);
2642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } else if (outputs.isStreamActiveRemotely(AUDIO_STREAM_MUSIC,
2652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY)) {
2662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // while media is playing on a remote device, use the the sonification behavior.
2672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // Note that we test this usecase before testing if media is playing because
2682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            //   the isStreamActive() method only informs about the activity of a stream, not
2692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            //   if it's for local playback. Note also that we use the same delay between both tests
27028d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
27128d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_SONIFICATION, availableOutputDevices, availableInputDevices, outputs);
2722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            //user "safe" speaker if available instead of normal speaker to avoid triggering
2732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            //other acoustic safety mechanisms for notification
2749a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent            if ((device & AUDIO_DEVICE_OUT_SPEAKER) &&
2759a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent                    (availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
2769a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent                device |= AUDIO_DEVICE_OUT_SPEAKER_SAFE;
2779a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent                device &= ~AUDIO_DEVICE_OUT_SPEAKER;
2789a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent            }
27928d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent        } else if (outputs.isStreamActive(
28028d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                                AUDIO_STREAM_MUSIC, SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY)) {
2812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // while media is playing (or has recently played), use the same device
28228d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
28328d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_MEDIA, availableOutputDevices, availableInputDevices, outputs);
2842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } else {
2852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // when media is not playing anymore, fall back on the sonification behavior
28628d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
28728d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_SONIFICATION, availableOutputDevices, availableInputDevices, outputs);
2882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            //user "safe" speaker if available instead of normal speaker to avoid triggering
2892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            //other acoustic safety mechanisms for notification
2909a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent            if ((device & AUDIO_DEVICE_OUT_SPEAKER) &&
2919a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent                    (availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
2929a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent                device |= AUDIO_DEVICE_OUT_SPEAKER_SAFE;
2939a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent                device &= ~AUDIO_DEVICE_OUT_SPEAKER;
2949a7d922796c61353e30cea5878f41b921adc79b0Eric Laurent            }
2952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
2962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
2972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
2982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_DTMF:
2992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (!isInCall()) {
3002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // when off call, DTMF strategy follows the same rules as MEDIA strategy
30128d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
30228d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_MEDIA, availableOutputDevices, availableInputDevices, outputs);
3032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            break;
3042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
3052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // when in call, DTMF and PHONE strategies follow the same rules
3062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // FALL THROUGH
3072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
3082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_PHONE:
3092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // Force use of only devices on primary output if:
3102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // - in call AND
3112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        //   - cannot route from voice call RX OR
3122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        //   - audio HAL version is < 3.0 and TX device is on the primary HW module
3132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (getPhoneState() == AUDIO_MODE_IN_CALL) {
3142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            audio_devices_t txDevice = getDeviceForInputSource(AUDIO_SOURCE_VOICE_COMMUNICATION);
3152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            sp<AudioOutputDescriptor> primaryOutput = outputs.getPrimaryOutput();
3162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            audio_devices_t availPrimaryInputDevices =
3172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                 availableInputDevices.getDevicesFromHwModule(primaryOutput->getModuleHandle());
3182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            audio_devices_t availPrimaryOutputDevices =
3192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    primaryOutput->supportedDevices() & availableOutputDevices.types();
3202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
3212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (((availableInputDevices.types() &
3222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    AUDIO_DEVICE_IN_TELEPHONY_RX & ~AUDIO_DEVICE_BIT_IN) == 0) ||
3232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    (((txDevice & availPrimaryInputDevices & ~AUDIO_DEVICE_BIT_IN) != 0) &&
3249ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov                         (primaryOutput->getAudioPort()->getModuleVersionMajor() < 3))) {
3252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                availableOutputDevicesType = availPrimaryOutputDevices;
3262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
3272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
32828d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent        // for phone strategy, we first consider the forced use and then the available devices by
32928d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent        // order of priority
3302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        switch (mForceUse[AUDIO_POLICY_FORCE_FOR_COMMUNICATION]) {
3312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        case AUDIO_POLICY_FORCE_BT_SCO:
3322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (!isInCall() || strategy != STRATEGY_DTMF) {
3332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
3342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
3362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
3372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device) break;
3382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_SCO;
3392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device) break;
3402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // if SCO device is requested but no SCO device is available, fall back to default case
3412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // FALL THROUGH
3422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
3432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        default:    // FORCE_NONE
3442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // when not in a phone call, phone strategy should route STREAM_VOICE_CALL to A2DP
3452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (!isInCall() &&
3462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    (mForceUse[AUDIO_POLICY_FORCE_FOR_MEDIA] != AUDIO_POLICY_FORCE_NO_BT_A2DP) &&
3472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    (outputs.getA2dpOutput() != 0)) {
3482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP;
3492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
3512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
3532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
3542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device) break;
3552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_WIRED_HEADSET;
3562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device) break;
357a0b18ce8f737c0d6ccd728e17c3f355a250ae1dcEric Laurent            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_LINE;
358a0b18ce8f737c0d6ccd728e17c3f355a250ae1dcEric Laurent            if (device) break;
359904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_HEADSET;
360904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent            if (device) break;
3612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_DEVICE;
3622110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device) break;
3632110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (!isInCall()) {
3642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_ACCESSORY;
3652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET;
3672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_AUX_DIGITAL;
3692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET;
3712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
3732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_EARPIECE;
3742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            break;
3752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
3762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        case AUDIO_POLICY_FORCE_SPEAKER:
3772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // when not in a phone call, phone strategy should route STREAM_VOICE_CALL to
3782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // A2DP speaker when forcing to speaker output
3792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (!isInCall() &&
3802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    (mForceUse[AUDIO_POLICY_FORCE_FOR_MEDIA] != AUDIO_POLICY_FORCE_NO_BT_A2DP) &&
3812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    (outputs.getA2dpOutput() != 0)) {
3822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
3832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
3852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (!isInCall()) {
3862110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_ACCESSORY;
3872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_DEVICE;
3892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET;
3912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_AUX_DIGITAL;
3932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = availableOutputDevicesType & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET;
3952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (device) break;
3962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
3972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER;
3982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            break;
3992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
4002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    break;
4012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
4022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_SONIFICATION:
4032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
4042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // If incall, just select the STRATEGY_PHONE device: The rest of the behavior is handled by
4052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // handleIncallSonification().
4062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (isInCall()) {
40728d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
40828d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_PHONE, availableOutputDevices, availableInputDevices, outputs);
4092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            break;
4102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
4112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // FALL THROUGH
4122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
4132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_ENFORCED_AUDIBLE:
4142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // strategy STRATEGY_ENFORCED_AUDIBLE uses same routing policy as STRATEGY_SONIFICATION
4152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // except:
4162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        //   - when in call where it doesn't default to STRATEGY_PHONE behavior
4172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        //   - in countries where not enforced in which case it follows STRATEGY_MEDIA
4182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
4192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((strategy == STRATEGY_SONIFICATION) ||
4202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                (mForceUse[AUDIO_POLICY_FORCE_FOR_SYSTEM] == AUDIO_POLICY_FORCE_SYSTEM_ENFORCED)) {
4212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER;
4222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
423a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent
424a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent        // if SCO headset is connected and we are told to use it, play ringtone over
425a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent        // speaker and BT SCO
426a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent        if (((availableOutputDevicesType & AUDIO_DEVICE_OUT_ALL_SCO) != 0) &&
427a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent                (mForceUse[AUDIO_POLICY_FORCE_FOR_COMMUNICATION] == AUDIO_POLICY_FORCE_BT_SCO)) {
428a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            uint32_t device2 = AUDIO_DEVICE_NONE;
429a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
430a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            if (device2 == AUDIO_DEVICE_NONE) {
431a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent                device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
432a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            }
433a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            if (device2 == AUDIO_DEVICE_NONE) {
434a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent                device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_SCO;
435a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            }
436a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent
437a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            if (device2 != AUDIO_DEVICE_NONE) {
438a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent                device |= device2;
439a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent                break;
440a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent            }
441a8e0f02dee635b88ea21c20f26356354e83ec83aEric Laurent        }
4422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // The second device used for sonification is the same as the device used by media strategy
4432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // FALL THROUGH
4442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
4452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_ACCESSIBILITY:
4462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (strategy == STRATEGY_ACCESSIBILITY) {
4472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // do not route accessibility prompts to a digital output currently configured with a
4482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // compressed format as they would likely not be mixed and dropped.
4492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            for (size_t i = 0; i < outputs.size(); i++) {
4502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                sp<AudioOutputDescriptor> desc = outputs.valueAt(i);
4512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                audio_devices_t devices = desc->device() &
4522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    (AUDIO_DEVICE_OUT_HDMI | AUDIO_DEVICE_OUT_SPDIF | AUDIO_DEVICE_OUT_HDMI_ARC);
4532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                if (desc->isActive() && !audio_is_linear_pcm(desc->mFormat) &&
4542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                        devices != AUDIO_DEVICE_NONE) {
4552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    availableOutputDevicesType = availableOutputDevices.types() & ~devices;
4562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                }
4572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
45828d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            availableOutputDevices =
45928d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    availableOutputDevices.getDevicesFromType(availableOutputDevicesType);
46028d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            if (outputs.isStreamActive(AUDIO_STREAM_RING) ||
46128d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    outputs.isStreamActive(AUDIO_STREAM_ALARM)) {
46228d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                return getDeviceForStrategyInt(
46328d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_SONIFICATION, availableOutputDevices, availableInputDevices, outputs);
46428d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            }
46528d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            if (isInCall()) {
46628d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                return getDeviceForStrategyInt(
46728d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                        STRATEGY_PHONE, availableOutputDevices, availableInputDevices, outputs);
46828d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            }
4692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
47028d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent        // For other cases, STRATEGY_ACCESSIBILITY behaves like STRATEGY_MEDIA
4712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // FALL THROUGH
4722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
47328d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent    // FIXME: STRATEGY_REROUTING follow STRATEGY_MEDIA for now
4742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_REROUTING:
4752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case STRATEGY_MEDIA: {
4762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        uint32_t device2 = AUDIO_DEVICE_NONE;
4772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (strategy != STRATEGY_SONIFICATION) {
4782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // no sonification on remote submix (e.g. WFD)
47928d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            if (availableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
48028d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                                                 String8("0")) != 0) {
4812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device2 = availableOutputDevices.types() & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
4822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
4832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
484a20d4fa431d1091abf66f9d426ef0cf441db6623Eric Laurent        if (isInCall() && (strategy == STRATEGY_MEDIA)) {
48528d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent            device = getDeviceForStrategyInt(
48628d09f06422841b4274d7fed6ad3441dc97382b2Eric Laurent                    STRATEGY_PHONE, availableOutputDevices, availableInputDevices, outputs);
487a20d4fa431d1091abf66f9d426ef0cf441db6623Eric Laurent            break;
488a20d4fa431d1091abf66f9d426ef0cf441db6623Eric Laurent        }
4892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((device2 == AUDIO_DEVICE_NONE) &&
4902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                (mForceUse[AUDIO_POLICY_FORCE_FOR_MEDIA] != AUDIO_POLICY_FORCE_NO_BT_A2DP) &&
4912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                (outputs.getA2dpOutput() != 0)) {
4922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP;
4932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device2 == AUDIO_DEVICE_NONE) {
4942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
4952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
4962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (device2 == AUDIO_DEVICE_NONE) {
4972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
4982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
4992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((device2 == AUDIO_DEVICE_NONE) &&
5012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            (mForceUse[AUDIO_POLICY_FORCE_FOR_MEDIA] == AUDIO_POLICY_FORCE_SPEAKER)) {
5022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER;
5032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (device2 == AUDIO_DEVICE_NONE) {
5052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
5062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5075c233f8b772719371475624edf1002ed80e1d0e8Jean-Michel Trivi        if (device2 == AUDIO_DEVICE_NONE) {
5082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_LINE;
5092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (device2 == AUDIO_DEVICE_NONE) {
5112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_WIRED_HEADSET;
5122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (device2 == AUDIO_DEVICE_NONE) {
514904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_HEADSET;
515904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent        }
516904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent        if (device2 == AUDIO_DEVICE_NONE) {
5172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_ACCESSORY;
5182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (device2 == AUDIO_DEVICE_NONE) {
5202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_USB_DEVICE;
5212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (device2 == AUDIO_DEVICE_NONE) {
5232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET;
5242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((device2 == AUDIO_DEVICE_NONE) && (strategy != STRATEGY_SONIFICATION)) {
5262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // no sonification on aux digital (e.g. HDMI)
5272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_AUX_DIGITAL;
5282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((device2 == AUDIO_DEVICE_NONE) &&
5302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                (mForceUse[AUDIO_POLICY_FORCE_FOR_DOCK] == AUDIO_POLICY_FORCE_ANALOG_DOCK)) {
5312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET;
5322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (device2 == AUDIO_DEVICE_NONE) {
5342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device2 = availableOutputDevicesType & AUDIO_DEVICE_OUT_SPEAKER;
5352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        int device3 = AUDIO_DEVICE_NONE;
5372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (strategy == STRATEGY_MEDIA) {
5382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // ARC, SPDIF and AUX_LINE can co-exist with others.
5392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device3 = availableOutputDevicesType & AUDIO_DEVICE_OUT_HDMI_ARC;
5402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device3 |= (availableOutputDevicesType & AUDIO_DEVICE_OUT_SPDIF);
5412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device3 |= (availableOutputDevicesType & AUDIO_DEVICE_OUT_AUX_LINE);
5422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device2 |= device3;
5452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // device is DEVICE_OUT_SPEAKER if we come from case STRATEGY_SONIFICATION or
5462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // STRATEGY_ENFORCED_AUDIBLE, AUDIO_DEVICE_NONE otherwise
5472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device |= device2;
5482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // If hdmi system audio mode is on, remove speaker out of output list.
5502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((strategy == STRATEGY_MEDIA) &&
5512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            (mForceUse[AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO] ==
5522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                AUDIO_POLICY_FORCE_HDMI_SYSTEM_AUDIO_ENFORCED)) {
5532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device &= ~AUDIO_DEVICE_OUT_SPEAKER;
5542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
5552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } break;
5562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    default:
5582110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGW("getDeviceForStrategy() unknown strategy: %d", strategy);
5592110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
5602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
5612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5625a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent    if (device == AUDIO_DEVICE_NONE) {
5635a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        ALOGV("getDeviceForStrategy() no device found for strategy %d", strategy);
5645a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        device = mApmObserver->getDefaultOutputDevice()->type();
5655a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        ALOGE_IF(device == AUDIO_DEVICE_NONE,
5665a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent                 "getDeviceForStrategy() no default device defined");
5675a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent    }
5682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    ALOGVV("getDeviceForStrategy() strategy %d, device %x", strategy, device);
5692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    return device;
5702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
5712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieaudio_devices_t Engine::getDeviceForInputSource(audio_source_t inputSource) const
5742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
5752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    const DeviceVector &availableOutputDevices = mApmObserver->getAvailableOutputDevices();
5762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    const DeviceVector &availableInputDevices = mApmObserver->getAvailableInputDevices();
577c75307b73d324d590d0dbc05b44bce9aa89b7145Eric Laurent    const SwAudioOutputCollection &outputs = mApmObserver->getOutputs();
5782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    audio_devices_t availableDeviceTypes = availableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;
5792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    uint32_t device = AUDIO_DEVICE_NONE;
5812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    switch (inputSource) {
5832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_VOICE_UPLINK:
5842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie      if (availableDeviceTypes & AUDIO_DEVICE_IN_VOICE_CALL) {
5852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie          device = AUDIO_DEVICE_IN_VOICE_CALL;
5862110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie          break;
5872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie      }
5882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie      break;
5892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
5902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_DEFAULT:
5912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_MIC:
5922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    if (availableDeviceTypes & AUDIO_DEVICE_IN_BLUETOOTH_A2DP) {
5932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device = AUDIO_DEVICE_IN_BLUETOOTH_A2DP;
5942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    } else if ((mForceUse[AUDIO_POLICY_FORCE_FOR_RECORD] == AUDIO_POLICY_FORCE_BT_SCO) &&
5952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        (availableDeviceTypes & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
5962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET;
5972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    } else if (availableDeviceTypes & AUDIO_DEVICE_IN_WIRED_HEADSET) {
5982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device = AUDIO_DEVICE_IN_WIRED_HEADSET;
599904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent    } else if (availableDeviceTypes & AUDIO_DEVICE_IN_USB_HEADSET) {
600904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent        device = AUDIO_DEVICE_IN_USB_HEADSET;
6012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    } else if (availableDeviceTypes & AUDIO_DEVICE_IN_USB_DEVICE) {
6022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device = AUDIO_DEVICE_IN_USB_DEVICE;
6032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    } else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
6042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        device = AUDIO_DEVICE_IN_BUILTIN_MIC;
6052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
6062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    break;
6072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
6082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_VOICE_COMMUNICATION:
6092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // Allow only use of devices on primary input if in call and HAL does not support routing
6102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        // to voice call path.
6112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if ((getPhoneState() == AUDIO_MODE_IN_CALL) &&
6122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                (availableOutputDevices.types() & AUDIO_DEVICE_OUT_TELEPHONY_TX) == 0) {
6132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            sp<AudioOutputDescriptor> primaryOutput = outputs.getPrimaryOutput();
6142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            availableDeviceTypes =
6152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    availableInputDevices.getDevicesFromHwModule(primaryOutput->getModuleHandle())
6162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                    & ~AUDIO_DEVICE_BIT_IN;
6172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
6192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        switch (mForceUse[AUDIO_POLICY_FORCE_FOR_COMMUNICATION]) {
6202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        case AUDIO_POLICY_FORCE_BT_SCO:
6212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // if SCO device is requested but no SCO device is available, fall back to default case
6222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (availableDeviceTypes & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
6232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET;
6242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                break;
6252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
6262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            // FALL THROUGH
6272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
6282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        default:    // FORCE_NONE
6292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (availableDeviceTypes & AUDIO_DEVICE_IN_WIRED_HEADSET) {
6302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = AUDIO_DEVICE_IN_WIRED_HEADSET;
631904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent            } else if (availableDeviceTypes & AUDIO_DEVICE_IN_USB_HEADSET) {
632904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent                device = AUDIO_DEVICE_IN_USB_HEADSET;
6332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            } else if (availableDeviceTypes & AUDIO_DEVICE_IN_USB_DEVICE) {
6342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = AUDIO_DEVICE_IN_USB_DEVICE;
6352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            } else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
6362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = AUDIO_DEVICE_IN_BUILTIN_MIC;
6372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
6382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            break;
6392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
6402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        case AUDIO_POLICY_FORCE_SPEAKER:
6412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            if (availableDeviceTypes & AUDIO_DEVICE_IN_BACK_MIC) {
6422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = AUDIO_DEVICE_IN_BACK_MIC;
6432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            } else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
6442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                device = AUDIO_DEVICE_IN_BUILTIN_MIC;
6452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            }
6462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            break;
6472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
6502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_VOICE_RECOGNITION:
6518a397d583a4f4cf24ad88facaf2fd33990cfb811rago    case AUDIO_SOURCE_UNPROCESSED:
6522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_HOTWORD:
6532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (mForceUse[AUDIO_POLICY_FORCE_FOR_RECORD] == AUDIO_POLICY_FORCE_BT_SCO &&
6542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie                availableDeviceTypes & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
6552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET;
6562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } else if (availableDeviceTypes & AUDIO_DEVICE_IN_WIRED_HEADSET) {
6572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_WIRED_HEADSET;
658904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent        } else if (availableDeviceTypes & AUDIO_DEVICE_IN_USB_HEADSET) {
659904d632a24db8f94de83e44f7179d1c0af022b03Eric Laurent            device = AUDIO_DEVICE_IN_USB_HEADSET;
6602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } else if (availableDeviceTypes & AUDIO_DEVICE_IN_USB_DEVICE) {
6612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_USB_DEVICE;
6622110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
6632110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_BUILTIN_MIC;
6642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_CAMCORDER:
6672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (availableDeviceTypes & AUDIO_DEVICE_IN_BACK_MIC) {
6682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_BACK_MIC;
6692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        } else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
6702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_BUILTIN_MIC;
6712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_VOICE_DOWNLINK:
6742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_VOICE_CALL:
6752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (availableDeviceTypes & AUDIO_DEVICE_IN_VOICE_CALL) {
6762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_VOICE_CALL;
6772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    case AUDIO_SOURCE_REMOTE_SUBMIX:
6802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (availableDeviceTypes & AUDIO_DEVICE_IN_REMOTE_SUBMIX) {
6812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_REMOTE_SUBMIX;
6822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie     case AUDIO_SOURCE_FM_TUNER:
6852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        if (availableDeviceTypes & AUDIO_DEVICE_IN_FM_TUNER) {
6862110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie            device = AUDIO_DEVICE_IN_FM_TUNER;
6872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        }
6882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    default:
6902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        ALOGW("getDeviceForInputSource() invalid input source %d", inputSource);
6912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie        break;
6922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    }
6935a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent    if (device == AUDIO_DEVICE_NONE) {
6945a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        ALOGV("getDeviceForInputSource() no device found for source %d", inputSource);
6955a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        if (availableDeviceTypes & AUDIO_DEVICE_IN_STUB) {
6965a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent            device = AUDIO_DEVICE_IN_STUB;
6975a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        }
6985a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent        ALOGE_IF(device == AUDIO_DEVICE_NONE,
6995a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent                 "getDeviceForInputSource() no default device defined");
7005a2b62984c7cecd1761fe272c078dd814c167942Eric Laurent    }
7012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    ALOGV("getDeviceForInputSource()input source %d, device %08x", inputSource, device);
7022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    return device;
7032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
7042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
7052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffietemplate <>
7062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieAudioPolicyManagerInterface *Engine::queryInterface()
7072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{
7082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie    return &mManagerInterface;
7092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}
7102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
7112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie} // namespace audio_policy
7122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie} // namespace android
7132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
7142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie
715