Split getSurroundSound method in 2 methods.
Split getSurroundSound in:
getSurroundSound for formats supported by source android device
getReportedSurroundSound for formats reported by any connected sound
device like soundbar etc.
Bug: 177990551
Test: atest AudioPolicyManagerTestForHdmi
Change-Id: Iac811315049f0598c930afd75f069f058080dad4
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index 9132086..e959e2c 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -272,8 +272,11 @@
virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
audio_format_t *surroundFormats,
- bool *surroundFormatsEnabled,
- bool reported) = 0;
+ bool *surroundFormatsEnabled) = 0;
+
+ virtual status_t getReportedSurroundFormats(unsigned int *numSurroundFormats,
+ audio_format_t *surroundFormats) = 0;
+
virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) = 0;
virtual bool isHapticPlaybackSupported() = 0;
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 75f0c1b..8352c7f 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -4499,68 +4499,28 @@
status_t AudioPolicyManager::getSurroundFormats(unsigned int *numSurroundFormats,
audio_format_t *surroundFormats,
- bool *surroundFormatsEnabled,
- bool reported)
+ bool *surroundFormatsEnabled)
{
- if (numSurroundFormats == NULL || (*numSurroundFormats != 0 &&
- (surroundFormats == NULL || surroundFormatsEnabled == NULL))) {
+ if (numSurroundFormats == nullptr || (*numSurroundFormats != 0 &&
+ (surroundFormats == nullptr || surroundFormatsEnabled == nullptr))) {
return BAD_VALUE;
}
- ALOGV("%s() numSurroundFormats %d surroundFormats %p surroundFormatsEnabled %p reported %d",
- __func__, *numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
+ ALOGV("%s() numSurroundFormats %d surroundFormats %p surroundFormatsEnabled %p",
+ __func__, *numSurroundFormats, surroundFormats, surroundFormatsEnabled);
size_t formatsWritten = 0;
size_t formatsMax = *numSurroundFormats;
- std::unordered_set<audio_format_t> formats; // Uses primary surround formats only
- if (reported) {
- // Return formats from all device profiles that have already been resolved by
- // checkOutputsForDevice().
- for (size_t i = 0; i < mAvailableOutputDevices.size(); i++) {
- sp<DeviceDescriptor> device = mAvailableOutputDevices[i];
- audio_devices_t deviceType = device->type();
- // Enabling/disabling formats are applied to only HDMI devices. So, this function
- // returns formats reported by HDMI devices.
- if (deviceType != AUDIO_DEVICE_OUT_HDMI) {
- continue;
- }
- // Formats reported by sink devices
- std::unordered_set<audio_format_t> formatset;
- if (auto it = mReportedFormatsMap.find(device); it != mReportedFormatsMap.end()) {
- formatset.insert(it->second.begin(), it->second.end());
- }
- // Formats hard-coded in the in policy configuration file (if any).
- FormatVector encodedFormats = device->encodedFormats();
- formatset.insert(encodedFormats.begin(), encodedFormats.end());
- // Filter the formats which are supported by the vendor hardware.
- for (auto it = formatset.begin(); it != formatset.end(); ++it) {
- if (mConfig.getSurroundFormats().count(*it) != 0) {
- formats.insert(*it);
- } else {
- for (const auto& pair : mConfig.getSurroundFormats()) {
- if (pair.second.count(*it) != 0) {
- formats.insert(pair.first);
- break;
- }
- }
- }
- }
- }
- } else {
- for (const auto& pair : mConfig.getSurroundFormats()) {
- formats.insert(pair.first);
- }
- }
- *numSurroundFormats = formats.size();
+ *numSurroundFormats = mConfig.getSurroundFormats().size();
audio_policy_forced_cfg_t forceUse = mEngine->getForceUse(
AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND);
- for (const auto& format: formats) {
+ for (const auto& format: mConfig.getSurroundFormats()) {
if (formatsWritten < formatsMax) {
- surroundFormats[formatsWritten] = format;
+ surroundFormats[formatsWritten] = format.first;
bool formatEnabled = true;
switch (forceUse) {
case AUDIO_POLICY_FORCE_ENCODED_SURROUND_MANUAL:
- formatEnabled = mManualSurroundFormats.count(format) != 0;
+ formatEnabled = mManualSurroundFormats.count(format.first) != 0;
break;
case AUDIO_POLICY_FORCE_ENCODED_SURROUND_NEVER:
formatEnabled = false;
@@ -4574,6 +4534,60 @@
return NO_ERROR;
}
+status_t AudioPolicyManager::getReportedSurroundFormats(unsigned int *numSurroundFormats,
+ audio_format_t *surroundFormats) {
+ if (numSurroundFormats == nullptr || (*numSurroundFormats != 0 && surroundFormats == nullptr)) {
+ return BAD_VALUE;
+ }
+ ALOGV("%s() numSurroundFormats %d surroundFormats %p",
+ __func__, *numSurroundFormats, surroundFormats);
+
+ size_t formatsWritten = 0;
+ size_t formatsMax = *numSurroundFormats;
+ std::unordered_set<audio_format_t> formats; // Uses primary surround formats only
+
+ // Return formats from all device profiles that have already been resolved by
+ // checkOutputsForDevice().
+ for (size_t i = 0; i < mAvailableOutputDevices.size(); i++) {
+ sp<DeviceDescriptor> device = mAvailableOutputDevices[i];
+ audio_devices_t deviceType = device->type();
+ // Enabling/disabling formats are applied to only HDMI devices. So, this function
+ // returns formats reported by HDMI devices.
+ if (deviceType != AUDIO_DEVICE_OUT_HDMI) {
+ continue;
+ }
+ // Formats reported by sink devices
+ std::unordered_set<audio_format_t> formatset;
+ if (auto it = mReportedFormatsMap.find(device); it != mReportedFormatsMap.end()) {
+ formatset.insert(it->second.begin(), it->second.end());
+ }
+
+ // Formats hard-coded in the in policy configuration file (if any).
+ FormatVector encodedFormats = device->encodedFormats();
+ formatset.insert(encodedFormats.begin(), encodedFormats.end());
+ // Filter the formats which are supported by the vendor hardware.
+ for (auto it = formatset.begin(); it != formatset.end(); ++it) {
+ if (mConfig.getSurroundFormats().count(*it) != 0) {
+ formats.insert(*it);
+ } else {
+ for (const auto& pair : mConfig.getSurroundFormats()) {
+ if (pair.second.count(*it) != 0) {
+ formats.insert(pair.first);
+ break;
+ }
+ }
+ }
+ }
+ }
+ *numSurroundFormats = formats.size();
+ for (const auto& format: formats) {
+ if (formatsWritten < formatsMax) {
+ surroundFormats[formatsWritten++] = format;
+ }
+ }
+ return NO_ERROR;
+}
+
status_t AudioPolicyManager::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
{
ALOGV("%s() format 0x%X enabled %d", __func__, audioFormat, enabled);
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index bf73f75..b979fe5 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -313,8 +313,9 @@
virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
audio_format_t *surroundFormats,
- bool *surroundFormatsEnabled,
- bool reported);
+ bool *surroundFormatsEnabled);
+ virtual status_t getReportedSurroundFormats(unsigned int *numSurroundFormats,
+ audio_format_t *surroundFormats);
virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP(
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 07122cc..c5b3b7c 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -1801,8 +1801,7 @@
return Status::ok();
}
-Status AudioPolicyService::getSurroundFormats(
- bool reported, media::Int* count,
+Status AudioPolicyService::getSurroundFormats(media::Int* count,
std::vector<media::audio::common::AudioFormat>* formats,
std::vector<bool>* formatsEnabled) {
unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
@@ -1821,7 +1820,7 @@
AutoCallerClear acc;
RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
- surroundFormatsEnabled.get(), reported)));
+ surroundFormatsEnabled.get())));
numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
@@ -1834,6 +1833,32 @@
return Status::ok();
}
+Status AudioPolicyService::getReportedSurroundFormats(
+ media::Int* count, std::vector<media::audio::common::AudioFormat>* formats) {
+ unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
+ convertIntegral<unsigned int>(count->value));
+ if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
+ numSurroundFormats = MAX_ITEMS_PER_LIST;
+ }
+ unsigned int numSurroundFormatsReq = numSurroundFormats;
+ std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
+
+ if (mAudioPolicyManager == NULL) {
+ return binderStatusFromStatusT(NO_INIT);
+ }
+ Mutex::Autolock _l(mLock);
+ AutoCallerClear acc;
+ RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
+ mAudioPolicyManager->getReportedSurroundFormats(
+ &numSurroundFormats, surroundFormats.get())));
+ numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
+ RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
+ convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
+ std::back_inserter(*formats), legacy2aidl_audio_format_t_AudioFormat)));
+ count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
+ return Status::ok();
+}
+
Status AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
std::vector<media::audio::common::AudioFormat>* _aidl_return) {
std::vector<audio_format_t> formats;
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 90ad81e..66bea8e 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -925,6 +925,7 @@
case TRANSACTION_registerPolicyMixes:
case TRANSACTION_setMasterMono:
case TRANSACTION_getSurroundFormats:
+ case TRANSACTION_getReportedSurroundFormats:
case TRANSACTION_setSurroundFormatEnabled:
case TRANSACTION_setAssistantUid:
case TRANSACTION_setA11yServicesUids:
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index a11b2cc..a52b212 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -182,9 +182,11 @@
binder::Status getMasterMono(bool* _aidl_return) override;
binder::Status getStreamVolumeDB(media::AudioStreamType stream, int32_t index, int32_t device,
float* _aidl_return) override;
- binder::Status getSurroundFormats(bool reported, media::Int* count,
+ binder::Status getSurroundFormats(media::Int* count,
std::vector<media::audio::common::AudioFormat>* formats,
std::vector<bool>* formatsEnabled) override;
+ binder::Status getReportedSurroundFormats(
+ media::Int* count, std::vector<media::audio::common::AudioFormat>* formats) override;
binder::Status getHwOffloadEncodingFormatsSupportedForA2DP(
std::vector<media::audio::common::AudioFormat>* _aidl_return) override;
binder::Status setSurroundFormatEnabled(media::audio::common::AudioFormat audioFormat,
diff --git a/services/audiopolicy/tests/audiopolicymanager_tests.cpp b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
index a8ede90..73be835 100644
--- a/services/audiopolicy/tests/audiopolicymanager_tests.cpp
+++ b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
@@ -797,7 +797,8 @@
protected:
void SetUp() override;
std::string getConfigFile() override { return sTvConfig; }
- std::map<audio_format_t, bool> getSurroundFormatsHelper(bool reported);
+ std::map<audio_format_t, bool> getSurroundFormatsHelper();
+ std::vector<audio_format_t> getReportedSurroundFormatsHelper();
std::unordered_set<audio_format_t> getFormatsFromPorts();
AudioPolicyManagerTestClient* getClient() override {
return new AudioPolicyManagerTestClientForHdmi;
@@ -828,12 +829,12 @@
}
std::map<audio_format_t, bool>
- AudioPolicyManagerTestForHdmi::getSurroundFormatsHelper(bool reported) {
+ AudioPolicyManagerTestForHdmi::getSurroundFormatsHelper() {
unsigned int numSurroundFormats = 0;
std::map<audio_format_t, bool> surroundFormatsMap;
status_t ret = mManager->getSurroundFormats(
&numSurroundFormats, nullptr /* surroundFormats */,
- nullptr /* surroundFormatsEnabled */, reported);
+ nullptr /* surroundFormatsEnabled */);
EXPECT_EQ(NO_ERROR, ret);
if (ret != NO_ERROR) {
return surroundFormatsMap;
@@ -843,7 +844,7 @@
bool surroundFormatsEnabled[numSurroundFormats];
memset(surroundFormatsEnabled, 0, sizeof(bool) * numSurroundFormats);
ret = mManager->getSurroundFormats(
- &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
+ &numSurroundFormats, surroundFormats, surroundFormatsEnabled);
EXPECT_EQ(NO_ERROR, ret);
if (ret != NO_ERROR) {
return surroundFormatsMap;
@@ -854,6 +855,28 @@
return surroundFormatsMap;
}
+std::vector<audio_format_t> AudioPolicyManagerTestForHdmi::getReportedSurroundFormatsHelper() {
+ unsigned int numSurroundFormats = 0;
+ std::vector<audio_format_t> surroundFormatsVector;
+ status_t ret = mManager->getReportedSurroundFormats(
+ &numSurroundFormats, nullptr /* surroundFormats */);
+ EXPECT_EQ(NO_ERROR, ret);
+ if (ret != NO_ERROR) {
+ return surroundFormatsVector;
+ }
+ audio_format_t surroundFormats[numSurroundFormats];
+ memset(surroundFormats, 0, sizeof(audio_format_t) * numSurroundFormats);
+ ret = mManager->getReportedSurroundFormats(&numSurroundFormats, surroundFormats);
+ EXPECT_EQ(NO_ERROR, ret);
+ if (ret != NO_ERROR) {
+ return surroundFormatsVector;
+ }
+ for (const auto &surroundFormat : surroundFormats) {
+ surroundFormatsVector.push_back(surroundFormat);
+ }
+ return surroundFormatsVector;
+}
+
std::unordered_set<audio_format_t>
AudioPolicyManagerTestForHdmi::getFormatsFromPorts() {
uint32_t numPorts = 0;
@@ -884,7 +907,7 @@
TEST_F(AudioPolicyManagerTestForHdmi, GetSurroundFormatsReturnsSupportedFormats) {
mManager->setForceUse(
AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
- auto surroundFormats = getSurroundFormatsHelper(false /*reported*/);
+ auto surroundFormats = getSurroundFormatsHelper();
ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
}
@@ -896,19 +919,19 @@
status_t ret =
mManager->setSurroundFormatEnabled(AUDIO_FORMAT_E_AC3, false /*enabled*/);
ASSERT_EQ(NO_ERROR, ret);
- auto surroundFormats = getSurroundFormatsHelper(false /*reported*/);
+ auto surroundFormats = getSurroundFormatsHelper();
ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
ASSERT_FALSE(surroundFormats[AUDIO_FORMAT_E_AC3]);
ret = mManager->setSurroundFormatEnabled(AUDIO_FORMAT_E_AC3, true /*enabled*/);
ASSERT_EQ(NO_ERROR, ret);
- surroundFormats = getSurroundFormatsHelper(false /*reported*/);
+ surroundFormats = getSurroundFormatsHelper();
ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
ASSERT_TRUE(surroundFormats[AUDIO_FORMAT_E_AC3]);
ret = mManager->setSurroundFormatEnabled(AUDIO_FORMAT_E_AC3, false /*enabled*/);
ASSERT_EQ(NO_ERROR, ret);
- surroundFormats = getSurroundFormatsHelper(false /*reported*/);
+ surroundFormats = getSurroundFormatsHelper();
ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
ASSERT_FALSE(surroundFormats[AUDIO_FORMAT_E_AC3]);
}
@@ -931,8 +954,8 @@
GetReportedSurroundFormatsReturnsHdmiReportedFormats) {
mManager->setForceUse(
AUDIO_POLICY_FORCE_FOR_ENCODED_SURROUND, AUDIO_POLICY_FORCE_ENCODED_SURROUND_ALWAYS);
- auto surroundFormats = getSurroundFormatsHelper(true /*reported*/);
- ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
+ auto surroundFormats = getReportedSurroundFormatsHelper();
+ ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), AUDIO_FORMAT_E_AC3));
}
TEST_F(AudioPolicyManagerTestForHdmi,
@@ -942,13 +965,13 @@
status_t ret = mManager->setSurroundFormatEnabled(AUDIO_FORMAT_E_AC3, false /*enabled*/);
ASSERT_EQ(NO_ERROR, ret);
- auto surroundFormats = getSurroundFormatsHelper(true /*reported*/);
- ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
+ auto surroundFormats = getReportedSurroundFormatsHelper();
+ ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), AUDIO_FORMAT_E_AC3));
ret = mManager->setSurroundFormatEnabled(AUDIO_FORMAT_E_AC3, true /*enabled*/);
ASSERT_EQ(NO_ERROR, ret);
- surroundFormats = getSurroundFormatsHelper(true /*reported*/);
- ASSERT_EQ(1, surroundFormats.count(AUDIO_FORMAT_E_AC3));
+ surroundFormats = getReportedSurroundFormatsHelper();
+ ASSERT_EQ(1, std::count(surroundFormats.begin(), surroundFormats.end(), AUDIO_FORMAT_E_AC3));
}
class AudioPolicyManagerTestDPNoRemoteSubmixModule : public AudioPolicyManagerTestDynamicPolicy {