Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +24 −13 Original line number Diff line number Diff line Loading @@ -134,12 +134,14 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT sp<DeviceDescriptor> device = mHwModules.getDeviceDescriptor(deviceType, device_address, device_name, encodedFormat, state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE); if (device == 0) { return INVALID_OPERATION; return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION; } status_t AudioPolicyManager::setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device, audio_policy_dev_state_t state) { // handle output devices if (audio_is_output_device(deviceType)) { if (audio_is_output_device(device->type())) { SortedVector <audio_io_handle_t> outputs; ssize_t index = mAvailableOutputDevices.indexOf(device); Loading @@ -156,7 +158,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT return INVALID_OPERATION; } ALOGV("%s() connecting device %s format %x", __func__, device->toString().c_str(), encodedFormat); __func__, device->toString().c_str(), device->getEncodedFormat()); // register new device as available if (mAvailableOutputDevices.add(device) < 0) { Loading Loading @@ -218,16 +220,13 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT // output device used by a dynamic policy of type recorder as no // playback use case is affected. bool doCheckForDeviceAndOutputChanges = true; if (device->type() == AUDIO_DEVICE_OUT_REMOTE_SUBMIX && strncmp(device_address, "0", AUDIO_DEVICE_MAX_ADDRESS_LEN) != 0) { if (device->type() == AUDIO_DEVICE_OUT_REMOTE_SUBMIX && device->address() != "0") { for (audio_io_handle_t output : outputs) { sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(output); sp<AudioPolicyMix> policyMix = desc->mPolicyMix.promote(); if (policyMix != nullptr && policyMix->mMixType == MIX_TYPE_RECORDERS && strncmp(device_address, policyMix->mDeviceAddress.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) { && device->address() == policyMix->mDeviceAddress.string()) { doCheckForDeviceAndOutputChanges = false; break; } Loading Loading @@ -273,7 +272,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT // a valid device selection on those outputs. bool force = (msdOutDevices.isEmpty() || msdOutDevices != desc->devices()) && !desc->isDuplicated() && (!device_distinguishes_on_address(deviceType) && (!device_distinguishes_on_address(device->type()) // always force when disconnecting (a non-duplicated device) || (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE)); setOutputDevices(desc, newDevices, force, 0); Loading @@ -289,7 +288,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT } // end if is output device // handle input devices if (audio_is_input_device(deviceType)) { if (audio_is_input_device(device->type())) { ssize_t index = mAvailableInputDevices.indexOf(device); switch (state) { Loading Loading @@ -4391,7 +4390,7 @@ status_t AudioPolicyManager::initialize() { // after parsing the config, mOutputDevicesAll and mInputDevicesAll contain all known devices; // open all output streams needed to access attached devices onNewAudioModulesAvailable(); onNewAudioModulesAvailableInt(nullptr /*newDevices*/); // make sure default device is reachable if (mDefaultOutputDevice == 0 || !mAvailableOutputDevices.contains(mDefaultOutputDevice)) { Loading Loading @@ -4447,6 +4446,16 @@ status_t AudioPolicyManager::initCheck() // --- void AudioPolicyManager::onNewAudioModulesAvailable() { DeviceVector newDevices; onNewAudioModulesAvailableInt(&newDevices); if (!newDevices.empty()) { nextAudioPortGeneration(); mpClientInterface->onAudioPortListUpdate(); } } void AudioPolicyManager::onNewAudioModulesAvailableInt(DeviceVector *newDevices) { for (const auto& hwModule : mHwModulesAll) { if (std::find(mHwModules.begin(), mHwModules.end(), hwModule) != mHwModules.end()) { Loading Loading @@ -4511,6 +4520,7 @@ void AudioPolicyManager::onNewAudioModulesAvailable() if (!device->isAttached()) { device->attach(hwModule); mAvailableOutputDevices.add(device); if (newDevices) newDevices->add(device); setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE); } } Loading Loading @@ -4566,6 +4576,7 @@ void AudioPolicyManager::onNewAudioModulesAvailable() device->attach(hwModule); device->importAudioPortAndPickAudioProfile(inProfile, true); mAvailableInputDevices.add(device); if (newDevices) newDevices->add(device); setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE); } } Loading services/audiopolicy/managerdefault/AudioPolicyManager.h +4 −0 Original line number Diff line number Diff line Loading @@ -776,6 +776,8 @@ protected: std::unordered_map<uid_t, audio_flags_mask_t> mAllowedCapturePolicies; private: void onNewAudioModulesAvailableInt(DeviceVector *newDevices); // Add or remove AC3 DTS encodings based on user preferences. void modifySurroundFormats(const sp<DeviceDescriptor>& devDesc, FormatVector *formatsPtr); void modifySurroundChannelMasks(ChannelMaskSet *channelMasksPtr); Loading Loading @@ -865,6 +867,8 @@ private: const char *device_address, const char *device_name, audio_format_t encodedFormat); status_t setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device, audio_policy_dev_state_t state); void setEngineDeviceConnectionState(const sp<DeviceDescriptor> device, audio_policy_dev_state_t state); Loading services/audiopolicy/service/AudioPolicyService.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -1833,7 +1833,7 @@ void AudioPolicyService::setEffectSuspended(int effectId, void AudioPolicyService::onNewAudioModulesAvailable() { mAudioCommandThread->audioModulesUpdateCommand(); mOutputCommandThread->audioModulesUpdateCommand(); } Loading services/audiopolicy/tests/AudioPolicyManagerTestClient.h +7 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,10 @@ public: return NO_ERROR; } void onAudioPortListUpdate() override { ++mAudioPortListUpdateCount; } // Helper methods for tests size_t getActivePatchesCount() const { return mActivePatches.size(); } Loading @@ -111,12 +115,15 @@ public: mAllowedModuleNames.swap(names); } size_t getAudioPortListUpdateCount() const { return mAudioPortListUpdateCount; } private: audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1; audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1; audio_patch_handle_t mNextPatchHandle = AUDIO_PATCH_HANDLE_NONE + 1; std::map<audio_patch_handle_t, struct audio_patch> mActivePatches; std::set<std::string> mAllowedModuleNames; size_t mAudioPortListUpdateCount = 0; }; } // namespace android services/audiopolicy/tests/AudioPolicyTestManager.h +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ class AudioPolicyTestManager : public AudioPolicyManager { using AudioPolicyManager::initialize; using AudioPolicyManager::getAvailableOutputDevices; using AudioPolicyManager::getAvailableInputDevices; uint32_t getAudioPortGeneration() const { return mAudioPortGeneration; } }; } // namespace android Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +24 −13 Original line number Diff line number Diff line Loading @@ -134,12 +134,14 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT sp<DeviceDescriptor> device = mHwModules.getDeviceDescriptor(deviceType, device_address, device_name, encodedFormat, state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE); if (device == 0) { return INVALID_OPERATION; return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION; } status_t AudioPolicyManager::setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device, audio_policy_dev_state_t state) { // handle output devices if (audio_is_output_device(deviceType)) { if (audio_is_output_device(device->type())) { SortedVector <audio_io_handle_t> outputs; ssize_t index = mAvailableOutputDevices.indexOf(device); Loading @@ -156,7 +158,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT return INVALID_OPERATION; } ALOGV("%s() connecting device %s format %x", __func__, device->toString().c_str(), encodedFormat); __func__, device->toString().c_str(), device->getEncodedFormat()); // register new device as available if (mAvailableOutputDevices.add(device) < 0) { Loading Loading @@ -218,16 +220,13 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT // output device used by a dynamic policy of type recorder as no // playback use case is affected. bool doCheckForDeviceAndOutputChanges = true; if (device->type() == AUDIO_DEVICE_OUT_REMOTE_SUBMIX && strncmp(device_address, "0", AUDIO_DEVICE_MAX_ADDRESS_LEN) != 0) { if (device->type() == AUDIO_DEVICE_OUT_REMOTE_SUBMIX && device->address() != "0") { for (audio_io_handle_t output : outputs) { sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(output); sp<AudioPolicyMix> policyMix = desc->mPolicyMix.promote(); if (policyMix != nullptr && policyMix->mMixType == MIX_TYPE_RECORDERS && strncmp(device_address, policyMix->mDeviceAddress.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) { && device->address() == policyMix->mDeviceAddress.string()) { doCheckForDeviceAndOutputChanges = false; break; } Loading Loading @@ -273,7 +272,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT // a valid device selection on those outputs. bool force = (msdOutDevices.isEmpty() || msdOutDevices != desc->devices()) && !desc->isDuplicated() && (!device_distinguishes_on_address(deviceType) && (!device_distinguishes_on_address(device->type()) // always force when disconnecting (a non-duplicated device) || (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE)); setOutputDevices(desc, newDevices, force, 0); Loading @@ -289,7 +288,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT } // end if is output device // handle input devices if (audio_is_input_device(deviceType)) { if (audio_is_input_device(device->type())) { ssize_t index = mAvailableInputDevices.indexOf(device); switch (state) { Loading Loading @@ -4391,7 +4390,7 @@ status_t AudioPolicyManager::initialize() { // after parsing the config, mOutputDevicesAll and mInputDevicesAll contain all known devices; // open all output streams needed to access attached devices onNewAudioModulesAvailable(); onNewAudioModulesAvailableInt(nullptr /*newDevices*/); // make sure default device is reachable if (mDefaultOutputDevice == 0 || !mAvailableOutputDevices.contains(mDefaultOutputDevice)) { Loading Loading @@ -4447,6 +4446,16 @@ status_t AudioPolicyManager::initCheck() // --- void AudioPolicyManager::onNewAudioModulesAvailable() { DeviceVector newDevices; onNewAudioModulesAvailableInt(&newDevices); if (!newDevices.empty()) { nextAudioPortGeneration(); mpClientInterface->onAudioPortListUpdate(); } } void AudioPolicyManager::onNewAudioModulesAvailableInt(DeviceVector *newDevices) { for (const auto& hwModule : mHwModulesAll) { if (std::find(mHwModules.begin(), mHwModules.end(), hwModule) != mHwModules.end()) { Loading Loading @@ -4511,6 +4520,7 @@ void AudioPolicyManager::onNewAudioModulesAvailable() if (!device->isAttached()) { device->attach(hwModule); mAvailableOutputDevices.add(device); if (newDevices) newDevices->add(device); setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE); } } Loading Loading @@ -4566,6 +4576,7 @@ void AudioPolicyManager::onNewAudioModulesAvailable() device->attach(hwModule); device->importAudioPortAndPickAudioProfile(inProfile, true); mAvailableInputDevices.add(device); if (newDevices) newDevices->add(device); setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE); } } Loading
services/audiopolicy/managerdefault/AudioPolicyManager.h +4 −0 Original line number Diff line number Diff line Loading @@ -776,6 +776,8 @@ protected: std::unordered_map<uid_t, audio_flags_mask_t> mAllowedCapturePolicies; private: void onNewAudioModulesAvailableInt(DeviceVector *newDevices); // Add or remove AC3 DTS encodings based on user preferences. void modifySurroundFormats(const sp<DeviceDescriptor>& devDesc, FormatVector *formatsPtr); void modifySurroundChannelMasks(ChannelMaskSet *channelMasksPtr); Loading Loading @@ -865,6 +867,8 @@ private: const char *device_address, const char *device_name, audio_format_t encodedFormat); status_t setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device, audio_policy_dev_state_t state); void setEngineDeviceConnectionState(const sp<DeviceDescriptor> device, audio_policy_dev_state_t state); Loading
services/audiopolicy/service/AudioPolicyService.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -1833,7 +1833,7 @@ void AudioPolicyService::setEffectSuspended(int effectId, void AudioPolicyService::onNewAudioModulesAvailable() { mAudioCommandThread->audioModulesUpdateCommand(); mOutputCommandThread->audioModulesUpdateCommand(); } Loading
services/audiopolicy/tests/AudioPolicyManagerTestClient.h +7 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,10 @@ public: return NO_ERROR; } void onAudioPortListUpdate() override { ++mAudioPortListUpdateCount; } // Helper methods for tests size_t getActivePatchesCount() const { return mActivePatches.size(); } Loading @@ -111,12 +115,15 @@ public: mAllowedModuleNames.swap(names); } size_t getAudioPortListUpdateCount() const { return mAudioPortListUpdateCount; } private: audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1; audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1; audio_patch_handle_t mNextPatchHandle = AUDIO_PATCH_HANDLE_NONE + 1; std::map<audio_patch_handle_t, struct audio_patch> mActivePatches; std::set<std::string> mAllowedModuleNames; size_t mAudioPortListUpdateCount = 0; }; } // namespace android
services/audiopolicy/tests/AudioPolicyTestManager.h +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ class AudioPolicyTestManager : public AudioPolicyManager { using AudioPolicyManager::initialize; using AudioPolicyManager::getAvailableOutputDevices; using AudioPolicyManager::getAvailableInputDevices; uint32_t getAudioPortGeneration() const { return mAudioPortGeneration; } }; } // namespace android