[audio] AudioTrack (四) getOutputForAttr 分析

接上文 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

相关推荐
笑小枫5 分钟前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
霸道流氓气质18 分钟前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
通玄27 分钟前
Jetpack Compose 入门系列(十):Paging 3 分页加载
android
hunterandroid33 分钟前
DataStore 工程化实践:迁移、并发更新与异常恢复
android·前端
独隅38 分钟前
IntelliJ IDEA 接入多种AI大模型插件终极指南(2026.1 企业合规版)
java·人工智能·intellij-idea
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
zfoo-framework1 小时前
1.ansible安装 2.虚拟机克隆
java
码上解惑2 小时前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
青山木2 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
程序员-珍3 小时前
报错下载android sdk失败
android·java