Linux USB Gadget UAC1复合麦克风扬声器
2025-09-23
本文链接为:http://www.usbzh.com/article/detail-1586.html ,欢迎转载,转载请附上本文链接。
上一篇文章大概说了一下在搞UAC1复合麦克风扬声器,当时也仅是将设备复合出来了,没有进行数据的通讯处理。今天要说的是音频数据处理也”正常”了。
由于IMX6UL自带的扬声器和麦克风,本来的想法是相互独立。扬声器用IMX6UL自常的扬声器播放,而麦克风用自带的麦克风采集声音,可无奈u_uac1.h/c文件中并没有实现Linux麦克风的功能,所以此路对自己来说,当前有点不通。

所以,本人本着能方便就偷懒的方式重新规划了音频数据的链路。我的想法是既然麦克风无法获取真实的数据,何不妨使用扬声器的数据来回环。这让从Windows系统下来的扬声器音频数据,在UAC1驱动中兵分两路,一路直接使用IMX6UL自带的扬声器直接播放,另一路则掉转车头,从UAC1驱动中回到Gadget麦克风中,最终回到Windows系统中。这样,我们在Windows系统中使用使用Gadget扬声器播放的声音,可以通过Gadget麦克风再次采集回来。如果这时我们用我们的另一个扬声器来侦听该麦克风,就可以听到播放的声音。

PS:在测试时遇到一个BUG,会内核崩溃,经过分析,是内存泄露引起的。
原因是在OUT的端点申请的端点请求,和IN端点中释放端点求时前,未释放端点的内存缓冲区。
if (ep == out_ep)
{
if (in_ep && in_ep->driver_data)
{
mreq = usb_ep_alloc_request(in_ep, GFP_ATOMIC);
if (mreq)
{
mreq->buf = kzalloc(req->actual, GFP_ATOMIC);
if (mreq->buf)
{
mreq->context = audio;
mreq->complete = f_audio_complete;
mreq->length = req->actual;
memcpy(mreq->buf, req->buf, req->actual);
usb_ep_queue(in_ep, mreq, GFP_ATOMIC);
}
else
{
usb_ep_free_request(in_ep,mreq);
}
}
}
f_audio_out_ep_complete(ep, req);
}
本文链接为:http://www.usbzh.com/article/detail-1586.html ,欢迎转载,转载请附上本文链接。
USB Gadget





