Loading services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +9 −0 Original line number Diff line number Diff line Loading @@ -423,6 +423,15 @@ public: */ bool supportsAllDevices(const DeviceVector &devices) const; /** * @brief supportsAtLeastOne checks if any device in devices is currently supported * @param devices to be checked against * @return true if the device is weakly supported by type (e.g. for non bus / rsubmix devices), * true if the device is supported (both type and address) for bus / remote submix * false otherwise */ bool supportsAtLeastOne(const DeviceVector &devices) const; /** * @brief supportsDevicesForPlayback * @param devices to be checked against Loading services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h +1 −1 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ public: */ status_t setUserIdDeviceAffinities(int userId, const AudioDeviceTypeAddrVector& devices); status_t removeUserIdDeviceAffinities(int userId); status_t getDevicesForUserId(int userId, Vector<AudioDeviceTypeAddr>& devices) const; status_t getDevicesForUserId(int userId, AudioDeviceTypeAddrVector& devices) const; void dump(String8 *dst) const; Loading services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -389,6 +389,11 @@ bool SwAudioOutputDescriptor::supportsAllDevices(const DeviceVector &devices) co return supportedDevices().containsAllDevices(devices); } bool SwAudioOutputDescriptor::supportsAtLeastOne(const DeviceVector &devices) const { return filterSupportedDevices(devices).size() > 0; } bool SwAudioOutputDescriptor::supportsDevicesForPlayback(const DeviceVector &devices) const { // No considering duplicated output Loading services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -640,7 +640,7 @@ status_t AudioPolicyMixCollection::removeUserIdDeviceAffinities(int userId) { } status_t AudioPolicyMixCollection::getDevicesForUserId(int userId, Vector<AudioDeviceTypeAddr>& devices) const { AudioDeviceTypeAddrVector& devices) const { // for each player mix: // find rules that don't exclude this userId, and add the device to the list for (size_t i = 0; i < size(); i++) { Loading @@ -658,7 +658,7 @@ status_t AudioPolicyMixCollection::getDevicesForUserId(int userId, } } if (ruleAllowsUserId) { devices.add(AudioDeviceTypeAddr(mix->mDeviceType, mix->mDeviceAddress.string())); devices.push_back(AudioDeviceTypeAddr(mix->mDeviceType, mix->mDeviceAddress.string())); } } return NO_ERROR; Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +64 −12 Original line number Diff line number Diff line Loading @@ -3783,6 +3783,44 @@ bool AudioPolicyManager::areAllDevicesSupported( return true; } void AudioPolicyManager::changeOutputDevicesMuteState( const AudioDeviceTypeAddrVector& devices) { ALOGVV("%s() num devices %zu", __func__, devices.size()); std::vector<sp<SwAudioOutputDescriptor>> outputs = getSoftwareOutputsForDevices(devices); for (size_t i = 0; i < outputs.size(); i++) { sp<SwAudioOutputDescriptor> outputDesc = outputs[i]; DeviceVector prevDevices = outputDesc->devices(); checkDeviceMuteStrategies(outputDesc, prevDevices, 0 /* delayMs */); } } std::vector<sp<SwAudioOutputDescriptor>> AudioPolicyManager::getSoftwareOutputsForDevices( const AudioDeviceTypeAddrVector& devices) const { std::vector<sp<SwAudioOutputDescriptor>> outputs; DeviceVector deviceDescriptors; for (size_t j = 0; j < devices.size(); j++) { sp<DeviceDescriptor> desc = mHwModules.getDeviceDescriptor( devices[j].mType, devices[j].getAddress(), String8(), AUDIO_FORMAT_DEFAULT); if (desc == nullptr || !audio_is_output_device(devices[j].mType)) { ALOGE("%s: device type %#x address %s not supported or not an output device", __func__, devices[j].mType, devices[j].getAddress()); continue; } deviceDescriptors.add(desc); } for (size_t i = 0; i < mOutputs.size(); i++) { if (!mOutputs.valueAt(i)->supportsAtLeastOne(deviceDescriptors)) { continue; } outputs.push_back(mOutputs.valueAt(i)); } return outputs; } status_t AudioPolicyManager::setUidDeviceAffinities(uid_t uid, const AudioDeviceTypeAddrVector& devices) { ALOGV("%s() uid=%d num devices %zu", __FUNCTION__, uid, devices.size()); Loading Loading @@ -3849,7 +3887,8 @@ status_t AudioPolicyManager::setDevicesRoleForStrategy(product_strategy_t strate return NO_ERROR; } void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint32_t delayMs) void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint32_t delayMs, bool skipDelays) { uint32_t waitMs = 0; bool wasLeUnicastActive = isLeUnicastActive(); Loading @@ -3875,8 +3914,8 @@ void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint continue; } waitMs = setOutputDevices(outputDesc, newDevices, forceRouting, delayMs, nullptr, true /*requiresMuteCheck*/, !forceRouting /*requiresVolumeCheck*/); !skipDelays /*requiresMuteCheck*/, !forceRouting /*requiresVolumeCheck*/, skipDelays); // Only apply special touch sound delay once delayMs = 0; } Loading Loading @@ -4061,13 +4100,18 @@ status_t AudioPolicyManager::setUserIdDeviceAffinities(int userId, // reevaluate outputs for all devices checkForDeviceAndOutputChanges(); updateCallAndOutputRouting(); changeOutputDevicesMuteState(devices); updateCallAndOutputRouting(false /* forceVolumeReeval */, 0 /* delayMs */, true /* skipDelays */); changeOutputDevicesMuteState(devices); return NO_ERROR; } status_t AudioPolicyManager::removeUserIdDeviceAffinities(int userId) { ALOGV("%s() userId=%d", __FUNCTION__, userId); AudioDeviceTypeAddrVector devices; mPolicyMixes.getDevicesForUserId(userId, devices); status_t status = mPolicyMixes.removeUserIdDeviceAffinities(userId); if (status != NO_ERROR) { ALOGE("%s() Could not remove all device affinities fo userId = %d", Loading @@ -4077,7 +4121,10 @@ status_t AudioPolicyManager::removeUserIdDeviceAffinities(int userId) { // reevaluate outputs for all devices checkForDeviceAndOutputChanges(); updateCallAndOutputRouting(); changeOutputDevicesMuteState(devices); updateCallAndOutputRouting(false /* forceVolumeReeval */, 0 /* delayMs */, true /* skipDelays */); changeOutputDevicesMuteState(devices); return NO_ERROR; } Loading Loading @@ -7324,7 +7371,8 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& bool force, int delayMs, audio_patch_handle_t *patchHandle, bool requiresMuteCheck, bool requiresVolumeCheck) bool requiresMuteCheck, bool requiresVolumeCheck, bool skipMuteDelay) { // TODO(b/262404095): Consider if the output need to be reopened. ALOGV("%s device %s delayMs %d", __func__, devices.toString().c_str(), delayMs); Loading @@ -7332,9 +7380,9 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& if (outputDesc->isDuplicated()) { muteWaitMs = setOutputDevices(outputDesc->subOutput1(), devices, force, delayMs, nullptr /* patchHandle */, requiresMuteCheck); nullptr /* patchHandle */, requiresMuteCheck, skipMuteDelay); muteWaitMs += setOutputDevices(outputDesc->subOutput2(), devices, force, delayMs, nullptr /* patchHandle */, requiresMuteCheck); nullptr /* patchHandle */, requiresMuteCheck, skipMuteDelay); return muteWaitMs; } Loading Loading @@ -7400,12 +7448,16 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& // Add half reported latency to delayMs when muteWaitMs is null in order // to avoid disordered sequence of muting volume and changing devices. installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs); int actualDelayMs = !skipMuteDelay && muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs; installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), actualDelayMs); } // Since the mute is skip, also skip the apply stream volume as that will be applied externally if (!skipMuteDelay) { // update stream volumes according to new device applyStreamVolumes(outputDesc, filteredDevices.types(), delayMs); } return muteWaitMs; } Loading Loading
services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +9 −0 Original line number Diff line number Diff line Loading @@ -423,6 +423,15 @@ public: */ bool supportsAllDevices(const DeviceVector &devices) const; /** * @brief supportsAtLeastOne checks if any device in devices is currently supported * @param devices to be checked against * @return true if the device is weakly supported by type (e.g. for non bus / rsubmix devices), * true if the device is supported (both type and address) for bus / remote submix * false otherwise */ bool supportsAtLeastOne(const DeviceVector &devices) const; /** * @brief supportsDevicesForPlayback * @param devices to be checked against Loading
services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h +1 −1 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ public: */ status_t setUserIdDeviceAffinities(int userId, const AudioDeviceTypeAddrVector& devices); status_t removeUserIdDeviceAffinities(int userId); status_t getDevicesForUserId(int userId, Vector<AudioDeviceTypeAddr>& devices) const; status_t getDevicesForUserId(int userId, AudioDeviceTypeAddrVector& devices) const; void dump(String8 *dst) const; Loading
services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -389,6 +389,11 @@ bool SwAudioOutputDescriptor::supportsAllDevices(const DeviceVector &devices) co return supportedDevices().containsAllDevices(devices); } bool SwAudioOutputDescriptor::supportsAtLeastOne(const DeviceVector &devices) const { return filterSupportedDevices(devices).size() > 0; } bool SwAudioOutputDescriptor::supportsDevicesForPlayback(const DeviceVector &devices) const { // No considering duplicated output Loading
services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -640,7 +640,7 @@ status_t AudioPolicyMixCollection::removeUserIdDeviceAffinities(int userId) { } status_t AudioPolicyMixCollection::getDevicesForUserId(int userId, Vector<AudioDeviceTypeAddr>& devices) const { AudioDeviceTypeAddrVector& devices) const { // for each player mix: // find rules that don't exclude this userId, and add the device to the list for (size_t i = 0; i < size(); i++) { Loading @@ -658,7 +658,7 @@ status_t AudioPolicyMixCollection::getDevicesForUserId(int userId, } } if (ruleAllowsUserId) { devices.add(AudioDeviceTypeAddr(mix->mDeviceType, mix->mDeviceAddress.string())); devices.push_back(AudioDeviceTypeAddr(mix->mDeviceType, mix->mDeviceAddress.string())); } } return NO_ERROR; Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +64 −12 Original line number Diff line number Diff line Loading @@ -3783,6 +3783,44 @@ bool AudioPolicyManager::areAllDevicesSupported( return true; } void AudioPolicyManager::changeOutputDevicesMuteState( const AudioDeviceTypeAddrVector& devices) { ALOGVV("%s() num devices %zu", __func__, devices.size()); std::vector<sp<SwAudioOutputDescriptor>> outputs = getSoftwareOutputsForDevices(devices); for (size_t i = 0; i < outputs.size(); i++) { sp<SwAudioOutputDescriptor> outputDesc = outputs[i]; DeviceVector prevDevices = outputDesc->devices(); checkDeviceMuteStrategies(outputDesc, prevDevices, 0 /* delayMs */); } } std::vector<sp<SwAudioOutputDescriptor>> AudioPolicyManager::getSoftwareOutputsForDevices( const AudioDeviceTypeAddrVector& devices) const { std::vector<sp<SwAudioOutputDescriptor>> outputs; DeviceVector deviceDescriptors; for (size_t j = 0; j < devices.size(); j++) { sp<DeviceDescriptor> desc = mHwModules.getDeviceDescriptor( devices[j].mType, devices[j].getAddress(), String8(), AUDIO_FORMAT_DEFAULT); if (desc == nullptr || !audio_is_output_device(devices[j].mType)) { ALOGE("%s: device type %#x address %s not supported or not an output device", __func__, devices[j].mType, devices[j].getAddress()); continue; } deviceDescriptors.add(desc); } for (size_t i = 0; i < mOutputs.size(); i++) { if (!mOutputs.valueAt(i)->supportsAtLeastOne(deviceDescriptors)) { continue; } outputs.push_back(mOutputs.valueAt(i)); } return outputs; } status_t AudioPolicyManager::setUidDeviceAffinities(uid_t uid, const AudioDeviceTypeAddrVector& devices) { ALOGV("%s() uid=%d num devices %zu", __FUNCTION__, uid, devices.size()); Loading Loading @@ -3849,7 +3887,8 @@ status_t AudioPolicyManager::setDevicesRoleForStrategy(product_strategy_t strate return NO_ERROR; } void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint32_t delayMs) void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint32_t delayMs, bool skipDelays) { uint32_t waitMs = 0; bool wasLeUnicastActive = isLeUnicastActive(); Loading @@ -3875,8 +3914,8 @@ void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint continue; } waitMs = setOutputDevices(outputDesc, newDevices, forceRouting, delayMs, nullptr, true /*requiresMuteCheck*/, !forceRouting /*requiresVolumeCheck*/); !skipDelays /*requiresMuteCheck*/, !forceRouting /*requiresVolumeCheck*/, skipDelays); // Only apply special touch sound delay once delayMs = 0; } Loading Loading @@ -4061,13 +4100,18 @@ status_t AudioPolicyManager::setUserIdDeviceAffinities(int userId, // reevaluate outputs for all devices checkForDeviceAndOutputChanges(); updateCallAndOutputRouting(); changeOutputDevicesMuteState(devices); updateCallAndOutputRouting(false /* forceVolumeReeval */, 0 /* delayMs */, true /* skipDelays */); changeOutputDevicesMuteState(devices); return NO_ERROR; } status_t AudioPolicyManager::removeUserIdDeviceAffinities(int userId) { ALOGV("%s() userId=%d", __FUNCTION__, userId); AudioDeviceTypeAddrVector devices; mPolicyMixes.getDevicesForUserId(userId, devices); status_t status = mPolicyMixes.removeUserIdDeviceAffinities(userId); if (status != NO_ERROR) { ALOGE("%s() Could not remove all device affinities fo userId = %d", Loading @@ -4077,7 +4121,10 @@ status_t AudioPolicyManager::removeUserIdDeviceAffinities(int userId) { // reevaluate outputs for all devices checkForDeviceAndOutputChanges(); updateCallAndOutputRouting(); changeOutputDevicesMuteState(devices); updateCallAndOutputRouting(false /* forceVolumeReeval */, 0 /* delayMs */, true /* skipDelays */); changeOutputDevicesMuteState(devices); return NO_ERROR; } Loading Loading @@ -7324,7 +7371,8 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& bool force, int delayMs, audio_patch_handle_t *patchHandle, bool requiresMuteCheck, bool requiresVolumeCheck) bool requiresMuteCheck, bool requiresVolumeCheck, bool skipMuteDelay) { // TODO(b/262404095): Consider if the output need to be reopened. ALOGV("%s device %s delayMs %d", __func__, devices.toString().c_str(), delayMs); Loading @@ -7332,9 +7380,9 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& if (outputDesc->isDuplicated()) { muteWaitMs = setOutputDevices(outputDesc->subOutput1(), devices, force, delayMs, nullptr /* patchHandle */, requiresMuteCheck); nullptr /* patchHandle */, requiresMuteCheck, skipMuteDelay); muteWaitMs += setOutputDevices(outputDesc->subOutput2(), devices, force, delayMs, nullptr /* patchHandle */, requiresMuteCheck); nullptr /* patchHandle */, requiresMuteCheck, skipMuteDelay); return muteWaitMs; } Loading Loading @@ -7400,12 +7448,16 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>& // Add half reported latency to delayMs when muteWaitMs is null in order // to avoid disordered sequence of muting volume and changing devices. installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs); int actualDelayMs = !skipMuteDelay && muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs; installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), actualDelayMs); } // Since the mute is skip, also skip the apply stream volume as that will be applied externally if (!skipMuteDelay) { // update stream volumes according to new device applyStreamVolumes(outputDesc, filteredDevices.types(), delayMs); } return muteWaitMs; } Loading