: 推 elguapo: 感谢解说。但我的point真的不是DAC的design问题。场景:M 07/13 18:51
: → elguapo: ac A 用 Dante 连 Mac B,Mac B 用 internal looping 将 07/13 18:51
: → elguapo: 音讯转给 USB DAC。Dante 和 internal looping 是虚拟介 07/13 18:51
: → elguapo: 面。请问音讯资料传递时,max A -> Mac B 传 Dante 时谁 07/13 18:51
: → elguapo: 是主钟?到了 Mac B,Dante 借 internal looping 到 USB 07/13 18:51
: → elguapo: 更正: Mac A 07/13 18:53
就我所知,Vitual interfac (自己)没有音频时钟
Vitual interface 可以不需要依存音频时钟,因为处理的只是数据流
在这我又要截一大段 Roon 讨论串中的对话救援
※
DAC 只能从其本地缓冲区中提取数据,因此它不关心上游的连接。核心只能将数据放入其
本地缓冲区,因为它不关心下游的连接。
RAAT 管理两者之间的数据传输,为了确保所有位元能够完整地从核心传送到DAC,它使用
网络本身提供的较低层级功能来确保数据的完整性。如果丢失一个数据包,将发送一个新
的数据包并按正确顺序放入缓冲区。如果数据包损坏,也是同样的处理方式。在大多数情
况下,缓冲区足够大,以使这个错误修复过程能够在DAC耗尽数据或核心填满其缓冲区之
前进行。
请记住,我在这里非常谨慎地使用“数据”这个词,因为这是音乐此时的形式。它是正在
播放的文件的位元串流。这是一个异步过程,对DAC的模拟输出没有影响。RAAT(以及网
络堆栈)在核心和终端之间促成了一个非常互动的对话。它们确保文件(不超过缓冲区的
大小)从核心复制到终端。
……
这是一个异步过程。根据定义,传输过程的时序(时钟同步)与解码过程完全独立。缓冲
区的填充和清空速率会变化,但只要DAC的缓冲区中有足够的数据,播放将会持续可靠进
行。
这里的关键是区分数据和信号的区别。正在播放的文件在其位元以实时方式通过DAC进行
转换之前,不会变成信号。在它们从DAC(或终端)的本地缓冲区中提取之前,这些位元
与用于文档、图像甚至本帖中的位元没有区别。
我理解发烧友不断尝试“改进”事物的渴望,这种行为实际上是这个爱好的基础。在过去
,当大多数概念与某些物理事物相关并且变化不仅容易展示,而且还可以通过一些逻辑解
释来支持时,这种改进更容易实现。然而,数字世界并非如此,因为其中许多概念与直觉
相悖,解释也更加复杂。
※
虽然 Vitual interfac 跟 Roon RAAT 有些差异,但本质上是相同的
当 Vitual I/F 的输出入是同 sample rate 时,Vitual I/F 的做用只是传递数据
音频数据应该被直接 pass through
当输出输入是不同 sample rate 时,会需要 SRC,但有两种选择
●其一是 SRC 采样率锁死,如 44100 Hz 转 96000 Hz 或等倍的 Oversampling
前端如果是 foobar 之类的 player、不会有时钟问题,就单纯的送资料填 buffer
但输入与输出端若有实体时钟差异会出现 Drift
我们的默认实现使用一种称为“填充”和“删除”样本的技术
基本上是插入或删除单个样本。
粗暴有效的解法,有可能出现爆裂声:D
●另一种就是用 Async SRC、也就是 Drift Correction,但 ASRC 开销大
Drift Correction 的过程一般 Vitual interfac 也是没时钟
因为前后端的进出的样本数差异,是前后端硬件的时钟差异造成的
视其中一方为主就解决了,依方向选好主角、另一个配合主角
至少我没看过有实践把系统主时钟拿进来凑一脚,让系统主时钟当主角的状况
但我猜这也是 e大您的理想
※
我上一篇推文中就有提过
Mac 的 Drift Correction 我上面贴的那篇也有提到
弥补的也只是 Audio device 间的 Audio clock 差异
跟 System clock 无关
就像这页里的第一个图
https://support.apple.com/en-us/HT202000
Clock Source 能选系统时钟吗?只有 Audio device 能选不是吗
从 e大当时的回答我就知道在段您想歪了