接上文 https://blog.csdn.net/we1less/article/details/156362906?spm=1001.2014.3001.5502
audio server
av/services/audioflinger /AudioFlinger.cpp createTrack
getOutputForAttr
cpp
status_t AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
media::CreateTrackResponse& _output)
{
//...
lStatus = AudioSystem::getOutputForAttr(&localAttr, &output.outputId, sessionId, &streamType,
adjAttributionSource, &input.config, input.flags,
&selectedDeviceIds, &portId, &secondaryOutputs,
&isSpatialized, &isBitPerfect, &volume, &muted);
//...
}
av/media/libaudioclient /AudioSystem.cpp getOutputForAttr
cpp
status_t AudioSystem::getOutputForAttr(audio_attributes_t* attr,
audio_io_handle_t* output,
audio_session_t session,
audio_stream_type_t* stream,
const AttributionSourceState& attributionSource,
audio_config_t* config,
audio_output_flags_t flags,
DeviceIdVector* selectedDeviceIds,
audio_port_handle_t* portId,
std::vector<audio_io_handle_t>* secondaryOutputs,
bool *isSpatialized,
bool *isBitPerfect,
float *volume,
bool *muted) {
//...
const sp<IAudioPolicyService> aps = get_audio_policy_service();
if (aps == nullptr) return NO_INIT;
//...
status_t status = statusTFromBinderStatus(
aps->getOutputForAttr(attrAidl, sessionAidl, attributionSource, configAidl, flagsAidl,
selectedDeviceIdsAidl, &responseAidl));
//...
return OK;
}
av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
cpp
status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *output,
audio_session_t session,
audio_stream_type_t *stream,
const AttributionSourceState& attributionSource,
audio_config_t *config,
audio_output_flags_t *flags,
DeviceIdVector *selectedDeviceIds,
audio_port_handle_t *portId,
std::vector<audio_io_handle_t> *secondaryOutputs,
output_type_t *outputType,
bool *isSpatialized,
bool *isBitPerfect,
float *volume,
bool *muted)
{
//...
audio_attributes_t resultAttr;
status_t status = getOutputForAttrInt(&resultAttr, output, session, attr, stream, uid,
config, flags, selectedDeviceIds, &isRequestedDeviceForExclusiveUse,
secondaryOutputs != nullptr ? &secondaryMixes : nullptr, outputType, isSpatialized,
isBitPerfect);
//...
return NO_ERROR;
}
status_t AudioPolicyManager::getOutputForAttrInt(
audio_attributes_t *resultAttr,
audio_io_handle_t *output,
audio_session_t session,
const audio_attributes_t *attr,
audio_stream_type_t *stream,
uid_t uid,
audio_config_t *config,
audio_output_flags_t *flags,
DeviceIdVector *selectedDeviceIds,
bool *isRequestedDeviceForExclusiveUse,
std::vector<sp<AudioPolicyMix>> *secondaryMixes,
output_type_t *outputType,
bool *isSpatialized,
bool *isBitPerfect)
{
//...
status_t status = getAudioAttributes(resultAttr, attr, *stream);
//...
return NO_ERROR;
}
status_t AudioPolicyManager::getAudioAttributes(audio_attributes_t *dstAttr,
const audio_attributes_t *srcAttr,
audio_stream_type_t srcStream)
{
if (srcAttr != NULL) {
//...
// 直接赋值
*dstAttr = *srcAttr;
} else {
//...
// 如果传递进来的为空,使用 audio_stream_type_t 构造
*dstAttr = mEngine->getAttributesForStreamType(srcStream);
}
//...
return NO_ERROR;
}
av/services/audiopolicy/engine/common/src/EngineBase.cpp
cpp
audio_attributes_t EngineBase::getAttributesForStreamType(audio_stream_type_t stream) const
{
return mProductStrategies.getAttributesForStreamType(stream);
}
av/services/audiopolicy/engine/common/include/EngineBase.h
ProductStrategyMap mProductStrategies;
av/services/audiopolicy/engine/common/src/ProductStrategy.cpp
从策略集合中遍历,找到支持这种 StreamType 的 Attributes
cpp
audio_attributes_t ProductStrategyMap::getAttributesForStreamType(audio_stream_type_t stream) const
{
for (const auto &iter : *this) {
const auto strategy = iter.second;
if (strategy->supportStreamType(stream)) {
return strategy->getAttributesForStreamType(stream);
}
}
ALOGV("%s: No product strategy for stream %s, using default", __FUNCTION__,
toString(stream).c_str());
return {};
}
audio_attributes_t ProductStrategy::getAttributesForStreamType(audio_stream_type_t streamType) const
{
const auto iter = std::find_if(begin(mAttributesVector), end(mAttributesVector),
[&streamType](const auto &supportedAttr) {
return supportedAttr.getStreamType() == streamType; });
return iter != end(mAttributesVector) ? iter->getAttributes() : AUDIO_ATTRIBUTES_INITIALIZER;
}
9.33