{"id":57,"date":"2026-05-04T08:31:43","date_gmt":"2026-05-04T08:31:43","guid":{"rendered":"http:\/\/www.fryduck99.com\/?p=57"},"modified":"2026-05-07T15:38:33","modified_gmt":"2026-05-07T15:38:33","slug":"android-audioflinger-deep-analysis","status":"publish","type":"post","link":"\/index.php\/2026\/05\/04\/android-audioflinger-deep-analysis\/","title":{"rendered":"Android AudioFlinger \u6df1\u5ea6\u89e3\u6790"},"content":{"rendered":"<p>> \u9002\u7528\u5e73\u53f0\uff1aAndroid \u901a\u7528\u6846\u67b6\uff08AAOS \/ \u6807\u51c6 Android\uff09<br \/>\n> \u9002\u7528\u7248\u672c\uff1aAndroid 12 \/ 13 \/ 14 \/ 15 \/ 16<\/p>\n<p>AudioFlinger \u662f Android \u97f3\u9891\u7cfb\u7edf\u7684\u6838\u5fc3\u5f15\u64ce\uff0c\u8fd0\u884c\u5728 <code>system_server<\/code> \u8fdb\u7a0b\u4e2d\uff0c\u8d1f\u8d23\u6240\u6709\u97f3\u9891\u64ad\u653e\u7684\u6df7\u97f3\u3001\u8def\u7531\u548c\u8c03\u5ea6\u3002<\/p>\n<h2>\u4e00\u3001AudioFlinger \u5728\u97f3\u9891\u67b6\u6784\u4e2d\u7684\u4f4d\u7f6e<\/h2>\n<h3>1.1 \u6574\u4f53\u67b6\u6784<\/h3>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u5e94\u7528\u5c42 (App)                                                 \u2502\n\u2502 AudioTrack.write() \/ MediaPlayer \/ ToneGenerator          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                             \u2502 Binder IPC\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 AudioFlinger (system_server)                                \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 PlaybackThread  \u2502  \u2502  RecordThread    \u2502  \u2502  MmapThread \u2502 \u2502\n\u2502 \u2502 (\u6df7\u97f3\u64ad\u653e)      \u2502  \u2502  (\u5f55\u97f3)           \u2502  \u2502 (\u5171\u4eab\u5185\u5b58)  \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                             \u2502 Passthrough \/ mmap\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Audio HAL (hardware\/interfaces\/audio\/)                      \u2502\n\u2502 (\u5382\u5546\u5b9e\u73b0\uff1aAudioStreamOut \/ AudioStreamIn)                 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                             \u2502\n  \u97f3\u9891\u786c\u4ef6 (DAC \/ DSP \/ I2S \/ PCM)\n<\/pre>\n<h3>1.2 \u5173\u952e\u804c\u8d23<\/h3>\n<p>| \u804c\u8d23 | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|<br \/>\n| <strong>\u97f3\u9891\u6df7\u97f3<\/strong> | \u591a\u4e2a AudioTrack \u6df7\u6210\u4e00\u4e2a\u8f93\u51fa\u6d41 |<br \/>\n| <strong>\u5171\u4eab\u5185\u5b58\u7ba1\u7406<\/strong> | mmap \u673a\u5236\uff0cApp \u4e0e AudioFlinger \u4e4b\u95f4\u96f6\u62f7\u8d1d |<br \/>\n| <strong>\u7ebf\u7a0b\u8c03\u5ea6<\/strong> | PlaybackThread \u5468\u671f\u6027\u5524\u9192\uff0c\u6d88\u8d39\u6570\u636e |<br \/>\n| <strong>\u91cd\u91c7\u6837<\/strong> | \u4e0d\u540c\u91c7\u6837\u7387\u7684 Track \u6df7\u97f3\u65f6\u9700\u8981\u91cd\u91c7\u6837 |<br \/>\n| <strong>\u97f3\u91cf\u5904\u7406<\/strong> | \u64ad\u653e\u524d\u5e94\u7528\u97f3\u91cf\u66f2\u7ebf\u548c\u8bbe\u5907\u9009\u578b |<br \/>\n| <strong>Effects<\/strong> | \u53ef\u9009\u7684\u97f3\u6548\u5904\u7406\u94fe\uff08\u4f4e\u97f3\u589e\u5f3a\u3001\u865a\u62df\u73af\u7ed5\u7b49\uff09 |<\/p>\n<h2>\u4e8c\u3001\u6838\u5fc3\u6570\u636e\u7ed3\u6784<\/h2>\n<h3>2.1 \u5171\u4eab\u5185\u5b58\u63a7\u5236\u5757\uff08audio_track_cblk_t\uff09<\/h3>\n<p>AudioTrack \u4e0e AudioFlinger \u4e4b\u95f4\u901a\u8fc7 <code>mmap<\/code> \u5171\u4eab\u5185\u5b58\u901a\u4fe1\uff0c\u6838\u5fc3\u662f <code>audio_track_cblk_t<\/code> \u63a7\u5236\u5757\uff1a<\/p>\n<pre>\nstruct audio_track_cblk_t {\n    void* buffers;              \/\/ \u5171\u4eab\u5185\u5b58\u57fa\u5730\u5740\n    uint32_t bufferCount;\n    uint32_t bufferSize;        \/\/ \u6bcf\u4e2a buffer \u5b57\u8282\u6570\n    uint32_t frameSize;         \/\/ \u6bcf\u5e27\u5b57\u8282\u6570\n\n    volatile uint32_t server;   \/\/ AudioFlinger \u5df2\u6d88\u8d39\u5230\u7684\u5e27\u4f4d\u7f6e\n    volatile uint32_t user;    \/\/ App \u5df2\u5199\u5165\u7684\u5e27\u4f4d\u7f6e\n    \n    uint32_t bufferEnd;        \/\/ \u5171\u4eab\u5185\u5b58\u73af\u5f62\u7f13\u51b2\u533a\u8fb9\u754c\n    android::Mutex mutex;\n    android::Condition cv;\n    volatile int32_t flowState;\n    uint32_t frameCount;\n};\n<\/pre>\n<p><strong>\u5de5\u4f5c\u539f\u7406\uff1a<\/strong><\/p>\n<pre>\n     \u5171\u4eab\u5185\u5b58\u73af\u5f62\u7f13\u51b2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\n\n     [\u5df2\u6d88\u8d39][\u5df2\u6d88\u8d39][\u53ef\u8bfb\u6570\u636e    ][\u53ef\u5199\u533a\u57df][\u53ef\u5199\u533a\u57df]\n                       \u2191          \u2191          \u2191\n                    server      user     bufferEnd\n\n     user - server = \u5c1a\u672a\u88ab\u6d88\u8d39\u7684\u6570\u636e\u5e27\u6570\n     \u7f13\u51b2\u533a\u6ee1 \u2192 user \u8ffd\u4e0a server \u2192 App write() \u963b\u585e\n     \u7f13\u51b2\u533a\u7a7a \u2192 server \u8ffd\u4e0a user \u2192 AudioFlinger \u8f93\u51fa\u9759\u97f3\n<\/pre>\n<h2>\u4e09\u3001\u97f3\u9891\u6df7\u97f3\u6d41\u7a0b<\/h2>\n<h3>3.1 \u6b63\u5e38\u64ad\u653e\u8def\u5f84<\/h3>\n<pre>\nApp: track.write(buffer) \n  \u2192 AudioFlinger: PlaybackThread.threadLoop()\n  \u2192 \u4f9d\u6b21\u6267\u884c\uff1a\n     \u2460 \u68c0\u67e5\u5404 Track \u7f13\u51b2\u533a\u72b6\u6001\uff08\u662f\u5426 underrun\uff09\n     \u2461 \u91cd\u91c7\u6837\uff08\u5982\u679c Track \u91c7\u6837\u7387 \u2260 \u8f93\u51fa\u91c7\u6837\u7387\uff09\n     \u2462 \u6df7\u97f3\uff08\u6240\u6709 Track \u53e0\u52a0\uff09\n     \u2463 \u5e94\u7528\u97f3\u91cf\n     \u2464 \u5e94\u7528 Effects\n     \u2465 \u5199\u5165 HAL output stream\n<\/pre>\n<h3>3.2 threadLoop \u6838\u5fc3\u903b\u8f91\uff08\u7b80\u5316\u7248\uff09<\/h3>\n<pre>\nbool PlaybackThread::threadLoop() {\n    const uint32_t outFrames = mFrameCount;\n    float mixBuffer[outFrames * mChannelCount];\n\n    for (const auto&amp; track : mTracks) {\n        if (track->isReady()) {\n            float* trackBuffer = track->getBuffer(outFrames);\n            for (uint32_t i = 0; i &lt; outFrames; i++) {\n                mixBuffer[i] += trackBuffer[i] * track->volume;\n            }\n        }\n    }\n\n    mEffectsChain->process(mixBuffer, outFrames);\n    mOutput->write(mixBuffer, outFrames);\n\n    for (const auto&amp; track : mTracks) {\n        track->updateServerPosition(outFrames);\n    }\n    return true;\n}\n<\/pre>\n<h2>\u56db\u3001\u7ebf\u7a0b\u6a21\u578b<\/h2>\n<h3>4.1 PlaybackThread \u751f\u547d\u5468\u671f<\/h3>\n<pre>\nAudioFlinger \u6536\u5230 createTrack() \u8bf7\u6c42\n  \u2192 binder \u7ebf\u7a0b\u5904\u7406\u8bf7\u6c42\n  \u2192 \u5728 PlaybackThread \u4e2d\u521b\u5efa Track \u5bf9\u8c61\n  \u2192 PlaybackThread \u88ab\u52a0\u5165 ThreadLoop \u8c03\u5ea6\n  \nPlaybackThread \u6301\u7eed\u8fd0\u884c\uff1a\n  \u2192 \u6bcf\u6b21 wakeUp() \u540e\u6267\u884c threadLoop()\n  \u2192 \u4ece mTracks \u4e2d\u6536\u96c6\u6570\u636e\u6df7\u97f3\n  \u2192 \u5199 HAL output\n  \u2192 \u5982\u679c\u6240\u6709 Track \u90fd\u6ca1\u6570\u636e\uff0csleep() \u7b49\u5f85\n<\/pre>\n<h3>4.2 \u7ebf\u7a0b\u4f18\u5148\u7ea7<\/h3>\n<p>| \u7ebf\u7a0b | \u4f18\u5148\u7ea7 | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8211;|&#8212;&#8212;|<br \/>\n| PlaybackThread (low latency) | <strong>TPRIO_AUDIO_LOW<\/strong> | \u97f3\u4e50\u3001\u6e38\u620f\u7b49\u4f4e\u5ef6\u8fdf\u573a\u666f |<br \/>\n| PlaybackThread (mixed) | <strong>TPRIO_AUDIO_APP<\/strong> | \u666e\u901a\u5a92\u4f53\u64ad\u653e |<br \/>\n| RecordThread | <strong>TPRIO_AUDIO_REC<\/strong> | \u5f55\u97f3 |<br \/>\n| FastThread (HAL callback) | <strong>TPRIO_AUDIO_SYS<\/strong> | FastMixer \u8def\u5f84\uff0c\u6781\u4f4e\u5ef6\u8fdf |<\/p>\n<h3>4.3 Fast Mixer\uff08\u6781\u4f4e\u5ef6\u8fdf\u8def\u5f84\uff09<\/h3>\n<p>Android 10+ \u5f15\u5165\u4e86 <strong>FastMixer<\/strong>\uff0c\u7528\u4e8e\u5bf9\u5ef6\u8fdf\u6781\u5ea6\u654f\u611f\u7684\u573a\u666f\uff1a<\/p>\n<pre>\n\u666e\u901a\u8def\u5f84\uff1aApp \u2192 AF(PlayThread) \u2192 HAL \u2192 \u786c\u4ef6\uff08\u5ef6\u8fdf 50ms+\uff09\nFast\u8def\u5f84\uff1aApp \u2192 FastTrack \u2192 FastThread \u2192 HAL\uff08\u5ef6\u8fdf &lt; 20ms\uff09\n<\/pre>\n<p>FastMixer \u4f7f\u7528\u66f4\u5c0f\u7684 buffer size\uff0c\u8df3\u8fc7\u90e8\u5206\u91cd\u91c7\u6837\u548c effects \u94fe\uff0c\u76f4\u63a5\u8d70 HAL \u7684 fast path\u3002<\/p>\n<h2>\u4e94\u3001Buffer \u7ba1\u7406\u4e0e Underrun<\/h2>\n<h3>5.1 Underrun \u4ea7\u751f\u539f\u7406<\/h3>\n<pre>\n\u65f6\u95f4\u8f74 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\n\n[\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588        ]  \u7f13\u51b2\u533a 60% \u6ee1\uff0cAudioFlinger \u6d88\u8d39\u4e2d\n[                    ]  \u7f13\u51b2\u533a\u7a7a\u4e86\uff01\n[                    ]  AudioFlinger \u8f93\u51fa\u9759\u97f3\uff08silence\uff09\n\n                    \u2191 \n                 \u8fd9\u91cc\u662f underrun\n                 \n\u6062\u590d\u77ac\u95f4\uff1a\n[    \u2593\u2593\u2593\u2593\u2593\u2593        ]  \u65b0\u6570\u636e\u5230\u8fbe + DAC \u7a81\u7136\u6709\u8f93\u51fa\n                 \u2191\n              Pop \u97f3\n<\/pre>\n<h3>5.2 Underrun \u7684\u5e38\u89c1\u539f\u56e0<\/h3>\n<p>| \u539f\u56e0 | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|<br \/>\n| <strong>App \u5199\u6570\u636e\u592a\u6162<\/strong> | \u4e3b\u7ebf\u7a0b\u88ab GC\u3001CPU \u62a2\u5360\uff0cwrite() \u8c03\u7528\u4e0d\u53ca\u65f6 |<br \/>\n| <strong>Buffer \u8bbe\u7f6e\u592a\u5c0f<\/strong> | \u7f13\u51b2\u533a\u4e0d\u8db3\u4ee5\u8986\u76d6\u4e3b\u7ebf\u7a0b\u6296\u52a8 |<br \/>\n| <strong>Track \u88ab\u9ad8\u4f18\u5148\u7ea7\u62a2\u5360<\/strong> | \u5bfc\u822a\u64ad\u62a5\u7b49\u9ad8\u4f18\u5148\u7ea7 Track \u62a2\u5360 Mixer \u65f6\u95f4\u7247 |<br \/>\n| <strong>HAL \u5185\u90e8\u7f13\u51b2\u533a\u8fc7\u5927<\/strong> | \u5382\u5546\u5b9e\u73b0\u7684 HAL \u5185\u90e8\u7f13\u51b2\u592a\u5927\uff0c\u7cfb\u7edf\u6574\u4f53\u5ef6\u8fdf\u4e0a\u5347 |<br \/>\n| <strong>\u91c7\u6837\u7387\u4e0d\u5339\u914d<\/strong> | \u91cd\u91c7\u6837\u5f00\u9500\u5927\uff0cAudioFlinger \u6765\u4e0d\u53ca\u6d88\u8d39 |<\/p>\n<h3>5.3 Underrun \u68c0\u6d4b\u4e0e\u65e5\u5fd7<\/h3>\n<pre>\n# \u67e5\u770b AudioFlinger \u72b6\u6001\uff08\u6700\u91cd\u8981\uff09\nadb shell dumpsys media.audio_flinger\n\n# \u8f93\u51fa\u793a\u4f8b\uff1a\n# PlaybackThread:\n#   Track 0xb400007f4c4c2a00, name=Music, underruns=3\n#   Track 0xb400007f4c4c3b00, name=Navigation, underruns=0\n\n# \u8fc7\u6ee4 underrun \u76f8\u5173 log\nadb logcat | grep -i \"underrun|playbackthread|buffer\"\n<\/pre>\n<h3>5.4 Buffer Size \u914d\u7f6e\u5efa\u8bae<\/h3>\n<p>| \u4f7f\u7528\u573a\u666f | bufferSizeInBytes | \u7f13\u51b2\u65f6\u957f (48kHz) | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;|<br \/>\n| \u6781\u4f4e\u5ef6\u8fdf\uff08\u6e38\u620f\/\u5361\u62c9OK\uff09 | 1024-2048 | 5-10ms | \u98ce\u9669\u9ad8\uff0c\u9700\u8981 App \u5c42\u7a33\u5b9a |<br \/>\n| \u4f4e\u5ef6\u8fdf | 4096 | ~21ms | \u5e73\u8861\u4e4b\u9009 |<br \/>\n| \u666e\u901a\u5a92\u4f53 | 8192 | ~42ms | \u63a8\u8350\u5927\u591a\u6570\u573a\u666f |<br \/>\n| \u9ad8\u7a33\u5b9a\u6027\uff08\u5bfc\u822a\u63d0\u793a\u97f3\uff09 | 16384 | ~85ms | \u6297\u6296\u52a8\u80fd\u529b\u5f3a |<\/p>\n<h2>\u516d\u3001\u91cd\u91c7\u6837\u673a\u5236<\/h2>\n<h3>6.1 \u4ec0\u4e48\u65f6\u5019\u9700\u8981\u91cd\u91c7\u6837<\/h3>\n<p>\u5f53\u591a\u4e2a Track \u91c7\u6837\u7387\u4e0d\u4e00\u81f4\u65f6\uff0cAudioFlinger \u5fc5\u987b\u91cd\u91c7\u6837\u5230\u7edf\u4e00\u7684\u8f93\u51fa\u91c7\u6837\u7387\uff1a<\/p>\n<pre>\nTrack A: 44.1kHz \u2192 \u91cd\u91c7\u6837\u5230 48kHz \u2192 \u6df7\u97f3\nTrack B: 48kHz   \u2192 \u76f4\u63a5\u6df7\u97f3\nTrack C: 96kHz   \u2192 \u91cd\u91c7\u6837\u5230 48kHz \u2192 \u6df7\u97f3\n                \u2193\n         \u8f93\u51fa\u5230 HAL (48kHz)\n<\/pre>\n<h3>6.2 \u91cd\u91c7\u6837\u6027\u80fd\u5f71\u54cd<\/h3>\n<pre>\n\u91cd\u91c7\u6837\u8ba1\u7b97\u8017\u65f6\uff0848kHz \u7acb\u4f53\u58f0 256 \u5e27\u8f93\u51fa\uff09\uff1a\n\nQuality = LOW    \u2192 ~0.5ms CPU \u65f6\u95f4\nQuality = MEDIUM \u2192 ~1.2ms CPU \u65f6\u95f4\nQuality = HIGH   \u2192 ~2.5ms CPU \u65f6\u95f4\n\n\u5982\u679c PlaybackThread \u6bcf 5ms \u5524\u9192\u4e00\u6b21\uff0c\n\u91cd\u91c7\u6837\u5360\u7528\u8d85\u8fc7 2ms \u5c31\u4f1a\u5f71\u54cd\u6df7\u97f3\u5b9e\u65f6\u6027\u3002\n<\/pre>\n<h2>\u4e03\u3001AudioFlinger \u4e0e Audio Effects \u7684\u4ea4\u4e92<\/h2>\n<h3>7.1 Effects \u5728\u97f3\u9891\u67b6\u6784\u4e2d\u7684\u4f4d\u7f6e<\/h3>\n<p>AudioFlinger \u901a\u8fc7 <strong>EffectsFactory<\/strong> \u548c <strong>EffectsChain<\/strong> \u7ba1\u7406\u6240\u6709\u97f3\u6548\u5904\u7406\u3002Effects \u4f4d\u4e8e\u6df7\u97f3\u4e4b\u540e\u3001\u5199\u5165 HAL \u4e4b\u524d\uff1a<\/p>\n<pre>\n\u5404 Track \u6570\u636e\n     \u2193\n  Resample\uff08\u91cd\u91c7\u6837\uff09\n     \u2193\n Track \u7ea7 Effects\uff08\u53ef\u9009\uff0c\u6bcf\u4e2a Track \u72ec\u7acb\uff09\n     \u2193\n \u6df7\u97f3\u5668\uff08Mixer\uff09\n     \u2193\n \u8f93\u51fa\u7ea7 Effects\uff08\u4e3b Effects \u94fe\uff09\n     \u2193\n HAL Output Stream\n<\/pre>\n<h3>7.2 \u4e24\u79cd Effects \u6302\u8f7d\u65b9\u5f0f<\/h3>\n<p>| \u7c7b\u578b | \u4f5c\u7528\u57df | \u5178\u578b\u7528\u9014 |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;-|<br \/>\n| <strong>Track Effects<\/strong> | \u5355\u4e2a AudioTrack | \u5361\u62c9OK\u4eba\u58f0\u6d88\u9664\u3001\u5f55\u97f3\u964d\u566a |<br \/>\n| <strong>Output Effects<\/strong> | \u6574\u4e2a Output Mix | \u5747\u8861\u5668\u3001\u865a\u62df\u73af\u7ed5\u3001\u4f4e\u97f3\u589e\u5f3a |<\/p>\n<h3>7.3 EffectsChain \u6838\u5fc3\u7ed3\u6784<\/h3>\n<pre>\n\/\/ frameworks\/av\/services\/audioflinger\/Effects.cpp\n\nclass EffectsChain {\n    sp&lt;PlaybackThread&gt; mThread;          \/\/ \u6240\u5c5e PlaybackThread\n    Vector&lt; sp&lt;EffectModule&gt; &gt; mEffects; \/\/ \u4e32\u8d77\u7684 Effect \u94fe\u8868\n    \n    \/\/ \u8f93\u5165\/\u8f93\u51fa buffer\n    float* mMixerBuffer;                 \/\/ \u6df7\u97f3\u5668\u8f93\u51fa\n    float* mOutputBuffer;               \/\/ Effects \u5904\u7406\u540e\u8f93\u51fa\n    \n    \/\/ \u5904\u7406\u51fd\u6570\n    status_t process_l(float* buffer, size_t frames);\n};\n<\/pre>\n<pre>\nEffectModule \u7ed3\u6784\uff1a\n\nclass EffectModule {\n    sp&lt;EffectInterface&gt; mInterface;     \/\/ HAL \u63a5\u53e3\u4ee3\u7406\n    effect_descriptor_t mDescriptor;      \/\/ Effect \u63cf\u8ff0\uff08\u540d\u79f0\u3001UUID\uff09\n    \n    uint32_t mSampleRate;                \/\/ \u5f53\u524d\u91c7\u6837\u7387\n    int mChannelMask;                    \/\/ \u901a\u9053\u63a9\u7801\n    \n    \/\/ \u72b6\u6001\n    bool mEnabled;\n    uint32_t mId;                        \/\/ \u552f\u4e00\u6807\u8bc6\n    \n    \/\/ \u914d\u7f6e\n    effect_config_t mConfig;             \/\/ \u8f93\u5165\/\u8f93\u51fa\u914d\u7f6e\uff08\u91c7\u6837\u7387\u3001\u901a\u9053\u3001buffer size\uff09\n};\n<\/pre>\n<h3>7.4 Effects \u5904\u7406\u6d41\u7a0b\uff08threadLoop \u4e2d\u7684\u8c03\u7528\u987a\u5e8f\uff09<\/h3>\n<pre>\nbool PlaybackThread::threadLoop() {\n    \/\/ 1. \u6536\u96c6\u5404 Track \u6570\u636e\uff0c\u53ef\u80fd\u505a\u91cd\u91c7\u6837\n    for (track : mTracks) {\n        trackBuffer = track-&gt;getBuffer(frames);\n        \/\/ Track \u7ea7 Effects \u5904\u7406\uff08\u5982\u679c\u5df2attach\uff09\n        for (effect : track-&gt;mEffects) {\n            effect-&gt;process(trackBuffer, frames);\n        }\n    }\n    \n    \/\/ 2. \u6df7\u97f3\u6240\u6709 Track\n    mixerBuffer = mixAllTracks(mTracks, frames);\n    \n    \/\/ 3. Output \u7ea7 Effects \u94fe\u5904\u7406\n    for (effect : mOutputEffectsChain-&gt;mEffects) {\n        effect-&gt;process(mixerBuffer, frames);\n    }\n    \n    \/\/ 4. \u5199\u5165 HAL\n    mOutput-&gt;write(mixerBuffer, frames);\n}\n<\/pre>\n<h3>7.5 \u521b\u5efa\u5e76\u6302\u8f7d Effect \u5230 Track<\/h3>\n<pre>\n\/\/ frameworks\/av\/media\/libmedia\/AudioEffect.cpp\n\n\/\/ App \u5c42\u521b\u5efa Effect\nAudioEffect effect = new AudioEffect();\neffect.setEffect(android.media.audiofx.BassBoost::class.java);\neffect.attach(implementationId);  \/\/ \u6307\u5b9a\u5177\u4f53 Effect \u5b9e\u73b0\n\n\/\/ \u6216\u8005\u901a\u8fc7 AudioTrack \u76f4\u63a5\u521b\u5efa\uff08Android 12+\uff09\nAudioTrack track = new AudioTrack.Builder()\n    .setAudioAttributes(attrs)\n    .setBufferSizeInBytes(8192)\n    .build();\n\n\/\/ \u5c06 Effect attach \u5230 Track\uff08\u9700\u8981 UID \u6743\u9650\uff09\ntrack.attachEffect(effect.getId());\n<\/pre>\n<h3>7.6 Output Effects \u7684\u52a0\u8f7d\u4e0e\u5382\u5546\u5b9e\u73b0<\/h3>\n<p>AudioFlinger \u542f\u52a8\u65f6\u901a\u8fc7 <strong>AudioPolicyService<\/strong> \u52a0\u8f7d HAL \u5c42\u7684 Effects\uff1a<\/p>\n<pre>\nAudioPolicyService\n  \u2192 AudioPolicyManager\n    \u2192 \u8bfb\u53d6 audio_effects.conf \u914d\u7f6e\n      \u2192 \u52a0\u8f7d vendor\/lib\/libaudioeq.so \u7b49\u5382\u5546\u5b9e\u73b0\n      \naudio_effects.conf \u793a\u4f8b\uff1a\n\nlibraries {\n  builtin:\n    path \/vendor\/lib\/libeffects_builtin.so\n  bundle:\n    path \/vendor\/lib\/libeffects_bundle.so\n  audio_visualizer:\n    path \/vendor\/lib\/libvisualizer.so\n  audio_pre_processing:\n    path \/vendor\/lib\/libaudio-pre-proc.so\n}\n\neffects {\n  bassboost {\n    library bundle\n    uuid f5268c21-3e19-4d30-b8e0-d5e2f7c7c3d5\n  }\n  equalizer {\n    library bundle\n    uuid 9538a8c1-4d30-4eef-a4c9-5c64e2e2e2e1\n  }\n  virtualizer {\n    library bundle\n    uuid 3c9b24f1-3e19-4d30-b8e0-d5e2f7c7c3d6\n  }\n}\n<\/pre>\n<h3>7.7 Effect UUID \u4e0e\u5382\u5546\u5b9e\u73b0<\/h3>\n<p>\u6bcf\u4e2a Effect \u7531 <strong>UUID<\/strong> \u552f\u4e00\u6807\u8bc6\uff0cUUID \u51b3\u5b9a\u4f7f\u7528\u54ea\u4e2a HAL \u5b9e\u73b0\uff1a<\/p>\n<pre>\nEffect UUID \u683c\u5f0f\uff1a\n- \u5382\u5546\u5fc5\u987b\u5b9e\u73b0 IEffect.hal \u4e2d\u5b9a\u4e49\u7684\u6240\u6709\u63a5\u53e3\n- AudioFlinger \u901a\u8fc7 UUID \u67e5\u627e\u5bf9\u5e94 HAL \u6a21\u5757\n- \u540c\u4e00\u4e2a Effect \u53ef\u4ee5\u6709\u591a\u4e2a\u7248\u672c\uff08\u4e0d\u540c\u5382\u5546\u7684\u4f18\u5316\u5b9e\u73b0\uff09\n\n\/\/ \u5e38\u89c1 Effect UUIDs\uff08\u6807\u51c6 Android\uff09\nconst effect_uuid_t EFFECT_UUID_BASSBOOST   = { 0xf5268c21, ... };\nconst effect_uuid_t EFFECT_UUID_EQUALIZER  = { 0x9538a8c1, ... };\nconst effect_uuid_t EFFECT_UUID_VIRTUALIZER = { 0x3c9b24f1, ... };\nconst effect_uuid_t EFFECT_UUID_REVERB     = { 0xc8c56f21, ... };\n<\/pre>\n<h3>7.8 Effect \u53c2\u6570\u914d\u7f6e<\/h3>\n<pre>\n\/\/ \u8bbe\u7f6e Effect \u53c2\u6570\uff08\u901a\u8fc7 IEffect HAL \u63a5\u53e3\uff09\neffect-&gt;setParameter(EFFECT_PARAM_BASS_LEVEL, 1000);  \/\/ 0-1000\n\n\/\/ \u67e5\u8be2 Effect \u72b6\u6001\neffect-&gt;getParameter(EFFECT_PARAM_BASS_LEVEL, &amp;level);\n\n\/\/ \u83b7\u53d6 Effect \u5b9e\u9645\u751f\u6548\u7684\u53c2\u6570\u8303\u56f4\neffect_descriptor_t desc;\neffect-&gt;getDescriptor(&amp;desc);\n\/\/ desc.effectUuid, desc.name, desc.implementationUuid \u7b49\n<\/pre>\n<h3>7.9 \u5178\u578b Effect \u5904\u7406\u6d41\u7a0b\u793a\u4f8b\uff1a\u5747\u8861\u5668\uff08Equalizer\uff09<\/h3>\n<pre>\nEqualizer \u5904\u7406\u6d41\u7a0b\uff1a\n\n\u8f93\u5165 PCM\uff0844.1kHz \u7acb\u4f53\u58f0\uff09\n     \u2193\n Band Split\uff08\u9891\u6bb5\u5206\u79bb\uff09\n   \u251c\u2500\u2500 Band 0: 20Hz-250Hz\n   \u251c\u2500\u2500 Band 1: 250Hz-500Hz\n   \u251c\u2500\u2500 Band 2: 500Hz-1kHz\n   \u251c\u2500\u2500 Band 3: 1kHz-4kHz\n   \u2514\u2500\u2500 Band 4: 4kHz-20kHz\n     \u2193\n \u5404 Band \u72ec\u7acb\u589e\u76ca\u8c03\u6574\uff08-12dB ~ +12dB\uff09\n     \u2193\n Band Merge\uff08\u9891\u6bb5\u5408\u5e76\uff09\n     \u2193\n \u8f93\u51fa PCM\uff0844.1kHz \u7acb\u4f53\u58f0\uff0c\u589e\u5f3a\u540e\uff09\n<\/pre>\n<pre>\n\/\/ Equalizer band \u6570\u91cf\u53d6\u51b3\u4e8e\u5382\u5546\u5b9e\u73b0\n\/\/ Android \u6807\u51c6\u5b9a\u4e49\u6700\u5927 5 band\uff0c\u4f46\u9ad8\u901a\/MTK \u901a\u5e38\u5b9e\u73b0 32 band\n\n\/\/ \u67e5\u8be2\u652f\u6301\u7684\u9891\u6bb5\u6570\nint numBands = equalizer-&gt;numberOfBands();\nint[] freqRange = equalizer-&gt;getBandFreqRange();\n\n\/\/ \u8bbe\u7f6e\u7b2c n \u4e2a\u9891\u6bb5\u7684\u589e\u76ca\uff08\u5355\u4f4d\u6beb\u8d1d\uff09\nequalizer-&gt;setBandLevel(band, milliBels);\n<\/pre>\n<h3>7.10 Effects \u8c03\u8bd5\u547d\u4ee4<\/h3>\n<pre>\n# \u67e5\u770b\u5f53\u524d\u6d3b\u8dc3\u7684 EffectsChain\nadb shell dumpsys media.audio_flinger | grep -A 20 \"EffectsChain\"\n\n# \u67e5\u770b\u5177\u4f53 Effect \u72b6\u6001\nadb shell dumpsys media.audio_flinger | grep -E \"EffectModule|effect|Equalizer|BassBoost|Virtualizer\"\n\n# \u67e5\u770b HAL \u5c42 Effect \u5b9e\u73b0\nadb shell dumpsys media.audio_flinger | grep -i \"uuid|descriptor\"\n\n# Logcat \u8fc7\u6ee4 Effect \u76f8\u5173\nadb logcat | grep -E \"EffectModule|EffectsFactory|AudioEffect|process_l\"\n\n# \u6293\u53d6 Effect \u5904\u7406\u524d\u540e\u7684 PCM\uff08\u9700\u8981 root\uff09\n# \u5728 EffectsChain::process_l() \u4e2d\u52a0 dump\n<\/pre>\n<h3>7.11 Effects \u5e38\u89c1\u95ee\u9898\u4e0e\u6392\u67e5<\/h3>\n<p>| \u95ee\u9898 | \u53ef\u80fd\u539f\u56e0 | \u6392\u67e5\u65b9\u6cd5 |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;-|<br \/>\n| <strong>Effect \u4e0d\u751f\u6548<\/strong> | Effect \u672a attach \u6216\u672a enable | \u786e\u8ba4 <code>effect.attach()<\/code> \u548c <code>effect.setEnable(true)<\/code> \u5df2\u8c03\u7528 |<br \/>\n| <strong>\u97f3\u6548\u5f02\u5e38\uff08\u7206\u97f3\uff09<\/strong> | Effect \u8f93\u51fa\u589e\u76ca\u8fc7\u5927\u8d85\u51fa\u8303\u56f4 | \u68c0\u67e5 <code>EFFECT_PARAM_VOLUME<\/code> \u8bbe\u7f6e |<br \/>\n| <strong>\u6027\u80fd\u4e0b\u964d<\/strong> | Effect \u8ba1\u7b97\u91cf\u5927\uff0cCPU \u8ddf\u4e0d\u4e0a | systrace \u770b AudioFlinger \u7ebf\u7a0b\u662f\u5426\u6309\u65f6\u5b8c\u6210 |<br \/>\n| <strong>\u591a Effect \u51b2\u7a81<\/strong> | \u591a\u4e2a Effect \u4e32\u884c\u5904\u7406\u987a\u5e8f\u4e0d\u5bf9 | \u8c03\u6574 Effect attach \u987a\u5e8f |<br \/>\n| <strong>HAL \u5c42 Effect \u52a0\u8f7d\u5931\u8d25<\/strong> | UUID \u4e0d\u5339\u914d\u6216 so \u5e93\u7f3a\u5931 | \u68c0\u67e5 <code>audio_effects.conf<\/code> \u548c vendor lib |<\/p>\n<h3>7.12 Effect \u4e0e\u91cd\u91c7\u6837\u7684\u4ea4\u4e92<\/h3>\n<p>Effects \u5904\u7406\u901a\u5e38\u5728<strong>\u7edf\u4e00\u8f93\u51fa\u91c7\u6837\u7387<\/strong>\u4e0b\u8fdb\u884c\uff0c\u56e0\u6b64\uff1a<\/p>\n<ol>\n<li>\u5404 Track \u539f\u59cb\u91c7\u6837\u7387 \u2192 \u5148\u91cd\u91c7\u6837\u5230\u8f93\u51fa\u91c7\u6837\u7387<\/li>\n<li>\u91cd\u91c7\u6837\u540e\u6570\u636e \u2192 Track Effects \u5904\u7406<\/li>\n<li>\u6240\u6709 Track \u6df7\u97f3 \u2192 Output Effects \u5904\u7406<\/li>\n<\/ol>\n<pre>\n\u5982\u679c Track A \u662f 44.1kHz\uff0cTrack B \u662f 48kHz\uff1a\n\nTrack A: 44.1kHz \u2192 \u91cd\u91c7\u6837\u5230 48kHz \u2192 Track Effects \u2192 \u6df7\u97f3\nTrack B: 48kHz  \u2192 \u76f4\u63a5 \u2192 Track Effects \u2192 \u6df7\u97f3\n                                              \u2193\n                                    Output Effects (48kHz)\n                                              \u2193\n                                         HAL output\n<\/pre>\n<h3>7.13 \u7279\u6b8a\u573a\u666f\uff1aVoice Recognition \u4e0e Effects<\/h3>\n<p>\u8bed\u97f3\u5524\u9192\u573a\u666f\u901a\u5e38\u9700\u8981\u7981\u7528\u6240\u6709 Output Effects\uff0c\u907f\u514d\u5f71\u54cd ASR \u8bc6\u522b\uff1a<\/p>\n<pre>\n\/\/ Voice Recognition \u6a21\u5f0f\u4e0b AudioFlinger \u4f1a bypass \u6240\u6709 Effects\n\/\/ \u7531 CarAudioService \u6216 VoiceAssistantService \u63a7\u5236\n\nif (usage == AudioUsage.VOICE_ASSISTANT) {\n    \/\/ \u8bf7\u6c42 Voice Recognition \u8def\u5f84\uff08\u65e0 Effects\uff09\n    audioAttributes.setFlags(AudioAttributes.FLAG_VOICE_BYPASS_EFFECTS);\n}\n<\/pre>\n<h2>\u516b\u3001\u4e0e CarAudioService \u7684\u5173\u7cfb<\/h2>\n<h3>8.1 \u666e\u901a Android vs \u8f66\u8f7d Android<\/h3>\n<pre>\n\u666e\u901a Android\uff1a\nApp \u2192 AudioFlinger \u2192 AudioHAL \u2192 \u786c\u4ef6\n\n\u8f66\u8f7d Android\uff08AAOS\uff09\uff1a\nApp \u2192 CarAudioService \u2192 AudioFlinger \u2192 CarAudioHAL \u2192 \u786c\u4ef6\n         \u2191\n         \u591a\u4e86 CarAudioService \u4f5c\u4e3a\u4e2d\u95f4\u5c42\n         \u8d1f\u8d23\u591a Zone \u7ba1\u7406\u3001Audio Focus\u3001\u8f66\u8f7d\u7279\u6709\u8def\u7531\n<\/pre>\n<h3>8.2 AudioFlinger \u5728\u8f66\u8f7d\u4e2d\u7684\u89d2\u8272<\/h3>\n<p>\u65e0\u8bba\u662f\u5426\u4f7f\u7528 CarAudioService\uff0cAudioFlinger \u59cb\u7ec8\u8d1f\u8d23\uff1a<\/p>\n<ul>\n<li>\u5b9e\u9645\u7684\u6df7\u97f3\u8ba1\u7b97<\/li>\n<li>mmap \u5171\u4eab\u5185\u5b58\u7ba1\u7406<\/li>\n<li>HAL \u63a5\u53e3\u8c03\u7528<\/li>\n<li>\u7f13\u51b2\u533a\u8c03\u5ea6<\/li>\n<\/ul>\n<p>CarAudioService \u5728\u4e0a\u5c42\u505a Zone \u8def\u7531\u548c Focus \u7ba1\u7406\uff0c\u6df7\u97f3\u548c\u8c03\u5ea6\u8fd8\u662f AudioFlinger \u5b8c\u6210\u3002<\/p>\n<h2>\u4e5d\u3001\u8c03\u8bd5\u65b9\u6cd5<\/h2>\n<h3>9.1 \u6838\u5fc3\u8bca\u65ad\u547d\u4ee4<\/h3>\n<pre>\n# \u67e5\u770b AudioFlinger \u5168\u5c40\u72b6\u6001\uff08\u6700\u91cd\u8981\uff09\nadb shell dumpsys media.audio_flinger\n\n# \u67e5\u770b\u5177\u4f53 PlaybackThread \u8be6\u60c5\nadb shell dumpsys media.audio_flinger | grep -A 30 \"PlaybackThread\"\n\n# \u67e5\u770b\u5404 Track \u72b6\u6001\nadb shell dumpsys media.audio_flinger | grep -E \"Track|underrun|latency\"\n\n# \u67e5\u770b HAL \u5c42\u4fe1\u606f\nadb shell dumpsys media.audio_flinger | grep -A 10 \"StreamOut\"\n<\/pre>\n<h3>9.2 \u5173\u952e\u5b57\u6bb5\u89e3\u8bfb<\/h3>\n<p>| \u5b57\u6bb5 | \u542b\u4e49 | \u6b63\u5e38\u503c |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|&#8212;&#8212;&#8211;|<br \/>\n| <code>underruns<\/code> | underrun \u6b21\u6570 | 0 \u6216\u5076\u5c14 > 0 |<br \/>\n| <code>latency<\/code> | \u7aef\u5230\u7aef\u5ef6\u8fdf\u4f30\u7b97 | 20-150ms |<br \/>\n| <code>sampleRate<\/code> | \u5f53\u524d\u8f93\u51fa\u91c7\u6837\u7387 | 44100 \u6216 48000 |<br \/>\n| <code>bufferSize<\/code> | HAL \u7f13\u51b2\u533a\u5927\u5c0f | \u5382\u5546\u5b9e\u73b0\u76f8\u5173 |<br \/>\n| <code>tracks<\/code> | \u6d3b\u8dc3 Track \u6570\u91cf | 1-10\uff08\u53d6\u51b3\u4e8e\u4f7f\u7528\u573a\u666f\uff09 |<\/p>\n<h3>9.3 \u5b8c\u6574\u8c03\u8bd5\u6e05\u5355<\/h3>\n<ol>\n<li><code>adb shell dumpsys media.audio_flinger<\/code><br \/>\n\u2192 \u786e\u8ba4 PlaybackThread \u5b58\u5728\u4e14\u8fd0\u884c\u4e2d<br \/>\n\u2192 \u786e\u8ba4 tracks \u6570\u91cf\u548c underruns \u8ba1\u6570<\/li>\n<li><code>adb logcat | grep -i underrun<\/code><br \/>\n\u2192 \u627e underrun \u53d1\u751f\u7684\u65f6\u95f4\u548c\u9891\u7387<\/li>\n<li>\u786e\u8ba4 bufferSizeInBytes<br \/>\n\u2192 &lt; 4096 \u5bb9\u6613 underrun\uff0c\u5efa\u8bae \u2265 4096<\/li>\n<li>\u786e\u8ba4\u91c7\u6837\u7387<br \/>\n\u2192 track.getSampleRate() vs \u8f93\u51fa\u91c7\u6837\u7387<br \/>\n\u2192 \u4e0d\u4e00\u81f4\u65f6\u68c0\u67e5 log \u6709\u65e0\u91cd\u91c7\u6837\u8b66\u544a<\/li>\n<li>\u6293 HAL dump<br \/>\n\u2192 \u5bf9\u6bd4 Framework \u5c42\u548c HAL \u5c42\u6570\u636e\u662f\u5426\u4e00\u81f4<\/li>\n<li>systrace<br \/>\n\u2192 \u5206\u6790 PlaybackThread \u8c03\u5ea6\u662f\u5426\u51c6\u65f6<\/li>\n<li>\u6d4b\u8bd5\u4e0d\u540c\u573a\u666f<br \/>\n\u2192 \u653e\u97f3\u4e50\u3001\u5bfc\u822a\u64ad\u62a5\u3001\u514d\u63d0\u901a\u8bdd\u5206\u522b\u6d4b\u8bd5<\/li>\n<\/ol>\n<h2>\u5341\u3001\u603b\u7ed3<\/h2>\n<p>| \u7ef4\u5ea6 | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|<br \/>\n| <strong>\u5b9a\u4f4d<\/strong> | Android \u97f3\u9891\u7cfb\u7edf\u6838\u5fc3\u5f15\u64ce\uff0c\u8d1f\u8d23\u6df7\u97f3\u3001\u8c03\u5ea6\u3001\u5171\u4eab\u5185\u5b58\u7ba1\u7406 |<br \/>\n| <strong>\u6838\u5fc3\u673a\u5236<\/strong> | mmap \u5171\u4eab\u5185\u5b58 + PlaybackThread \u5468\u671f\u6027\u6df7\u97f3 |<br \/>\n| <strong>\u7ebf\u7a0b\u6a21\u578b<\/strong> | PlaybackThread \u8d1f\u8d23\u6df7\u97f3\uff0cFastThread \u8d1f\u8d23\u6781\u4f4e\u5ef6\u8fdf\u8def\u5f84 |<br \/>\n| <strong>Underrun \u6839\u56e0<\/strong> | App \u5199\u6570\u636e\u6162\u3001Buffer \u592a\u5c0f\u3001\u91cd\u91c7\u6837\u5f00\u9500\u5927\u3001HAL \u7f13\u51b2\u8fc7\u5927 |<br \/>\n| <strong>Effects \u4ea4\u4e92<\/strong> | Track Effects \u5728\u6df7\u97f3\u524d\u5355\u8f68\u5904\u7406\uff0cOutput Effects \u5728\u6df7\u97f3\u540e\u5168\u5c40\u5904\u7406 |<br \/>\n| <strong>\u8c03\u8bd5\u5165\u53e3<\/strong> | <code>dumpsys media.audio_flinger<\/code> + logcat + systrace |<br \/>\n| <strong>\u4e0e CarAudioService<\/strong> | CarAudioService \u5728\u4e0a\u5c42\u505a\u8def\u7531\u548c Focus\uff0c\u5b9e\u9645\u6df7\u97f3\u4ecd\u7531 AudioFlinger \u5b8c\u6210 |<\/p>\n","protected":false},"excerpt":{"rendered":"<p>> \u9002\u7528\u5e73\u53f0\uff1aAndroid \u901a\u7528\u6846\u67b6\uff08AAOS \/ \u6807\u51c6 Android\uff09 > \u9002\u7528\u7248\u672c\uff1aAndroid 1 &#8230; <a title=\"Android AudioFlinger \u6df1\u5ea6\u89e3\u6790\" class=\"read-more\" href=\"\/index.php\/2026\/05\/04\/android-audioflinger-deep-analysis\/\" aria-label=\"\u9605\u8bfb Android AudioFlinger \u6df1\u5ea6\u89e3\u6790\">\u9605\u8bfb\u66f4\u591a<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,3],"tags":[],"class_list":["post-57","post","type-post","status-publish","format-standard","hentry","category-tech","category-car-audio"],"_links":{"self":[{"href":"\/index.php\/wp-json\/wp\/v2\/posts\/57","targetHints":{"allow":["GET"]}}],"collection":[{"href":"\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"\/index.php\/wp-json\/wp\/v2\/comments?post=57"}],"version-history":[{"count":3,"href":"\/index.php\/wp-json\/wp\/v2\/posts\/57\/revisions"}],"predecessor-version":[{"id":70,"href":"\/index.php\/wp-json\/wp\/v2\/posts\/57\/revisions\/70"}],"wp:attachment":[{"href":"\/index.php\/wp-json\/wp\/v2\/media?parent=57"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"\/index.php\/wp-json\/wp\/v2\/categories?post=57"},{"taxonomy":"post_tag","embeddable":true,"href":"\/index.php\/wp-json\/wp\/v2\/tags?post=57"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}