From 3a26bb21bd9c38fe48b203cd018b95b955f2d1de Mon Sep 17 00:00:00 2001 From: Baekgyeong Kim Date: Wed, 30 Oct 2019 20:29:41 +0900 Subject: [PATCH] Add audio stream and usage for virtual assistant New stream type: AUDIO_STREAM_ASSISTANT This is intended to be used by a virtual assistant like Google Assistant, Bixby, etc. The audio stream has own volume alias and the volume does not change by volume changes of other streams. Bug: 123745215 Test: make Change-Id: I17ec0480cad4c3507a97454ccb832255adda9897 Merged-In: I17ec0480cad4c3507a97454ccb832255adda9897 Signed-off-by: Baekgyeong Kim --- media/libeffects/config/src/EffectsConfig.cpp | 1 + media/libmediahelper/TypeConverter.cpp | 1 + .../config/audio_policy_volumes.xml | 10 ++ .../engine/common/src/EngineBase.cpp | 93 +++++++++++-------- .../engine/common/src/EngineDefaultConfig.h | 4 + ...audio_policy_engine_product_strategies.xml | 6 ++ .../audio_policy_engine_stream_volumes.xml | 11 ++- ...audio_policy_engine_product_strategies.xml | 6 ++ .../audio_policy_engine_stream_volumes.xml | 11 +++ .../service/AudioPolicyEffects.cpp | 3 +- .../tests/audiopolicymanager_tests.cpp | 4 + 11 files changed, 108 insertions(+), 42 deletions(-) diff --git a/media/libeffects/config/src/EffectsConfig.cpp b/media/libeffects/config/src/EffectsConfig.cpp index f39eb0c7ac..218249da04 100644 --- a/media/libeffects/config/src/EffectsConfig.cpp +++ b/media/libeffects/config/src/EffectsConfig.cpp @@ -100,6 +100,7 @@ constexpr std::pair STREAM_NAME_MAP + + + + + strategy = new ProductStrategy(strategyConfig.name); - for (const auto &group : strategyConfig.attributesGroups) { - const auto &iter = std::find_if(begin(volumeGroups), end(volumeGroups), - [&group](const auto &volumeGroup) { - return group.volumeGroup == volumeGroup.second->getName(); }); - ALOG_ASSERT(iter != end(volumeGroups), "Invalid Volume Group Name %s", - group.volumeGroup.c_str()); - if (group.stream != AUDIO_STREAM_DEFAULT) { - iter->second->addSupportedStream(group.stream); - } - for (const auto &attr : group.attributesVect) { - strategy->addAttributes({group.stream, iter->second->getId(), attr}); - iter->second->addSupportedAttributes(attr); - } + auto loadVolumeConfig = [](auto &volumeGroups, auto &volumeConfig) { + sp volumeGroup = new VolumeGroup(volumeConfig.name, volumeConfig.indexMin, + volumeConfig.indexMax); + volumeGroups[volumeGroup->getId()] = volumeGroup; + + for (auto &configCurve : volumeConfig.volumeCurves) { + device_category deviceCat = DEVICE_CATEGORY_SPEAKER; + if (!DeviceCategoryConverter::fromString(configCurve.deviceCategory, deviceCat)) { + ALOGE("%s: Invalid %s", __FUNCTION__, configCurve.deviceCategory.c_str()); + continue; + } + sp curve = new VolumeCurve(deviceCat); + for (auto &point : configCurve.curvePoints) { + curve->add({point.index, point.attenuationInMb}); } - product_strategy_t strategyId = strategy->getId(); - productStrategies[strategyId] = strategy; + volumeGroup->add(curve); } + return volumeGroup; }; - auto loadVolumeGroups = [](auto &volumeConfigs, auto &volumeGroups) { - for (auto &volumeConfig : volumeConfigs) { - sp volumeGroup = new VolumeGroup(volumeConfig.name, volumeConfig.indexMin, - volumeConfig.indexMax); - volumeGroups[volumeGroup->getId()] = volumeGroup; - - for (auto &configCurve : volumeConfig.volumeCurves) { - device_category deviceCat = DEVICE_CATEGORY_SPEAKER; - if (!DeviceCategoryConverter::fromString(configCurve.deviceCategory, deviceCat)) { - ALOGE("%s: Invalid %s", __FUNCTION__, configCurve.deviceCategory.c_str()); - continue; - } - sp curve = new VolumeCurve(deviceCat); - for (auto &point : configCurve.curvePoints) { - curve->add({point.index, point.attenuationInMb}); - } - volumeGroup->add(curve); - } + auto addSupportedStreamAttributes = [](auto &group, auto &volumeGroup, auto &strategy) { + volumeGroup->addSupportedStream(group.stream); + for (const auto &attr : group.attributesVect) { + strategy->addAttributes({group.stream, volumeGroup->getId(), attr}); + volumeGroup->addSupportedAttributes(attr); } }; + auto result = engineConfig::parse(); if (result.parsedConfig == nullptr) { ALOGW("%s: No configuration found, using default matching phone experience.", __FUNCTION__); @@ -157,9 +142,37 @@ engineConfig::ParsingResult EngineBase::loadAudioPolicyEngineConfig() static_cast(ret == NO_ERROR ? 0 : 1)}; } ALOGE_IF(result.nbSkippedElement != 0, "skipped %zu elements", result.nbSkippedElement); - loadVolumeGroups(result.parsedConfig->volumeGroups, mVolumeGroups); - loadProductStrategies(result.parsedConfig->productStrategies, mProductStrategies, - mVolumeGroups); + + engineConfig::VolumeGroup defaultVolumeConfig; + for (auto &volumeConfig : result.parsedConfig->volumeGroups) { + // save default volume config for streams not defined in configuration + if (volumeConfig.name.compare("AUDIO_STREAM_MUSIC") == 0) { + defaultVolumeConfig = volumeConfig; + } + loadVolumeConfig(mVolumeGroups, volumeConfig); + } + for (auto& strategyConfig : result.parsedConfig->productStrategies) { + sp strategy = new ProductStrategy(strategyConfig.name); + for (const auto &group : strategyConfig.attributesGroups) { + const auto &iter = std::find_if(begin(mVolumeGroups), end(mVolumeGroups), + [&group](const auto &volumeGroup) { + return group.volumeGroup == volumeGroup.second->getName(); }); + if (group.stream != AUDIO_STREAM_DEFAULT) { + if (iter == end(mVolumeGroups)) { + ALOGW("%s: No configuration of %s found, using default volume configuration" + , __FUNCTION__, group.volumeGroup.c_str()); + defaultVolumeConfig.name = group.volumeGroup; + sp volumeGroup = + loadVolumeConfig(mVolumeGroups, defaultVolumeConfig); + addSupportedStreamAttributes(group, volumeGroup, strategy); + } else { + addSupportedStreamAttributes(group, iter->second, strategy); + } + } + } + product_strategy_t strategyId = strategy->getId(); + mProductStrategies[strategyId] = strategy; + } mProductStrategies.initialize(); return result; } diff --git a/services/audiopolicy/engine/common/src/EngineDefaultConfig.h b/services/audiopolicy/engine/common/src/EngineDefaultConfig.h index fede0d93de..6331856ec6 100644 --- a/services/audiopolicy/engine/common/src/EngineDefaultConfig.h +++ b/services/audiopolicy/engine/common/src/EngineDefaultConfig.h @@ -81,6 +81,10 @@ const engineConfig::ProductStrategies gOrderedStrategies = { }, {"STRATEGY_MEDIA", { + {"assistant", AUDIO_STREAM_ASSISTANT, "AUDIO_STREAM_ASSISTANT", + {{AUDIO_CONTENT_TYPE_SPEECH, AUDIO_USAGE_ASSISTANT, + AUDIO_SOURCE_DEFAULT, 0, ""}} + }, {"music", AUDIO_STREAM_MUSIC, "AUDIO_STREAM_MUSIC", { {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_MEDIA, AUDIO_SOURCE_DEFAULT, 0, ""}, diff --git a/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_product_strategies.xml b/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_product_strategies.xml index 939874353a..b1c0dcf34a 100644 --- a/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_product_strategies.xml +++ b/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_product_strategies.xml @@ -72,6 +72,12 @@ + + + + + + diff --git a/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_stream_volumes.xml b/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_stream_volumes.xml index 707a18471c..0f9614ec72 100644 --- a/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_stream_volumes.xml +++ b/services/audiopolicy/engineconfigurable/config/example/phone/audio_policy_engine_stream_volumes.xml @@ -205,7 +205,16 @@ volume index from 0 to 100. - + + assistant + 0 + 15 + + + + + + rerouting 0 diff --git a/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_product_strategies.xml b/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_product_strategies.xml index 939874353a..b1c0dcf34a 100644 --- a/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_product_strategies.xml +++ b/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_product_strategies.xml @@ -72,6 +72,12 @@ + + + + + + diff --git a/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_stream_volumes.xml b/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_stream_volumes.xml index 707a18471c..a259950faf 100644 --- a/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_stream_volumes.xml +++ b/services/audiopolicy/enginedefault/config/example/phone/audio_policy_engine_stream_volumes.xml @@ -206,6 +206,17 @@ volume index from 0 to 100. + + assistant + 0 + 15 + + + + + + + rerouting 0 diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index 4947714841..60caa31be4 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -562,7 +562,8 @@ const char *AudioPolicyEffects::kStreamNames[AUDIO_STREAM_PUBLIC_CNT+1] = { AUDIO_STREAM_BLUETOOTH_SCO_TAG, AUDIO_STREAM_ENFORCED_AUDIBLE_TAG, AUDIO_STREAM_DTMF_TAG, - AUDIO_STREAM_TTS_TAG + AUDIO_STREAM_TTS_TAG, + AUDIO_STREAM_ASSISTANT_TAG }; // returns the audio_stream_t enum corresponding to the output stream name or diff --git a/services/audiopolicy/tests/audiopolicymanager_tests.cpp b/services/audiopolicy/tests/audiopolicymanager_tests.cpp index 299a50f8ea..0263597a88 100644 --- a/services/audiopolicy/tests/audiopolicymanager_tests.cpp +++ b/services/audiopolicy/tests/audiopolicymanager_tests.cpp @@ -794,6 +794,8 @@ INSTANTIATE_TEST_CASE_P( (audio_attributes_t){AUDIO_CONTENT_TYPE_MUSIC, AUDIO_USAGE_VIRTUAL_SOURCE, AUDIO_SOURCE_DEFAULT, 0, "addr=remote_submix_media"}, (audio_attributes_t){AUDIO_CONTENT_TYPE_MUSIC, AUDIO_USAGE_ASSISTANT, + AUDIO_SOURCE_DEFAULT, 0, "addr=remote_submix_media"}, + (audio_attributes_t){AUDIO_CONTENT_TYPE_SPEECH, AUDIO_USAGE_ASSISTANT, AUDIO_SOURCE_DEFAULT, 0, "addr=remote_submix_media"} ) ); @@ -835,6 +837,8 @@ INSTANTIATE_TEST_CASE_P( (audio_attributes_t){AUDIO_CONTENT_TYPE_MUSIC, AUDIO_USAGE_GAME, AUDIO_SOURCE_DEFAULT, 0, ""}, (audio_attributes_t){AUDIO_CONTENT_TYPE_MUSIC, AUDIO_USAGE_ASSISTANT, + AUDIO_SOURCE_DEFAULT, 0, ""}, + (audio_attributes_t){AUDIO_CONTENT_TYPE_SPEECH, AUDIO_USAGE_ASSISTANT, AUDIO_SOURCE_DEFAULT, 0, ""} ) );