什么是异步传输,为什么要异步传输,中文文章有很多,但是非常含糊
http://www.soomal.com/doc/10100000758.htm
http://www.erji.net/read.php?tid=767228
没办法,转战英文和日文资料
也发现一些枪文,但是人家枪文枪得有深度
至少问题一看就明白了
基本工作流程
一些基本概念也贴一下
USB音频类规定的USB同步传输周期为1ms,即对于8kHz/16位/单通道PCM编码的音频流,每隔1ms,USB设备就会收到一次主机传来的数据,数据包大小为16字节,为了尽量保持I2S和USB传输同步,可以取16字节作为一个缓存区段的大小。当USB声卡接收到数据后,MCU先判断缓冲区中是否有空闲区域,如果没有足够缓冲区就跳过一个样本,然后再逐一把FIFO中的数据复制到SDRAM的缓冲区。
因为I2S的DMA控制器处理数据是按段进行,每段长度为16字节,在DMA取数据前,先判断缓冲区中的数据量,如果没有足够数据(16字节),则加入静音数据,然后再执行DMA传输。
下面才是重点
这是USB AUDIO 数据流的基本格局
音频数据是一毫秒一个数据包封包的,传输的时候延迟1毫秒
数据格式是Audio Data ((bit number / 8) x (fs/1000))
举个简单的例子,立体声2496,在USB AUDIO数据流中就变成每毫秒 6X96byte(两声道所以是6),1648是4X48
数据包中会包含格式信息,USB音频设备内的服务周期是10MS,以一个服务周期为单位来确认采样信息是否改变,这个10ms非常重要,以后会再次提到
这个图很有意思,一毫秒的数据装入FIFO(先进先出)BUFFER后,底下走I2S跑D/A去了,数据是一次性倒入的,解包发I2S->D/A是顺序完成的,这时候需要时钟,这个问题在本楼以上,不存在任何问题,不是双时钟就是NB时钟发生器,控制器自己合成时钟什么的,最讨厌了。
48Khz成为标准是怎么回事
1648的在USB中就是每毫秒发送48组4byte数据,2496就是一毫秒发送96组6byte数据
但是44.1、88.2怎么办,一毫秒发送44.1组4byte?显然不可能
要么44组,要么45组,显然发多了的结果是积水越来越多,最后灌不进去,发少了可能直接放空了声音中断
所以,44.1的传输实际是异步的
异步传输是怎么回事呢?从结果上说,就是10毫秒之内搞定44.1、88.2
如何实现的呢?请看下面这张图
我们不再以1毫秒为单位,异步传输的时候,要以10毫秒为单位(刚才说过了,10毫秒是服务周期)
44.1K的时候,前9毫秒都是每毫秒发送44组4byte,所以每毫秒有2.27us的盈余,9毫秒积累起来,全部加给最后一个数据包,最后一毫秒是45组4byte!
于是,数据齐了
The First Packet receiving end, following the SOF Frame 44 and thefirst set of data is detected must be converted to I2S.However,LRCLK SOH so the next 44.1kHz to the period between 1mS 2.27μS(1.0mS - 1/44.1kx 44) gap (GAP) that will be. GAP in the middle ofthis music sounds crazy and another is to have that out Bachitsu LPwill sound like scratched records.Therefore, the pair took outKuttsukemasu been following the beginning of the packet. Aftersending the packet data in the second 4.54μS, after sending thepacket data in third 6.81μS ... and gradually increases the Gapsent a packet of data in the ninth will be done after 20.43μS.Immediately after the 10th transfer it attaches to the first set ofpackets at this time the 10th 11th (First Frame is not forward it)of the SOH matches.Therefore, USB Audio devices in the Packet10pieces (10mS min) and should allow for a buffer that makes iteasier for Hardware and Software, 16bit/44.1kHz in 1,764 bytes(4x441), 24bit/96kHz well with you and to 5,760 bytes (6x960) ofRAM is required. USB Audio Stream is available at the moment to theexample of the controller and TAS1020B Endpoint Buffer and RAM isused as it is about 1304 bytes up to 10mS minute buffer is notavailable. TAS1020B be set in train of a ring buffer (CircularBuffaer), so this is 44.1kHz Audio data-based support.
我引用一下,这是翻译成英文的
注意硬件要求,异步传输需要大容量buffer,1644要求1764bytes(每10毫秒),2496的要求是5760bytes,TAS1020B本身的参数上并不符合1644异步传输的要求(1304byte是不够的),不过作者说这玩意儿有个Circularbuffer模式,正好可以符合要求。
ONKYO用了什么模式不清楚,从buffer大小的角度上讲,sanyo芯片比1020B更多,我看到异步传输数据上有些2048bytes,不过不能确认,2048的话倒真的可以用了。
这个厂商的宣传很有意思,号称1020B开启CircularBuffaer后可以勉强满足1644,但是你是怎么支持2488的,存在很大的疑问,总觉得在自己抽自己
个人的想法是,44.1和88.2的传输需要的buffer可能是4~8x,没有厂商宣传得那么大,毕竟不是10个数据包一起扔进去的。
最后来这个图
至此,异步传输基本是怎么情况讲完了,说穿了,异步传输关键是缓冲区要大,目前日本厂商还是主要用USB 2.0 FULLSPEED的模式,两声道2496,一秒持续传输,数据包总大小接近5Mb,5.1声道2448都要爆,1648是极限(相当于两声道2496)。两声道24192是不可能有戏了,3296就突破6M了,太危险。
terratec等厂商要对付多声道高品质录音及播放的,highspeed的控制器+fpga+双时钟是必须的,24192也好,多声道2496也好,一个都不能少
这个图还是值得参考的,这个声卡卖得非常贵,是U55SX的2倍,但是U55SX的基础与回放素质远超这玩意儿
在VISTA体系以前,不同采样率和格式混音怎么办是个麻烦
但是,VISTA以后,反正共享模式是统一格式,SRC精度还高,直接SRC成2448或者2496反而省事了。
USB这样的体制,又产生了一个问题,断流怎么办。
这个问题在高端领域是个伪命题,高端尽量独占,系统又强,配的线还好,2声道数据流的话倒也问题不大
这里说下线,其实,最好的USB线,一定是高端音频厂商出的,M-AUDIO,ROLAND这些死硬的要用USB供电的厂商,搭配的4个9的双屏蔽线拿来用倒也不错。
低端?低端其实板载SPDIF,把USB声卡当DAC算了,麻烦还少一点,音质上,这点基础了,jitter大就大吧,说实在的,PCHIFI投钱一定要下本,不下本不如HDA.....