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