...
1156 /*
1157 * process after playback sync complete
1158 *
1159 * Full speed devices report feedback values in 10.14 format as samples
1160 * per frame, high speed devices in 16.16 format as samples per
1161 * microframe.
1162 *
1163 * Because the Audio Class 1 spec was written before USB 2.0, many high
1164 * speed devices use a wrong interpretation, some others use an
1165 * entirely different format.
1166 *
1167 * Therefore, we cannot predict what format any particular device uses
1168 * and must detect it automatically.
1169 */
1170
1171 if (urb->iso_frame_desc[0].status != 0 ||
1172 urb->iso_frame_desc[0].actual_length < 3)
1173 return;
1174
1175 f = le32_to_cpup(urb->transfer_buffer);
1176 if (urb->iso_frame_desc[0].actual_length == 3)
1177 f &= 0x00ffffff;
1178 else
1179 f &= 0x0fffffff;
1180
1181 if (f == 0)
1182 return;
1183
1184 if (unlikely(sender->tenor_fb_quirk)) {
1185 /*
1186 * Devices based on Tenor 8802 chipsets (TEAC UD-H01
1187 * and others) sometimes change the feedback value
1188 * by +/- 0x1.0000.
1189 */
1190 if (f < ep->freqn - 0x8000)
1191 f += 0xf000;
1192 else if (f > ep->freqn + 0x8000)
1193 f -= 0xf000;
1194 } else if (unlikely(ep->freqshift == INT_MIN)) {
1195 /*
1196 * The first time we see a feedback value, determine its format
1197 * by shifting it left or right until it matches the nominal
1198 * frequency value. This assumes that the feedback does not
1199 * differ from the nominal value more than +50% or -25%.
1200 */
1201 shift = 0;
1202 while (f < ep->freqn - ep->freqn / 4) {
1203 f <<= 1;
1204 shift++;
1205 }
1206 while (f > ep->freqn + ep->freqn / 2) {
1207 f >>= 1;
1208 shift--;
1209 }
1210 ep->freqshift = shift;
1211 } else if (ep->freqshift >= 0)
1212 f <<= ep->freqshift;
1213 else
1214 f >>= -ep->freqshift;
1215
1216 if (likely(f >= ep->freqn - ep->freqn / 8 && f <= ep->freqmax)) {
1217 /*
1218 * If the frequency looks valid, set it.
1219 * This value is referred to in prepare_playback_urb().
1220 */
1221 spin_lock_irqsave(&ep->lock, flags);
1222 ep->freqm = f;
1223 spin_unlock_irqrestore(&ep->lock, flags);
1224 } else {
1225 /*
1226 * Out of range; maybe the shift value is wrong.
1227 * Reset it so that we autodetect again the next time.
1228 */
1229 ep->freqshift = INT_MIN;
1230 }
145 int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)
146 {
147 unsigned long flags;
148 int ret;
149
150 if (ep->fill_max)
151 return ep->maxframesize;
152
153 spin_lock_irqsave(&ep->lock, flags);
154 ep->phase = (ep->phase & 0xffff)
155 + (ep->freqm << ep->datainterval);
156 ret = min(ep->phase >> 16, ep->maxframesize);
157 spin_unlock_irqrestore(&ep->lock, flags);
158
159 return ret;
160 }
1451 static void prepare_playback_urb(struct snd_usb_substream *subs,
1452 struct urb *urb)
1453 {
1454 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
1455 struct snd_usb_endpoint *ep = subs->data_endpoint;
1456 struct snd_urb_ctx *ctx = urb->context;
1457 unsigned int counts, frames, bytes;
1458 int i, stride, period_elapsed = 0;
1459 unsigned long flags;
1460
1461 stride = runtime->frame_bits >> 3;
1462
1463 frames = 0;
1464 urb->number_of_packets = 0;
1465 spin_lock_irqsave(&subs->lock, flags);
1466 subs->frame_limit += ep->max_urb_frames;
1467 for (i = 0; i < ctx->packets; i++) {
1468 if (ctx->packet_size)
1469 counts = ctx->packet_size;
1470 else
1471 counts = snd_usb_endpoint_next_packet_size(ep);
...
cloud119 发表于 2017-4-23 20:32
技术贴支持了
坐等坛子的大神出来开撕
夜惊风 发表于 2017-4-23 21:21
USB之所以使用UAC传输音频,很大原因是接收端简陋的硬件条件造成的,早期的USB接收界面之所以简陋,那是因 ...
aarwwefdds 发表于 2017-4-23 21:53
其实buffer也没那么精贵,现在的设备挂个几兆闪存轻而易举的事情,也不增加多少成本
主要是现在有两种 ...
夜惊风 发表于 2017-4-23 22:12
buffer芯片现在很便宜,但是基于UAC的芯片设计思路已经转不过来了,为了适应市场不能再随意修 ...
aarwwefdds 发表于 2017-4-23 22:36
实干是好事,我也正考虑以后实干一下。在实干前先不烧了
不过不知道你遇上的影响是否用仪器测过,是否 ...
蓝子风 发表于 2017-4-23 23:11
看处理顺序。我记得一个朋友做数播的时候,数据接收后的处理环节镶套顺序不同也会导致声音的变化。当然这 ...
brthrush 发表于 2017-4-24 10:23
按我的理解USB用BULK传输音频数据相当于吧歌曲下载到DAC再播放,这样DAC其实跟数字转盘没区别了
dragonlch 发表于 2017-4-27 16:26
现在大部分界面都采用“USB异步传输”
乐之邦的比较奇怪,采用“Bulk模式”
蓝子风 发表于 2017-4-23 23:11
看处理顺序。我记得一个朋友做数播的时候,数据接收后的处理环节镶套顺序不同也会导致声音的变化。当然这 ...
aarwwefdds 发表于 2017-4-28 08:43
突然发现你还有个黑历史
http://www.erji.net/forum.php?mod=viewthread&tid=767228&extra=&page=2
aarwwefdds 发表于 2017-4-27 16:59
你这搬运工没搬好 连接都挂了
bulk有个最大的问题,它带宽不被保证,如果传高采样率数据占去很大带宽 ...
夜惊风 发表于 2017-4-28 09:28
有个不懂的地方请教一下,假如在界面跟PC之间串入了HOST,那PC跟HOST之间是UAC还是BULK?
蓝子风 发表于 2017-4-28 09:45
按照USB规范,是BULK
蓝子风 发表于 2017-4-28 09:45
按照USB规范,是BULK
夜惊风 发表于 2017-4-28 09:28
有个不懂的地方请教一下,假如在界面跟PC之间串入了HOST,那PC跟HOST之间是UAC还是BULK?
aarwwefdds 发表于 2017-4-28 10:13
就USB总线本身来说,USB总线只允许有一个Host。像OTG也只是协商这个连线之间谁做Host,如果其中一个Maste ...
aarwwefdds 发表于 2017-4-28 10:21
像USB音频这样的应用,如果在PC和USB解码器界面串入另一个“Host”,而且和PC还得走USB的话。
那么只有 ...
aarwwefdds 发表于 2017-4-28 10:08
USB规范允许两个Host?不对吧 你看到的Bulk是在哪里看到的
夜惊风 发表于 2017-4-28 10:23
给推荐个合适的HOST芯片,我来试试
蓝子风 发表于 2017-4-28 10:34
我记得USB规范中描述BULK的时候给出的一个示意图就有一个HUB的
aarwwefdds 发表于 2017-4-28 10:35
HUB相对于PC也不是Host啊...
蓝子风 发表于 2017-4-28 10:41
相对于下一级设备就是HOST了呀
aarwwefdds 发表于 2017-4-28 10:51
...所有的HUB都是“集线”作用 正常情况下它是透明的 不破坏与主机之间的网络拓扑。最终还是以主机的SOF ...
蓝子风 发表于 2017-4-28 11:05
MTT技术的USB HUB。实际是一个对下一级设备的HOST作用的设备了。
毕竟和主机连接的协议已经和次级设备 ...
aarwwefdds 发表于 2017-4-28 11:12
事务翻译仅影响高速HUB与全速/低速设备之间的互动,不管是单TT还是多TT,都只影响全速/低速设备。
多T ...
蓝子风 发表于 2017-4-28 11:24
实际上HUB转译之后,变相的相当于时钟重新分配了。如果能再加上传输损耗补偿就更好了。对于UAC也算是一个 ...
蓝子风 发表于 2017-4-28 11:24
实际上HUB转译之后,变相的相当于时钟重新分配了。如果能再加上传输损耗补偿就更好了。对于UAC也算是一个 ...
duben 发表于 2017-4-28 13:27
这个贴是不是要发到PCHIFI板块去
aarwwefdds 发表于 2017-4-28 08:43
突然发现你还有个黑历史
http://www.erji.net/forum.php?mod=viewthread&tid=767228&extra=&page=2
aarwwefdds 发表于 2017-4-28 12:09
你可以认为多个TT相当于HUB集成了多个全速/低速控制器 单个TT相当于HUB只有一个全速/低速控制器。单TT的话H ...
aarwwefdds 发表于 2017-4-28 13:41
这个属于“HIFI理论”吧,发这里我觉得没啥不对。特别是关乎于所谓的“数字界面”(实际是DDC)的一些运 ...
蓝子风 发表于 2017-4-28 17:38
哦,明白了,3Q呢。这样说来HUB还有肩负一个任务就是分类PC-HUB之间的带宽给下一级设备,STT就是只有提供 ...
TokuRin 发表于 2017-9-22 15:48
楼主,咨询个问题!!!
音频文件本身采样精度是16bit,外置音频解码器(乐之邦的一个设备)是32bit(bBit ...
aarwwefdds 发表于 2017-9-23 04:16
最好的办法就是直接塞0了。方便处理
而且在某些情况下,例如在播放过程中应用了DSP,你可以很方便的从 ...
TokuRin 发表于 2017-9-23 17:57
多谢回复!!!
所以,是通过主机端软件修改音频数据,达到主机端和外设端相互匹配bit参数的(外设的bit ...
TokuRin 发表于 2017-9-23 21:42
我可能大背景没描述!
我是在Linux下,在应用层,去实现uac2.0协议(绕过了底层uac驱动),和外接音频解 ...
aarwwefdds 发表于 2017-4-23 21:53
其实buffer也没那么精贵,现在的设备挂个几兆RAM轻而易举的事情,也不增加多少成本
主要是现在有两种 ...
TokuRin 发表于 2017-9-23 21:42
我可能大背景没描述!
我是在Linux下,在应用层,去实现uac2.0协议(绕过了底层uac驱动),和外接音频解 ...
蓝子风 发表于 2017-4-28 09:45
按照USB规范,是BULK
rgwan 发表于 2017-10-18 23:14
求仔细读文档,看不懂就看实现……别上来就言之凿凿
上次在B站闲逛还看到你和其他人争论频率分辨 ...
wangzx998 发表于 2017-10-20 23:58
技术文好评,虽然难以看懂
个人见解,HIFI烧油,也是PC攒机烧友
相对于笔记本,尽量不要USB直连,O ...
蓝子风 发表于 2017-10-20 23:01
B站上的那个呀,如果纯粹正弦波可以没问题,但是问题是音频信号中不止正弦波。你的很多信号理论也基本是 ...
rgwan 发表于 2017-10-21 15:54
公开了,欢迎去我的GitHub。最近缺钱,打算做一个套件回血。到时候板子我能免费送一波,器件就没法送了。 ...
wangzx998 发表于 2017-10-21 00:03
usb这个东西通用程度太高,不止音频传输,设备输入输出慢慢都做成USB了
可能没资格评论这个技术文( ...
天将明 发表于 2017-10-22 03:25
虽然我没有看懂,但我怎么觉得这个意思是USB现在是个100马力的发动机,难题就在如何基于它做出好车。
专业尸体 发表于 2018-12-14 17:02
楼主你好,本人小白刚接触一点usb音频,我enable了playback interface之后,给isochronous endpoint按照max ...
ppqppqpp 发表于 2018-12-14 21:18
20年经验老师傅,专业维修菊花
欢迎光临 耳机网-耳机大家坛 (http://erji.net/) | Powered by Discuz! X3.2 |