Usb audio目前已经有三个版本: 1.0,2.0,3.0 。1.0版本虽然出现的最早,但任然在大多数产品上使用,如TI 的 PCM系列usb audio芯片,基本上都是1.0的版本。 这里有一点需要明确,usb audio的版本并不是对应usb的版本。

同步传输:

usb支持的四种传输机制: 控制传输,中断传输,块传输,同步传输,其中同步传输适用于实时性要求比较高且对数据误差有一定容忍的场合,典型的如音频、视频输出。当然这种实时性是以牺牲数据准确率为代价的,Usb协议里面如何保证同步传输的实时性呢?
1. 无握手机制,即不使用retry 机制,所以在要保证同步传输的质量,高质量的USB线缆是必要的
2. 定义同步传输在所有传输方式里面的带宽优先级为最高

反馈引入:

Usb audio的数据都是通过同步传输到usb device的,虽然usb host能保证如上几点,但同步传输还是会有以下地点问题:
1. 主机受CPU负载影响,无法保证usb 同步数据的发送请求间隔
2. 由于usb host与usb device时钟不可能绝对同步,会导致usb device 端数据buff 出现 over run 或 under run

关于第二点,作以下说明:
比如PC播放一个48K采样率的音频文件,假定usb host按照标准的48K 采样率发送数据包,假定usb device端采样I2S接口播放音频数据,这里按照双通道,16bit数据宽度来计算,I2S理想的时钟应该为(48K * 16 *2)=1536K,但由于usb device I2S控制器的时钟生成机制缺陷,比如只能产生1530K 的时钟,那么就会导致I2S的数据消耗率小于usb host的数据发送率,最终就会出现 usb device buff over run

所以同步传输引入了同步机制来解决device与host数据不同步的问题。当然,如果不考虑各种兼容机制,全部自定义一套传输机制也是可以的,如 :

定义一个中断IN端点: usb device 每隔一定间隔返回自己buff的可用空间
定义一个bulk OUT 端点: usb host 用于发送音频数据
这样usb host根据 中断端点返回的device可用buff空间size,一次发送 size的数据到device即可。
这样也可以解决数据不同步问题,不过前提是usb device驱动,连带播放器应用程序都需要自己动手编写,工作量就大了。

同步方式:

USB协议定义了同步传输的三种同步机制:

1. Asynchronous 
2. Synchronous 
3. Adaptive

Synchronous模式

Usb device 根据host发送的SOF帧来同步数据的发送。SOF帧是数据的起始帧,对于USB full speed 设备,USB host以 1.00 ms ±0.0005 ms 的间隔发送SOF帧,对于high speed设备,间隔是125 µs ±0.0625 µs 。
这里以full speed设备为例来说明一种Synchronous同步方式。假定usb device的同步OUT端点设定的数据间隔也为1ms(即一个SOF帧传输一次数据),每隔一个SOF ,usb device接收一帧数据后重新启动一次DMA传输,这样usb device端的数据发送率就依据usb host 的SOF来同步。但由于usb host数据发送的不稳定情况和usb device自身发送时钟的不同步问题,任然会导致usb device buff的over 或 under,一般的解决办法是采用resample的方式来保证usb device端的数据已稳定时钟发送: 在over时丢弃某些samples,under时插入某些samples。

Adaptive模式

自适应模式,即device端自动适应host端的数据发送率。如:
1. 虽然host数据发送不稳定,device端主动调整自身数据发送时钟,适应host的数据发送率
2. device通过resample的方式,插入或者丢弃buff内的samples来保证自身数据发送率的稳定性

Asynchronous 模式

以上两种同步方式中原始audio数据总会有损失。而在asynchronous模式下,host会获取device端实际的数据发送率来实时调整自身数据发送率。Device端能依据这一点来保证自身发送buff的稳定性,从而解决数据同步的问题,如,host端发送速率为48K,device反馈实际播放速率为46K,那么主机就会调整自身发送速率为46K。一种典型的Asynchronous同步方式如下图:

以上两种同步方式中原始audio数据总会有损失。而在asynchronous模式下,host会获取device端实际的数据发送率来实时调整自身数据发送率。Device端能依据这一点来保证自身发送buff的稳定性,从而解决数据同步的问题,如,host端发送速率为48K,device反馈实际播放速率为46K,那么主机就会调整自身发送速率为46K。一种典型的Asynchronous同步方式如下图:

Device端有两个同步端点,一个用于音频数据接收,了一个用于反馈实际数据发送率。

usb audio -- 异步方式介绍(1)相关推荐

  1. USB开发—STM32 USB Audio 开发板介绍(Feedback)

    USB开发-STM32 USB Audio 开发板介绍(Feedback) 一.背景 我个人从事音频行业有好几年的时间.后面慢慢的做起了声卡,也就是USB Audio.自己也走了不少的弯路.之前一起是 ...

  2. Ubuntu13下调试USB AUDIO的一些记录

    最近想玩玩LINUX,于是双系统装了一个Ubuntu13.04. 在新系统下用着都还好,不过我自己DIY的USB DAC出了问题.在WIN7下能正常工作,但是在Ubuntu下就爆音不断,很明显是音频数 ...

  3. Visual C++串口通信编程---多线程异步方式

    Visual C++串口通信编程---多线程异步方式 1. 串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式. 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占 ...

  4. usb audio知识点

    已基本完成wavedev结构的usb音频驱动,现将开发心得及经验总结一下与大家分享/********************************************************** ...

  5. USB Audio Class (UAC)音频解读规范

    前言 USB 音频非常流行,原因之一是USB Audio 是USB 标准的一部分,因此原生模式驱动程序可用于所有流程的操作系统(Win Linux Mac).USB 音频是一种灵活的解决方案,因为任何 ...

  6. usb audio设备驱动

    本文引用自ls.cq<usb audio设备驱动> http://bbs.driverdevelop.com/read.php?tid-118579-page-1.html 已基本完成wa ...

  7. 成熟的 XMOS 方案 ——「 XMOS USB Audio 」

    2022年3月17日 英国布里斯托尔 - 英国领先的芯片公司XMOS发布了其用于自动车牌识别(ALPR)的参考解决方案, 旨在将停车场的ALPR从复杂的资源密集型硬件转向简单的设备上的人工智能. 该方 ...

  8. USB Audio设计与实现

    1 前言 本文将基于STM32F4 Discovery板,从零开始设计并实现一个USB Audio的例子. 2 设计构思 所谓的USB AUDIO就是制作一个盒子,这个盒子可以通过USB连接到PC,P ...

  9. asio boost 异步错误处理_boost::ASIO的同步方式和异步方式

    http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...

最新文章

  1. 继承中多态的灵活使用及其分析图 第一个程序的升级版
  2. Redis设置外网可访问
  3. 复盘王者荣耀手游开发全过程,Unity引擎使用帧同步放弃状态同步
  4. 一个ABAP调试器里查看类的静态属性的小技巧
  5. html wap php,wap.php
  6. 【洛谷 P3304】[SDOI2013]直径(树的直径)
  7. 【MyBiatis框架】原生态Jdbc的弊端已经Mybatis简介
  8. java精确除法运算-BigDecimal
  9. Linux---线程池的实现
  10. html 点击隐藏特效代码,vueJS简单的点击显示与隐藏的效果(实现代码)
  11. spring-页面模板配置
  12. 罗克露计算机组成原理书籍,计算机组成原理完整版罗克露全原版.ppt
  13. 黑莓刷机及情景设置来电和短信等没有声音的解决办法
  14. SQLyog数据库:主键外键代码添加
  15. Win10系统修改开机密码
  16. Qt for WebAssembly 环境配置 - 知其然并知其所以然
  17. 7.camera驱动08-全志-media framework
  18. Mac vmvare vmdk文件使用
  19. 软件测试与质量保障之间的关系
  20. Java实现 LeetCode 365 水壶问题

热门文章

  1. DNS使用的是TCP协议还是UDP协议
  2. 11月22日云栖精选夜读:双11享Go了吗?2017阿里双11在线峰会续写科技盛宴!
  3. Windows 下 Git 的安装及如何与码云协作
  4. 如何选择学习主流程序语言(一)
  5. Django项目中集成富文本编辑器的通用方法,适合KindEditor,xhEditor,NicEditor,wymeditor等 .
  6. RDKit化学式 分子式搜索
  7. 开源大数据:Iceberg新一代数据湖技术实践
  8. Kaldi AMI数据集脚本学习3---run_ihm.sh stage 1~3
  9. 一个按钮控制暂停和开始java_《第一炉香》|一个女人的自甘堕落,从控制不住欲望开始...
  10. vue cli3 搭建项目 使用vue-router 以及 element-ui