irpas技术客

Android 11音频服务创建以及播放的流程_c-Schutz_android 音频服务

irpas 2627

1、音频服务初始化流程

当前版本:Android 11

大致的创建流程如下:

#mermaid-svg-lUW3kAKPq9qvpFck .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-lUW3kAKPq9qvpFck .label text{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .node rect,#mermaid-svg-lUW3kAKPq9qvpFck .node circle,#mermaid-svg-lUW3kAKPq9qvpFck .node ellipse,#mermaid-svg-lUW3kAKPq9qvpFck .node polygon,#mermaid-svg-lUW3kAKPq9qvpFck .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-lUW3kAKPq9qvpFck .node .label{text-align:center;fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .node.clickable{cursor:pointer}#mermaid-svg-lUW3kAKPq9qvpFck .arrowheadPath{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-lUW3kAKPq9qvpFck .flowchart-link{stroke:#333;fill:none}#mermaid-svg-lUW3kAKPq9qvpFck .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-lUW3kAKPq9qvpFck .edgeLabel rect{opacity:0.9}#mermaid-svg-lUW3kAKPq9qvpFck .edgeLabel span{color:#333}#mermaid-svg-lUW3kAKPq9qvpFck .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-lUW3kAKPq9qvpFck .cluster text{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-lUW3kAKPq9qvpFck .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-lUW3kAKPq9qvpFck text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-lUW3kAKPq9qvpFck .actor-line{stroke:grey}#mermaid-svg-lUW3kAKPq9qvpFck .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-lUW3kAKPq9qvpFck .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-lUW3kAKPq9qvpFck #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-lUW3kAKPq9qvpFck .sequenceNumber{fill:#fff}#mermaid-svg-lUW3kAKPq9qvpFck #sequencenumber{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck #crosshead path{fill:#333;stroke:#333}#mermaid-svg-lUW3kAKPq9qvpFck .messageText{fill:#333;stroke:#333}#mermaid-svg-lUW3kAKPq9qvpFck .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-lUW3kAKPq9qvpFck .labelText,#mermaid-svg-lUW3kAKPq9qvpFck .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-lUW3kAKPq9qvpFck .loopText,#mermaid-svg-lUW3kAKPq9qvpFck .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-lUW3kAKPq9qvpFck .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-lUW3kAKPq9qvpFck .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-lUW3kAKPq9qvpFck .noteText,#mermaid-svg-lUW3kAKPq9qvpFck .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-lUW3kAKPq9qvpFck .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-lUW3kAKPq9qvpFck .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-lUW3kAKPq9qvpFck .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-lUW3kAKPq9qvpFck .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .section{stroke:none;opacity:0.2}#mermaid-svg-lUW3kAKPq9qvpFck .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-lUW3kAKPq9qvpFck .section2{fill:#fff400}#mermaid-svg-lUW3kAKPq9qvpFck .section1,#mermaid-svg-lUW3kAKPq9qvpFck .section3{fill:#fff;opacity:0.2}#mermaid-svg-lUW3kAKPq9qvpFck .sectionTitle0{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .sectionTitle1{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .sectionTitle2{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .sectionTitle3{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-lUW3kAKPq9qvpFck .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .grid path{stroke-width:0}#mermaid-svg-lUW3kAKPq9qvpFck .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-lUW3kAKPq9qvpFck .task{stroke-width:2}#mermaid-svg-lUW3kAKPq9qvpFck .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .taskText:not([font-size]){font-size:11px}#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-lUW3kAKPq9qvpFck .task.clickable{cursor:pointer}#mermaid-svg-lUW3kAKPq9qvpFck .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-lUW3kAKPq9qvpFck .taskText0,#mermaid-svg-lUW3kAKPq9qvpFck .taskText1,#mermaid-svg-lUW3kAKPq9qvpFck .taskText2,#mermaid-svg-lUW3kAKPq9qvpFck .taskText3{fill:#fff}#mermaid-svg-lUW3kAKPq9qvpFck .task0,#mermaid-svg-lUW3kAKPq9qvpFck .task1,#mermaid-svg-lUW3kAKPq9qvpFck .task2,#mermaid-svg-lUW3kAKPq9qvpFck .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutside0,#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutside2{fill:#000}#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutside1,#mermaid-svg-lUW3kAKPq9qvpFck .taskTextOutside3{fill:#000}#mermaid-svg-lUW3kAKPq9qvpFck .active0,#mermaid-svg-lUW3kAKPq9qvpFck .active1,#mermaid-svg-lUW3kAKPq9qvpFck .active2,#mermaid-svg-lUW3kAKPq9qvpFck .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-lUW3kAKPq9qvpFck .activeText0,#mermaid-svg-lUW3kAKPq9qvpFck .activeText1,#mermaid-svg-lUW3kAKPq9qvpFck .activeText2,#mermaid-svg-lUW3kAKPq9qvpFck .activeText3{fill:#000 !important}#mermaid-svg-lUW3kAKPq9qvpFck .done0,#mermaid-svg-lUW3kAKPq9qvpFck .done1,#mermaid-svg-lUW3kAKPq9qvpFck .done2,#mermaid-svg-lUW3kAKPq9qvpFck .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-lUW3kAKPq9qvpFck .doneText0,#mermaid-svg-lUW3kAKPq9qvpFck .doneText1,#mermaid-svg-lUW3kAKPq9qvpFck .doneText2,#mermaid-svg-lUW3kAKPq9qvpFck .doneText3{fill:#000 !important}#mermaid-svg-lUW3kAKPq9qvpFck .crit0,#mermaid-svg-lUW3kAKPq9qvpFck .crit1,#mermaid-svg-lUW3kAKPq9qvpFck .crit2,#mermaid-svg-lUW3kAKPq9qvpFck .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-lUW3kAKPq9qvpFck .activeCrit0,#mermaid-svg-lUW3kAKPq9qvpFck .activeCrit1,#mermaid-svg-lUW3kAKPq9qvpFck .activeCrit2,#mermaid-svg-lUW3kAKPq9qvpFck .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-lUW3kAKPq9qvpFck .doneCrit0,#mermaid-svg-lUW3kAKPq9qvpFck .doneCrit1,#mermaid-svg-lUW3kAKPq9qvpFck .doneCrit2,#mermaid-svg-lUW3kAKPq9qvpFck .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-lUW3kAKPq9qvpFck .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-lUW3kAKPq9qvpFck .milestoneText{font-style:italic}#mermaid-svg-lUW3kAKPq9qvpFck .doneCritText0,#mermaid-svg-lUW3kAKPq9qvpFck .doneCritText1,#mermaid-svg-lUW3kAKPq9qvpFck .doneCritText2,#mermaid-svg-lUW3kAKPq9qvpFck .doneCritText3{fill:#000 !important}#mermaid-svg-lUW3kAKPq9qvpFck .activeCritText0,#mermaid-svg-lUW3kAKPq9qvpFck .activeCritText1,#mermaid-svg-lUW3kAKPq9qvpFck .activeCritText2,#mermaid-svg-lUW3kAKPq9qvpFck .activeCritText3{fill:#000 !important}#mermaid-svg-lUW3kAKPq9qvpFck .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-lUW3kAKPq9qvpFck g.classGroup text .title{font-weight:bolder}#mermaid-svg-lUW3kAKPq9qvpFck g.clickable{cursor:pointer}#mermaid-svg-lUW3kAKPq9qvpFck g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-lUW3kAKPq9qvpFck g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-lUW3kAKPq9qvpFck .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-lUW3kAKPq9qvpFck .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-lUW3kAKPq9qvpFck .dashed-line{stroke-dasharray:3}#mermaid-svg-lUW3kAKPq9qvpFck #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck .commit-id,#mermaid-svg-lUW3kAKPq9qvpFck .commit-msg,#mermaid-svg-lUW3kAKPq9qvpFck .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-lUW3kAKPq9qvpFck g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-lUW3kAKPq9qvpFck g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-lUW3kAKPq9qvpFck g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-lUW3kAKPq9qvpFck .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-lUW3kAKPq9qvpFck .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-lUW3kAKPq9qvpFck .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-lUW3kAKPq9qvpFck .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-lUW3kAKPq9qvpFck .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-lUW3kAKPq9qvpFck .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-lUW3kAKPq9qvpFck .edgeLabel text{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-lUW3kAKPq9qvpFck .node circle.state-start{fill:black;stroke:black}#mermaid-svg-lUW3kAKPq9qvpFck .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-lUW3kAKPq9qvpFck #statediagram-barbEnd{fill:#9370db}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-state .divider{stroke:#9370db}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-lUW3kAKPq9qvpFck .note-edge{stroke-dasharray:5}#mermaid-svg-lUW3kAKPq9qvpFck .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-lUW3kAKPq9qvpFck .error-icon{fill:#522}#mermaid-svg-lUW3kAKPq9qvpFck .error-text{fill:#522;stroke:#522}#mermaid-svg-lUW3kAKPq9qvpFck .edge-thickness-normal{stroke-width:2px}#mermaid-svg-lUW3kAKPq9qvpFck .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-lUW3kAKPq9qvpFck .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-lUW3kAKPq9qvpFck .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-lUW3kAKPq9qvpFck .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-lUW3kAKPq9qvpFck .marker{fill:#333}#mermaid-svg-lUW3kAKPq9qvpFck .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-lUW3kAKPq9qvpFck { color: rgba(0, 0, 0, 0.75); font: ; } 1 2 3 4 5 6 和AudioFlinger交互 7 8 返回加载结果 9 main_audioserver AudioFlinger AudioPolicyService AudioPolicyManager 解析包含设备的xml配置 初始化Engine并解析策略xml 加载xml解析出的模块 打开输入输出流

经过上面的流程系统音频服务已经启动处于待命状态,如果有应用需要播放则会通过服务最终选择合适的硬件将声音播出,接下来按照上面的流程进行进一步的细分。

1.1 开机启动音频服务

音频服务在frameworks/av/media/audioserver/main_audioserver.cpp中,这里会启动音频的AudioFlinger和AudioPolicyService两大组件,简单的流程如下:

#mermaid-svg-mqLXGdGPlaerIUoj .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-mqLXGdGPlaerIUoj .label text{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .node rect,#mermaid-svg-mqLXGdGPlaerIUoj .node circle,#mermaid-svg-mqLXGdGPlaerIUoj .node ellipse,#mermaid-svg-mqLXGdGPlaerIUoj .node polygon,#mermaid-svg-mqLXGdGPlaerIUoj .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-mqLXGdGPlaerIUoj .node .label{text-align:center;fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .node.clickable{cursor:pointer}#mermaid-svg-mqLXGdGPlaerIUoj .arrowheadPath{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-mqLXGdGPlaerIUoj .flowchart-link{stroke:#333;fill:none}#mermaid-svg-mqLXGdGPlaerIUoj .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-mqLXGdGPlaerIUoj .edgeLabel rect{opacity:0.9}#mermaid-svg-mqLXGdGPlaerIUoj .edgeLabel span{color:#333}#mermaid-svg-mqLXGdGPlaerIUoj .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-mqLXGdGPlaerIUoj .cluster text{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-mqLXGdGPlaerIUoj .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-mqLXGdGPlaerIUoj text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-mqLXGdGPlaerIUoj .actor-line{stroke:grey}#mermaid-svg-mqLXGdGPlaerIUoj .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-mqLXGdGPlaerIUoj .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-mqLXGdGPlaerIUoj #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-mqLXGdGPlaerIUoj .sequenceNumber{fill:#fff}#mermaid-svg-mqLXGdGPlaerIUoj #sequencenumber{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj #crosshead path{fill:#333;stroke:#333}#mermaid-svg-mqLXGdGPlaerIUoj .messageText{fill:#333;stroke:#333}#mermaid-svg-mqLXGdGPlaerIUoj .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-mqLXGdGPlaerIUoj .labelText,#mermaid-svg-mqLXGdGPlaerIUoj .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-mqLXGdGPlaerIUoj .loopText,#mermaid-svg-mqLXGdGPlaerIUoj .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-mqLXGdGPlaerIUoj .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-mqLXGdGPlaerIUoj .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-mqLXGdGPlaerIUoj .noteText,#mermaid-svg-mqLXGdGPlaerIUoj .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-mqLXGdGPlaerIUoj .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-mqLXGdGPlaerIUoj .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-mqLXGdGPlaerIUoj .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-mqLXGdGPlaerIUoj .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .section{stroke:none;opacity:0.2}#mermaid-svg-mqLXGdGPlaerIUoj .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-mqLXGdGPlaerIUoj .section2{fill:#fff400}#mermaid-svg-mqLXGdGPlaerIUoj .section1,#mermaid-svg-mqLXGdGPlaerIUoj .section3{fill:#fff;opacity:0.2}#mermaid-svg-mqLXGdGPlaerIUoj .sectionTitle0{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .sectionTitle1{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .sectionTitle2{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .sectionTitle3{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-mqLXGdGPlaerIUoj .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .grid path{stroke-width:0}#mermaid-svg-mqLXGdGPlaerIUoj .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-mqLXGdGPlaerIUoj .task{stroke-width:2}#mermaid-svg-mqLXGdGPlaerIUoj .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .taskText:not([font-size]){font-size:11px}#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-mqLXGdGPlaerIUoj .task.clickable{cursor:pointer}#mermaid-svg-mqLXGdGPlaerIUoj .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-mqLXGdGPlaerIUoj .taskText0,#mermaid-svg-mqLXGdGPlaerIUoj .taskText1,#mermaid-svg-mqLXGdGPlaerIUoj .taskText2,#mermaid-svg-mqLXGdGPlaerIUoj .taskText3{fill:#fff}#mermaid-svg-mqLXGdGPlaerIUoj .task0,#mermaid-svg-mqLXGdGPlaerIUoj .task1,#mermaid-svg-mqLXGdGPlaerIUoj .task2,#mermaid-svg-mqLXGdGPlaerIUoj .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutside0,#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutside2{fill:#000}#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutside1,#mermaid-svg-mqLXGdGPlaerIUoj .taskTextOutside3{fill:#000}#mermaid-svg-mqLXGdGPlaerIUoj .active0,#mermaid-svg-mqLXGdGPlaerIUoj .active1,#mermaid-svg-mqLXGdGPlaerIUoj .active2,#mermaid-svg-mqLXGdGPlaerIUoj .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-mqLXGdGPlaerIUoj .activeText0,#mermaid-svg-mqLXGdGPlaerIUoj .activeText1,#mermaid-svg-mqLXGdGPlaerIUoj .activeText2,#mermaid-svg-mqLXGdGPlaerIUoj .activeText3{fill:#000 !important}#mermaid-svg-mqLXGdGPlaerIUoj .done0,#mermaid-svg-mqLXGdGPlaerIUoj .done1,#mermaid-svg-mqLXGdGPlaerIUoj .done2,#mermaid-svg-mqLXGdGPlaerIUoj .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-mqLXGdGPlaerIUoj .doneText0,#mermaid-svg-mqLXGdGPlaerIUoj .doneText1,#mermaid-svg-mqLXGdGPlaerIUoj .doneText2,#mermaid-svg-mqLXGdGPlaerIUoj .doneText3{fill:#000 !important}#mermaid-svg-mqLXGdGPlaerIUoj .crit0,#mermaid-svg-mqLXGdGPlaerIUoj .crit1,#mermaid-svg-mqLXGdGPlaerIUoj .crit2,#mermaid-svg-mqLXGdGPlaerIUoj .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-mqLXGdGPlaerIUoj .activeCrit0,#mermaid-svg-mqLXGdGPlaerIUoj .activeCrit1,#mermaid-svg-mqLXGdGPlaerIUoj .activeCrit2,#mermaid-svg-mqLXGdGPlaerIUoj .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-mqLXGdGPlaerIUoj .doneCrit0,#mermaid-svg-mqLXGdGPlaerIUoj .doneCrit1,#mermaid-svg-mqLXGdGPlaerIUoj .doneCrit2,#mermaid-svg-mqLXGdGPlaerIUoj .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-mqLXGdGPlaerIUoj .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-mqLXGdGPlaerIUoj .milestoneText{font-style:italic}#mermaid-svg-mqLXGdGPlaerIUoj .doneCritText0,#mermaid-svg-mqLXGdGPlaerIUoj .doneCritText1,#mermaid-svg-mqLXGdGPlaerIUoj .doneCritText2,#mermaid-svg-mqLXGdGPlaerIUoj .doneCritText3{fill:#000 !important}#mermaid-svg-mqLXGdGPlaerIUoj .activeCritText0,#mermaid-svg-mqLXGdGPlaerIUoj .activeCritText1,#mermaid-svg-mqLXGdGPlaerIUoj .activeCritText2,#mermaid-svg-mqLXGdGPlaerIUoj .activeCritText3{fill:#000 !important}#mermaid-svg-mqLXGdGPlaerIUoj .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-mqLXGdGPlaerIUoj g.classGroup text .title{font-weight:bolder}#mermaid-svg-mqLXGdGPlaerIUoj g.clickable{cursor:pointer}#mermaid-svg-mqLXGdGPlaerIUoj g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-mqLXGdGPlaerIUoj g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-mqLXGdGPlaerIUoj .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-mqLXGdGPlaerIUoj .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-mqLXGdGPlaerIUoj .dashed-line{stroke-dasharray:3}#mermaid-svg-mqLXGdGPlaerIUoj #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj .commit-id,#mermaid-svg-mqLXGdGPlaerIUoj .commit-msg,#mermaid-svg-mqLXGdGPlaerIUoj .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-mqLXGdGPlaerIUoj g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-mqLXGdGPlaerIUoj g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-mqLXGdGPlaerIUoj g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-mqLXGdGPlaerIUoj .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-mqLXGdGPlaerIUoj .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-mqLXGdGPlaerIUoj .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-mqLXGdGPlaerIUoj .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-mqLXGdGPlaerIUoj .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-mqLXGdGPlaerIUoj .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-mqLXGdGPlaerIUoj .edgeLabel text{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-mqLXGdGPlaerIUoj .node circle.state-start{fill:black;stroke:black}#mermaid-svg-mqLXGdGPlaerIUoj .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-mqLXGdGPlaerIUoj #statediagram-barbEnd{fill:#9370db}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-state .divider{stroke:#9370db}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-mqLXGdGPlaerIUoj .note-edge{stroke-dasharray:5}#mermaid-svg-mqLXGdGPlaerIUoj .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-mqLXGdGPlaerIUoj .error-icon{fill:#522}#mermaid-svg-mqLXGdGPlaerIUoj .error-text{fill:#522;stroke:#522}#mermaid-svg-mqLXGdGPlaerIUoj .edge-thickness-normal{stroke-width:2px}#mermaid-svg-mqLXGdGPlaerIUoj .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-mqLXGdGPlaerIUoj .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-mqLXGdGPlaerIUoj .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-mqLXGdGPlaerIUoj .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-mqLXGdGPlaerIUoj .marker{fill:#333}#mermaid-svg-mqLXGdGPlaerIUoj .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-mqLXGdGPlaerIUoj { color: rgba(0, 0, 0, 0.75); font: ; } 1 instantiate 2 instantiate main_audioserver AudioFlinger AudioPolicyService

经过上面流程之后音频系统中会启动AudioFlinger用于处理后面所有的音频播放,AudioFlinger具体的功能后面再详细分析,AudioPolicyService负责后面的音频策略的处理等流程,AudioFlinger和AudioPolicyService之间进行交互

1.2 AudioFlinger模块加载

通过上面流程会调用到AudioFlinger的构造函数,进行AudioFlinger模块的处理,流程如下:

#mermaid-svg-OqEfCaipk2NyQBQw .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-OqEfCaipk2NyQBQw .label text{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .node rect,#mermaid-svg-OqEfCaipk2NyQBQw .node circle,#mermaid-svg-OqEfCaipk2NyQBQw .node ellipse,#mermaid-svg-OqEfCaipk2NyQBQw .node polygon,#mermaid-svg-OqEfCaipk2NyQBQw .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-OqEfCaipk2NyQBQw .node .label{text-align:center;fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .node.clickable{cursor:pointer}#mermaid-svg-OqEfCaipk2NyQBQw .arrowheadPath{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-OqEfCaipk2NyQBQw .flowchart-link{stroke:#333;fill:none}#mermaid-svg-OqEfCaipk2NyQBQw .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-OqEfCaipk2NyQBQw .edgeLabel rect{opacity:0.9}#mermaid-svg-OqEfCaipk2NyQBQw .edgeLabel span{color:#333}#mermaid-svg-OqEfCaipk2NyQBQw .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-OqEfCaipk2NyQBQw .cluster text{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-OqEfCaipk2NyQBQw .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-OqEfCaipk2NyQBQw text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-OqEfCaipk2NyQBQw .actor-line{stroke:grey}#mermaid-svg-OqEfCaipk2NyQBQw .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-OqEfCaipk2NyQBQw .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-OqEfCaipk2NyQBQw #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-OqEfCaipk2NyQBQw .sequenceNumber{fill:#fff}#mermaid-svg-OqEfCaipk2NyQBQw #sequencenumber{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw #crosshead path{fill:#333;stroke:#333}#mermaid-svg-OqEfCaipk2NyQBQw .messageText{fill:#333;stroke:#333}#mermaid-svg-OqEfCaipk2NyQBQw .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-OqEfCaipk2NyQBQw .labelText,#mermaid-svg-OqEfCaipk2NyQBQw .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-OqEfCaipk2NyQBQw .loopText,#mermaid-svg-OqEfCaipk2NyQBQw .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-OqEfCaipk2NyQBQw .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-OqEfCaipk2NyQBQw .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-OqEfCaipk2NyQBQw .noteText,#mermaid-svg-OqEfCaipk2NyQBQw .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-OqEfCaipk2NyQBQw .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-OqEfCaipk2NyQBQw .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-OqEfCaipk2NyQBQw .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-OqEfCaipk2NyQBQw .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .section{stroke:none;opacity:0.2}#mermaid-svg-OqEfCaipk2NyQBQw .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-OqEfCaipk2NyQBQw .section2{fill:#fff400}#mermaid-svg-OqEfCaipk2NyQBQw .section1,#mermaid-svg-OqEfCaipk2NyQBQw .section3{fill:#fff;opacity:0.2}#mermaid-svg-OqEfCaipk2NyQBQw .sectionTitle0{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .sectionTitle1{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .sectionTitle2{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .sectionTitle3{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-OqEfCaipk2NyQBQw .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .grid path{stroke-width:0}#mermaid-svg-OqEfCaipk2NyQBQw .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-OqEfCaipk2NyQBQw .task{stroke-width:2}#mermaid-svg-OqEfCaipk2NyQBQw .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .taskText:not([font-size]){font-size:11px}#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-OqEfCaipk2NyQBQw .task.clickable{cursor:pointer}#mermaid-svg-OqEfCaipk2NyQBQw .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-OqEfCaipk2NyQBQw .taskText0,#mermaid-svg-OqEfCaipk2NyQBQw .taskText1,#mermaid-svg-OqEfCaipk2NyQBQw .taskText2,#mermaid-svg-OqEfCaipk2NyQBQw .taskText3{fill:#fff}#mermaid-svg-OqEfCaipk2NyQBQw .task0,#mermaid-svg-OqEfCaipk2NyQBQw .task1,#mermaid-svg-OqEfCaipk2NyQBQw .task2,#mermaid-svg-OqEfCaipk2NyQBQw .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutside0,#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutside2{fill:#000}#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutside1,#mermaid-svg-OqEfCaipk2NyQBQw .taskTextOutside3{fill:#000}#mermaid-svg-OqEfCaipk2NyQBQw .active0,#mermaid-svg-OqEfCaipk2NyQBQw .active1,#mermaid-svg-OqEfCaipk2NyQBQw .active2,#mermaid-svg-OqEfCaipk2NyQBQw .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-OqEfCaipk2NyQBQw .activeText0,#mermaid-svg-OqEfCaipk2NyQBQw .activeText1,#mermaid-svg-OqEfCaipk2NyQBQw .activeText2,#mermaid-svg-OqEfCaipk2NyQBQw .activeText3{fill:#000 !important}#mermaid-svg-OqEfCaipk2NyQBQw .done0,#mermaid-svg-OqEfCaipk2NyQBQw .done1,#mermaid-svg-OqEfCaipk2NyQBQw .done2,#mermaid-svg-OqEfCaipk2NyQBQw .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-OqEfCaipk2NyQBQw .doneText0,#mermaid-svg-OqEfCaipk2NyQBQw .doneText1,#mermaid-svg-OqEfCaipk2NyQBQw .doneText2,#mermaid-svg-OqEfCaipk2NyQBQw .doneText3{fill:#000 !important}#mermaid-svg-OqEfCaipk2NyQBQw .crit0,#mermaid-svg-OqEfCaipk2NyQBQw .crit1,#mermaid-svg-OqEfCaipk2NyQBQw .crit2,#mermaid-svg-OqEfCaipk2NyQBQw .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-OqEfCaipk2NyQBQw .activeCrit0,#mermaid-svg-OqEfCaipk2NyQBQw .activeCrit1,#mermaid-svg-OqEfCaipk2NyQBQw .activeCrit2,#mermaid-svg-OqEfCaipk2NyQBQw .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-OqEfCaipk2NyQBQw .doneCrit0,#mermaid-svg-OqEfCaipk2NyQBQw .doneCrit1,#mermaid-svg-OqEfCaipk2NyQBQw .doneCrit2,#mermaid-svg-OqEfCaipk2NyQBQw .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-OqEfCaipk2NyQBQw .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-OqEfCaipk2NyQBQw .milestoneText{font-style:italic}#mermaid-svg-OqEfCaipk2NyQBQw .doneCritText0,#mermaid-svg-OqEfCaipk2NyQBQw .doneCritText1,#mermaid-svg-OqEfCaipk2NyQBQw .doneCritText2,#mermaid-svg-OqEfCaipk2NyQBQw .doneCritText3{fill:#000 !important}#mermaid-svg-OqEfCaipk2NyQBQw .activeCritText0,#mermaid-svg-OqEfCaipk2NyQBQw .activeCritText1,#mermaid-svg-OqEfCaipk2NyQBQw .activeCritText2,#mermaid-svg-OqEfCaipk2NyQBQw .activeCritText3{fill:#000 !important}#mermaid-svg-OqEfCaipk2NyQBQw .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-OqEfCaipk2NyQBQw g.classGroup text .title{font-weight:bolder}#mermaid-svg-OqEfCaipk2NyQBQw g.clickable{cursor:pointer}#mermaid-svg-OqEfCaipk2NyQBQw g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-OqEfCaipk2NyQBQw g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-OqEfCaipk2NyQBQw .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-OqEfCaipk2NyQBQw .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-OqEfCaipk2NyQBQw .dashed-line{stroke-dasharray:3}#mermaid-svg-OqEfCaipk2NyQBQw #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw .commit-id,#mermaid-svg-OqEfCaipk2NyQBQw .commit-msg,#mermaid-svg-OqEfCaipk2NyQBQw .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-OqEfCaipk2NyQBQw g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-OqEfCaipk2NyQBQw g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-OqEfCaipk2NyQBQw g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-OqEfCaipk2NyQBQw .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-OqEfCaipk2NyQBQw .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-OqEfCaipk2NyQBQw .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-OqEfCaipk2NyQBQw .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-OqEfCaipk2NyQBQw .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-OqEfCaipk2NyQBQw .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-OqEfCaipk2NyQBQw .edgeLabel text{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-OqEfCaipk2NyQBQw .node circle.state-start{fill:black;stroke:black}#mermaid-svg-OqEfCaipk2NyQBQw .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-OqEfCaipk2NyQBQw #statediagram-barbEnd{fill:#9370db}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-state .divider{stroke:#9370db}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-OqEfCaipk2NyQBQw .note-edge{stroke-dasharray:5}#mermaid-svg-OqEfCaipk2NyQBQw .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-OqEfCaipk2NyQBQw .error-icon{fill:#522}#mermaid-svg-OqEfCaipk2NyQBQw .error-text{fill:#522;stroke:#522}#mermaid-svg-OqEfCaipk2NyQBQw .edge-thickness-normal{stroke-width:2px}#mermaid-svg-OqEfCaipk2NyQBQw .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-OqEfCaipk2NyQBQw .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-OqEfCaipk2NyQBQw .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-OqEfCaipk2NyQBQw .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-OqEfCaipk2NyQBQw .marker{fill:#333}#mermaid-svg-OqEfCaipk2NyQBQw .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-OqEfCaipk2NyQBQw { color: rgba(0, 0, 0, 0.75); font: ; } onFirstRef 构造函数 DevicesFactoryHalInterface.cpp 1 2 DevicesFactoryHalCallbackImpl EffectsFactoryHalInterface::create DevicesFactoryHalInterface::create create AudioFlinger

在上面的构造函数中实例化了设备接口以及音效接口,此时AudioFlinger模块已经成功创建出来,后面即使AudioPolicyService创建出来后和AudioFlinger之间的交互过程

1.3 AudioPolicyService模块加载

AudioPolicyService负责音频的一些策略管理以及命令处理,具体的启动流程如下:

#mermaid-svg-b9GJn5G0sVRH34s7 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .label text{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .node rect,#mermaid-svg-b9GJn5G0sVRH34s7 .node circle,#mermaid-svg-b9GJn5G0sVRH34s7 .node ellipse,#mermaid-svg-b9GJn5G0sVRH34s7 .node polygon,#mermaid-svg-b9GJn5G0sVRH34s7 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-b9GJn5G0sVRH34s7 .node .label{text-align:center;fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .node.clickable{cursor:pointer}#mermaid-svg-b9GJn5G0sVRH34s7 .arrowheadPath{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-b9GJn5G0sVRH34s7 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-b9GJn5G0sVRH34s7 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-b9GJn5G0sVRH34s7 .edgeLabel rect{opacity:0.9}#mermaid-svg-b9GJn5G0sVRH34s7 .edgeLabel span{color:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-b9GJn5G0sVRH34s7 .cluster text{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-b9GJn5G0sVRH34s7 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-b9GJn5G0sVRH34s7 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-b9GJn5G0sVRH34s7 .actor-line{stroke:grey}#mermaid-svg-b9GJn5G0sVRH34s7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-b9GJn5G0sVRH34s7 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .sequenceNumber{fill:#fff}#mermaid-svg-b9GJn5G0sVRH34s7 #sequencenumber{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .messageText{fill:#333;stroke:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-b9GJn5G0sVRH34s7 .labelText,#mermaid-svg-b9GJn5G0sVRH34s7 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-b9GJn5G0sVRH34s7 .loopText,#mermaid-svg-b9GJn5G0sVRH34s7 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-b9GJn5G0sVRH34s7 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-b9GJn5G0sVRH34s7 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-b9GJn5G0sVRH34s7 .noteText,#mermaid-svg-b9GJn5G0sVRH34s7 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-b9GJn5G0sVRH34s7 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-b9GJn5G0sVRH34s7 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-b9GJn5G0sVRH34s7 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-b9GJn5G0sVRH34s7 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .section{stroke:none;opacity:0.2}#mermaid-svg-b9GJn5G0sVRH34s7 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-b9GJn5G0sVRH34s7 .section2{fill:#fff400}#mermaid-svg-b9GJn5G0sVRH34s7 .section1,#mermaid-svg-b9GJn5G0sVRH34s7 .section3{fill:#fff;opacity:0.2}#mermaid-svg-b9GJn5G0sVRH34s7 .sectionTitle0{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .sectionTitle1{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .sectionTitle2{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .sectionTitle3{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-b9GJn5G0sVRH34s7 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .grid path{stroke-width:0}#mermaid-svg-b9GJn5G0sVRH34s7 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-b9GJn5G0sVRH34s7 .task{stroke-width:2}#mermaid-svg-b9GJn5G0sVRH34s7 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .taskText:not([font-size]){font-size:11px}#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-b9GJn5G0sVRH34s7 .task.clickable{cursor:pointer}#mermaid-svg-b9GJn5G0sVRH34s7 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-b9GJn5G0sVRH34s7 .taskText0,#mermaid-svg-b9GJn5G0sVRH34s7 .taskText1,#mermaid-svg-b9GJn5G0sVRH34s7 .taskText2,#mermaid-svg-b9GJn5G0sVRH34s7 .taskText3{fill:#fff}#mermaid-svg-b9GJn5G0sVRH34s7 .task0,#mermaid-svg-b9GJn5G0sVRH34s7 .task1,#mermaid-svg-b9GJn5G0sVRH34s7 .task2,#mermaid-svg-b9GJn5G0sVRH34s7 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutside0,#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutside2{fill:#000}#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutside1,#mermaid-svg-b9GJn5G0sVRH34s7 .taskTextOutside3{fill:#000}#mermaid-svg-b9GJn5G0sVRH34s7 .active0,#mermaid-svg-b9GJn5G0sVRH34s7 .active1,#mermaid-svg-b9GJn5G0sVRH34s7 .active2,#mermaid-svg-b9GJn5G0sVRH34s7 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-b9GJn5G0sVRH34s7 .activeText0,#mermaid-svg-b9GJn5G0sVRH34s7 .activeText1,#mermaid-svg-b9GJn5G0sVRH34s7 .activeText2,#mermaid-svg-b9GJn5G0sVRH34s7 .activeText3{fill:#000 !important}#mermaid-svg-b9GJn5G0sVRH34s7 .done0,#mermaid-svg-b9GJn5G0sVRH34s7 .done1,#mermaid-svg-b9GJn5G0sVRH34s7 .done2,#mermaid-svg-b9GJn5G0sVRH34s7 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-b9GJn5G0sVRH34s7 .doneText0,#mermaid-svg-b9GJn5G0sVRH34s7 .doneText1,#mermaid-svg-b9GJn5G0sVRH34s7 .doneText2,#mermaid-svg-b9GJn5G0sVRH34s7 .doneText3{fill:#000 !important}#mermaid-svg-b9GJn5G0sVRH34s7 .crit0,#mermaid-svg-b9GJn5G0sVRH34s7 .crit1,#mermaid-svg-b9GJn5G0sVRH34s7 .crit2,#mermaid-svg-b9GJn5G0sVRH34s7 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-b9GJn5G0sVRH34s7 .activeCrit0,#mermaid-svg-b9GJn5G0sVRH34s7 .activeCrit1,#mermaid-svg-b9GJn5G0sVRH34s7 .activeCrit2,#mermaid-svg-b9GJn5G0sVRH34s7 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-b9GJn5G0sVRH34s7 .doneCrit0,#mermaid-svg-b9GJn5G0sVRH34s7 .doneCrit1,#mermaid-svg-b9GJn5G0sVRH34s7 .doneCrit2,#mermaid-svg-b9GJn5G0sVRH34s7 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-b9GJn5G0sVRH34s7 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-b9GJn5G0sVRH34s7 .milestoneText{font-style:italic}#mermaid-svg-b9GJn5G0sVRH34s7 .doneCritText0,#mermaid-svg-b9GJn5G0sVRH34s7 .doneCritText1,#mermaid-svg-b9GJn5G0sVRH34s7 .doneCritText2,#mermaid-svg-b9GJn5G0sVRH34s7 .doneCritText3{fill:#000 !important}#mermaid-svg-b9GJn5G0sVRH34s7 .activeCritText0,#mermaid-svg-b9GJn5G0sVRH34s7 .activeCritText1,#mermaid-svg-b9GJn5G0sVRH34s7 .activeCritText2,#mermaid-svg-b9GJn5G0sVRH34s7 .activeCritText3{fill:#000 !important}#mermaid-svg-b9GJn5G0sVRH34s7 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-b9GJn5G0sVRH34s7 g.classGroup text .title{font-weight:bolder}#mermaid-svg-b9GJn5G0sVRH34s7 g.clickable{cursor:pointer}#mermaid-svg-b9GJn5G0sVRH34s7 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-b9GJn5G0sVRH34s7 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-b9GJn5G0sVRH34s7 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-b9GJn5G0sVRH34s7 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-b9GJn5G0sVRH34s7 .dashed-line{stroke-dasharray:3}#mermaid-svg-b9GJn5G0sVRH34s7 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 .commit-id,#mermaid-svg-b9GJn5G0sVRH34s7 .commit-msg,#mermaid-svg-b9GJn5G0sVRH34s7 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-b9GJn5G0sVRH34s7 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-b9GJn5G0sVRH34s7 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-b9GJn5G0sVRH34s7 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-b9GJn5G0sVRH34s7 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-b9GJn5G0sVRH34s7 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-b9GJn5G0sVRH34s7 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-b9GJn5G0sVRH34s7 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-b9GJn5G0sVRH34s7 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-b9GJn5G0sVRH34s7 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-b9GJn5G0sVRH34s7 .edgeLabel text{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-b9GJn5G0sVRH34s7 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-b9GJn5G0sVRH34s7 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-b9GJn5G0sVRH34s7 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-b9GJn5G0sVRH34s7 .note-edge{stroke-dasharray:5}#mermaid-svg-b9GJn5G0sVRH34s7 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-b9GJn5G0sVRH34s7 .error-icon{fill:#522}#mermaid-svg-b9GJn5G0sVRH34s7 .error-text{fill:#522;stroke:#522}#mermaid-svg-b9GJn5G0sVRH34s7 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-b9GJn5G0sVRH34s7 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-b9GJn5G0sVRH34s7 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-b9GJn5G0sVRH34s7 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-b9GJn5G0sVRH34s7 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-b9GJn5G0sVRH34s7 .marker{fill:#333}#mermaid-svg-b9GJn5G0sVRH34s7 .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-b9GJn5G0sVRH34s7 { color: rgba(0, 0, 0, 0.75); font: ; } Engine xml文件解析 AudioPolicyManager AudioPolicyService 1 启动音频命令处理线程 2 启动output活跃命令线程 3 4 5 2 1 传入APM持有的AudioPolicyConfig对象,解析出来放在这里 解析xml配置文件 这里是一个模板,会解析出所有的内容 1 加载音频engine库 2 根据前面加载的库调用该函数创建Engine对象 3 设置APM为监听者 4 初始化检查 5 打开访问附加设备所需的所有输出流 和AudioFlinger交互 load createEngine setObserver initCheck deserializeAudioPolicyXmlConfig deserializeAudioPolicyFile PolicySerializer::deserialize deserializeCollection deserialize AudioPolicyManagerSPRD构造 AudioPolicyManager构造 loadConfig initialize onNewAudioModulesAvailableInt APS构造函数 onFirstRef new-AudioCommandThread new1-AudioCommandThread new-AudioPolicyClient createAudioPolicyManager new-AudioPolicyEffects AudioFlinger 这里调用的createAudioPolicyManager定义在vendor/sprd/modules/audio/newapm/R.x/AudioPolicyManagerSPRD.cpp中解析的配置文件包含audio_policy_configuration.xml,用于解析包含音频策略在内的一些配置文件deserializeAudioPolicyFile方法定义在frameworks/av/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp文件中primary_audio_policy_configuration.xml文件解析流程配置解析Engine配置分析

总结:

首先分析了从AudioPolicyService创建AudioPolicyManager的流程,这里涉及到第三方自己的AudioPolicyManager,所以中间多了一个AudioPolicyManagerSPRD的创建有了AudioPolicyManager对象之后需要加载音频的一些配置文件,包括描述所有外部设备以及设备之间路由情况的primary_audio_policy_configuration.xml,这个xml文件解析之后会将内容存放到AudioPolicyManager持有的AudioPolicyConfig对象中,具体的作用我们后面分析加载完xml之后就是进行Engine对象的创建,这个Engine对象负责管理音频策略相关的内容Engine对象创建完毕之后需要对xml解析出来的内容进行处理,这部分涉及和AudioFlinger的交互,放在后面一节讲述 1.3.1 AudioPolicyService和AudioFlinger交互流程 #mermaid-svg-JNxeD6NPpwjqtxaG .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .label text{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .node rect,#mermaid-svg-JNxeD6NPpwjqtxaG .node circle,#mermaid-svg-JNxeD6NPpwjqtxaG .node ellipse,#mermaid-svg-JNxeD6NPpwjqtxaG .node polygon,#mermaid-svg-JNxeD6NPpwjqtxaG .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-JNxeD6NPpwjqtxaG .node .label{text-align:center;fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .node.clickable{cursor:pointer}#mermaid-svg-JNxeD6NPpwjqtxaG .arrowheadPath{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-JNxeD6NPpwjqtxaG .flowchart-link{stroke:#333;fill:none}#mermaid-svg-JNxeD6NPpwjqtxaG .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-JNxeD6NPpwjqtxaG .edgeLabel rect{opacity:0.9}#mermaid-svg-JNxeD6NPpwjqtxaG .edgeLabel span{color:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-JNxeD6NPpwjqtxaG .cluster text{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-JNxeD6NPpwjqtxaG .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-JNxeD6NPpwjqtxaG text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-JNxeD6NPpwjqtxaG .actor-line{stroke:grey}#mermaid-svg-JNxeD6NPpwjqtxaG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-JNxeD6NPpwjqtxaG #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .sequenceNumber{fill:#fff}#mermaid-svg-JNxeD6NPpwjqtxaG #sequencenumber{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG #crosshead path{fill:#333;stroke:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .messageText{fill:#333;stroke:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-JNxeD6NPpwjqtxaG .labelText,#mermaid-svg-JNxeD6NPpwjqtxaG .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-JNxeD6NPpwjqtxaG .loopText,#mermaid-svg-JNxeD6NPpwjqtxaG .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-JNxeD6NPpwjqtxaG .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-JNxeD6NPpwjqtxaG .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-JNxeD6NPpwjqtxaG .noteText,#mermaid-svg-JNxeD6NPpwjqtxaG .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-JNxeD6NPpwjqtxaG .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-JNxeD6NPpwjqtxaG .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-JNxeD6NPpwjqtxaG .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-JNxeD6NPpwjqtxaG .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .section{stroke:none;opacity:0.2}#mermaid-svg-JNxeD6NPpwjqtxaG .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-JNxeD6NPpwjqtxaG .section2{fill:#fff400}#mermaid-svg-JNxeD6NPpwjqtxaG .section1,#mermaid-svg-JNxeD6NPpwjqtxaG .section3{fill:#fff;opacity:0.2}#mermaid-svg-JNxeD6NPpwjqtxaG .sectionTitle0{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .sectionTitle1{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .sectionTitle2{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .sectionTitle3{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-JNxeD6NPpwjqtxaG .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .grid path{stroke-width:0}#mermaid-svg-JNxeD6NPpwjqtxaG .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-JNxeD6NPpwjqtxaG .task{stroke-width:2}#mermaid-svg-JNxeD6NPpwjqtxaG .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .taskText:not([font-size]){font-size:11px}#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-JNxeD6NPpwjqtxaG .task.clickable{cursor:pointer}#mermaid-svg-JNxeD6NPpwjqtxaG .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-JNxeD6NPpwjqtxaG .taskText0,#mermaid-svg-JNxeD6NPpwjqtxaG .taskText1,#mermaid-svg-JNxeD6NPpwjqtxaG .taskText2,#mermaid-svg-JNxeD6NPpwjqtxaG .taskText3{fill:#fff}#mermaid-svg-JNxeD6NPpwjqtxaG .task0,#mermaid-svg-JNxeD6NPpwjqtxaG .task1,#mermaid-svg-JNxeD6NPpwjqtxaG .task2,#mermaid-svg-JNxeD6NPpwjqtxaG .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutside0,#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutside2{fill:#000}#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutside1,#mermaid-svg-JNxeD6NPpwjqtxaG .taskTextOutside3{fill:#000}#mermaid-svg-JNxeD6NPpwjqtxaG .active0,#mermaid-svg-JNxeD6NPpwjqtxaG .active1,#mermaid-svg-JNxeD6NPpwjqtxaG .active2,#mermaid-svg-JNxeD6NPpwjqtxaG .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-JNxeD6NPpwjqtxaG .activeText0,#mermaid-svg-JNxeD6NPpwjqtxaG .activeText1,#mermaid-svg-JNxeD6NPpwjqtxaG .activeText2,#mermaid-svg-JNxeD6NPpwjqtxaG .activeText3{fill:#000 !important}#mermaid-svg-JNxeD6NPpwjqtxaG .done0,#mermaid-svg-JNxeD6NPpwjqtxaG .done1,#mermaid-svg-JNxeD6NPpwjqtxaG .done2,#mermaid-svg-JNxeD6NPpwjqtxaG .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-JNxeD6NPpwjqtxaG .doneText0,#mermaid-svg-JNxeD6NPpwjqtxaG .doneText1,#mermaid-svg-JNxeD6NPpwjqtxaG .doneText2,#mermaid-svg-JNxeD6NPpwjqtxaG .doneText3{fill:#000 !important}#mermaid-svg-JNxeD6NPpwjqtxaG .crit0,#mermaid-svg-JNxeD6NPpwjqtxaG .crit1,#mermaid-svg-JNxeD6NPpwjqtxaG .crit2,#mermaid-svg-JNxeD6NPpwjqtxaG .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-JNxeD6NPpwjqtxaG .activeCrit0,#mermaid-svg-JNxeD6NPpwjqtxaG .activeCrit1,#mermaid-svg-JNxeD6NPpwjqtxaG .activeCrit2,#mermaid-svg-JNxeD6NPpwjqtxaG .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-JNxeD6NPpwjqtxaG .doneCrit0,#mermaid-svg-JNxeD6NPpwjqtxaG .doneCrit1,#mermaid-svg-JNxeD6NPpwjqtxaG .doneCrit2,#mermaid-svg-JNxeD6NPpwjqtxaG .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-JNxeD6NPpwjqtxaG .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-JNxeD6NPpwjqtxaG .milestoneText{font-style:italic}#mermaid-svg-JNxeD6NPpwjqtxaG .doneCritText0,#mermaid-svg-JNxeD6NPpwjqtxaG .doneCritText1,#mermaid-svg-JNxeD6NPpwjqtxaG .doneCritText2,#mermaid-svg-JNxeD6NPpwjqtxaG .doneCritText3{fill:#000 !important}#mermaid-svg-JNxeD6NPpwjqtxaG .activeCritText0,#mermaid-svg-JNxeD6NPpwjqtxaG .activeCritText1,#mermaid-svg-JNxeD6NPpwjqtxaG .activeCritText2,#mermaid-svg-JNxeD6NPpwjqtxaG .activeCritText3{fill:#000 !important}#mermaid-svg-JNxeD6NPpwjqtxaG .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-JNxeD6NPpwjqtxaG g.classGroup text .title{font-weight:bolder}#mermaid-svg-JNxeD6NPpwjqtxaG g.clickable{cursor:pointer}#mermaid-svg-JNxeD6NPpwjqtxaG g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-JNxeD6NPpwjqtxaG g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-JNxeD6NPpwjqtxaG .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-JNxeD6NPpwjqtxaG .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-JNxeD6NPpwjqtxaG .dashed-line{stroke-dasharray:3}#mermaid-svg-JNxeD6NPpwjqtxaG #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG .commit-id,#mermaid-svg-JNxeD6NPpwjqtxaG .commit-msg,#mermaid-svg-JNxeD6NPpwjqtxaG .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-JNxeD6NPpwjqtxaG g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-JNxeD6NPpwjqtxaG g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-JNxeD6NPpwjqtxaG g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-JNxeD6NPpwjqtxaG .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-JNxeD6NPpwjqtxaG .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-JNxeD6NPpwjqtxaG .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-JNxeD6NPpwjqtxaG .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-JNxeD6NPpwjqtxaG .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-JNxeD6NPpwjqtxaG .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-JNxeD6NPpwjqtxaG .edgeLabel text{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JNxeD6NPpwjqtxaG .node circle.state-start{fill:black;stroke:black}#mermaid-svg-JNxeD6NPpwjqtxaG .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-JNxeD6NPpwjqtxaG #statediagram-barbEnd{fill:#9370db}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-state .divider{stroke:#9370db}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-JNxeD6NPpwjqtxaG .note-edge{stroke-dasharray:5}#mermaid-svg-JNxeD6NPpwjqtxaG .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-JNxeD6NPpwjqtxaG .error-icon{fill:#522}#mermaid-svg-JNxeD6NPpwjqtxaG .error-text{fill:#522;stroke:#522}#mermaid-svg-JNxeD6NPpwjqtxaG .edge-thickness-normal{stroke-width:2px}#mermaid-svg-JNxeD6NPpwjqtxaG .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-JNxeD6NPpwjqtxaG .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-JNxeD6NPpwjqtxaG .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-JNxeD6NPpwjqtxaG .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-JNxeD6NPpwjqtxaG .marker{fill:#333}#mermaid-svg-JNxeD6NPpwjqtxaG .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-JNxeD6NPpwjqtxaG { color: rgba(0, 0, 0, 0.75); font: ; } audio_hw DevicesFactoryHalLocal AudioFlinger AudioPolicyManager 1 1 mDevicesFactoryHal->openDevice 2 new AudioHwDevice 3 add添加到mAudioHwDevs 1 2 1 调用hardware.c中内容打开相应音频HAL层库 2 hardware/audio.h 这里会根据前面加载的库文件进行最终调用 2 将已经成功加载的模块添加到该容器中 3 adev_open openDevice load_audio_interface new-DeviceHalLocal loadHwModule loadHwModule_l onNewAudioModulesAvailableInt mHwModules 打开访问连接设备的所有输入输出流 AudioHwDevice构造 mAudioHwDevs hw_get_module_byclass audio_hw_device_open

这里涉及几个重要的文件位置:

frameworks/av/services/audiopolicy/common/managerdefinitions/include/HwModule.h

hardware/libhardware/include/hardware/audio.h

hardware/libhardware/hardware.c

frameworks/av/media/libaudiohal/impl/DeviceHalLocal.cpp

分析:在hw_get_module_by_class的时候会加载音频库,这里会加载第三方自己实现的库,一般第三方的库中都有对open函数指针的赋值,这里赋的是adev_open;然后调用audio_hw_device_open最终调用到adev_open之后会打开相应的模块,并将所有的操作指针进行赋值,如果成功返回再创建DeviceHalLocal对象,在这里也是为以后调用open_output_stream/open_input_stream等函数做准备,这些函数就包含在这个对象中

1.3.1.1 输入输出设备的打开和线程创建

在前面流程图AudioPolicyManager的第三步,具体代码如下:

void AudioPolicyManager::onNewAudioModulesAvailableInt(DeviceVector *newDevices) { for (const auto& hwModule : mHwModulesAll) { if (std::find(mHwModules.begin(), mHwModules.end(), hwModule) != mHwModules.end()) { continue; } hwModule->setHandle(mpClientInterface->loadHwModule(hwModule->getName())); if (hwModule->getHandle() == AUDIO_MODULE_HANDLE_NONE) { ALOGW("could not open HW module %s", hwModule->getName()); continue; } mHwModules.push_back(hwModule); // 打开访问附加设备所需的所有输出流,除了仅在应用程序实际需 // 要时才打开的直接输出流。这也验证了 mAvailableOutputDevices 列表 for (const auto& outProfile : hwModule->getOutputProfiles()) { if (!outProfile->canOpenNewIo()) { ALOGE("Invalid Output profile max open count %u for profile %s", outProfile->maxOpenCount, outProfile->getTagName().c_str()); continue; } if (!outProfile->hasSupportedDevices()) { ALOGW("Output profile contains no device on module %s", hwModule->getName()); continue; } // 这里和primary_audio_policy_coinfiguration.xml中给hifi音源加的flag进行对应 if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_TTS) != 0) { mTtsOutputAvailable = true; } const DeviceVector &supportedDevices = outProfile->getSupportedDevices(); DeviceVector availProfileDevices = supportedDevices.filter(mOutputDevicesAll); sp<DeviceDescriptor> supportedDevice = 0; if (supportedDevices.contains(mDefaultOutputDevice)) { supportedDevice = mDefaultOutputDevice; } else { // 选择配置文件的 SupportedDevices 中存在的第一个设备, // 也是 mAvailableOutputDevices 的一部分。 if (availProfileDevices.isEmpty()) { continue; } supportedDevice = availProfileDevices.itemAt(0); } if (!mOutputDevicesAll.contains(supportedDevice)) { continue; } // 根据outProfile 得到一个描述符,设置mpClientInterface // 描述了source和sink之间的关系 sp<SwAudioOutputDescriptor> outputDesc = new SwAudioOutputDescriptor(outProfile, mpClientInterface); audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; // 在这里最终调用AudioFlinger的openOutput函数打开这个输出流,并返回表示这个设备的输出流 // 的句柄audio_io_handle_t用于后面AudioTrack创建的时候查找具体的线程使用 status_t status = outputDesc->open(nullptr, DeviceVector(supportedDevice), AUDIO_STREAM_DEFAULT, AUDIO_OUTPUT_FLAG_NONE, &output); if (status != NO_ERROR) { ALOGW("Cannot open output stream for devices %s on hw module %s", // 表示失败,不能打开profile对应的device的输出流 supportedDevice->toString().c_str(), hwModule->getName()); continue; } for (const auto &device : availProfileDevices) { // 一旦确认连接的设备可以访问,就为它提供一个有效的 ID if (!device->isAttached()) { device->attach(hwModule); mAvailableOutputDevices.add(device); // 添加到可用的输出设备中 device->setEncapsulationInfoFromHal(mpClientInterface); if (newDevices) newDevices->add(device); setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE); } } if (mPrimaryOutput == 0 && outProfile->getFlags() & AUDIO_OUTPUT_FLAG_PRIMARY) { mPrimaryOutput = outputDesc; // 设置主音频输出 } if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_DIRECT) != 0) { outputDesc->close(); // 如果是直接输出流则先关闭 } else { // 将这个添加到打开的输出描述符列表mOutputs中(SwAudioOutputCollection类型) addOutput(output, outputDesc); // 设置适合当前Source的输出设备,这一部分内容和修改的pfw文件有关 setOutputDevices(outputDesc, DeviceVector(supportedDevice), true, 0, NULL); } } // 打开访问附加设备所需的输入流以验证 mAvailableInputDevices 列表 for (const auto& inProfile : hwModule->getInputProfiles()) { if (!inProfile->canOpenNewIo()) { ALOGE("Invalid Input profile max open count %u for profile %s", inProfile->maxOpenCount, inProfile->getTagName().c_str()); continue; } // 如果当前sink没有相应的设备支持则结束 if (!inProfile->hasSupportedDevices()) { ALOGW("Input profile contains no device on module %s", hwModule->getName()); continue; } // 选择配置文件中存在的第一个设备支持的设备也是可用输入设备的一部分 const DeviceVector &supportedDevices = inProfile->getSupportedDevices(); DeviceVector availProfileDevices = supportedDevices.filter(mInputDevicesAll); if (availProfileDevices.isEmpty()) { ALOGE("%s: Input device list is empty!", __FUNCTION__); continue; } // 根据inProfile 得到一个描述符,设置mpClientInterface sp<AudioInputDescriptor> inputDesc = new AudioInputDescriptor(inProfile, mpClientInterface); audio_io_handle_t input = AUDIO_IO_HANDLE_NONE; // 这里最终调用到AudioFlinger的openIntput打开输入流 status_t status = inputDesc->open(nullptr, availProfileDevices.itemAt(0), AUDIO_SOURCE_MIC, AUDIO_INPUT_FLAG_NONE, &input); if (status != NO_ERROR) { ALOGW("Cannot open input stream for device %s on hw module %s", availProfileDevices.toString().c_str(), hwModule->getName()); continue; } for (const auto &device : availProfileDevices) { // 一旦确认连接的设备可以访问,就为它提供一个有效的 ID if (!device->isAttached()) { device->attach(hwModule); device->importAudioPortAndPickAudioProfile(inProfile, true); mAvailableInputDevices.add(device); if (newDevices) newDevices->add(device); setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE); } } inputDesc->close(); } } }

上面代码中提到在AudioFlinger中打开了输入和输出设备,下面是输出流打开流程包括线程的创建:

#mermaid-svg-s13EDGpPWPVOsjF6 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .label text{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .node rect,#mermaid-svg-s13EDGpPWPVOsjF6 .node circle,#mermaid-svg-s13EDGpPWPVOsjF6 .node ellipse,#mermaid-svg-s13EDGpPWPVOsjF6 .node polygon,#mermaid-svg-s13EDGpPWPVOsjF6 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-s13EDGpPWPVOsjF6 .node .label{text-align:center;fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .node.clickable{cursor:pointer}#mermaid-svg-s13EDGpPWPVOsjF6 .arrowheadPath{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-s13EDGpPWPVOsjF6 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-s13EDGpPWPVOsjF6 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-s13EDGpPWPVOsjF6 .edgeLabel rect{opacity:0.9}#mermaid-svg-s13EDGpPWPVOsjF6 .edgeLabel span{color:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-s13EDGpPWPVOsjF6 .cluster text{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-s13EDGpPWPVOsjF6 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-s13EDGpPWPVOsjF6 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-s13EDGpPWPVOsjF6 .actor-line{stroke:grey}#mermaid-svg-s13EDGpPWPVOsjF6 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-s13EDGpPWPVOsjF6 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .sequenceNumber{fill:#fff}#mermaid-svg-s13EDGpPWPVOsjF6 #sequencenumber{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .messageText{fill:#333;stroke:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-s13EDGpPWPVOsjF6 .labelText,#mermaid-svg-s13EDGpPWPVOsjF6 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-s13EDGpPWPVOsjF6 .loopText,#mermaid-svg-s13EDGpPWPVOsjF6 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-s13EDGpPWPVOsjF6 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-s13EDGpPWPVOsjF6 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-s13EDGpPWPVOsjF6 .noteText,#mermaid-svg-s13EDGpPWPVOsjF6 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-s13EDGpPWPVOsjF6 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-s13EDGpPWPVOsjF6 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-s13EDGpPWPVOsjF6 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-s13EDGpPWPVOsjF6 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .section{stroke:none;opacity:0.2}#mermaid-svg-s13EDGpPWPVOsjF6 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-s13EDGpPWPVOsjF6 .section2{fill:#fff400}#mermaid-svg-s13EDGpPWPVOsjF6 .section1,#mermaid-svg-s13EDGpPWPVOsjF6 .section3{fill:#fff;opacity:0.2}#mermaid-svg-s13EDGpPWPVOsjF6 .sectionTitle0{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .sectionTitle1{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .sectionTitle2{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .sectionTitle3{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-s13EDGpPWPVOsjF6 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .grid path{stroke-width:0}#mermaid-svg-s13EDGpPWPVOsjF6 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-s13EDGpPWPVOsjF6 .task{stroke-width:2}#mermaid-svg-s13EDGpPWPVOsjF6 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .taskText:not([font-size]){font-size:11px}#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-s13EDGpPWPVOsjF6 .task.clickable{cursor:pointer}#mermaid-svg-s13EDGpPWPVOsjF6 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-s13EDGpPWPVOsjF6 .taskText0,#mermaid-svg-s13EDGpPWPVOsjF6 .taskText1,#mermaid-svg-s13EDGpPWPVOsjF6 .taskText2,#mermaid-svg-s13EDGpPWPVOsjF6 .taskText3{fill:#fff}#mermaid-svg-s13EDGpPWPVOsjF6 .task0,#mermaid-svg-s13EDGpPWPVOsjF6 .task1,#mermaid-svg-s13EDGpPWPVOsjF6 .task2,#mermaid-svg-s13EDGpPWPVOsjF6 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutside0,#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutside2{fill:#000}#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutside1,#mermaid-svg-s13EDGpPWPVOsjF6 .taskTextOutside3{fill:#000}#mermaid-svg-s13EDGpPWPVOsjF6 .active0,#mermaid-svg-s13EDGpPWPVOsjF6 .active1,#mermaid-svg-s13EDGpPWPVOsjF6 .active2,#mermaid-svg-s13EDGpPWPVOsjF6 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-s13EDGpPWPVOsjF6 .activeText0,#mermaid-svg-s13EDGpPWPVOsjF6 .activeText1,#mermaid-svg-s13EDGpPWPVOsjF6 .activeText2,#mermaid-svg-s13EDGpPWPVOsjF6 .activeText3{fill:#000 !important}#mermaid-svg-s13EDGpPWPVOsjF6 .done0,#mermaid-svg-s13EDGpPWPVOsjF6 .done1,#mermaid-svg-s13EDGpPWPVOsjF6 .done2,#mermaid-svg-s13EDGpPWPVOsjF6 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-s13EDGpPWPVOsjF6 .doneText0,#mermaid-svg-s13EDGpPWPVOsjF6 .doneText1,#mermaid-svg-s13EDGpPWPVOsjF6 .doneText2,#mermaid-svg-s13EDGpPWPVOsjF6 .doneText3{fill:#000 !important}#mermaid-svg-s13EDGpPWPVOsjF6 .crit0,#mermaid-svg-s13EDGpPWPVOsjF6 .crit1,#mermaid-svg-s13EDGpPWPVOsjF6 .crit2,#mermaid-svg-s13EDGpPWPVOsjF6 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-s13EDGpPWPVOsjF6 .activeCrit0,#mermaid-svg-s13EDGpPWPVOsjF6 .activeCrit1,#mermaid-svg-s13EDGpPWPVOsjF6 .activeCrit2,#mermaid-svg-s13EDGpPWPVOsjF6 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-s13EDGpPWPVOsjF6 .doneCrit0,#mermaid-svg-s13EDGpPWPVOsjF6 .doneCrit1,#mermaid-svg-s13EDGpPWPVOsjF6 .doneCrit2,#mermaid-svg-s13EDGpPWPVOsjF6 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-s13EDGpPWPVOsjF6 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-s13EDGpPWPVOsjF6 .milestoneText{font-style:italic}#mermaid-svg-s13EDGpPWPVOsjF6 .doneCritText0,#mermaid-svg-s13EDGpPWPVOsjF6 .doneCritText1,#mermaid-svg-s13EDGpPWPVOsjF6 .doneCritText2,#mermaid-svg-s13EDGpPWPVOsjF6 .doneCritText3{fill:#000 !important}#mermaid-svg-s13EDGpPWPVOsjF6 .activeCritText0,#mermaid-svg-s13EDGpPWPVOsjF6 .activeCritText1,#mermaid-svg-s13EDGpPWPVOsjF6 .activeCritText2,#mermaid-svg-s13EDGpPWPVOsjF6 .activeCritText3{fill:#000 !important}#mermaid-svg-s13EDGpPWPVOsjF6 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-s13EDGpPWPVOsjF6 g.classGroup text .title{font-weight:bolder}#mermaid-svg-s13EDGpPWPVOsjF6 g.clickable{cursor:pointer}#mermaid-svg-s13EDGpPWPVOsjF6 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-s13EDGpPWPVOsjF6 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-s13EDGpPWPVOsjF6 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-s13EDGpPWPVOsjF6 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-s13EDGpPWPVOsjF6 .dashed-line{stroke-dasharray:3}#mermaid-svg-s13EDGpPWPVOsjF6 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 .commit-id,#mermaid-svg-s13EDGpPWPVOsjF6 .commit-msg,#mermaid-svg-s13EDGpPWPVOsjF6 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-s13EDGpPWPVOsjF6 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-s13EDGpPWPVOsjF6 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-s13EDGpPWPVOsjF6 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-s13EDGpPWPVOsjF6 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-s13EDGpPWPVOsjF6 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-s13EDGpPWPVOsjF6 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-s13EDGpPWPVOsjF6 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-s13EDGpPWPVOsjF6 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-s13EDGpPWPVOsjF6 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-s13EDGpPWPVOsjF6 .edgeLabel text{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s13EDGpPWPVOsjF6 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-s13EDGpPWPVOsjF6 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-s13EDGpPWPVOsjF6 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-s13EDGpPWPVOsjF6 .note-edge{stroke-dasharray:5}#mermaid-svg-s13EDGpPWPVOsjF6 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-s13EDGpPWPVOsjF6 .error-icon{fill:#522}#mermaid-svg-s13EDGpPWPVOsjF6 .error-text{fill:#522;stroke:#522}#mermaid-svg-s13EDGpPWPVOsjF6 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-s13EDGpPWPVOsjF6 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-s13EDGpPWPVOsjF6 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-s13EDGpPWPVOsjF6 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-s13EDGpPWPVOsjF6 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-s13EDGpPWPVOsjF6 .marker{fill:#333}#mermaid-svg-s13EDGpPWPVOsjF6 .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-s13EDGpPWPVOsjF6 { color: rgba(0, 0, 0, 0.75); font: ; } Threads AudioFlinger AudioOutputDescriptor AudioPolicyManager 1 new SwAudioOutputDescriptor 2 mClientInterface->openOutput 该函数会返回创建的输出线程 1 2 outHwDev->openOutputStream 1 new AudioStreamOut 2 1 这里调用的是函数指针实际指向adev_open_output_stream 2 new StreamOutHalLocal 3 使用打开的输出流创建线程 4 将创建的线程添加到成员中 MixerThread构造 openOutput openOutput_l findSuitableHwDev_l mPlaybackThreads.add Output构造 open onNewAudioModulesAvailableInt AudioHwDevice::openOutputStream AudioStreamOut构造 AudioStreamOut::open DeviceHalLocal::openOutputStream open_output_stream StreamOutHalLocal构造

上图findSuitableHwDev_l会返回AudioFlinger::loadHwModule_l中根据Module加载的AudioHwDevice,

接下来继续分析输入流的打开流程以及线程的创建:

#mermaid-svg-I8swNXsaRSFXERWd .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-I8swNXsaRSFXERWd .label text{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .node rect,#mermaid-svg-I8swNXsaRSFXERWd .node circle,#mermaid-svg-I8swNXsaRSFXERWd .node ellipse,#mermaid-svg-I8swNXsaRSFXERWd .node polygon,#mermaid-svg-I8swNXsaRSFXERWd .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-I8swNXsaRSFXERWd .node .label{text-align:center;fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .node.clickable{cursor:pointer}#mermaid-svg-I8swNXsaRSFXERWd .arrowheadPath{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-I8swNXsaRSFXERWd .flowchart-link{stroke:#333;fill:none}#mermaid-svg-I8swNXsaRSFXERWd .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-I8swNXsaRSFXERWd .edgeLabel rect{opacity:0.9}#mermaid-svg-I8swNXsaRSFXERWd .edgeLabel span{color:#333}#mermaid-svg-I8swNXsaRSFXERWd .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-I8swNXsaRSFXERWd .cluster text{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-I8swNXsaRSFXERWd .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-I8swNXsaRSFXERWd text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-I8swNXsaRSFXERWd .actor-line{stroke:grey}#mermaid-svg-I8swNXsaRSFXERWd .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-I8swNXsaRSFXERWd .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-I8swNXsaRSFXERWd #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-I8swNXsaRSFXERWd .sequenceNumber{fill:#fff}#mermaid-svg-I8swNXsaRSFXERWd #sequencenumber{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd #crosshead path{fill:#333;stroke:#333}#mermaid-svg-I8swNXsaRSFXERWd .messageText{fill:#333;stroke:#333}#mermaid-svg-I8swNXsaRSFXERWd .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-I8swNXsaRSFXERWd .labelText,#mermaid-svg-I8swNXsaRSFXERWd .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-I8swNXsaRSFXERWd .loopText,#mermaid-svg-I8swNXsaRSFXERWd .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-I8swNXsaRSFXERWd .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-I8swNXsaRSFXERWd .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-I8swNXsaRSFXERWd .noteText,#mermaid-svg-I8swNXsaRSFXERWd .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-I8swNXsaRSFXERWd .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-I8swNXsaRSFXERWd .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-I8swNXsaRSFXERWd .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-I8swNXsaRSFXERWd .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .section{stroke:none;opacity:0.2}#mermaid-svg-I8swNXsaRSFXERWd .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-I8swNXsaRSFXERWd .section2{fill:#fff400}#mermaid-svg-I8swNXsaRSFXERWd .section1,#mermaid-svg-I8swNXsaRSFXERWd .section3{fill:#fff;opacity:0.2}#mermaid-svg-I8swNXsaRSFXERWd .sectionTitle0{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .sectionTitle1{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .sectionTitle2{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .sectionTitle3{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-I8swNXsaRSFXERWd .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .grid path{stroke-width:0}#mermaid-svg-I8swNXsaRSFXERWd .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-I8swNXsaRSFXERWd .task{stroke-width:2}#mermaid-svg-I8swNXsaRSFXERWd .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .taskText:not([font-size]){font-size:11px}#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-I8swNXsaRSFXERWd .task.clickable{cursor:pointer}#mermaid-svg-I8swNXsaRSFXERWd .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-I8swNXsaRSFXERWd .taskText0,#mermaid-svg-I8swNXsaRSFXERWd .taskText1,#mermaid-svg-I8swNXsaRSFXERWd .taskText2,#mermaid-svg-I8swNXsaRSFXERWd .taskText3{fill:#fff}#mermaid-svg-I8swNXsaRSFXERWd .task0,#mermaid-svg-I8swNXsaRSFXERWd .task1,#mermaid-svg-I8swNXsaRSFXERWd .task2,#mermaid-svg-I8swNXsaRSFXERWd .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutside0,#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutside2{fill:#000}#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutside1,#mermaid-svg-I8swNXsaRSFXERWd .taskTextOutside3{fill:#000}#mermaid-svg-I8swNXsaRSFXERWd .active0,#mermaid-svg-I8swNXsaRSFXERWd .active1,#mermaid-svg-I8swNXsaRSFXERWd .active2,#mermaid-svg-I8swNXsaRSFXERWd .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-I8swNXsaRSFXERWd .activeText0,#mermaid-svg-I8swNXsaRSFXERWd .activeText1,#mermaid-svg-I8swNXsaRSFXERWd .activeText2,#mermaid-svg-I8swNXsaRSFXERWd .activeText3{fill:#000 !important}#mermaid-svg-I8swNXsaRSFXERWd .done0,#mermaid-svg-I8swNXsaRSFXERWd .done1,#mermaid-svg-I8swNXsaRSFXERWd .done2,#mermaid-svg-I8swNXsaRSFXERWd .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-I8swNXsaRSFXERWd .doneText0,#mermaid-svg-I8swNXsaRSFXERWd .doneText1,#mermaid-svg-I8swNXsaRSFXERWd .doneText2,#mermaid-svg-I8swNXsaRSFXERWd .doneText3{fill:#000 !important}#mermaid-svg-I8swNXsaRSFXERWd .crit0,#mermaid-svg-I8swNXsaRSFXERWd .crit1,#mermaid-svg-I8swNXsaRSFXERWd .crit2,#mermaid-svg-I8swNXsaRSFXERWd .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-I8swNXsaRSFXERWd .activeCrit0,#mermaid-svg-I8swNXsaRSFXERWd .activeCrit1,#mermaid-svg-I8swNXsaRSFXERWd .activeCrit2,#mermaid-svg-I8swNXsaRSFXERWd .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-I8swNXsaRSFXERWd .doneCrit0,#mermaid-svg-I8swNXsaRSFXERWd .doneCrit1,#mermaid-svg-I8swNXsaRSFXERWd .doneCrit2,#mermaid-svg-I8swNXsaRSFXERWd .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-I8swNXsaRSFXERWd .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-I8swNXsaRSFXERWd .milestoneText{font-style:italic}#mermaid-svg-I8swNXsaRSFXERWd .doneCritText0,#mermaid-svg-I8swNXsaRSFXERWd .doneCritText1,#mermaid-svg-I8swNXsaRSFXERWd .doneCritText2,#mermaid-svg-I8swNXsaRSFXERWd .doneCritText3{fill:#000 !important}#mermaid-svg-I8swNXsaRSFXERWd .activeCritText0,#mermaid-svg-I8swNXsaRSFXERWd .activeCritText1,#mermaid-svg-I8swNXsaRSFXERWd .activeCritText2,#mermaid-svg-I8swNXsaRSFXERWd .activeCritText3{fill:#000 !important}#mermaid-svg-I8swNXsaRSFXERWd .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-I8swNXsaRSFXERWd g.classGroup text .title{font-weight:bolder}#mermaid-svg-I8swNXsaRSFXERWd g.clickable{cursor:pointer}#mermaid-svg-I8swNXsaRSFXERWd g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-I8swNXsaRSFXERWd g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-I8swNXsaRSFXERWd .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-I8swNXsaRSFXERWd .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-I8swNXsaRSFXERWd .dashed-line{stroke-dasharray:3}#mermaid-svg-I8swNXsaRSFXERWd #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd .commit-id,#mermaid-svg-I8swNXsaRSFXERWd .commit-msg,#mermaid-svg-I8swNXsaRSFXERWd .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-I8swNXsaRSFXERWd g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-I8swNXsaRSFXERWd g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-I8swNXsaRSFXERWd g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-I8swNXsaRSFXERWd .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-I8swNXsaRSFXERWd .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-I8swNXsaRSFXERWd .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-I8swNXsaRSFXERWd .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-I8swNXsaRSFXERWd .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-I8swNXsaRSFXERWd .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-I8swNXsaRSFXERWd .edgeLabel text{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-I8swNXsaRSFXERWd .node circle.state-start{fill:black;stroke:black}#mermaid-svg-I8swNXsaRSFXERWd .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-I8swNXsaRSFXERWd #statediagram-barbEnd{fill:#9370db}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-state .divider{stroke:#9370db}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-I8swNXsaRSFXERWd .note-edge{stroke-dasharray:5}#mermaid-svg-I8swNXsaRSFXERWd .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-I8swNXsaRSFXERWd .error-icon{fill:#522}#mermaid-svg-I8swNXsaRSFXERWd .error-text{fill:#522;stroke:#522}#mermaid-svg-I8swNXsaRSFXERWd .edge-thickness-normal{stroke-width:2px}#mermaid-svg-I8swNXsaRSFXERWd .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-I8swNXsaRSFXERWd .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-I8swNXsaRSFXERWd .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-I8swNXsaRSFXERWd .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-I8swNXsaRSFXERWd .marker{fill:#333}#mermaid-svg-I8swNXsaRSFXERWd .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-I8swNXsaRSFXERWd { color: rgba(0, 0, 0, 0.75); font: ; } Threads DeviceHalLocal.cpp AudioFlinger AudioInputDescriptor AudioPolicyManager 1 2 mClientInterface->openInput 1 2 实际是audio_hw.c中的adev_open_input_stream 3 4创建线程 5 创建的线程添加到成员中 RecordThread构造 openInputStream openInput openInput_l findSuitableHwDev_l mRecordThreads.add Input构造 open onNewAudioModulesAvailableInt open_input_stream StreamInHalLocal构造 AudioStreamIn构造

上面讲输入和输出的线程创建已经分析完毕,现在我们的Android系统中已经存在了一些播放线程了,后面就是一个应用如果通过AudioTrack开始播放音频该怎么将这段音频对应到相应的线程中去的问题

整个第一节音频服务初始化到这里结束,音频服务启动之后加载相应的音频库,扫描了配置文件中的一些模块和连接的外设,并打开这些外设创建了相应的工作线程,比如最常用的MixerThread线程和录音的RecordThread,现在整个音频系统已经启动,剩下的就是其他应用等访问音频服务的过程。

2、 Engine的创建流程

前面分析Engine的时候没有进行详细的分析,Engine作为音频后期统筹管理的模块,是如何将策略加载进去的,以及后面设备切换的时候怎么进行修改,这些内容在这一节进行分析

2.1 音频策略加载

在前面1.2节中AudioPolicyManager的initialize方法中涉及到了Engine的创建,接着这个内容进一步详细分析:

#mermaid-svg-x2fsjl3vB30npMSh .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-x2fsjl3vB30npMSh .label text{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .node rect,#mermaid-svg-x2fsjl3vB30npMSh .node circle,#mermaid-svg-x2fsjl3vB30npMSh .node ellipse,#mermaid-svg-x2fsjl3vB30npMSh .node polygon,#mermaid-svg-x2fsjl3vB30npMSh .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-x2fsjl3vB30npMSh .node .label{text-align:center;fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .node.clickable{cursor:pointer}#mermaid-svg-x2fsjl3vB30npMSh .arrowheadPath{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-x2fsjl3vB30npMSh .flowchart-link{stroke:#333;fill:none}#mermaid-svg-x2fsjl3vB30npMSh .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-x2fsjl3vB30npMSh .edgeLabel rect{opacity:0.9}#mermaid-svg-x2fsjl3vB30npMSh .edgeLabel span{color:#333}#mermaid-svg-x2fsjl3vB30npMSh .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-x2fsjl3vB30npMSh .cluster text{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-x2fsjl3vB30npMSh .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-x2fsjl3vB30npMSh text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-x2fsjl3vB30npMSh .actor-line{stroke:grey}#mermaid-svg-x2fsjl3vB30npMSh .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-x2fsjl3vB30npMSh .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-x2fsjl3vB30npMSh #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-x2fsjl3vB30npMSh .sequenceNumber{fill:#fff}#mermaid-svg-x2fsjl3vB30npMSh #sequencenumber{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh #crosshead path{fill:#333;stroke:#333}#mermaid-svg-x2fsjl3vB30npMSh .messageText{fill:#333;stroke:#333}#mermaid-svg-x2fsjl3vB30npMSh .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-x2fsjl3vB30npMSh .labelText,#mermaid-svg-x2fsjl3vB30npMSh .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-x2fsjl3vB30npMSh .loopText,#mermaid-svg-x2fsjl3vB30npMSh .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-x2fsjl3vB30npMSh .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-x2fsjl3vB30npMSh .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-x2fsjl3vB30npMSh .noteText,#mermaid-svg-x2fsjl3vB30npMSh .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-x2fsjl3vB30npMSh .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-x2fsjl3vB30npMSh .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-x2fsjl3vB30npMSh .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-x2fsjl3vB30npMSh .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .section{stroke:none;opacity:0.2}#mermaid-svg-x2fsjl3vB30npMSh .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-x2fsjl3vB30npMSh .section2{fill:#fff400}#mermaid-svg-x2fsjl3vB30npMSh .section1,#mermaid-svg-x2fsjl3vB30npMSh .section3{fill:#fff;opacity:0.2}#mermaid-svg-x2fsjl3vB30npMSh .sectionTitle0{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .sectionTitle1{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .sectionTitle2{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .sectionTitle3{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-x2fsjl3vB30npMSh .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .grid path{stroke-width:0}#mermaid-svg-x2fsjl3vB30npMSh .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-x2fsjl3vB30npMSh .task{stroke-width:2}#mermaid-svg-x2fsjl3vB30npMSh .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .taskText:not([font-size]){font-size:11px}#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-x2fsjl3vB30npMSh .task.clickable{cursor:pointer}#mermaid-svg-x2fsjl3vB30npMSh .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-x2fsjl3vB30npMSh .taskText0,#mermaid-svg-x2fsjl3vB30npMSh .taskText1,#mermaid-svg-x2fsjl3vB30npMSh .taskText2,#mermaid-svg-x2fsjl3vB30npMSh .taskText3{fill:#fff}#mermaid-svg-x2fsjl3vB30npMSh .task0,#mermaid-svg-x2fsjl3vB30npMSh .task1,#mermaid-svg-x2fsjl3vB30npMSh .task2,#mermaid-svg-x2fsjl3vB30npMSh .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutside0,#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutside2{fill:#000}#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutside1,#mermaid-svg-x2fsjl3vB30npMSh .taskTextOutside3{fill:#000}#mermaid-svg-x2fsjl3vB30npMSh .active0,#mermaid-svg-x2fsjl3vB30npMSh .active1,#mermaid-svg-x2fsjl3vB30npMSh .active2,#mermaid-svg-x2fsjl3vB30npMSh .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-x2fsjl3vB30npMSh .activeText0,#mermaid-svg-x2fsjl3vB30npMSh .activeText1,#mermaid-svg-x2fsjl3vB30npMSh .activeText2,#mermaid-svg-x2fsjl3vB30npMSh .activeText3{fill:#000 !important}#mermaid-svg-x2fsjl3vB30npMSh .done0,#mermaid-svg-x2fsjl3vB30npMSh .done1,#mermaid-svg-x2fsjl3vB30npMSh .done2,#mermaid-svg-x2fsjl3vB30npMSh .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-x2fsjl3vB30npMSh .doneText0,#mermaid-svg-x2fsjl3vB30npMSh .doneText1,#mermaid-svg-x2fsjl3vB30npMSh .doneText2,#mermaid-svg-x2fsjl3vB30npMSh .doneText3{fill:#000 !important}#mermaid-svg-x2fsjl3vB30npMSh .crit0,#mermaid-svg-x2fsjl3vB30npMSh .crit1,#mermaid-svg-x2fsjl3vB30npMSh .crit2,#mermaid-svg-x2fsjl3vB30npMSh .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-x2fsjl3vB30npMSh .activeCrit0,#mermaid-svg-x2fsjl3vB30npMSh .activeCrit1,#mermaid-svg-x2fsjl3vB30npMSh .activeCrit2,#mermaid-svg-x2fsjl3vB30npMSh .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-x2fsjl3vB30npMSh .doneCrit0,#mermaid-svg-x2fsjl3vB30npMSh .doneCrit1,#mermaid-svg-x2fsjl3vB30npMSh .doneCrit2,#mermaid-svg-x2fsjl3vB30npMSh .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-x2fsjl3vB30npMSh .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-x2fsjl3vB30npMSh .milestoneText{font-style:italic}#mermaid-svg-x2fsjl3vB30npMSh .doneCritText0,#mermaid-svg-x2fsjl3vB30npMSh .doneCritText1,#mermaid-svg-x2fsjl3vB30npMSh .doneCritText2,#mermaid-svg-x2fsjl3vB30npMSh .doneCritText3{fill:#000 !important}#mermaid-svg-x2fsjl3vB30npMSh .activeCritText0,#mermaid-svg-x2fsjl3vB30npMSh .activeCritText1,#mermaid-svg-x2fsjl3vB30npMSh .activeCritText2,#mermaid-svg-x2fsjl3vB30npMSh .activeCritText3{fill:#000 !important}#mermaid-svg-x2fsjl3vB30npMSh .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-x2fsjl3vB30npMSh g.classGroup text .title{font-weight:bolder}#mermaid-svg-x2fsjl3vB30npMSh g.clickable{cursor:pointer}#mermaid-svg-x2fsjl3vB30npMSh g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-x2fsjl3vB30npMSh g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-x2fsjl3vB30npMSh .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-x2fsjl3vB30npMSh .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-x2fsjl3vB30npMSh .dashed-line{stroke-dasharray:3}#mermaid-svg-x2fsjl3vB30npMSh #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh .commit-id,#mermaid-svg-x2fsjl3vB30npMSh .commit-msg,#mermaid-svg-x2fsjl3vB30npMSh .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-x2fsjl3vB30npMSh g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-x2fsjl3vB30npMSh g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-x2fsjl3vB30npMSh g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-x2fsjl3vB30npMSh .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-x2fsjl3vB30npMSh .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-x2fsjl3vB30npMSh .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-x2fsjl3vB30npMSh .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-x2fsjl3vB30npMSh .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-x2fsjl3vB30npMSh .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-x2fsjl3vB30npMSh .edgeLabel text{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-x2fsjl3vB30npMSh .node circle.state-start{fill:black;stroke:black}#mermaid-svg-x2fsjl3vB30npMSh .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-x2fsjl3vB30npMSh #statediagram-barbEnd{fill:#9370db}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-state .divider{stroke:#9370db}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-x2fsjl3vB30npMSh .note-edge{stroke-dasharray:5}#mermaid-svg-x2fsjl3vB30npMSh .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-x2fsjl3vB30npMSh .error-icon{fill:#522}#mermaid-svg-x2fsjl3vB30npMSh .error-text{fill:#522;stroke:#522}#mermaid-svg-x2fsjl3vB30npMSh .edge-thickness-normal{stroke-width:2px}#mermaid-svg-x2fsjl3vB30npMSh .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-x2fsjl3vB30npMSh .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-x2fsjl3vB30npMSh .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-x2fsjl3vB30npMSh .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-x2fsjl3vB30npMSh .marker{fill:#333}#mermaid-svg-x2fsjl3vB30npMSh .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-x2fsjl3vB30npMSh { color: rgba(0, 0, 0, 0.75); font: ; } ProductStrategy EngineConfig EngineBase Engine EngineLibrary 1 传入了Engine库的名字 1 2 传入Engine库名字 解析出Engine创建函数到mCreateEngineInstance 2 1该分支不重要 2 创建出mPfwConnector 创建出_pParameterMgr 1 1 解析出来的内容放到这里 2 1 添加新的音量组 2 创建音量曲线 3 4 设定默认策略 2 ProductStrategy构造 initialize getDefault parse struct-Config B/loadAudioPolicyEngineConfig loadVolumeConfig Engine构造 loadAudioPolicyEngineConfig 追加自定义XML解析 load EngineLibrary构造 init createEngine AudioPolicyManager dlsym EngineInstance::createEngineInstance ParameterManagerWrapper构造 CParameterMgrPlatformConnector构造 CParameterMgr构造 VolumeGroup构造 VolumeCurve构造

音频策略加载的时候有一个比较重要的函数,这个函数EngineBase里面的loadAudioPolicyEngineConfig,代码如下:

engineConfig::ParsingResult EngineBase::loadAudioPolicyEngineConfig() { auto loadVolumeConfig = [](auto &volumeGroups, auto &volumeConfig) { // 确保名称唯一性以防止重复 LOG_ALWAYS_FATAL_IF(std::any_of(std::begin(volumeGroups), std::end(volumeGroups), [&volumeConfig](const auto &volumeGroup) { return volumeConfig.name == volumeGroup.second->getName(); }), "group name %s defined twice, review the configuration", volumeConfig.name.c_str()); // 表示当前VolumeGroup还没有被加载过,开始创建加载加载 sp<VolumeGroup> 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<VolumeCurve> curve = new VolumeCurve(deviceCat); for (auto &point : configCurve.curvePoints) { curve->add({point.index, point.attenuationInMb}); } volumeGroup->add(curve); } return volumeGroup; }; auto addSupportedAttributesToGroup = [](auto &group, auto &volumeGroup, auto &strategy) { for (const auto &attr : group.attributesVect) { strategy->addAttributes({group.stream, volumeGroup->getId(), attr}); volumeGroup->addSupportedAttributes(attr); } }; auto checkStreamForGroups = [](auto streamType, const auto &volumeGroups) { const auto &iter = std::find_if(std::begin(volumeGroups), std::end(volumeGroups), [&streamType](const auto &volumeGroup) { const auto& streams = volumeGroup.second->getStreamTypes(); return std::find(std::begin(streams), std::end(streams), streamType) != std::end(streams); }); return iter != end(volumeGroups); }; // 前面三个lambda表达式后面会用到,实际是从这里开始的 // 这里开始进行解析,最终会解析出来策略、标准、标准类型以及音量组四个内容 // struct Config { // float version; // ProductStrategies productStrategies; // Criteria criteria; // CriterionTypes criterionTypes; // VolumeGroups volumeGroups; // }; auto result = engineConfig::parse(); if (result.parsedConfig == nullptr) { // 如果上面没有解析成功表示没有找到配置,所以使用默认的配置 ALOGW("%s: No configuration found, using default matching phone experience.", __FUNCTION__); engineConfig::Config config = gDefaultEngineConfig; android::status_t ret = engineConfig::parseLegacyVolumes(config.volumeGroups); result = {std::make_unique<engineConfig::Config>(config), static_cast<size_t>(ret == NO_ERROR ? 0 : 1)}; } ... ALOGE_IF(result.nbSkippedElement != 0, "skipped %zu elements", result.nbSkippedElement); // 这里是解析的时候跳过的无效策略数 engineConfig::VolumeGroup defaultVolumeConfig; engineConfig::VolumeGroup defaultSystemVolumeConfig; // 循环解析所有的音量组 for (auto &volumeConfig : result.parsedConfig->volumeGroups) { // 保存未在配置中定义的流的默认音量配置 讲music和patch作为未定义流类型的默认配置 if (volumeConfig.name.compare("AUDIO_STREAM_MUSIC") == 0) { defaultVolumeConfig = volumeConfig; } if (volumeConfig.name.compare("AUDIO_STREAM_PATCH") == 0) { defaultSystemVolumeConfig = volumeConfig; } // 这里调用上面第一个lamabda表达式 // 这里定义的mVolumeGroups是一个map容器,其中second是VolumeGroup指针,定义在VolumeGroup.h中 // 这里调用这个lambda表达式是为了讲volumeConfig中包含的volumeGroups解析到mVolumeGroups中 loadVolumeConfig(mVolumeGroups, volumeConfig); } // 循环遍历所有的音频策略 for (auto& strategyConfig : result.parsedConfig->productStrategies) { sp<ProductStrategy> 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(); }); sp<VolumeGroup> volumeGroup = nullptr; // 如果没有为此策略提供音量组,则使用音乐音量组配置创建一个新的音量组(视为默认设置) if (iter == end(mVolumeGroups)) { engineConfig::VolumeGroup volumeConfig; if (group.stream >= AUDIO_STREAM_PUBLIC_CNT) { volumeConfig = defaultSystemVolumeConfig; } else { volumeConfig = defaultVolumeConfig; } ALOGW("%s: No configuration of %s found, using default volume configuration" , __FUNCTION__, group.volumeGroup.c_str()); volumeConfig.name = group.volumeGroup; volumeGroup = loadVolumeConfig(mVolumeGroups, volumeConfig); } else { volumeGroup = iter->second; } if (group.stream != AUDIO_STREAM_DEFAULT) { // 可以将旧流一次分配给卷组 LOG_ALWAYS_FATAL_IF(checkStreamForGroups(group.stream, mVolumeGroups), "stream %s already assigned to a volume group, " "review the configuration", toString(group.stream).c_str()); volumeGroup->addSupportedStream(group.stream); } // 为策略添加相应的属性 addSupportedAttributesToGroup(group, volumeGroup, strategy); } // 将新创建的strategy保存到mProductStrategies中并分配一个单独的ID product_strategy_t strategyId = strategy->getId(); mProductStrategies[strategyId] = strategy; } mProductStrategies.initialize(); return result; } 3、 应用播放音频

应用播放音频是通过创建AudioTrack的方式进行播放的,每一个音频流对应着一个AudioTrack的实例,每个AudioTrack会在创建的时候注册到AudioFlinger中,由AudioFlinger将所有的AudioTrack进行混合再传入到HAL中进行播放。

通过前面的分析流程知道了AudioPolicyService启动时加载了系统支持的所有音频接口,并且打开了默认的音频输出,并且为该输出创建了一个播放线程,同时为该线程分配了一个全局唯一的audio_io_handle_t值,任何Track想要发声都需要去查找相应的audio_io_handle_t值找到对应的播放线程才能最终将音频数据传输到HAL层进行播放,大致的播放框图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lHvPE4uC-1642646395284)(./TN1.11.7870音频文档/应用播放流程.png)]

3.1 应用创建Track流程 调用AudioTrack::getMinBufferSize接口传入音频参数获取最小缓冲区大小,调用到HAL层判断当前硬件是否支持该种类型的音频播放,如果不支持后续也不会创建Tracknew AudioTrackAudioTrack::writeAudioTrack::play

需要注意的是音频播放的时候有两种模式:

static模式,一次性将音频加载进内存中供AudioFlinger读取,这种方式适用于对时延要求高且内存较小的音频stream模式,这种是AudioTrack向内存中不断的写数据,AudioFlinger去内存中读数据,动态的进行,一般情况下遇到的都是这种情况

static模式下需要先调用write方法,后调用play方法 stream模式下先调用play方法,后调用write方法

#mermaid-svg-iIDnj1iCjcXhNKyh .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .label text{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .node rect,#mermaid-svg-iIDnj1iCjcXhNKyh .node circle,#mermaid-svg-iIDnj1iCjcXhNKyh .node ellipse,#mermaid-svg-iIDnj1iCjcXhNKyh .node polygon,#mermaid-svg-iIDnj1iCjcXhNKyh .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-iIDnj1iCjcXhNKyh .node .label{text-align:center;fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .node.clickable{cursor:pointer}#mermaid-svg-iIDnj1iCjcXhNKyh .arrowheadPath{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-iIDnj1iCjcXhNKyh .flowchart-link{stroke:#333;fill:none}#mermaid-svg-iIDnj1iCjcXhNKyh .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-iIDnj1iCjcXhNKyh .edgeLabel rect{opacity:0.9}#mermaid-svg-iIDnj1iCjcXhNKyh .edgeLabel span{color:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-iIDnj1iCjcXhNKyh .cluster text{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-iIDnj1iCjcXhNKyh .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-iIDnj1iCjcXhNKyh text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-iIDnj1iCjcXhNKyh .actor-line{stroke:grey}#mermaid-svg-iIDnj1iCjcXhNKyh .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-iIDnj1iCjcXhNKyh #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .sequenceNumber{fill:#fff}#mermaid-svg-iIDnj1iCjcXhNKyh #sequencenumber{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh #crosshead path{fill:#333;stroke:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .messageText{fill:#333;stroke:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-iIDnj1iCjcXhNKyh .labelText,#mermaid-svg-iIDnj1iCjcXhNKyh .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-iIDnj1iCjcXhNKyh .loopText,#mermaid-svg-iIDnj1iCjcXhNKyh .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-iIDnj1iCjcXhNKyh .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-iIDnj1iCjcXhNKyh .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-iIDnj1iCjcXhNKyh .noteText,#mermaid-svg-iIDnj1iCjcXhNKyh .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-iIDnj1iCjcXhNKyh .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-iIDnj1iCjcXhNKyh .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-iIDnj1iCjcXhNKyh .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-iIDnj1iCjcXhNKyh .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .section{stroke:none;opacity:0.2}#mermaid-svg-iIDnj1iCjcXhNKyh .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-iIDnj1iCjcXhNKyh .section2{fill:#fff400}#mermaid-svg-iIDnj1iCjcXhNKyh .section1,#mermaid-svg-iIDnj1iCjcXhNKyh .section3{fill:#fff;opacity:0.2}#mermaid-svg-iIDnj1iCjcXhNKyh .sectionTitle0{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .sectionTitle1{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .sectionTitle2{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .sectionTitle3{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-iIDnj1iCjcXhNKyh .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .grid path{stroke-width:0}#mermaid-svg-iIDnj1iCjcXhNKyh .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-iIDnj1iCjcXhNKyh .task{stroke-width:2}#mermaid-svg-iIDnj1iCjcXhNKyh .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .taskText:not([font-size]){font-size:11px}#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-iIDnj1iCjcXhNKyh .task.clickable{cursor:pointer}#mermaid-svg-iIDnj1iCjcXhNKyh .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-iIDnj1iCjcXhNKyh .taskText0,#mermaid-svg-iIDnj1iCjcXhNKyh .taskText1,#mermaid-svg-iIDnj1iCjcXhNKyh .taskText2,#mermaid-svg-iIDnj1iCjcXhNKyh .taskText3{fill:#fff}#mermaid-svg-iIDnj1iCjcXhNKyh .task0,#mermaid-svg-iIDnj1iCjcXhNKyh .task1,#mermaid-svg-iIDnj1iCjcXhNKyh .task2,#mermaid-svg-iIDnj1iCjcXhNKyh .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutside0,#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutside2{fill:#000}#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutside1,#mermaid-svg-iIDnj1iCjcXhNKyh .taskTextOutside3{fill:#000}#mermaid-svg-iIDnj1iCjcXhNKyh .active0,#mermaid-svg-iIDnj1iCjcXhNKyh .active1,#mermaid-svg-iIDnj1iCjcXhNKyh .active2,#mermaid-svg-iIDnj1iCjcXhNKyh .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-iIDnj1iCjcXhNKyh .activeText0,#mermaid-svg-iIDnj1iCjcXhNKyh .activeText1,#mermaid-svg-iIDnj1iCjcXhNKyh .activeText2,#mermaid-svg-iIDnj1iCjcXhNKyh .activeText3{fill:#000 !important}#mermaid-svg-iIDnj1iCjcXhNKyh .done0,#mermaid-svg-iIDnj1iCjcXhNKyh .done1,#mermaid-svg-iIDnj1iCjcXhNKyh .done2,#mermaid-svg-iIDnj1iCjcXhNKyh .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-iIDnj1iCjcXhNKyh .doneText0,#mermaid-svg-iIDnj1iCjcXhNKyh .doneText1,#mermaid-svg-iIDnj1iCjcXhNKyh .doneText2,#mermaid-svg-iIDnj1iCjcXhNKyh .doneText3{fill:#000 !important}#mermaid-svg-iIDnj1iCjcXhNKyh .crit0,#mermaid-svg-iIDnj1iCjcXhNKyh .crit1,#mermaid-svg-iIDnj1iCjcXhNKyh .crit2,#mermaid-svg-iIDnj1iCjcXhNKyh .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-iIDnj1iCjcXhNKyh .activeCrit0,#mermaid-svg-iIDnj1iCjcXhNKyh .activeCrit1,#mermaid-svg-iIDnj1iCjcXhNKyh .activeCrit2,#mermaid-svg-iIDnj1iCjcXhNKyh .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-iIDnj1iCjcXhNKyh .doneCrit0,#mermaid-svg-iIDnj1iCjcXhNKyh .doneCrit1,#mermaid-svg-iIDnj1iCjcXhNKyh .doneCrit2,#mermaid-svg-iIDnj1iCjcXhNKyh .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-iIDnj1iCjcXhNKyh .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-iIDnj1iCjcXhNKyh .milestoneText{font-style:italic}#mermaid-svg-iIDnj1iCjcXhNKyh .doneCritText0,#mermaid-svg-iIDnj1iCjcXhNKyh .doneCritText1,#mermaid-svg-iIDnj1iCjcXhNKyh .doneCritText2,#mermaid-svg-iIDnj1iCjcXhNKyh .doneCritText3{fill:#000 !important}#mermaid-svg-iIDnj1iCjcXhNKyh .activeCritText0,#mermaid-svg-iIDnj1iCjcXhNKyh .activeCritText1,#mermaid-svg-iIDnj1iCjcXhNKyh .activeCritText2,#mermaid-svg-iIDnj1iCjcXhNKyh .activeCritText3{fill:#000 !important}#mermaid-svg-iIDnj1iCjcXhNKyh .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-iIDnj1iCjcXhNKyh g.classGroup text .title{font-weight:bolder}#mermaid-svg-iIDnj1iCjcXhNKyh g.clickable{cursor:pointer}#mermaid-svg-iIDnj1iCjcXhNKyh g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-iIDnj1iCjcXhNKyh g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-iIDnj1iCjcXhNKyh .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-iIDnj1iCjcXhNKyh .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-iIDnj1iCjcXhNKyh .dashed-line{stroke-dasharray:3}#mermaid-svg-iIDnj1iCjcXhNKyh #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh .commit-id,#mermaid-svg-iIDnj1iCjcXhNKyh .commit-msg,#mermaid-svg-iIDnj1iCjcXhNKyh .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-iIDnj1iCjcXhNKyh g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-iIDnj1iCjcXhNKyh g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-iIDnj1iCjcXhNKyh g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-iIDnj1iCjcXhNKyh .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-iIDnj1iCjcXhNKyh .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-iIDnj1iCjcXhNKyh .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-iIDnj1iCjcXhNKyh .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-iIDnj1iCjcXhNKyh .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-iIDnj1iCjcXhNKyh .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-iIDnj1iCjcXhNKyh .edgeLabel text{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-iIDnj1iCjcXhNKyh .node circle.state-start{fill:black;stroke:black}#mermaid-svg-iIDnj1iCjcXhNKyh .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-iIDnj1iCjcXhNKyh #statediagram-barbEnd{fill:#9370db}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-state .divider{stroke:#9370db}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-iIDnj1iCjcXhNKyh .note-edge{stroke-dasharray:5}#mermaid-svg-iIDnj1iCjcXhNKyh .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-iIDnj1iCjcXhNKyh .error-icon{fill:#522}#mermaid-svg-iIDnj1iCjcXhNKyh .error-text{fill:#522;stroke:#522}#mermaid-svg-iIDnj1iCjcXhNKyh .edge-thickness-normal{stroke-width:2px}#mermaid-svg-iIDnj1iCjcXhNKyh .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-iIDnj1iCjcXhNKyh .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-iIDnj1iCjcXhNKyh .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-iIDnj1iCjcXhNKyh .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-iIDnj1iCjcXhNKyh .marker{fill:#333}#mermaid-svg-iIDnj1iCjcXhNKyh .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-iIDnj1iCjcXhNKyh { color: rgba(0, 0, 0, 0.75); font: ; } AudioTrack.cpp Native AudioTrack.java native_setup 1 new AudioTrack 3 根据播放模式调用set 和AudioFlinger交互 2 申请共享内存 native_get_min_buff_size进入native是为了确认硬件是否支持这些参数 会和AF交互计算出最小帧数用于确定缓冲区大小 AudioTrack构造 getMinFrameCount set createTrack_l android_media_AudioTrack_setup android_media_AudioTrack_get_min_buff_size AudioTrackJniStorage构造 AudioTrack getMinBufferSize AudioFlinger

在这里创建共享内存的时候会用到getMinBufferSize获取的值最终创建缓冲区大小,这一步最终会进入到HAL层使用应用的采样率等一些参数来判断当前硬件是否支持该种类型的音频播放。

在set函数中会和AudioFlinger以及AudioPolicyManager进行互动,主要是找到给当前Track播放的设备以及该设备使用的线程,最终实现播放音频的目的。

3.2 策略查找流程 #mermaid-svg-qao7VsRyGLyMDzWj .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-qao7VsRyGLyMDzWj .label text{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .node rect,#mermaid-svg-qao7VsRyGLyMDzWj .node circle,#mermaid-svg-qao7VsRyGLyMDzWj .node ellipse,#mermaid-svg-qao7VsRyGLyMDzWj .node polygon,#mermaid-svg-qao7VsRyGLyMDzWj .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-qao7VsRyGLyMDzWj .node .label{text-align:center;fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .node.clickable{cursor:pointer}#mermaid-svg-qao7VsRyGLyMDzWj .arrowheadPath{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-qao7VsRyGLyMDzWj .flowchart-link{stroke:#333;fill:none}#mermaid-svg-qao7VsRyGLyMDzWj .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-qao7VsRyGLyMDzWj .edgeLabel rect{opacity:0.9}#mermaid-svg-qao7VsRyGLyMDzWj .edgeLabel span{color:#333}#mermaid-svg-qao7VsRyGLyMDzWj .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-qao7VsRyGLyMDzWj .cluster text{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-qao7VsRyGLyMDzWj .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-qao7VsRyGLyMDzWj text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-qao7VsRyGLyMDzWj .actor-line{stroke:grey}#mermaid-svg-qao7VsRyGLyMDzWj .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-qao7VsRyGLyMDzWj .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-qao7VsRyGLyMDzWj #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-qao7VsRyGLyMDzWj .sequenceNumber{fill:#fff}#mermaid-svg-qao7VsRyGLyMDzWj #sequencenumber{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj #crosshead path{fill:#333;stroke:#333}#mermaid-svg-qao7VsRyGLyMDzWj .messageText{fill:#333;stroke:#333}#mermaid-svg-qao7VsRyGLyMDzWj .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-qao7VsRyGLyMDzWj .labelText,#mermaid-svg-qao7VsRyGLyMDzWj .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-qao7VsRyGLyMDzWj .loopText,#mermaid-svg-qao7VsRyGLyMDzWj .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-qao7VsRyGLyMDzWj .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-qao7VsRyGLyMDzWj .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-qao7VsRyGLyMDzWj .noteText,#mermaid-svg-qao7VsRyGLyMDzWj .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-qao7VsRyGLyMDzWj .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-qao7VsRyGLyMDzWj .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-qao7VsRyGLyMDzWj .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-qao7VsRyGLyMDzWj .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .section{stroke:none;opacity:0.2}#mermaid-svg-qao7VsRyGLyMDzWj .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-qao7VsRyGLyMDzWj .section2{fill:#fff400}#mermaid-svg-qao7VsRyGLyMDzWj .section1,#mermaid-svg-qao7VsRyGLyMDzWj .section3{fill:#fff;opacity:0.2}#mermaid-svg-qao7VsRyGLyMDzWj .sectionTitle0{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .sectionTitle1{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .sectionTitle2{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .sectionTitle3{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-qao7VsRyGLyMDzWj .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .grid path{stroke-width:0}#mermaid-svg-qao7VsRyGLyMDzWj .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-qao7VsRyGLyMDzWj .task{stroke-width:2}#mermaid-svg-qao7VsRyGLyMDzWj .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .taskText:not([font-size]){font-size:11px}#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-qao7VsRyGLyMDzWj .task.clickable{cursor:pointer}#mermaid-svg-qao7VsRyGLyMDzWj .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-qao7VsRyGLyMDzWj .taskText0,#mermaid-svg-qao7VsRyGLyMDzWj .taskText1,#mermaid-svg-qao7VsRyGLyMDzWj .taskText2,#mermaid-svg-qao7VsRyGLyMDzWj .taskText3{fill:#fff}#mermaid-svg-qao7VsRyGLyMDzWj .task0,#mermaid-svg-qao7VsRyGLyMDzWj .task1,#mermaid-svg-qao7VsRyGLyMDzWj .task2,#mermaid-svg-qao7VsRyGLyMDzWj .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutside0,#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutside2{fill:#000}#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutside1,#mermaid-svg-qao7VsRyGLyMDzWj .taskTextOutside3{fill:#000}#mermaid-svg-qao7VsRyGLyMDzWj .active0,#mermaid-svg-qao7VsRyGLyMDzWj .active1,#mermaid-svg-qao7VsRyGLyMDzWj .active2,#mermaid-svg-qao7VsRyGLyMDzWj .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-qao7VsRyGLyMDzWj .activeText0,#mermaid-svg-qao7VsRyGLyMDzWj .activeText1,#mermaid-svg-qao7VsRyGLyMDzWj .activeText2,#mermaid-svg-qao7VsRyGLyMDzWj .activeText3{fill:#000 !important}#mermaid-svg-qao7VsRyGLyMDzWj .done0,#mermaid-svg-qao7VsRyGLyMDzWj .done1,#mermaid-svg-qao7VsRyGLyMDzWj .done2,#mermaid-svg-qao7VsRyGLyMDzWj .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-qao7VsRyGLyMDzWj .doneText0,#mermaid-svg-qao7VsRyGLyMDzWj .doneText1,#mermaid-svg-qao7VsRyGLyMDzWj .doneText2,#mermaid-svg-qao7VsRyGLyMDzWj .doneText3{fill:#000 !important}#mermaid-svg-qao7VsRyGLyMDzWj .crit0,#mermaid-svg-qao7VsRyGLyMDzWj .crit1,#mermaid-svg-qao7VsRyGLyMDzWj .crit2,#mermaid-svg-qao7VsRyGLyMDzWj .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-qao7VsRyGLyMDzWj .activeCrit0,#mermaid-svg-qao7VsRyGLyMDzWj .activeCrit1,#mermaid-svg-qao7VsRyGLyMDzWj .activeCrit2,#mermaid-svg-qao7VsRyGLyMDzWj .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-qao7VsRyGLyMDzWj .doneCrit0,#mermaid-svg-qao7VsRyGLyMDzWj .doneCrit1,#mermaid-svg-qao7VsRyGLyMDzWj .doneCrit2,#mermaid-svg-qao7VsRyGLyMDzWj .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-qao7VsRyGLyMDzWj .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-qao7VsRyGLyMDzWj .milestoneText{font-style:italic}#mermaid-svg-qao7VsRyGLyMDzWj .doneCritText0,#mermaid-svg-qao7VsRyGLyMDzWj .doneCritText1,#mermaid-svg-qao7VsRyGLyMDzWj .doneCritText2,#mermaid-svg-qao7VsRyGLyMDzWj .doneCritText3{fill:#000 !important}#mermaid-svg-qao7VsRyGLyMDzWj .activeCritText0,#mermaid-svg-qao7VsRyGLyMDzWj .activeCritText1,#mermaid-svg-qao7VsRyGLyMDzWj .activeCritText2,#mermaid-svg-qao7VsRyGLyMDzWj .activeCritText3{fill:#000 !important}#mermaid-svg-qao7VsRyGLyMDzWj .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-qao7VsRyGLyMDzWj g.classGroup text .title{font-weight:bolder}#mermaid-svg-qao7VsRyGLyMDzWj g.clickable{cursor:pointer}#mermaid-svg-qao7VsRyGLyMDzWj g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-qao7VsRyGLyMDzWj g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-qao7VsRyGLyMDzWj .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-qao7VsRyGLyMDzWj .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-qao7VsRyGLyMDzWj .dashed-line{stroke-dasharray:3}#mermaid-svg-qao7VsRyGLyMDzWj #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj .commit-id,#mermaid-svg-qao7VsRyGLyMDzWj .commit-msg,#mermaid-svg-qao7VsRyGLyMDzWj .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-qao7VsRyGLyMDzWj g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-qao7VsRyGLyMDzWj g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-qao7VsRyGLyMDzWj g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-qao7VsRyGLyMDzWj .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-qao7VsRyGLyMDzWj .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-qao7VsRyGLyMDzWj .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-qao7VsRyGLyMDzWj .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-qao7VsRyGLyMDzWj .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-qao7VsRyGLyMDzWj .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-qao7VsRyGLyMDzWj .edgeLabel text{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-qao7VsRyGLyMDzWj .node circle.state-start{fill:black;stroke:black}#mermaid-svg-qao7VsRyGLyMDzWj .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-qao7VsRyGLyMDzWj #statediagram-barbEnd{fill:#9370db}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-state .divider{stroke:#9370db}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-qao7VsRyGLyMDzWj .note-edge{stroke-dasharray:5}#mermaid-svg-qao7VsRyGLyMDzWj .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-qao7VsRyGLyMDzWj .error-icon{fill:#522}#mermaid-svg-qao7VsRyGLyMDzWj .error-text{fill:#522;stroke:#522}#mermaid-svg-qao7VsRyGLyMDzWj .edge-thickness-normal{stroke-width:2px}#mermaid-svg-qao7VsRyGLyMDzWj .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-qao7VsRyGLyMDzWj .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-qao7VsRyGLyMDzWj .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-qao7VsRyGLyMDzWj .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-qao7VsRyGLyMDzWj .marker{fill:#333}#mermaid-svg-qao7VsRyGLyMDzWj .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-qao7VsRyGLyMDzWj { color: rgba(0, 0, 0, 0.75); font: ; } AudioPolicyMix Engine AudioPolicyManager AudioFlinger AudioTrack 1 1 2 new TrackClientDescriptor 1 通过应用attr获取流类型 2 mPolicyMixes.getOutputForAttr 3 4 Engine策略 1 2 3 4 返回输出设备 getOutputForAttr getStreamTypeForAttributes getOutputDevicesForAttributes AP::getOutputForAttr getOutputForAttrInt getAvailableOutputDevices getOutputs 如果有显式路由优先显式路由其次动态路由 AF::createTrack set AT::createTrack_l TrackClientDescriptor构造 getProductStrategyForAttributes findPreferredDevice

在AudioPolicyManager种获取output的候可以选择主设备和次设备输出,但是次设备都是通过动态策略进行选择的,Engine不支持选中次设备,主要都是通过这里的APM从前面解析xml之后得到的一些结果中去查询需要的数据

3.3 播放线程和HAL的交互

将输出设备选中之后就需要针对该输出设备创建相应的线程进行数据的写入了,前面部分已经获取了当前应用要播放的流类型应该打开的output的所有信息,剩下的工作就是怎么找到当前output所对应的播放线程:

3.3.1 播放线程的选择以及Track创建 #mermaid-svg-l26RN17AYqeQo7PO .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-l26RN17AYqeQo7PO .label text{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .node rect,#mermaid-svg-l26RN17AYqeQo7PO .node circle,#mermaid-svg-l26RN17AYqeQo7PO .node ellipse,#mermaid-svg-l26RN17AYqeQo7PO .node polygon,#mermaid-svg-l26RN17AYqeQo7PO .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-l26RN17AYqeQo7PO .node .label{text-align:center;fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .node.clickable{cursor:pointer}#mermaid-svg-l26RN17AYqeQo7PO .arrowheadPath{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-l26RN17AYqeQo7PO .flowchart-link{stroke:#333;fill:none}#mermaid-svg-l26RN17AYqeQo7PO .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-l26RN17AYqeQo7PO .edgeLabel rect{opacity:0.9}#mermaid-svg-l26RN17AYqeQo7PO .edgeLabel span{color:#333}#mermaid-svg-l26RN17AYqeQo7PO .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-l26RN17AYqeQo7PO .cluster text{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-l26RN17AYqeQo7PO .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-l26RN17AYqeQo7PO text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-l26RN17AYqeQo7PO .actor-line{stroke:grey}#mermaid-svg-l26RN17AYqeQo7PO .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-l26RN17AYqeQo7PO .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-l26RN17AYqeQo7PO #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-l26RN17AYqeQo7PO .sequenceNumber{fill:#fff}#mermaid-svg-l26RN17AYqeQo7PO #sequencenumber{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO #crosshead path{fill:#333;stroke:#333}#mermaid-svg-l26RN17AYqeQo7PO .messageText{fill:#333;stroke:#333}#mermaid-svg-l26RN17AYqeQo7PO .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-l26RN17AYqeQo7PO .labelText,#mermaid-svg-l26RN17AYqeQo7PO .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-l26RN17AYqeQo7PO .loopText,#mermaid-svg-l26RN17AYqeQo7PO .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-l26RN17AYqeQo7PO .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-l26RN17AYqeQo7PO .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-l26RN17AYqeQo7PO .noteText,#mermaid-svg-l26RN17AYqeQo7PO .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-l26RN17AYqeQo7PO .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-l26RN17AYqeQo7PO .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-l26RN17AYqeQo7PO .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-l26RN17AYqeQo7PO .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .section{stroke:none;opacity:0.2}#mermaid-svg-l26RN17AYqeQo7PO .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-l26RN17AYqeQo7PO .section2{fill:#fff400}#mermaid-svg-l26RN17AYqeQo7PO .section1,#mermaid-svg-l26RN17AYqeQo7PO .section3{fill:#fff;opacity:0.2}#mermaid-svg-l26RN17AYqeQo7PO .sectionTitle0{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .sectionTitle1{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .sectionTitle2{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .sectionTitle3{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-l26RN17AYqeQo7PO .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .grid path{stroke-width:0}#mermaid-svg-l26RN17AYqeQo7PO .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-l26RN17AYqeQo7PO .task{stroke-width:2}#mermaid-svg-l26RN17AYqeQo7PO .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .taskText:not([font-size]){font-size:11px}#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-l26RN17AYqeQo7PO .task.clickable{cursor:pointer}#mermaid-svg-l26RN17AYqeQo7PO .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-l26RN17AYqeQo7PO .taskText0,#mermaid-svg-l26RN17AYqeQo7PO .taskText1,#mermaid-svg-l26RN17AYqeQo7PO .taskText2,#mermaid-svg-l26RN17AYqeQo7PO .taskText3{fill:#fff}#mermaid-svg-l26RN17AYqeQo7PO .task0,#mermaid-svg-l26RN17AYqeQo7PO .task1,#mermaid-svg-l26RN17AYqeQo7PO .task2,#mermaid-svg-l26RN17AYqeQo7PO .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutside0,#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutside2{fill:#000}#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutside1,#mermaid-svg-l26RN17AYqeQo7PO .taskTextOutside3{fill:#000}#mermaid-svg-l26RN17AYqeQo7PO .active0,#mermaid-svg-l26RN17AYqeQo7PO .active1,#mermaid-svg-l26RN17AYqeQo7PO .active2,#mermaid-svg-l26RN17AYqeQo7PO .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-l26RN17AYqeQo7PO .activeText0,#mermaid-svg-l26RN17AYqeQo7PO .activeText1,#mermaid-svg-l26RN17AYqeQo7PO .activeText2,#mermaid-svg-l26RN17AYqeQo7PO .activeText3{fill:#000 !important}#mermaid-svg-l26RN17AYqeQo7PO .done0,#mermaid-svg-l26RN17AYqeQo7PO .done1,#mermaid-svg-l26RN17AYqeQo7PO .done2,#mermaid-svg-l26RN17AYqeQo7PO .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-l26RN17AYqeQo7PO .doneText0,#mermaid-svg-l26RN17AYqeQo7PO .doneText1,#mermaid-svg-l26RN17AYqeQo7PO .doneText2,#mermaid-svg-l26RN17AYqeQo7PO .doneText3{fill:#000 !important}#mermaid-svg-l26RN17AYqeQo7PO .crit0,#mermaid-svg-l26RN17AYqeQo7PO .crit1,#mermaid-svg-l26RN17AYqeQo7PO .crit2,#mermaid-svg-l26RN17AYqeQo7PO .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-l26RN17AYqeQo7PO .activeCrit0,#mermaid-svg-l26RN17AYqeQo7PO .activeCrit1,#mermaid-svg-l26RN17AYqeQo7PO .activeCrit2,#mermaid-svg-l26RN17AYqeQo7PO .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-l26RN17AYqeQo7PO .doneCrit0,#mermaid-svg-l26RN17AYqeQo7PO .doneCrit1,#mermaid-svg-l26RN17AYqeQo7PO .doneCrit2,#mermaid-svg-l26RN17AYqeQo7PO .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-l26RN17AYqeQo7PO .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-l26RN17AYqeQo7PO .milestoneText{font-style:italic}#mermaid-svg-l26RN17AYqeQo7PO .doneCritText0,#mermaid-svg-l26RN17AYqeQo7PO .doneCritText1,#mermaid-svg-l26RN17AYqeQo7PO .doneCritText2,#mermaid-svg-l26RN17AYqeQo7PO .doneCritText3{fill:#000 !important}#mermaid-svg-l26RN17AYqeQo7PO .activeCritText0,#mermaid-svg-l26RN17AYqeQo7PO .activeCritText1,#mermaid-svg-l26RN17AYqeQo7PO .activeCritText2,#mermaid-svg-l26RN17AYqeQo7PO .activeCritText3{fill:#000 !important}#mermaid-svg-l26RN17AYqeQo7PO .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-l26RN17AYqeQo7PO g.classGroup text .title{font-weight:bolder}#mermaid-svg-l26RN17AYqeQo7PO g.clickable{cursor:pointer}#mermaid-svg-l26RN17AYqeQo7PO g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-l26RN17AYqeQo7PO g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-l26RN17AYqeQo7PO .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-l26RN17AYqeQo7PO .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-l26RN17AYqeQo7PO .dashed-line{stroke-dasharray:3}#mermaid-svg-l26RN17AYqeQo7PO #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO .commit-id,#mermaid-svg-l26RN17AYqeQo7PO .commit-msg,#mermaid-svg-l26RN17AYqeQo7PO .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-l26RN17AYqeQo7PO g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-l26RN17AYqeQo7PO g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-l26RN17AYqeQo7PO g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-l26RN17AYqeQo7PO .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-l26RN17AYqeQo7PO .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-l26RN17AYqeQo7PO .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-l26RN17AYqeQo7PO .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-l26RN17AYqeQo7PO .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-l26RN17AYqeQo7PO .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-l26RN17AYqeQo7PO .edgeLabel text{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-l26RN17AYqeQo7PO .node circle.state-start{fill:black;stroke:black}#mermaid-svg-l26RN17AYqeQo7PO .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-l26RN17AYqeQo7PO #statediagram-barbEnd{fill:#9370db}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-state .divider{stroke:#9370db}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-l26RN17AYqeQo7PO .note-edge{stroke-dasharray:5}#mermaid-svg-l26RN17AYqeQo7PO .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-l26RN17AYqeQo7PO .error-icon{fill:#522}#mermaid-svg-l26RN17AYqeQo7PO .error-text{fill:#522;stroke:#522}#mermaid-svg-l26RN17AYqeQo7PO .edge-thickness-normal{stroke-width:2px}#mermaid-svg-l26RN17AYqeQo7PO .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-l26RN17AYqeQo7PO .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-l26RN17AYqeQo7PO .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-l26RN17AYqeQo7PO .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-l26RN17AYqeQo7PO .marker{fill:#333}#mermaid-svg-l26RN17AYqeQo7PO .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-l26RN17AYqeQo7PO { color: rgba(0, 0, 0, 0.75); font: ; } Threads AudioFlinger 2 根据当前的outputID找到对应的播放线程 3 调用上一步返回的线程的该函数 4 是Track对象的代理支持binder通讯 1 创建Track 2 createTrack_l 将Track添加进线程持有的mTracks AF::createTrack checkPlaybackThread_l TrackHandler构造 PlaybackTracks::Track

这里首先根据当前找到的outputId查找对应的播放线程,这个播放线程是在一开始创建AudioFlinger和AudioPolicyManager的时候就打开的,然后在该线程中为当前要播放的音频创建一个Track并将该Track添加进当前线程持有的Track容器中。

到此从应用发起创建AudioTrack的请求到AudioFlinger最终创建AudioTrack已经结束,剩下的事情就是应用开始往共享内存中写入内容,AudioFlinger获取内容并发送到HAL层中通过tinyALSA驱动打开硬件进行最终的播放。

3.3.1 AudioTrack打开输出源

上面的内容是找到了当前AudioTrack相关的output以及相应的工作线程,接下来就需要打开这个output,然后开始往里面写数据,也就是应用调用write或play之后开始写数据的内容,直接从AudioTrack.cpp中开始看

#mermaid-svg-vxTz51ghcHadtr47 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-vxTz51ghcHadtr47 .label text{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .node rect,#mermaid-svg-vxTz51ghcHadtr47 .node circle,#mermaid-svg-vxTz51ghcHadtr47 .node ellipse,#mermaid-svg-vxTz51ghcHadtr47 .node polygon,#mermaid-svg-vxTz51ghcHadtr47 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-vxTz51ghcHadtr47 .node .label{text-align:center;fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .node.clickable{cursor:pointer}#mermaid-svg-vxTz51ghcHadtr47 .arrowheadPath{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-vxTz51ghcHadtr47 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-vxTz51ghcHadtr47 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-vxTz51ghcHadtr47 .edgeLabel rect{opacity:0.9}#mermaid-svg-vxTz51ghcHadtr47 .edgeLabel span{color:#333}#mermaid-svg-vxTz51ghcHadtr47 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-vxTz51ghcHadtr47 .cluster text{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-vxTz51ghcHadtr47 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-vxTz51ghcHadtr47 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-vxTz51ghcHadtr47 .actor-line{stroke:grey}#mermaid-svg-vxTz51ghcHadtr47 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-vxTz51ghcHadtr47 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-vxTz51ghcHadtr47 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-vxTz51ghcHadtr47 .sequenceNumber{fill:#fff}#mermaid-svg-vxTz51ghcHadtr47 #sequencenumber{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-vxTz51ghcHadtr47 .messageText{fill:#333;stroke:#333}#mermaid-svg-vxTz51ghcHadtr47 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-vxTz51ghcHadtr47 .labelText,#mermaid-svg-vxTz51ghcHadtr47 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-vxTz51ghcHadtr47 .loopText,#mermaid-svg-vxTz51ghcHadtr47 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-vxTz51ghcHadtr47 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-vxTz51ghcHadtr47 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-vxTz51ghcHadtr47 .noteText,#mermaid-svg-vxTz51ghcHadtr47 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-vxTz51ghcHadtr47 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-vxTz51ghcHadtr47 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-vxTz51ghcHadtr47 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-vxTz51ghcHadtr47 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .section{stroke:none;opacity:0.2}#mermaid-svg-vxTz51ghcHadtr47 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-vxTz51ghcHadtr47 .section2{fill:#fff400}#mermaid-svg-vxTz51ghcHadtr47 .section1,#mermaid-svg-vxTz51ghcHadtr47 .section3{fill:#fff;opacity:0.2}#mermaid-svg-vxTz51ghcHadtr47 .sectionTitle0{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .sectionTitle1{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .sectionTitle2{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .sectionTitle3{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-vxTz51ghcHadtr47 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .grid path{stroke-width:0}#mermaid-svg-vxTz51ghcHadtr47 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-vxTz51ghcHadtr47 .task{stroke-width:2}#mermaid-svg-vxTz51ghcHadtr47 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .taskText:not([font-size]){font-size:11px}#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-vxTz51ghcHadtr47 .task.clickable{cursor:pointer}#mermaid-svg-vxTz51ghcHadtr47 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-vxTz51ghcHadtr47 .taskText0,#mermaid-svg-vxTz51ghcHadtr47 .taskText1,#mermaid-svg-vxTz51ghcHadtr47 .taskText2,#mermaid-svg-vxTz51ghcHadtr47 .taskText3{fill:#fff}#mermaid-svg-vxTz51ghcHadtr47 .task0,#mermaid-svg-vxTz51ghcHadtr47 .task1,#mermaid-svg-vxTz51ghcHadtr47 .task2,#mermaid-svg-vxTz51ghcHadtr47 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutside0,#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutside2{fill:#000}#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutside1,#mermaid-svg-vxTz51ghcHadtr47 .taskTextOutside3{fill:#000}#mermaid-svg-vxTz51ghcHadtr47 .active0,#mermaid-svg-vxTz51ghcHadtr47 .active1,#mermaid-svg-vxTz51ghcHadtr47 .active2,#mermaid-svg-vxTz51ghcHadtr47 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-vxTz51ghcHadtr47 .activeText0,#mermaid-svg-vxTz51ghcHadtr47 .activeText1,#mermaid-svg-vxTz51ghcHadtr47 .activeText2,#mermaid-svg-vxTz51ghcHadtr47 .activeText3{fill:#000 !important}#mermaid-svg-vxTz51ghcHadtr47 .done0,#mermaid-svg-vxTz51ghcHadtr47 .done1,#mermaid-svg-vxTz51ghcHadtr47 .done2,#mermaid-svg-vxTz51ghcHadtr47 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-vxTz51ghcHadtr47 .doneText0,#mermaid-svg-vxTz51ghcHadtr47 .doneText1,#mermaid-svg-vxTz51ghcHadtr47 .doneText2,#mermaid-svg-vxTz51ghcHadtr47 .doneText3{fill:#000 !important}#mermaid-svg-vxTz51ghcHadtr47 .crit0,#mermaid-svg-vxTz51ghcHadtr47 .crit1,#mermaid-svg-vxTz51ghcHadtr47 .crit2,#mermaid-svg-vxTz51ghcHadtr47 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-vxTz51ghcHadtr47 .activeCrit0,#mermaid-svg-vxTz51ghcHadtr47 .activeCrit1,#mermaid-svg-vxTz51ghcHadtr47 .activeCrit2,#mermaid-svg-vxTz51ghcHadtr47 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-vxTz51ghcHadtr47 .doneCrit0,#mermaid-svg-vxTz51ghcHadtr47 .doneCrit1,#mermaid-svg-vxTz51ghcHadtr47 .doneCrit2,#mermaid-svg-vxTz51ghcHadtr47 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-vxTz51ghcHadtr47 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-vxTz51ghcHadtr47 .milestoneText{font-style:italic}#mermaid-svg-vxTz51ghcHadtr47 .doneCritText0,#mermaid-svg-vxTz51ghcHadtr47 .doneCritText1,#mermaid-svg-vxTz51ghcHadtr47 .doneCritText2,#mermaid-svg-vxTz51ghcHadtr47 .doneCritText3{fill:#000 !important}#mermaid-svg-vxTz51ghcHadtr47 .activeCritText0,#mermaid-svg-vxTz51ghcHadtr47 .activeCritText1,#mermaid-svg-vxTz51ghcHadtr47 .activeCritText2,#mermaid-svg-vxTz51ghcHadtr47 .activeCritText3{fill:#000 !important}#mermaid-svg-vxTz51ghcHadtr47 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-vxTz51ghcHadtr47 g.classGroup text .title{font-weight:bolder}#mermaid-svg-vxTz51ghcHadtr47 g.clickable{cursor:pointer}#mermaid-svg-vxTz51ghcHadtr47 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-vxTz51ghcHadtr47 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-vxTz51ghcHadtr47 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-vxTz51ghcHadtr47 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-vxTz51ghcHadtr47 .dashed-line{stroke-dasharray:3}#mermaid-svg-vxTz51ghcHadtr47 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 .commit-id,#mermaid-svg-vxTz51ghcHadtr47 .commit-msg,#mermaid-svg-vxTz51ghcHadtr47 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-vxTz51ghcHadtr47 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-vxTz51ghcHadtr47 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-vxTz51ghcHadtr47 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-vxTz51ghcHadtr47 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-vxTz51ghcHadtr47 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-vxTz51ghcHadtr47 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-vxTz51ghcHadtr47 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-vxTz51ghcHadtr47 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-vxTz51ghcHadtr47 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-vxTz51ghcHadtr47 .edgeLabel text{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vxTz51ghcHadtr47 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-vxTz51ghcHadtr47 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-vxTz51ghcHadtr47 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-vxTz51ghcHadtr47 .note-edge{stroke-dasharray:5}#mermaid-svg-vxTz51ghcHadtr47 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-vxTz51ghcHadtr47 .error-icon{fill:#522}#mermaid-svg-vxTz51ghcHadtr47 .error-text{fill:#522;stroke:#522}#mermaid-svg-vxTz51ghcHadtr47 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-vxTz51ghcHadtr47 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-vxTz51ghcHadtr47 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-vxTz51ghcHadtr47 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-vxTz51ghcHadtr47 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-vxTz51ghcHadtr47 .marker{fill:#333}#mermaid-svg-vxTz51ghcHadtr47 .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-vxTz51ghcHadtr47 { color: rgba(0, 0, 0, 0.75); font: ; } AudioPolicyManager AudioTrack 第三方的函数 在这里有对TTS流的处理 1 重新选择device? 2 最终选择的设备看这里 APMS::startOutput APM::startOutput startSource getNewOutputDevices setOutputDevices start

在上面调用startSource的时候需要进行一些判断来决定最终是否打开该输出源,如果不能打开是不会向底层写数据的,调试的时候需要重点关注这部分内容,判断是否所有情况都准备就绪再去看数据处理的部分。

3.3.2 AudioFlinger向HAL层写数据

这里AudioTrack向共享内存写入数据,AudioFlinger从共享内存中读取数据,我们这里直接从AudioFlinger里面的线程开始分析,假设是MixerThread(大部分情况都是这种)过程如下:

#mermaid-svg-fwBw4ZBDpR4neDag .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-fwBw4ZBDpR4neDag .label text{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .node rect,#mermaid-svg-fwBw4ZBDpR4neDag .node circle,#mermaid-svg-fwBw4ZBDpR4neDag .node ellipse,#mermaid-svg-fwBw4ZBDpR4neDag .node polygon,#mermaid-svg-fwBw4ZBDpR4neDag .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-fwBw4ZBDpR4neDag .node .label{text-align:center;fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .node.clickable{cursor:pointer}#mermaid-svg-fwBw4ZBDpR4neDag .arrowheadPath{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-fwBw4ZBDpR4neDag .flowchart-link{stroke:#333;fill:none}#mermaid-svg-fwBw4ZBDpR4neDag .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-fwBw4ZBDpR4neDag .edgeLabel rect{opacity:0.9}#mermaid-svg-fwBw4ZBDpR4neDag .edgeLabel span{color:#333}#mermaid-svg-fwBw4ZBDpR4neDag .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-fwBw4ZBDpR4neDag .cluster text{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-fwBw4ZBDpR4neDag .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-fwBw4ZBDpR4neDag text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-fwBw4ZBDpR4neDag .actor-line{stroke:grey}#mermaid-svg-fwBw4ZBDpR4neDag .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-fwBw4ZBDpR4neDag .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-fwBw4ZBDpR4neDag #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-fwBw4ZBDpR4neDag .sequenceNumber{fill:#fff}#mermaid-svg-fwBw4ZBDpR4neDag #sequencenumber{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag #crosshead path{fill:#333;stroke:#333}#mermaid-svg-fwBw4ZBDpR4neDag .messageText{fill:#333;stroke:#333}#mermaid-svg-fwBw4ZBDpR4neDag .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-fwBw4ZBDpR4neDag .labelText,#mermaid-svg-fwBw4ZBDpR4neDag .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-fwBw4ZBDpR4neDag .loopText,#mermaid-svg-fwBw4ZBDpR4neDag .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-fwBw4ZBDpR4neDag .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-fwBw4ZBDpR4neDag .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-fwBw4ZBDpR4neDag .noteText,#mermaid-svg-fwBw4ZBDpR4neDag .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-fwBw4ZBDpR4neDag .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-fwBw4ZBDpR4neDag .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-fwBw4ZBDpR4neDag .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-fwBw4ZBDpR4neDag .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .section{stroke:none;opacity:0.2}#mermaid-svg-fwBw4ZBDpR4neDag .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-fwBw4ZBDpR4neDag .section2{fill:#fff400}#mermaid-svg-fwBw4ZBDpR4neDag .section1,#mermaid-svg-fwBw4ZBDpR4neDag .section3{fill:#fff;opacity:0.2}#mermaid-svg-fwBw4ZBDpR4neDag .sectionTitle0{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .sectionTitle1{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .sectionTitle2{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .sectionTitle3{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-fwBw4ZBDpR4neDag .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .grid path{stroke-width:0}#mermaid-svg-fwBw4ZBDpR4neDag .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-fwBw4ZBDpR4neDag .task{stroke-width:2}#mermaid-svg-fwBw4ZBDpR4neDag .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .taskText:not([font-size]){font-size:11px}#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-fwBw4ZBDpR4neDag .task.clickable{cursor:pointer}#mermaid-svg-fwBw4ZBDpR4neDag .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-fwBw4ZBDpR4neDag .taskText0,#mermaid-svg-fwBw4ZBDpR4neDag .taskText1,#mermaid-svg-fwBw4ZBDpR4neDag .taskText2,#mermaid-svg-fwBw4ZBDpR4neDag .taskText3{fill:#fff}#mermaid-svg-fwBw4ZBDpR4neDag .task0,#mermaid-svg-fwBw4ZBDpR4neDag .task1,#mermaid-svg-fwBw4ZBDpR4neDag .task2,#mermaid-svg-fwBw4ZBDpR4neDag .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutside0,#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutside2{fill:#000}#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutside1,#mermaid-svg-fwBw4ZBDpR4neDag .taskTextOutside3{fill:#000}#mermaid-svg-fwBw4ZBDpR4neDag .active0,#mermaid-svg-fwBw4ZBDpR4neDag .active1,#mermaid-svg-fwBw4ZBDpR4neDag .active2,#mermaid-svg-fwBw4ZBDpR4neDag .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-fwBw4ZBDpR4neDag .activeText0,#mermaid-svg-fwBw4ZBDpR4neDag .activeText1,#mermaid-svg-fwBw4ZBDpR4neDag .activeText2,#mermaid-svg-fwBw4ZBDpR4neDag .activeText3{fill:#000 !important}#mermaid-svg-fwBw4ZBDpR4neDag .done0,#mermaid-svg-fwBw4ZBDpR4neDag .done1,#mermaid-svg-fwBw4ZBDpR4neDag .done2,#mermaid-svg-fwBw4ZBDpR4neDag .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-fwBw4ZBDpR4neDag .doneText0,#mermaid-svg-fwBw4ZBDpR4neDag .doneText1,#mermaid-svg-fwBw4ZBDpR4neDag .doneText2,#mermaid-svg-fwBw4ZBDpR4neDag .doneText3{fill:#000 !important}#mermaid-svg-fwBw4ZBDpR4neDag .crit0,#mermaid-svg-fwBw4ZBDpR4neDag .crit1,#mermaid-svg-fwBw4ZBDpR4neDag .crit2,#mermaid-svg-fwBw4ZBDpR4neDag .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-fwBw4ZBDpR4neDag .activeCrit0,#mermaid-svg-fwBw4ZBDpR4neDag .activeCrit1,#mermaid-svg-fwBw4ZBDpR4neDag .activeCrit2,#mermaid-svg-fwBw4ZBDpR4neDag .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-fwBw4ZBDpR4neDag .doneCrit0,#mermaid-svg-fwBw4ZBDpR4neDag .doneCrit1,#mermaid-svg-fwBw4ZBDpR4neDag .doneCrit2,#mermaid-svg-fwBw4ZBDpR4neDag .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-fwBw4ZBDpR4neDag .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-fwBw4ZBDpR4neDag .milestoneText{font-style:italic}#mermaid-svg-fwBw4ZBDpR4neDag .doneCritText0,#mermaid-svg-fwBw4ZBDpR4neDag .doneCritText1,#mermaid-svg-fwBw4ZBDpR4neDag .doneCritText2,#mermaid-svg-fwBw4ZBDpR4neDag .doneCritText3{fill:#000 !important}#mermaid-svg-fwBw4ZBDpR4neDag .activeCritText0,#mermaid-svg-fwBw4ZBDpR4neDag .activeCritText1,#mermaid-svg-fwBw4ZBDpR4neDag .activeCritText2,#mermaid-svg-fwBw4ZBDpR4neDag .activeCritText3{fill:#000 !important}#mermaid-svg-fwBw4ZBDpR4neDag .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-fwBw4ZBDpR4neDag g.classGroup text .title{font-weight:bolder}#mermaid-svg-fwBw4ZBDpR4neDag g.clickable{cursor:pointer}#mermaid-svg-fwBw4ZBDpR4neDag g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-fwBw4ZBDpR4neDag g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-fwBw4ZBDpR4neDag .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-fwBw4ZBDpR4neDag .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-fwBw4ZBDpR4neDag .dashed-line{stroke-dasharray:3}#mermaid-svg-fwBw4ZBDpR4neDag #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag .commit-id,#mermaid-svg-fwBw4ZBDpR4neDag .commit-msg,#mermaid-svg-fwBw4ZBDpR4neDag .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-fwBw4ZBDpR4neDag g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-fwBw4ZBDpR4neDag g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-fwBw4ZBDpR4neDag g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-fwBw4ZBDpR4neDag .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-fwBw4ZBDpR4neDag .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-fwBw4ZBDpR4neDag .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-fwBw4ZBDpR4neDag .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-fwBw4ZBDpR4neDag .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-fwBw4ZBDpR4neDag .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-fwBw4ZBDpR4neDag .edgeLabel text{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fwBw4ZBDpR4neDag .node circle.state-start{fill:black;stroke:black}#mermaid-svg-fwBw4ZBDpR4neDag .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-fwBw4ZBDpR4neDag #statediagram-barbEnd{fill:#9370db}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-state .divider{stroke:#9370db}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-fwBw4ZBDpR4neDag .note-edge{stroke-dasharray:5}#mermaid-svg-fwBw4ZBDpR4neDag .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-fwBw4ZBDpR4neDag .error-icon{fill:#522}#mermaid-svg-fwBw4ZBDpR4neDag .error-text{fill:#522;stroke:#522}#mermaid-svg-fwBw4ZBDpR4neDag .edge-thickness-normal{stroke-width:2px}#mermaid-svg-fwBw4ZBDpR4neDag .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-fwBw4ZBDpR4neDag .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-fwBw4ZBDpR4neDag .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-fwBw4ZBDpR4neDag .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-fwBw4ZBDpR4neDag .marker{fill:#333}#mermaid-svg-fwBw4ZBDpR4neDag .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-fwBw4ZBDpR4neDag { color: rgba(0, 0, 0, 0.75); font: ; } audio_hifi audio_hw AudioStreamOut Threads 首先启动mFastMixer mOutput->write stream->write mStream->write 1 1 2 3 2 3 out_hifi_write start_hifi_output_stream out_write start_output_stream write MIX::threadLoop_write PLAY::threadLoop_write streamHalLocal::write pcm_open pcm_mmap_write


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Android #音频服务