惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Troy Hunt's Blog
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
T
Tenable Blog
L
LINUX DO - 热门话题
V
Visual Studio Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
Netflix TechBlog - Medium
SecWiki News
SecWiki News
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Project Zero
Project Zero
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
Recorded Future
Recorded Future
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
S
Securelist
Spread Privacy
Spread Privacy
L
LangChain Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Last Watchdog
The Last Watchdog
Attack and Defense Labs
Attack and Defense Labs
博客园 - 司徒正美
Help Net Security
Help Net Security
L
Lohrmann on Cybersecurity
人人都是产品经理
人人都是产品经理
Forbes - Security
Forbes - Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
PCI Perspectives
PCI Perspectives
博客园 - 【当耐特】
T
Tor Project blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
来自九年前的远古音频兵器 - Xperia XZ Premium - 少数派
纳兰音韵 · 2026-05-25 · via 少数派

Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 

文章代表作者个人观点,少数派仅对标题和排版略作修改。


前言

Android 设备的音频质量,一直是一个被人们津津乐道的话题。从早年的低质量 AudioFlinger 强制重采样和低精度音频衰减,到现如今的专用 AAudio 高性能输出。但因为 SoC 制造商和 OEM 仍然对 HAL 有较大的自定义能力,不同设备上的音频质量区别仍旧非常巨大。比如联发科的某些设备会将 audioeffect 集成进 vendor 挂载在 AudioFlinger 上而无法关闭,高通设备的 Direct HD 可以在受支持的设备上绕过 effect chain 输出原始音频。

换句话说,Android 早已具备高质量音频输出的能力,但真正愿意保留声音原貌的厂商,却越来越少了。现在更流行的做法,则是先将所有音频统一送入 mixer 与 DSP 处理链路,再进行输出,在这里进行处理之后再输出。所谓的处理,大多是一些所谓的杜比音效,响度均衡,系统 EQ 甚至 OEM 音效。初衷确实是为了提升用户体验,但为此强行放弃了高保真音频,真的值得吗?

正巧在几个月前,我购入了一台银色镜面的 Sony Xperia XZ Premium。也正是从那时开始,我重新开始思考 Android 的声音到底应该是什么样子。

一睹机皇的风采:硬件配置

XZP 搭载了高通 msm8998 SoC,也就是高通骁龙 835。它的硬件基础或许算不上优秀,它没有专用的 DAC,而是使用了高通 Aqstic™ WCD9335 作为 DAC。

这颗 DAC 本身支持的最高音频规格来到了 32bit/384 KHz (PCM) 。支持 DSD64/128、FLAC、ALAC、LPCM 等常见的无损格式。

如果你对硬件感兴趣,这是一些来自其它网站的数据:

 44.1kHz48kHz96kHzZ3
测试项目,dB(A)-96.0-96.7-100.5-86.6
噪声水平,DB(A)95.896.6105.186.5
总谐波失真,%0.00160.00690.00670.012
互调失真,%0.00550.00500.00230.019
立体声分离度,dB-90.0-90.3-88.5-86.4

上述数据以及更详细的硬件测试,见 Soomal 我并不是太懂这方面,所以不说太多了,本文重点也不在此。

DIRECT 和 MIXER:把原始音频送进 HAL

这里测试了三 (四) 种不同的播放器,分别是:

  • Apple Music(集成解码器)
  • Sony Music(MediaFramework)
  • Poweramp(集成 FFmpeg)
  • Sony Music Center(Exclusive)

经过对比,发现输出类型大概可以分为四类:

  • MIXER
  • DIRECT,经过了索尼的 effectchain
  • DIRECT,高通 DIRECT HD,跳过了 effect chain
  • OFFLOAD,非 PCM 且支持的格式会被直接送进 DSP

这是来自 audio_output_policy.conf 的原始信息:

outputs {
  default {
    flags AUDIO_OUTPUT_FLAG_PRIMARY
    formats AUDIO_FORMAT_PCM_16_BIT
    sampling_rates 48000
    bit_width 16
    app_type 69937
  }
  proaudio {
    flags AUDIO_OUTPUT_FLAG_FAST|AUDIO_OUTPUT_FLAG_RAW
    formats AUDIO_FORMAT_PCM_16_BIT
    sampling_rates 48000
    bit_width 16
    app_type 69943
  }
  deep_buffer {
    flags AUDIO_OUTPUT_FLAG_DEEP_BUFFER
    formats AUDIO_FORMAT_PCM_16_BIT
    sampling_rates 48000
    bit_width 16
    app_type 69936
  }
  direct_pcm_16 {
    flags AUDIO_OUTPUT_FLAG_DIRECT
    formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
    sampling_rates 44100|48000|88200|96000|176400|192000
    bit_width 16
    app_type 69936
  }
  direct_pcm_24 {
    flags AUDIO_OUTPUT_FLAG_DIRECT
    formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
    sampling_rates 44100|48000|88200|96000|176400|192000|352800|384000
    bit_width 24
    app_type 69940
  }
  direct_pcm_32 {
    flags AUDIO_OUTPUT_FLAG_DIRECT
    formats AUDIO_FORMAT_PCM_32_BIT
    sampling_rates 44100|48000|88200|96000|176400|192000|352800|384000
    bit_width 32
    app_type 69942
  }
  compress_passthrough {
    flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING|AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH
    formats AUDIO_FORMAT_AC3|AUDIO_FORMAT_E_AC3|AUDIO_FORMAT_E_AC3_JOC|AUDIO_FORMAT_DTS|AUDIO_FORMAT_DTS_HD|AUDIO_FORMAT_DSD
    sampling_rates 32000|44100|48000|88200|96000|176400|192000|352800
    bit_width 16
    app_type 69941
  }
  compress_offload_16 {
    flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING
    formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_PCM_16_BIT_OFFLOAD|AUDIO_FORMAT_PCM_24_BIT_OFFLOAD|AUDIO_FORMAT_FLAC|AUDIO_FORMAT_ALAC|AUDIO_FORMAT_APE|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2|AUDIO_FORMAT_WMA|AUDIO_FORMAT_WMA_PRO|AUDIO_FORMAT_VORBIS|AUDIO_FORMAT_AAC_ADTS_LC|AUDIO_FORMAT_AAC_ADTS_HE_V1|AUDIO_FORMAT_AAC_ADTS_HE_V2
    sampling_rates 44100|48000|88200|96000|176400|192000
    bit_width 16
    app_type 69936
  }
  compress_offload_24 {
    flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING
    formats AUDIO_FORMAT_PCM_24_BIT_OFFLOAD|AUDIO_FORMAT_FLAC|AUDIO_FORMAT_ALAC|AUDIO_FORMAT_APE|AUDIO_FORMAT_VORBIS|AUDIO_FORMAT_WMA|AUDIO_FORMAT_WMA_PRO
    sampling_rates 44100|48000|88200|96000|176400|192000
    bit_width 24
    app_type 69940
  }
}

MIXER:普通应用的输出方式

对于一般的应用输出音频,无论音频规格有多高,输出线程通常都是 MIXER(type 0),来看一个例子:

output thread 0xf3603f40, name AudioOut_D, tid 1218, type 0 (MIXER):
  I/O handle: 13
  Standby: no
  Sample rate: 48000 Hz
  HAL frame count: 192
  HAL format: 0x1 (AUDIO_FORMAT_PCM_16_BIT)
  HAL buffer size: 768 bytes
  Channel count: 2
  Channel mask: 0x00000003 (front-left, front-right)
  Processing format: 0x5 (AUDIO_FORMAT_PCM_FLOAT)
  Processing frame size: 8 bytes
  Pending config events: none
  Output device: 0x2 (AUDIO_DEVICE_OUT_SPEAKER)
  Input device: 0 (AUDIO_DEVICE_NONE)
  Audio source: 0 (default)
  Normal frame count: 960
  Last write occurred (msecs): 14
  Total writes: 40169
  Delayed writes: 0
  Blocked in write: no
  Suspend count: 0
  Sink buffer : 0xf38c0000
  Mixer buffer: 0xf38b6000
  Effect buffer: 0xf38be000
  Fast track availMask=0xf8
  Standby delay ns=3000000000
  AudioStreamOut: 0xf48ac6b8 flags 0x6 (AUDIO_OUTPUT_FLAG_PRIMARY|AUDIO_OUTPUT_FLAG_FAST)
  Frames written: 38562240
  Suspended frames: 0
  PipeSink frames written: 38562240
  Hal stream dump:
  Thread throttle time (msecs): 0
  AudioMixer tracks: 1 
  Master mono: off

在该设备的 MIXER 输出线程中,所有进入该混音路径的音频都最终会被转换为 48 kHz / PCM 16-bit 输出格式,此类行为和输出设备类型无关。

1 Effect Chains
    1 effects for session 6953
	In buffer    Out buffer                 Active tracks:
	0xf717e000   0xf7182000 -> 0xf35e7000   0
	Effect ID 971:
		Session Status State Engine:
		06953   000    003   0xf489a1d0
		Descriptor:
		- UUID: af8da7e0-2ca1-11e3-b71d-0002a5d5c51b
		- TYPE: ec7178ec-e5e1-4432-a3f4-4657e6795210
		- apiVersion: F38B4040
		- flags: 00400240 (conn. mode: insert, insert pref: any, volume mgmt: implements control, device indication: requires updates, input mode: not set, output mode: not set, offloadable)
		- name: Sonysweffect
		- implementor: SONY
		- data: float
		- Input configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf717e000 01920   48000    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- Output configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf7182000 01920   48000    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- HAL buffers:
			In(0xf717e000) InConversion(nullptr) Out(0xf7182000 -> 0xf35e7000) OutConversion(nullptr)
		1 Clients:
			 Pid Priority Ctrl Locked client server
			17347        0  yes    yes      0      0
SonySWEffect
	EffectsSt: DN VPT CPSP CAPLUS ALC 
	WrapSt: ACTIVE 
	SupOnDev: DN CA CPSP XLOUD ALC 
	VPT mode: 0
	In Fmt: 0x5
	Out Fmt: 0x5
	In SR: 48000 Hz
	Out SR: 48000 Hz
	Cur Dev: 0x2
	Cur LeftVol: 4096
	Cur RightVol: 4096

AudioFlinger 在 mixer 阶段统一完成多路音频的混合与处理,并在写入 HAL 之前进行格式转换。因此对于 MIXER 路径的输出而言,最终进入硬件层的音频格式固定为 48 kHz / 16-bit PCM。无论原始音频文件质量如何,都会被处理之后送入 HAL. 通过 AAudio 输出的音频也会进入这个路径。

在 effect chain 部分,可以观察到 Sony 的 audio effect 已经被挂载到当前 session,但 Active tracks 显示为 0,说明该 effect 当前并未绑定到任何正在播放的音频流。

这也意味着包括 DSEE、ClearAudio+ 等处理效果,在非白名单应用下并不会被激活。(推测)

实测的听感也符合上述结论和推测。

DIRECT with effect chain:DIRECT 也有音效处理

索尼自己的索尼音乐会走这个奇怪的路径。
 

Output thread 0xef375000, name AudioOut_4F5, tid 24237, type 1 (DIRECT):
  I/O handle: 1269
  Standby: no
  Sample rate: 96000 Hz
  HAL frame count: 7680
  HAL format: 0x6 (AUDIO_FORMAT_PCM_24_BIT_PACKED)
  HAL buffer size: 46080 bytes
  Channel count: 2
  Channel mask: 0x00000003 (front-left, front-right)
  Processing format: 0x6 (AUDIO_FORMAT_PCM_24_BIT_PACKED)
  Processing frame size: 6 bytes
  Pending config events: none
  Output device: 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
  Input device: 0 (AUDIO_DEVICE_NONE)
  Audio source: 0 (default)
  Normal frame count: 7680
  Last write occurred (msecs): 72
  Total writes: 55
  Delayed writes: 0
  Blocked in write: yes
  Suspend count: 0
  Sink buffer : 0xefdd3000
  Mixer buffer: 0xefdb4000
  Effect buffer: 0xefc62000
  Fast track availMask=0xfe
  Standby delay ns=1000000000
  AudioStreamOut: 0xefd836b8 flags 0x1 (AUDIO_OUTPUT_FLAG_DIRECT)
  Frames written: 422400
  Suspended frames: 0

可以观察到 AUDIO_OUTPUT_FLAG_DIRECT FLAG. DIRECT 路径下,音频不再进入 mixer 进行统一重采样与位深转换,而是直接按输出 profile 以高分辨率 PCM 写入 HAL。

Dsee 0xf186fa00:
 DsxParam:
   -Sample rate: 44100 -Codec: -1 -Average bitrate: -1
 Mode: disable
  Sample rate: 44100
  Format: 0x1 (pcm16)
  Fragment size: 14208

HAL_Volume
  Volume_l: 1.00000000
  Volume_r: 1.00000000
  Stream volumes in dB: 0:-17, 1:-26, 2:-26, 3:-26, 4:-26, 5:-26, 6:-inf, 7:-26, 8:-18, 9:-96, 10:0, 11:0, 12:0
  Normal mixer raw underrun counters: partial=0 empty=0
  1 Tracks of which 1 are active
    T Name Active Client Session S  Flags   Format Chn mask  SRate ST  L dB  R dB  VS dB   Server FrmCnt  FrmRdy F Underruns  Flushed Main Buf  Aux Buf
         0    yes  23947    7249 A  0x000 00000001 00000003  44100  3     0     0     0  0002C3A0  22932   19380 A         0        0 EF31C000 00000000
  1 Effect Chains
    1 effects for session 7249
	In buffer               Out buffer                 Active tracks:
	0xef31c000 -> 0xf70f4000   0xf70f4000 -> 0xef31c000   1
	Effect ID 1075:
		Session Status State Engine:
		07249   000    003   0xf3d858a0
		Descriptor:
		- UUID: af8da7e0-2ca1-11e3-b71d-0002a5d5c51b
		- TYPE: ec7178ec-e5e1-4432-a3f4-4657e6795210
		- apiVersion: F3DCD940
		- flags: 00400240 (conn. mode: insert, insert pref: any, volume mgmt: implements control, device indication: requires updates, input mode: not set, output mode: not set, offloadable)
		- name: Sonysweffect
		- implementor: SONY
		- data: float
		- Input configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf70f4000 03552   44100    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- Output configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf70f4000 03552   44100    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- HAL buffers:
			In(0xef31c000 -> 0xf70f4000) InConversion(nullptr) Out(0xf70f4000 -> 0xef31c000) OutConversion(nullptr)
		1 Clients:
			 Pid Priority Ctrl Locked client server
			17347        0  yes    yes      0      0
Effect_params
  Effect_enabled: 1
  Effect_volume: 420
SONY_Effects
  ClearAudio plus status: 1
  ca_plus_index: 0
  VPT mode: 0
  Dynamic_normalizer: 1
  S-Force: 0
  Clear Phase for Speaker: 4
  ca_band_level: 0 0 0 0 0 0

在索尼音乐的 DIRECT 输出下,effect chain 生效了。可以观察到 VPT 和 ClearAudio 都在工作,DSEE 只有在特定条件下才工作(可以正常工作,但是我没开)。在这个实例中,送入 AudioFlinger 的就是 PCM 流。

未观察到其它应用播放音频会经过此路径,实测的听感也符合上述结论和推测。

DIRECT with DIRECT HD:绕过绝大多数 effect chain

在 Poweramp 的 HIRES 输出模式上观察到了 DIRECT,而且这个 DIRECT 有点特殊,我们一点一点看。

Poweramp 探测到的音频输出信息

reading /vendor/etc/audio_output_policy.conf
has direct_pcm_24, sampling_rates=44100|48000|88200|96000|176400|192000|352800|384000
AUDIO_OUTPUT_FLAG_DIRECT direct_pcm_24
has direct_pcm_24 formats=AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
FLAG_VARIANT_DIRECT_HD via direct_pcm_24
FLAG_NEEDS_DEEP_BUFFER android_sdk=28
USB can handle Hi-Res - sdk=28
>>>OK flags=0x854616600000000
FLAG_VARIANT_DIRECT_HD
FLAG_SUPPORTS_PCM_8_24
FLAG_SUPPORTS_PCM_24
FLAG_SUPPORTS_PCM_32
FLAG_SUPPORTS_UNITY_GAIN_STREAM
FLAG_SUPPORTS_USB
FLAG_NEEDS_EXTRA_SLEEPS
FLAG_SUPPORTS_LDAC
FLAG_NEEDS_DEEP_BUFFER
FLAG_ALLOW_DVC_EFFECT
FLAG_BT_DVC_EFFECT
INTERNAL_OUTPUT_FLAG_SR_384K
INTERNAL_OUTPUT_FLAG_SR_352K
INTERNAL_OUTPUT_FLAG_SR_192K
INTERNAL_OUTPUT_FLAG_SR_176K
INTERNAL_OUTPUT_FLAG_SR_96K
INTERNAL_OUTPUT_FLAG_SR_88K
INTERNAL_OUTPUT_FLAG_SR_48K
INTERNAL_OUTPUT_FLAG_SR_44K

Poweramp 探测到了非常多支持的音频规格,这些信息是从  /vendor/etc/audio_output_policy.conf 中获取的,说明设备本身也支持这些规格。

AudioFlinger 和 effect chain

Output thread 0xf3074000, name AudioOut_5CD, tid 27468, type 1 (DIRECT):
  I/O handle: 1485
  Standby: no
  Sample rate: 48000 Hz
  HAL frame count: 3840
  HAL format: 0x3 (AUDIO_FORMAT_PCM_32_BIT)
  HAL buffer size: 30720 bytes
  Channel count: 2
  Channel mask: 0x00000003 (front-left, front-right)
  Processing format: 0x3 (AUDIO_FORMAT_PCM_32_BIT)
  Processing frame size: 8 bytes
  Pending config events: none
  Output device: 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
  Input device: 0 (AUDIO_DEVICE_NONE)
  Audio source: 0 (default)
  Normal frame count: 3840
  Last write occurred (msecs): 40
  Total writes: 210
  Delayed writes: 0
  Blocked in write: yes
  Suspend count: 0
  Sink buffer : 0xef324000
  Mixer buffer: 0xf2b03000
  Effect buffer: 0xefdd3000
  Fast track availMask=0xfe
  Standby delay ns=1000000000
  AudioStreamOut: 0xf48ddee8 flags 0x1 (AUDIO_OUTPUT_FLAG_DIRECT)
  Frames written: 806400
  Suspended frames: 0

可以观察到 AUDIO_OUTPUT_FLAG_DIRECT,经过此路径的音频不会被重采样和进行位深转换,因为 Poweramp 已经完成了这些操作(如果符合条件),送入 AudioFlinger 的就是 PCM 流。

Dsee 0x0:
 Mode: disable
  Sample rate: 48000
  Format: 0x3 (pcm32)
  Fragment size: 23040

HAL_Volume
  Volume_l: 1.00000000
  Volume_r: 1.00000000
  Stream volumes in dB: 0:-17, 1:-24, 2:-6, 3:-26, 4:-14, 5:-6, 6:-inf, 7:-6, 8:-18, 9:-96, 10:0, 11:0, 12:0
  Normal mixer raw underrun counters: partial=0 empty=0
  1 Tracks of which 1 are active
    T Name Active Client Session S  Flags   Format Chn mask  SRate ST  L dB  R dB  VS dB   Server FrmCnt  FrmRdy F Underruns  Flushed Main Buf  Aux Buf
         0    yes  27110    7337 A  0x000 00000003 00000003  48000  8     0     0     0  000C5D00   7684    3844 A         0      288 EFDD3000 00000000
  1 Effect Chains
    1 effects for session 7337
	In buffer               Out buffer                 Active tracks:
	0xefdd3000 -> 0xf7112000   0xf7112000 -> 0xefdd3000   1
	Effect ID 1099:
		Session Status State Engine:
		07337   000    003   0xf489ab30
		Descriptor:
		- UUID: 119341a0-8469-11df-81f9-0002a5d5c51b
		- TYPE: 09e8ede0-ddde-11db-b4f6-0002a5d5c51b
		- apiVersion: F38B5B40
		- flags: 00000050 (conn. mode: insert, insert pref: last, volume mgmt: implements control, input mode: not set, output mode: not set)
		- name: Volume
		- implementor: NXP Software Ltd.
		- data: float
		- Input configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf7112000 03840   48000    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- Output configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf7112000 03840   48000    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- HAL buffers:
			In(0xefdd3000 -> 0xf7112000) InConversion(nullptr) Out(0xf7112000 -> 0xefdd3000) OutConversion(nullptr)
		1 Clients:
			 Pid Priority Ctrl Locked client server
			27110     1337  yes    yes      0      0

DSEE 挂载到了 effect chain 上,但被禁用了。可以看见 HAL 音量是 1.00000000,可能是因为 Poweramp 传递了 ALWAYS_UNITY_GAIN,它禁用了 HAL 的音频衰减,通过自己的 DVC 控制。

值得注意的是 effect chain 中出现了一个 Volume (NXP Software Ltd.). 我在网上并没有查到相关的信息,这个效果器的输出和输出却都是 48000,标识着音频可能进行了重采样,但不太可能,原因下述:

HAL 的音量是 1.00000000,说明 HAL 并没有调整音量,这个效果器可能是用来通知播放器 DVC 音量变化而非直接自行处理的音频,同时在其它播放器输出中并没有发现这个效果器,而测试的播放器中除了 Poweramp 都没有 DVC 功能。

作为对比,在关闭 DVC 后,发现了如下变化;

Dsee 0x0:
 Mode: disable
  Sample rate: 48000
  Format: 0x6 (pcm24)
  Fragment size: 23040

HAL_Volume
  Volume_l: 0.05128648
  Volume_r: 0.05128648
  Stream volumes in dB: 0:-17, 1:-26, 2:-26, 3:-26, 4:-26, 5:-26, 6:-inf, 7:-26, 8:-18, 9:-96, 10:0, 11:0, 12:0
  Normal mixer raw underrun counters: partial=0 empty=0
  1 Tracks of which 1 are active
    T Name Active Client Session S  Flags   Format Chn mask  SRate ST  L dB  R dB  VS dB   Server FrmCnt  FrmRdy F Underruns  Flushed Main Buf  Aux Buf
         0    yes  27110    7385 A  0x000 00000006 00000003  48000  3     0     0     0  00027600   7684    7684 A         0        0 F3657000 00000000
  0 Effect Chains
  Local log:
   05-24 18:00:56.490 CFG_EVENT_CREATE_AUDIO_PATCH: old device 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE) new device 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
   05-24 18:00:56.493 AT::add       (0xf48f1080)      0     no  27110    7385 A  0x000 00000006 00000003  48000  3     0     0     0  00000000   7684       0 f         0        0 F3657000 00000000

注意到 HAL 进行了音量衰减,而 Volume 效果器消失了,如果它是用来调整音量的,为什么反而不存在了?同时观察到了系统音量变化并没有影响 HAL 音量为 1,而 DVC 关闭时会变化。Volume 效果器并没有实际处理音频,所以也没有重采样这一说。

在实测中听感的变化也验证了上述推测。

OFFLOAD:针对非 PCM 流的直通

在索尼音乐的实测中,还发现了一个不是很常见的输出模式:

Output thread 0xf3064000, name AudioOut_67D, tid 31664, type 4 (OFFLOAD):
  I/O handle: 1661
  Standby: no
  Sample rate: 44100 Hz
  HAL frame count: 32768
  HAL format: 0x1000000 (AUDIO_FORMAT_MP3)
  HAL buffer size: 32768 bytes
  Channel count: 2
  Channel mask: 0x00000003 (front-left, front-right)
  Processing format: 0x1000000 (AUDIO_FORMAT_MP3)
  Processing frame size: 1 bytes
  Pending config events: none
  Output device: 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
  Input device: 0 (AUDIO_DEVICE_NONE)
  Audio source: 0 (default)
  Normal frame count: 32768
  Last write occurred (msecs): 166
  Total writes: 13
  Delayed writes: 0
  Blocked in write: no
  Suspend count: 0
  Sink buffer : 0xf2b03000
  Mixer buffer: 0xefa83000
  Effect buffer: 0xef903000
  Fast track availMask=0xfe
  Standby delay ns=1000000000
  AudioStreamOut: 0xf48dde70 flags 0x31 (AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING)
  Frames written: 262144
  Suspended frames: 0

观察到模式是 OFFLOAD(type 4),HAL 识别到了是 AUDIO_FORMAT_MP3,并携带了 AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING 这些 FLAGS。这些 FLAG 大致的意思就是 DIRECT 输出,不进行压缩,以非阻塞的方式输出。

在此音频路径中 MP3 被直接 HAL 送进了 DSP 进行解码,CPU 没有参与音频处理。它也绕过了 MIXER 的那些重采样和位深转换,在播放不同规格的 MP3 文件时观察到了 HAL 规格变化。

Dsee 0xf13e5980:
 DsxParam:
   -Sample rate: 44100 -Codec: -1 -Average bitrate: -1
 Mode: disable
  Sample rate: 44100
  Format: 0x1 (pcm16)
  Fragment size: 14208

HAL_Volume
  Volume_l: 1.00000000
  Volume_r: 1.00000000
  Stream volumes in dB: 0:-17, 1:-30, 2:-30, 3:-30, 4:-30, 5:-30, 6:-inf, 7:-30, 8:-18, 9:-96, 10:-3.7, 11:0, 12:0
  Normal mixer raw underrun counters: partial=0 empty=0
  1 Tracks of which 1 are active
    T Name Active Client Session S  Flags   Format Chn mask  SRate ST  L dB  R dB  VS dB   Server FrmCnt  FrmRdy F Underruns  Flushed Main Buf  Aux Buf
         0    yes  31374    7737 A  0x000 00000001 00000003  44100  3     0     0     0  00006F00  22932   12276 A         0        0 EFC28000 00000000
  1 Effect Chains
    1 effects for session 7737
	In buffer               Out buffer                 Active tracks:
	0xefc28000 -> 0xf70bc000   0xf70bc000 -> 0xefc28000   1
	Effect ID 1195:
		Session Status State Engine:
		07737   000    003   0xf489ae00
		Descriptor:
		- UUID: af8da7e0-2ca1-11e3-b71d-0002a5d5c51b
		- TYPE: ec7178ec-e5e1-4432-a3f4-4657e6795210
		- apiVersion: F12AC400
		- flags: 00400240 (conn. mode: insert, insert pref: any, volume mgmt: implements control, device indication: requires updates, input mode: not set, output mode: not set, offloadable)
		- name: Sonysweffect
		- implementor: SONY
		- data: float
		- Input configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf70bc000 03552   44100    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- Output configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf70bc000 03552   44100    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- HAL buffers:
			In(0xefc28000 -> 0xf70bc000) InConversion(nullptr) Out(0xf70bc000 -> 0xefc28000) OutConversion(nullptr)
		1 Clients:
			 Pid Priority Ctrl Locked client server
			17347        0  yes    yes      0      0
Effect_params
  Effect_enabled: 1
  Effect_volume: 259
SONY_Effects
  ClearAudio plus status: 1
  ca_plus_index: 0
  VPT mode: 0
  Dynamic_normalizer: 1
  S-Force: 0
  Clear Phase for Speaker: 4
  ca_band_level: 0 0 0 0 0 0
  Local log:
   05-24 19:23:24.969 CFG_EVENT_CREATE_AUDIO_PATCH: old device 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE) new device 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
   05-24 19:23:24.971 AT::add       (0xf48ef280)      0     no  31374    7737 A  0x000 00000001 00000003  44100  3     0     0     0  00000000  22932       0 f         0        0 EFC28000 00000000

这个路径的 effect chain 上挂的都是索尼效果器。可以观察到 ClearAudio, VPT 之类的功能都在正常工作。

没有压缩编码的上下文(如 MP3/AAC 的 metadata),DSEE 可以正常工作(我没开)。

值得注意的是,HAL 音量同样是 1.00000000,但是 effect chain 中没有发现 NXP 的 Volume 效果器,这是因为 Dynamic_normalizer: 1,也就是动态均衡器开启了,可能是它替代了 NXP Volume.

作为对比,我关闭了动态均衡器:

HAL_Volume
  Volume_l: 0.03162301
  Volume_r: 0.03162301
  Stream volumes in dB: 0:-17, 1:-30, 2:-30, 3:-30, 4:-30, 5:-30, 6:-inf, 7:-30, 8:-18, 9:-96, 10:-3.7, 11:0, 12:0
  Normal mixer raw underrun counters: partial=0 empty=0
  1 Tracks of which 1 are active
    T Name Active Client Session S  Flags   Format Chn mask  SRate ST  L dB  R dB  VS dB   Server FrmCnt  FrmRdy F Underruns  Flushed Main Buf  Aux Buf
         0    yes  31374    7817 A  0x000 00000001 00000003  44100  3     0     0     0  00633D20  22932   12276 A         0        0 EFC6B000 00000000
  1 Effect Chains
    1 effects for session 7817
	In buffer               Out buffer                 Active tracks:
	0xefc6b000 -> 0xf70bc000   0xf70bc000 -> 0xefc6b000   1
	Effect ID 1219:
		Session Status State Engine:
		07817   000    000   0xf489b100
		Descriptor:
		- UUID: af8da7e0-2ca1-11e3-b71d-0002a5d5c51b
		- TYPE: ec7178ec-e5e1-4432-a3f4-4657e6795210
		- apiVersion: F48EBE40
		- flags: 00400240 (conn. mode: insert, insert pref: any, volume mgmt: implements control, device indication: requires updates, input mode: not set, output mode: not set, offloadable)
		- name: Sonysweffect
		- implementor: SONY
		- data: float
		- Input configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf70bc000 03552   44100    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- Output configuration:
			Buffer     Frames  Smp rate Channels Format
			0xf70bc000 03552   44100    00000003      5 (AUDIO_FORMAT_PCM_FLOAT)
		- HAL buffers:
			In(0xefc6b000 -> 0xf70bc000) InConversion(nullptr) Out(0xf70bc000 -> 0xefc6b000) OutConversion(nullptr)
		1 Clients:
			 Pid Priority Ctrl Locked client server
			17347        0  yes    yes      0      0
Effect_params
  Effect_enabled: 0
  Effect_volume: 259
  Local log:
   05-24 19:40:49.662 CFG_EVENT_CREATE_AUDIO_PATCH: old device 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE) new device 0x8 (AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
   05-24 19:40:49.664 AT::add       (0xf128a280)      0     no  31374    7817 A  0x000 00000001 00000003  44100  3     0     0     0  00000000  22932       0 f         0        0 EFC6B000 00000000
```

观察到 HAL 音量不再是 1,表明 HAL 进行了音量衰减,也说明了索尼音乐没有 DVC 功能。

在实测中,除了 DSEE 的开关之外没有发现其它听感上的区别。

放弃了高保真音频,真的值得吗?

在剖析了上述四种输出模式之后,我们回到最开始提出的一个问题:

为此强行放弃了高保真音频,真的值得吗?

这个问题站在不同人角度看答案是不同的。站在厂商的角度看是没有问题的,因为 DIRECT 不是 Android 默认就提供的,它需要厂商对 HAL 进行定制,而且会破坏杜比音效之类的后处理的兼容性,所以全都走 MIXER 并统一规格,是一个在工程上无可置疑的选择。

但在我看来,所谓的后处理效果根本就不是必要的。一盘好的母带,已经经过了混音师的调整,他的目的不是「更好听」,而是「更标准」。

这就像很多电视对画面的后处理一样,看上去确实更艳丽更生动,但是看久了不刺眼吗?色彩和白点标准吗?还原了导演的真实意图吗?为什么电视这么大的屏幕,在制作现场做一个参考性的大屏幕监看都不配?

换句话说,我们使用的这些回放设备,到底有没有尊重创作者?有没有努力地还原创作者想传递给我们的心意?在现在大多数消费级电子产品上,我可以说:没有。

在消费级电视上,我们看见了 filmmaker 模式,看见了厂商的一点诚意。但是在手机上,我没有看见任何现在厂商的诚意。

Xperia 基本已经退出了消费级电子市场,但这部来自 2017 年的上古兵器,却让我对 Xperia 有了新的认识,也让我对「到底是什么是高保真」有了新的认识。

也许,不作处理的处理,才是最好的处理吧。

参见

内容同步发表在独立博客 Nalanyinyun's Library 上,欢迎大家前去参观:

本站同时提供了邮件订阅服务,欢迎大家订阅以获得本站的内容更新,本站不定时更新文学类和技术类文章:

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀