Merge "audio policy: fix configurable engine and dynamic policies take 2"

gugelfrei
TreeHugger Robot 5 years ago committed by Android (Google) Code Review
commit fc332471b3

@ -135,10 +135,17 @@ public:
/**
* @brief filter the devices supported by this collection against another collection
* @param devices to filter against
* @return
* @return a filtered DeviceVector
*/
DeviceVector filter(const DeviceVector &devices) const;
/**
* @brief filter the devices supported by this collection before sending
* then to the Engine via AudioPolicyManagerObserver interface
* @return a filtered DeviceVector
*/
DeviceVector filterForEngine() const;
/**
* @brief merge two vectors. As SortedVector Implementation is buggy (it does not check the size
* of the destination vector, only of the source, it provides a safe implementation

@ -399,6 +399,18 @@ bool DeviceVector::containsAllDevices(const DeviceVector &devices) const
return filter(devices).size() == devices.size();
}
DeviceVector DeviceVector::filterForEngine() const
{
DeviceVector filteredDevices;
for (const auto &device : *this) {
if (audio_is_remote_submix_device(device->type()) && device->address() != "0") {
continue;
}
filteredDevices.add(device);
}
return filteredDevices;
}
void DeviceDescriptor::log() const
{
ALOGI("Device id:%d type:0x%08X:%s, addr:%s", mId, mDeviceType,

@ -46,9 +46,9 @@ public:
virtual const AudioInputCollection &getInputs() const = 0;
virtual const DeviceVector &getAvailableOutputDevices() const = 0;
virtual const DeviceVector getAvailableOutputDevices() const = 0;
virtual const DeviceVector &getAvailableInputDevices() const = 0;
virtual const DeviceVector getAvailableInputDevices() const = 0;
virtual const sp<DeviceDescriptor> &getDefaultOutputDevice() const = 0;

@ -207,7 +207,7 @@ DeviceVector Engine::getDevicesForProductStrategy(product_strategy_t ps) const
ALOGE("%s: Trying to get device on invalid strategy %d", __FUNCTION__, ps);
return {};
}
const DeviceVector &availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const DeviceVector availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const SwAudioOutputCollection &outputs = getApmObserver()->getOutputs();
uint32_t availableOutputDevicesType = availableOutputDevices.types();
@ -272,7 +272,7 @@ DeviceVector Engine::getOutputDevicesForAttributes(const audio_attributes_t &att
return DeviceVector(preferredDevice);
}
product_strategy_t strategy = getProductStrategyForAttributes(attributes);
const DeviceVector &availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const DeviceVector availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const SwAudioOutputCollection &outputs = getApmObserver()->getOutputs();
//
// @TODO: what is the priority of explicit routing? Shall it be considered first as it used to
@ -298,7 +298,7 @@ sp<DeviceDescriptor> Engine::getInputDeviceForAttributes(const audio_attributes_
sp<AudioPolicyMix> *mix) const
{
const auto &policyMixes = getApmObserver()->getAudioPolicyMixCollection();
const auto &availableInputDevices = getApmObserver()->getAvailableInputDevices();
const auto availableInputDevices = getApmObserver()->getAvailableInputDevices();
const auto &inputs = getApmObserver()->getInputs();
std::string address;
//

@ -502,8 +502,8 @@ audio_devices_t Engine::getDeviceForStrategyInt(legacy_strategy strategy,
audio_devices_t Engine::getDeviceForInputSource(audio_source_t inputSource) const
{
const DeviceVector &availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const DeviceVector &availableInputDevices = getApmObserver()->getAvailableInputDevices();
const DeviceVector availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices();
const SwAudioOutputCollection &outputs = getApmObserver()->getOutputs();
audio_devices_t availableDeviceTypes = availableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;
@ -704,7 +704,7 @@ DeviceVector Engine::getOutputDevicesForAttributes(const audio_attributes_t &att
return DeviceVector(preferredDevice);
}
product_strategy_t strategy = getProductStrategyForAttributes(attributes);
const DeviceVector &availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const DeviceVector availableOutputDevices = getApmObserver()->getAvailableOutputDevices();
const SwAudioOutputCollection &outputs = getApmObserver()->getOutputs();
//
// @TODO: what is the priority of explicit routing? Shall it be considered first as it used to
@ -730,7 +730,7 @@ sp<DeviceDescriptor> Engine::getInputDeviceForAttributes(const audio_attributes_
sp<AudioPolicyMix> *mix) const
{
const auto &policyMixes = getApmObserver()->getAudioPolicyMixCollection();
const auto &availableInputDevices = getApmObserver()->getAvailableInputDevices();
const auto availableInputDevices = getApmObserver()->getAvailableInputDevices();
const auto &inputs = getApmObserver()->getInputs();
std::string address;

@ -423,8 +423,7 @@ status_t AudioPolicyManager::handleDeviceConfigChange(audio_devices_t device,
if (!audio_is_output_device(device) && !audio_is_input_device(device)) return BAD_VALUE;
// Check if the device is currently connected
DeviceVector availableDevices = getAvailableOutputDevices();
DeviceVector deviceList = availableDevices.getDevicesFromTypeMask(device);
DeviceVector deviceList = mAvailableOutputDevices.getDevicesFromTypeMask(device);
if (deviceList.empty()) {
// Nothing to do: device is not connected
return NO_ERROR;

@ -342,13 +342,13 @@ protected:
{
return mInputs;
}
virtual const DeviceVector &getAvailableOutputDevices() const
virtual const DeviceVector getAvailableOutputDevices() const
{
return mAvailableOutputDevices;
return mAvailableOutputDevices.filterForEngine();
}
virtual const DeviceVector &getAvailableInputDevices() const
virtual const DeviceVector getAvailableInputDevices() const
{
return mAvailableInputDevices;
return mAvailableInputDevices.filterForEngine();
}
virtual const sp<DeviceDescriptor> &getDefaultOutputDevice() const
{

Loading…
Cancel
Save