usb麦以及GD32单片机的一些坑--usb microphone&exmc

本文讲述了开发者在项目中遇到的问题,如音频数据同步问题、USB接口调整和GD微控制器的GPIO速度调整。作者通过解决技术难题,揭示了Linux与USB设备的交互机制,以及在嵌入式开发中如何处理数据溢出和频率调整。

项目中途换方案,st改成gd,407Ve片子。

**usb mic**

要实现usb  microphone,于是音频codec+usb iso,上位机是linux。根据各个例程,初步实现都ok。

问题来了:1ms发一次的声卡数据,还tm是44.1khz的,我去!后来又发现iis的dma数据填充和usb上位机的读取数据时钟源不一致,导致dma填充速度快过usb读取,有些数据还没传过去就被覆盖了!!然后播放的声音间歇性失真(试了满久才认定的),我再去!!!!

怎么搞:(1)44.1k频率很讨厌,加上之前没搞过usb iso。。查各种资料,每10ms传送441个音频采样给到主机,就ok了。又来个问题,不知道iso其实可以每次传输不同长度的数据,好sb。试试,发现可以。另外,由于之前没发现数据覆盖问题还以为linux不支持iso不定长传输,深深忏悔我的无知!!!!

(2)数据覆盖问题,理论分析一定会存在的,可是例程就是彻底的例程,不涉及实际应用中的问题。纠结之下,突然想起来,不是可以发不定长吗?那好办了,当发现dma buffer 有较多没发完的数据时,一次发两个1ms的数据不就ok了?是的,实际测试真的好了。

真的深深惭愧,linux其实很NB。linux用alsa接usb数据的,发现只要设置好了采样率,通道,每次采样的点数,就可以直接接收数据了。我觉得alsa在自己里层也做了缓冲,不然44.1k音频的一包数据(1ms)是44或45个,我设置一次读200个,肯定是5个包啦!然后我处理了数据继续接收,后面的数据和前面的数据还可以无缝衔接,必定有缓冲的。在这次应用里,alsa挺好用,当然libusb也挺牛逼的,之前的程序是alsa直接通过pcm驱动读codec的,先入为主了吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值