找回密码
 -注册-
查看: 21075|回复: 21
打印 上一主题 下一主题

USB音频声卡的时钟同步方式同步、自适应、异步的理解和优缺点

[复制链接]
1
发表于 2017-9-17 08:57 | 显示全部楼层 来自 上海市
本帖最后由 aarwwefdds 于 2017-9-17 09:06 编辑
异步模式:USB声卡的时钟频率固定不变,所以(时钟)质量相当好。但USB控制器时钟是固定的,频率不可调,也不会受USB声卡控制。(二者不同步)解决方法只有一个:(驱动程序)启用速率匹配器,合并一部分数据或对数据插值来减少或增加数据,间接地放慢或加快传数速度,这就意味着原始音频数据已被修改。所以,这个方法保证了时钟的质量却牺牲了原始音频数据的保真

闭源代码不说,开源代码里我从来没见过驱动实现了SRC。而且这种SRC是要竭力避免的

关于ASYNC和其它方式的实现区别我在这个帖子里有说
http://www.erji.net/forum.php?mod=viewthread&tid=1987631&extra=

在代码里可以看到,ASYNC和其它同步方式影响的就是“下一个包大小”
http://lxr.free-electrons.com/source/sound/usb/pcm.c
  1. 1467         for (i = 0; i < ctx->packets; i++) {
  2. 1468                 if (ctx->packet_size)
  3. 1469                         counts = ctx->packet_size; /* 如果已经有packet_size则使用。一般在ASYNC隐式反馈,或者adaptive或者sync模式下会使用 */
  4. 1470                 else
  5. 1471                         counts = snd_usb_endpoint_next_packet_size(ep); /* 使用来自ASYNC显式反馈的数据决定下一个包的大小 */
复制代码

  1. 145 int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)
  2. 146 {
  3. 147         unsigned long flags;
  4. 148         int ret;
  5. 149
  6. 150         if (ep->fill_max)
  7. 151                 return ep->maxframesize;
  8. 152
  9. 153         spin_lock_irqsave(&ep->lock, flags);
  10. 154         ep->phase = (ep->phase & 0xffff)
  11. 155                 + (ep->freqm << ep->datainterval);
  12. 156         ret = min(ep->phase >> 16, ep->maxframesize);
  13. 157         spin_unlock_irqrestore(&ep->lock, flags);
  14. 158
  15. 159         return ret;
  16. 160 }
复制代码

这个ep->freqm是由
http://lxr.free-electrons.com/source/sound/usb/endpoint.c的snd_usb_handle_sync_urb设置的,也就是处理反馈数据的函数

并且实际上,每次数据包的大小包含的sample数也是有限制的,代码里有写,XMOS文档里也明确提出来了,不是说你DAC想拿多少就能给多少的。
根据规范每个USB frame的时钟本身还有个最大jitter的限制,超过这个限制USB设备端就会完全无法与主机端沟通(out of sync 失去同步),这个限制设定本身已经考虑到了USB BUS上可能的最大时钟抖动
回复

使用道具 举报

2
发表于 2017-9-18 07:30 | 显示全部楼层 来自 上海市
本帖最后由 aarwwefdds 于 2017-9-18 10:12 编辑
wxleasyland 发表于 2017-9-17 22:31
不好意思,比较菜,程序看不来。

XMOS这个反馈机制能让电脑播放器播放得快点或慢点吗?

事实上 在要求音画同步的场合(例如看视频) 默认情况下你的时钟是跟着声卡走的。声卡驱动确实会反馈延迟信息(不只是USB而是所有声卡都会,这是强制要求),轻微的速度不匹配的结果是画面丢帧或重复帧,因此会导致画面轻微抖晃不平顺,没对比过的话是发现不了的

而在只听音乐的场合这不会带来什么问题,因为不需要做音画同步,最多只需要轻微调整一下软件的播放时间走的快慢而已

而你说的不以声卡时钟为标准而是以PC时钟为标准的软件确实有,第三方软件ReClock的默认设置下就是这么做的,这个软件可以让画面减少被动丢帧/重复产生的抖晃。但ReClock的核心机制正是像你说的SRC,这导致了不能源码输出,是否要用它其实是有争议的

看视频我个人比较推荐madvr的smooth motion frc选项,可以在不SRC音频的前提下对画面做处理和补偿。强迫症可额外用关闭了SRC功能的Reclock做WASAPI独占输出,跳过系统混音器降低一些潜在延迟的不稳定
回复

使用道具 举报

3
发表于 2017-9-18 14:19 | 显示全部楼层 来自 上海市
本帖最后由 aarwwefdds 于 2017-9-18 16:02 编辑

共享模式下,这个Audio Engine会做混音和SRC/FX/音量调节之类的事情(这里有些可以offload给硬件,但至少USB不支持offload给硬件)。

独占模式下,直接与声卡驱动互动。

ASIO/WASAPI之类的API本身是没有SRC功能的,不信就去翻文档,翻英文的,MSDN一大堆。这些插件也不需要实现什么SRC,要做SRC都是播放软件自己做的。

至于“单纯的播放音频”,你咋就想不明白呢,和我之前跟你说的“音画同步”的原理是一样的,无论是否含有视频正常情况下播放软件都是以声卡反馈的时间延迟为准,什么进度条什么播放时间都是播放软件以声卡的间接反馈来调整,给你举个视频的例子是让你方便理解...

而且你大可放心,PC和DAC有偏差也不会差太远,因为UAC和USB协议本身就限制了DAC时钟和Host它最大允许偏差多远。而且现代PC的时钟精度其实是很精准的,完全没有那么不堪,精度达到纳秒级别对于现代CPU轻而易举的事情。只是因为1用不上,2高精度时钟占用资源,所以不用而已

p.s.其实声卡驱动自身也不用怎么“反馈”给播放软件(不要搞混了,这里说的是驱动给播放软件反馈),播放软件自己就能测出来缓存实际空掉的时间与设定值的差异,所以说我一直说的“反馈”其实多数情况下是间接的。而这个计算在ASIO和WASAPI Event下将会更加准确因为声卡驱动直接通知播放软件什么时候该写数据了。但不要再误解,就算不用ASIO和WASAPI,播放软件一样能测出差异值并补正而且代码十分简单。只是相对的不那么精确,最多就是如果你在看视频的话画面“相对”更加“抖晃”而已(听音乐就完全没影响的)
回复

使用道具 举报

4
发表于 2017-9-18 14:24 | 显示全部楼层 来自 上海市
顺带一说 bulk模式的声卡我听说是有的 穷邦弄过
回复

使用道具 举报

5
发表于 2017-9-19 09:55 | 显示全部楼层 来自 上海市
本帖最后由 aarwwefdds 于 2017-9-19 10:17 编辑

因为Win这鬼玩意在Win10之前的系统只支持UAC1而不支持UAC2。而大多数UAC1最多只能稳定支持24/96格式,再往上就不那么好使了

此外,Win10最新版已经有官方UAC2支持,XMOS可以不用再装驱动。不过如果不那么在意额外装个厂商驱动的话还是建议装。从Linux开源代码里就可以看出很多厂商的UAC2实现是不标准的,以至于内核开发者要针对各种蛋疼实现做特殊处理

另外除了厂商驱动和系统驱动以外,还有第三方通用UAC1/2驱动。

p.s.XMOS不同的厂家固件也是不一样的,有些厂家的XMOS同样可以运行于UAC1模式,此时对大多数Win10以前的操作系统也是免驱的。有些高端DAC甚至有UAC1/2切换功能
回复

使用道具 举报

6
发表于 2017-9-19 10:02 | 显示全部楼层 来自 上海市
本帖最后由 aarwwefdds 于 2017-9-19 10:36 编辑
wxleasyland 发表于 2017-9-18 21:10
是的,WASAPI作为API本身是没有SRC,但foobar的WASAPI插件倒是有可能。

看了您的描述,大概知道了:

另外我曾经看自称是开发者的人说过,其实以前在专业音乐制作领域的客户(也就是厂商)更倾向于“自适应”方案,而在HiFi领域则更倾向“异步”。同样的异步方案他们给HiFi厂商,厂商就用了,但是给音频制作领域的就宁愿用“自适应”

因为自适应方案“时钟”灵活性大。异步方案在这个场景下会吃瘪:一端用ASYNC输入,另一端用ASYNC实时监听(输出)。因为有两个主时钟存在,PC此时不得不做SRC,对声音的影响很大。

UAC2引入了Clock Domain。就好了不少

另外还有一点是,在DS架构高性能DAC大行其道之前,在大家都还在用R2R做HiFi DAC的时候,时钟抖动对于DAC几乎没影响,最多只是影响抖晃率,而这个比起对DS架构DAC的影响小太多了。DS架构时钟直接参与波形还原,时钟不稳定直接导致波形还原变得不那么精确,这直接反应出来的就是各种次生噪声;R2R的话你可以想象一下就是1kHz变成了1.002kHz,反正。。。人耳听不出来的
回复

使用道具 举报

7
发表于 2017-9-20 13:38 | 显示全部楼层 来自 上海市
icm 发表于 2017-9-20 10:51
win10创意者版对UAC2的支持并不好xmos的芯片设备管理里会有惊叹号(固件读取不正常),没有asio模式不能 ...

WASAPI一样可以输出DoP

另外UAC2支持已经进入正式版了,好像好了很多。虽然多少还是有一些问题
回复

使用道具 举报

8
发表于 2017-9-20 13:50 | 显示全部楼层 来自 上海市
wxleasyland 发表于 2017-9-20 12:34
200元左右的Amanero或者XMOS  USB转I2S子卡,哪个好一些呢?  看上Amanero,但肯定是非原版的。

说老实话 差不多。你听不出来的

现在的DS DAC对时钟抖动的敏感度低了很多了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | -注册-

本版积分规则

Archiver|手机版|粤icp备09046054号|耳机网-耳机大家坛

粤公网安备 44030602000598号 耳机大家坛、www.erji.net、网站LOGO图形均为注册商标

GMT+8, 2024-5-4 08:05

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表