blob: fcf410ba23e2658b29e15af492274a038b15d64d [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "APM::AudioPolicyEngine/LastRemovableMediaDevices"
//#define LOG_NDEBUG 0
#include "LastRemovableMediaDevices.h"
#include <log/log.h>
namespace android {
void LastRemovableMediaDevices::setRemovableMediaDevices(sp<DeviceDescriptor> desc,
audio_policy_dev_state_t state)
{
if (desc == nullptr) {
return;
} else {
if ((state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) &&
(getDeviceOutGroup(desc->type()) != GROUP_NONE)) {
setRemovableMediaDevices(desc, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE);
mMediaDevices.insert(mMediaDevices.begin(), {desc, getDeviceOutGroup(desc->type())});
} else if (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
for (auto iter = mMediaDevices.begin(); iter != mMediaDevices.end(); ++iter) {
if ((iter->desc)->equals(desc)) {
mMediaDevices.erase(iter);
break;
}
}
}
}
}
std::vector<audio_devices_t> LastRemovableMediaDevices::getLastRemovableMediaDevices(
device_out_group_t group, std::vector<audio_devices_t> excludedDevices) const
{
std::vector<audio_devices_t> ret;
for (auto iter = mMediaDevices.begin(); iter != mMediaDevices.end(); ++iter) {
audio_devices_t type = (iter->desc)->type();
if ((group == GROUP_NONE || group == getDeviceOutGroup(type))
&& std::find(excludedDevices.begin(), excludedDevices.end(), type) ==
excludedDevices.end()) {
ret.push_back(type);
}
}
return ret;
}
sp<DeviceDescriptor> LastRemovableMediaDevices::getLastRemovableMediaDevice(
const DeviceVector& excludedDevices, device_out_group_t group) const {
for (auto iter = mMediaDevices.begin(); iter != mMediaDevices.end(); ++iter) {
if ((group == GROUP_NONE || group == getDeviceOutGroup((iter->desc)->type())) &&
!excludedDevices.contains(iter->desc)) {
return iter->desc;
}
}
return nullptr;
}
device_out_group_t LastRemovableMediaDevices::getDeviceOutGroup(audio_devices_t device) const
{
switch (device) {
case AUDIO_DEVICE_OUT_WIRED_HEADPHONE:
case AUDIO_DEVICE_OUT_LINE:
case AUDIO_DEVICE_OUT_WIRED_HEADSET:
case AUDIO_DEVICE_OUT_USB_HEADSET:
case AUDIO_DEVICE_OUT_USB_ACCESSORY:
case AUDIO_DEVICE_OUT_USB_DEVICE:
case AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET:
case AUDIO_DEVICE_OUT_AUX_DIGITAL:
return GROUP_WIRED;
case AUDIO_DEVICE_OUT_BLUETOOTH_A2DP:
case AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES:
case AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER:
// TODO (b/122931261): remove when preferred device for strategy media will be used instead of
// AUDIO_POLICY_FORCE_NO_BT_A2DP.
case AUDIO_DEVICE_OUT_HEARING_AID:
case AUDIO_DEVICE_OUT_BLE_HEADSET:
case AUDIO_DEVICE_OUT_BLE_SPEAKER:
case AUDIO_DEVICE_OUT_BLE_BROADCAST:
return GROUP_BT_A2DP;
default:
return GROUP_NONE;
}
}
} // namespace android