From 26874fed269f1f88d5e9eaef831d0d4c14ba74be Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 13 Apr 2020 15:52:39 -0700 Subject: [PATCH] audio policy: fix crash in findPreferredDevice() on duplicating outputs Duplicating outputs do not have an associated IOProfile and getPolicyAudioPort() returns null. Add a method to AudioIODescriptorInterface to query if the input or output descriptor corresponds to MMAP IO profile or not. Bug: 153849965 Test: repro steps in the bug Change-Id: I300356880198f1785e3a5e1359ffd393c6ae4190 --- .../managerdefinitions/include/AudioIODescriptorInterface.h | 4 +++- .../managerdefinitions/include/AudioInputDescriptor.h | 6 ++++++ .../managerdefinitions/include/AudioOutputDescriptor.h | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h b/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h index 1596ff77e7..6167f958df 100644 --- a/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h +++ b/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h @@ -34,6 +34,8 @@ public: virtual audio_patch_handle_t getPatchHandle() const = 0; virtual void setPatchHandle(audio_patch_handle_t handle) = 0; + + virtual bool isMmap() = 0; }; template @@ -48,7 +50,7 @@ sp findPreferredDevice( // created when the mmap stream is opened). This client is never active. // On non MMAP IOs, the preferred device is honored only if all active clients have // a preferred device in which case the first client drives the selection. - if (desc->getPolicyAudioPort()->isMmap()) { + if (desc->isMmap()) { // The client list is never empty on a MMAP IO return devices.getDeviceFromId( desc->clientsList(false /*activeOnly*/)[0]->preferredDeviceId()); diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h index c67a006130..6f47abc5f7 100644 --- a/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h +++ b/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h @@ -92,6 +92,12 @@ public: audio_config_base_t getConfig() const override; audio_patch_handle_t getPatchHandle() const override; void setPatchHandle(audio_patch_handle_t handle) override; + bool isMmap() override { + if (getPolicyAudioPort() != nullptr) { + return getPolicyAudioPort()->isMmap(); + } + return false; + } status_t open(const audio_config_t *config, const sp &device, diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h index 41f7dfcfd1..39d11401be 100644 --- a/services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +++ b/services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h @@ -268,6 +268,12 @@ public: audio_config_base_t getConfig() const override; audio_patch_handle_t getPatchHandle() const override; void setPatchHandle(audio_patch_handle_t handle) override; + bool isMmap() override { + if (getPolicyAudioPort() != nullptr) { + return getPolicyAudioPort()->isMmap(); + } + return false; + } TrackClientVector clientsList(bool activeOnly = false, product_strategy_t strategy = PRODUCT_STRATEGY_NONE,