该功能会用到USB, Audio功能。
对于USB音箱,数据流:PC->USB->设备->udc驱动->gadget驱动(UAC1)->应用层得到音频数据(操作生成的虚拟声卡进行录音)->应用层播放音频数据(操作实际播放声卡进行播放)
对于USB麦克风,数据流:设备端应用层拿到录音数据(操作实际录音声卡进行录音)->应用层播放录音数据(操作生成的虚拟声卡进行播放)->gadget(UAC1驱动)->udc驱动->USB->PC(执行录音程序)得到录音数据
配置使用方法
- 内核配置
USB gadget UAC1内核配置:
另外Audio相关播放、录音配置也需要配置。 - configfs配置
一般直接输入命令即可:setusbconfig uac1
具体配置内容可以查看package/base-files/setusbconfig-configfs该脚本
个别需要注意的配置:
设置通道数掩码,例如支持两通道:
echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
设置采样率:
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
我们的平台默认配置一般只有一个ISOC端点,所以默认setusbconfig只会使能一个USB playback:
echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate - 测试验证方法
默认配置使用了USB音箱模式,因此,需要将虚拟声卡的录音数据送到实际的播放声卡(例如audiocodec)中:
arecord -Dhw:UAC1Gadget -f S16_LE -r 48000 -c 2 -t raw |aplay -Dhw:audiocodec -f S16_LE -r 48000 -c 2 -t raw
(PC端注意选用新生成的播放设备进行播放)
如果需要改成USB麦克风模式,需要修改下setusbconfig配置:
echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
这时候是将实际录音数据送到虚拟声卡中:
arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 -t raw |aplay -Dhw:UAC1Gadget -f S16_LE -r 16000 -c 2 -t raw
(PC端注意选用新生成的录音设备进行录音)
利用alsa的dsnoop插件,它不会因没有数据而返回-EIO错误
改动点:
/etc/asound.conf增加相关alsa配置:
pcm.CaptureUAC1 {
type plug
slave.pcm {
type dsnoop
ipc_key 3333
ipc_perm 0666
slave {
pcm "hw:UAC1Gadget"
rate 48000
channels 2
period_size 1920
periods 4
}
}
}
测试命令指定的名字需要从安排了arecord -Dhw:UAC1Gadget改成arecord -DCaptureUAC1,即:
arecord -DCaptureUAC1 -f S16_LE -r 48000 -c 2 |aplay