Re: [闲聊] HTPC/CAT建构的自身经验

楼主: Oswyn (Oswyn)   2020-03-16 02:22:40
WASAPI (push) 是较新的 WaveRT Port Driver、使用 cyclic buffers,Audio device
需要支援 DMA。有人不推是因为部分 Audio device 相容性不佳,为了省麻烦就叫你别
用,不用就不会有机会有问题。话说什么年代了硬件还不支援 DMA(笑)、硬件相容性
、支援度不佳并不是这个模式的问题。用 WASAPI (push) 有问题该吐草的是两光硬件
或其不良驱动程式。但你知道的做 Audio 设备的很多在这块通常都....
WASAPI (event) 是旧式的 "ping-pong" buffers。
工作正常 Buffer 大小能满足传输的话两者没有不同。不管是 WASAPI or ASIO 其功能
都只是在程式与 Audio interface 间传递 Audio data 并不决定声音品质。
Buffer 是拿来缓冲的,够大传输就不容易出包不易有 Pops、Clicks and Cracks 这些
音频故障。只是听个音乐而不是二、三十个音轨在混音*n个 plug-in 在 DSP,除非
硬件或驱动有问题啦...
in foobar【读档>解码>ReplayGain>DSP chain>Output】=>Audio Device
一连串的 Audio playback stream,在其中一个地方强迫资料流变得零碎并不会让它
变实时只是形成瓶颈,更容易发生音频故障。
Audio interface 都有硬件最小 buffer size 限制与实际最大 buffer size。
一般常见的最小 size 是 30000 hundred-nanosecond、也就是 3 ms。但这不代表这硬
体在 3ms 一定能完美工作就是了,毕竟能不能操极限是要看整台设备的软硬件。
而 foobar2000 的 foo_out_wasapi 写的很阳春,它没有互动也没有防呆虽然功能上是
没有问题啦。
在设定中向 WASAPI 提出的是 buffer size 的【请求】,实际上 WASAPI 会依据 audio
frame 的大小(ch 数 * bit-depth * Sample rate)来回应一个可行 buffer size。
零是不可能的、也不能比硬件的最小 buffer size 要小。以上面的例子 3ms 会回给一
个能放 3.xx ms audio大小的 buffer。而 audio 的位元深与采样率会影响实际大小。
太小的 buffer size 对 WASAPI (push) 的 cyclic buffers 不利。Cyclic buffers
是你追我跑的环形缓冲区,设太小=跑道太短会很容易撞车。cyclic buffers 是先进
先出(FIFO)其延迟是看硬件自发性的读取。foobar 是 music player 所以 audio
data 都是已知的,buffer size 设大点没什负面问题但最好不要设的太小。
WASAPI (event) 的 "乒乓" buffers 则不能设太大,如上述没有防呆。如果在此
设定了超过硬件的最大值,多出来的部分则会丢失。
极端例子如硬件最大 buffer size 只有 250ms 如果设了 500ms,foobar 每次会传送
500ms 的 audio 但硬件只能实收 250ms 然后播放、多出来的 250ms audio 会被放生
。然后 foobar 会再送下一个 500ms...250ms 被播放 250ms 被放生。会听到很严重的
辍音,然后进度条跑的飞快。以此例五分钟的音乐会跳针成二分半就播完。
但如果只设成大了点,只丢失几个 samples 辍音不够严重,如不知原因可能只会听出
比较不好听。但根源上的问题是设定已经错误了,但 foo_out_wasapi 并没有防呆也
没有任何互动告知使用者的 buffer size 出问题。
应该些人听信 push mode 不可用,用 event mode 设大有问题所以得出小=好的结论
另如上述如果硬件的 buffer size 最小值是 3ms,这代表设成 0~3ms 之间的任何值
WASAPI 所回应的 buffer size 大小都会是相同的,所以听起来不可能会有不同。
但如果使用者觉得设成 0ms 最棒,那有什么理由不能说 3ms、5ms、10ms、50ms 到超
过最大值前听起来都跟设成 0ms 一样好?有人能挑战用听的听出硬件的最小 buffer
size 值?如果小真的好音质真有差、盲测应该能分辨出最小 buffer size 这个界线才
是。
听出硬件最大 buffer size 大致上的大小应该不难,基本上这就是严重的音频故障。
因为就算每次只最小丢失一个 sample 也会因为定时定频率重复发生而显得明显。参考
出问题/正常的分界适中的设定 event mode 的 buffer size 应该是不错的选择。
在这部分应只有 audio interface 耗尽 audio data 而后面的 audio data 来不及备
妥产生的音频故障,而没有正常备妥&传输但影响音质的问题。
另外这的 32-bit 指的是 32-bit float?不论是整数或浮点,在 source audio data
一般最高只有 24-bit 的 playback 的状况下这应该没有什好处。只会增加无谓的资料
传输量,这会让低延迟的设定环境更容易撞车。除非有进行 DSP 不然看不出会有好处
就是了。
作者: max8201 (我是一只沙沙羊)   2020-03-16 05:21:00
怎么我感觉看了很多,但又不知道结论是什么,我的问题吗?
作者: alanswill (小夫)   2020-03-16 06:39:00
看不懂QQ,不过我在网络上查到的都是说event比push还要新?
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-16 08:12:00
hi 感谢你的解释,我其实没能力知道driver底层的机制,所以建议压低buffer只是沿用过去CAT玩家的原则,在不出事的情况下压低各种buffer与latency至于这样对听感的影响,就像我之前推文提到的,我只能解释到低延迟对SI有好处,然后音频装置吃到高品质数位讯号对听感有助益,至于是让receiver工作的更好还是这样的SI品质会一路串到da线路影响解出来的类比讯号品质就非我能解释的了然后32bit云云,就data层面确实就是补0,是不是真的有差我也不确定,当心理作也可以
作者: ultimatevic (龟龟龟)   2020-03-16 09:10:00
感谢资讯 真复杂...
作者: djboy (雞尾酒)   2020-03-16 10:08:00
感谢,专业推!!O大文,每次都读的好开心
作者: clioneurise (Romarin)   2020-03-16 12:14:00
推好文
作者: yamatai (回避性人格障碍症)   2020-03-16 12:52:00
可惜音响上面偏偏就是buffer小声音比较真,buffer大声音会变滑顺浮肿
作者: breadf ( Lifting Turn )   2020-03-16 13:25:00
我想文章意思是,小有个极限,大的话event也是有极限在软件UI上看到的设定值不一定是实际值
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-16 15:39:00
底层机制一定是这样,看愿意开放多少弹性给应用层
作者: ang728 (要耍厨你还嫩的很)   2020-03-16 20:47:00
精辟解析
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-16 21:04:00
嘿,针对32bit,我思考的角度是,wasapi会不会统一吃32bit data也就是我说的默认格式,传24给他,他还要再补0,跟你举例的情形刚好相反,但我也说了只是我猜的,我也不排除是心理作用另外感谢你解释了DPC latency的含义,至于buffer大小,我最早也不信,现在自己跟着用。但确实也不可能每个buffer设定都给他测试看看,你要这样质疑我也无法反驳,顶多争辩一句这不是只有我自己在心里感觉。实际上不管是中文 英文 甚至是日文资讯,全世界在讨论CAT的社群在这几部分的看法几乎都是相似的,但要说谁有办法解释的很严谨完整,我也没见过就是跟SI关系,看来我比较多是用dpc latency在想,单纯buffer大小部分,看来又是块我是无法解释的东西
作者: goldie (阿良)   2020-03-16 21:15:00
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-16 21:17:00
提出一个猜想,buffer拉大,表示要等更多资料凑齐一个标准单位,这时可能会让送出的时间变得更不规律,也就是我说的SI劣化
作者: breadf ( Lifting Turn )   2020-03-16 21:19:00
SI不是L1的东西吗?还是我误会你SI的意思XD
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-16 21:49:00
Signal Integrity,其实我只是长期以来觉得类比讯号一样一堆类比性质,后来才知道确实有这个概念更正:"数位讯号"一样有一堆类比性质
作者: breadf ( Lifting Turn )   2020-03-16 21:53:00
是这样没错啊,L1来看本来就没有纯数位的东西只是我觉得拉到L1来看,送不送出bus上都是always有东西跑所以不明白不规律跟SI劣化关联有这么大吗?当然duty不一样电源设计也许duty加重的时候PI变烂影响SI也是有可能*电源设计不佳
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-16 21:56:00
那你当我脑补吧,毕竟是乱猜想的 DPC latency比较好连结不过数位端的各种现象,不down到线路底层根本没得讨论纯data coding层面 根本一堆玩意都是鬼扯
作者: evadodoya (口责口责)   2020-03-16 22:06:00
我就鬼扯(真的
作者: lll156k1529 (吃鸡腿)   2020-03-16 23:01:00
讯号处理就很难 一堆人爱直接拿资讯面的0101来讲
作者: evadodoya (口责口责)   2020-03-16 23:21:00
不这样子怎么战
作者: lll156k1529 (吃鸡腿)   2020-03-16 23:39:00
的确是这样才能战XD 不然讯号与系统 或讯号处理课大部分人都是去被电的 要战三小XD
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-17 08:06:00
hi 简单回一下,buffer大小当然是自己测过有效才会用,记得比较清楚的是录音接口的buffer,从默认512 samples调到最低16 samples之类,但确实应该没人会16 32 64 128这样试另外我也同意人耳不是非常可靠,所以都是要找一些原则出来,不然软硬件设定多如牛毛,又藏着一堆改变非改善的陷阱另外针对人云亦云,其实也是在认同一些原则后,看人家分享的东西你觉得值不值得试,因为有时候是单纯不知道可以这样去动设定最后每人喜好音色云云,我倒是觉得录制阶段有这回事,那是艺术家的权利,但到了重播阶段,改善与改变是不同的两回事,要能分辨需要累积听感与对自然声音的认知
作者: f9999 (foo)   2020-03-17 09:23:00
谢谢你的解释, 可是我还是比较喜欢低Latency, 高bit rate
作者: znew1219 (NULL)   2020-03-17 16:10:00
Buffer并非越小越好,最少要Payload Size的4倍Payload Size又会影响Throughput,以8B/10B来计算有25% overhead,Payload Size=256byte,throughput约92%再加上Completion latency,Flow control update latency另外像是BIOS中的CPU节能技术,会影响DMA读写提高latency,这些设定是环环相扣
作者: yuugen2 (马英丸)   2020-03-17 18:39:00
这串太专业了,可以简单说结论吗
作者: evadodoya (口责口责)   2020-03-17 18:56:00
就其实还是回归到自己最喜欢的听感而已 这些只是调整参数之一 供你玩唱一下莫文蔚的阴天一下
作者: znew1219 (NULL)   2020-03-17 21:05:00
简单说就是要依据worst-case来调整,就像船期最长间隔会影响备货数量,包装大小也会影响,包装大一个箱子能装的数量少,sample rate越高,Buffer也要越大
作者: louis0407 (能当个乡民也是一种幸福)   2020-03-17 21:44:00
碎嘴一下,NOS也是有好处的,thd很差那是频响域,对应的时间域,NOS反倒表现的很好,而人耳比起频响域,对时间域反而更敏感
作者: justagame (各种加班)   2020-03-17 22:08:00
ABX只能测听不听得出OS/NOS的差异阿不能处理个体觉得哪一种好听/哪个失真较高 这类的问题
作者: breadf ( Lifting Turn )   2020-03-17 22:37:00
应该用sync补吧XD
作者: justagame (各种加班)   2020-03-17 23:08:00
OS跟NOS已经吵了很久啦 我自己的DAC两种都能切换

Links booklink

Contact Us: admin [ a t ] ucptt.com