UAC是USB Audio Class的缩写,USB音频类,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制方式,传输模式,音频格式等等参数。
在上一节我们在MM32F0163D7P 平台上成功的移植了TinyUSB,基于这个平台,今天我们来实现一个 uac2_headset 音频设备,这个设备支持基础的录音和放音功能,如果要支持音量调节/静音功能,还需要再添加一个 HID 变成复合设备。
2快速移植一个UAC+HID复合设备
按照前面两篇文章,我们可以快速的移植出一个基于TinyUSB的UAC+HID复合设备,主要的代码片段如下:
/*-------------MAIN-------------*/
intmain(void)
{
USB_DeviceClockInit();//board_init();
CONSOLE_Init(460800);//enableprintfdebug
//initdevicestackonconfiguredroothubport
tud_init(BOARD_TUD_RHPORT);
TU_LOG1("UACHeadset&HIDrunning
");//CFG_TUSB_DEBUGfordebugging#ifCFG_TUSB_DEBUG
//0:nodebug
//1:printerror
//2:printwarning
//3:printinfo
while(1)
{
tud_task();//TinyUSBdevicetask
audio_task();
hid_task();
}
return0;
}
#defineEPNUM_AUDIO_IN0x01
#defineEPNUM_AUDIO_OUT0x01
#defineEPNUM_HID0x03
uint8_tconstdesc_configuration[]=
{
//Interfacecount,stringindex,totallength,attribute,powerinmA
TUD_CONFIG_DESCRIPTOR(1,ITF_NUM_TOTAL,0,CONFIG_TOTAL_LEN,TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP,100),
//Interfacenumber,stringindex,EPOut&EPInaddress,EPsize
TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR(2,EPNUM_AUDIO_OUT,EPNUM_AUDIO_IN|0x80),
//Interfacenumber,stringindex,protocol,reportdescriptorlen,EPOut&Inaddress,size&pollinginterval
TUD_HID_INOUT_DESCRIPTOR(ITF_NUM_HID,6,HID_ITF_PROTOCOL_NONE,sizeof(desc_hid_report),EPNUM_HID,0x80|EPNUM_HID,CFG_TUD_HID_EP_BUFSIZE,10),
};
//--------------------------------------------------------------------+ //StringDescriptors //--------------------------------------------------------------------+ //arrayofpointertostringdescriptors charconst*string_desc_arr[]= { (constchar[]){0x09,0x04},//0:issupportedlanguageisEnglish(0x0409) "TinyUSB",//1:Manufacturer "TinyUSBheadset",//2:Product "000001",//3:Serials,shouldusechipID "TinyUSBSpeakers",//4:AudioInterface "TinyUSBMicrophone",//5:AudioInterface "TinyUSBHID",//6:HIDInterface };

图1 枚举过程

图2 枚举设备
工程文件树:
1.TinyUSB_UAC_HID
2. │
3. ├─USER
4. │ main.c
5. │ usb_descriptors.c
6. │ usb_dcd_port.c
7. │
8. └─TinyUSB
9.
10. tusb.c
11. audio_device.c
12. tud_fifo.c
13. usbd.c
14. usb_control.c
15. hid_device.c
3耳机设备设置修改音量
在耳机属性里面可以操作修改音量大小,同时通过抓包工具可以抓到主机下发的SET CUR命令。

图3 设置音量
4耳机设备设置修改采样频率和位深度
在耳机属性高级里面默认格式可以看到下拉框有两种格式,一个是2通道 16位48000Hz,另外一个是2通道 24位 48000Hz,播放声音下发ISOC包的时候根据这个选择传输。

图4 设置采样频率和位深度
通过设置,下位机可以在播放或者录音时处理不同的采样频率和位深度。样例中全局变量current_resolution是位深度,current_sample_rate是采样频率。
5音频数据的收发处理
播放时ISOC下发的数据包缓存在spk_buf里面。
录用时麦克风的声音采样数据写入mic_buf,通过ISOC同步上传到电脑端。(例程是将播放的数据包处理后通过接口又返回电脑端,由tud_audio_write((uint8_t *)mic_buf, (uint16_t) (spk_data_size / 2))实现)
//--------------------------------------------------------------------+
//AUDIOTask
//--------------------------------------------------------------------+
voidaudio_task(void)
{
//Whennewdataarrived,copydatafromspeakerbuffer,tomicrophonebuffer
//andsenditover
//Onlysupportspeaker&headphonebothhavethesameresolution
//Ifoneis16bitanotheris24bitbecareofLOUDnoise!
if(spk_data_size)
{
if(current_resolution==16)
{
int16_t*src=(int16_t*)spk_buf;
int16_t*limit=(int16_t*)spk_buf+spk_data_size/2;
int16_t*dst=(int16_t*)mic_buf;
while(src< limit)
{
// Combine two channels into one
int32_t left = *src++;
int32_t right = *src++;
*dst++ = (int16_t) ((left >>1)+(right>>1));
}
memset(mic_buf,0xCC,sizeof(mic_buf));//mm32testcode
tud_audio_write((uint8_t*)mic_buf,(uint16_t)(spk_data_size/2));
spk_data_size=0;
}
elseif(current_resolution==24)
{
int32_t*src=spk_buf;
int32_t*limit=spk_buf+spk_data_size/4;
int32_t*dst=mic_buf;
while(src< limit)
{
// Combine two channels into one
int32_t left = *src++;
int32_t right = *src++;
*dst++ = (int32_t) ((uint32_t) ((left >>1)+(right>>1))&0xffffff00ul);
}
tud_audio_write((uint8_t*)mic_buf,(uint16_t)(spk_data_size/2));
spk_data_size=0;
}
}
}
6功能验证测试
将uac2_headset 音频设备插入PC,在计算机管理->设备管理器->音频输入和输出里面出现耳机和麦克风两个TinyUSB headset设备证明枚举成功。

图5 设备管理器音频设备
电脑端播放音乐使用抓包工具抓到ISOC的数据包:

图6 ISOC数据包
审核编辑:汤梓红
-
usb
+关注
关注
60文章
7945浏览量
264597 -
audio
+关注
关注
1文章
320浏览量
59259 -
音频设备
+关注
关注
0文章
85浏览量
13993 -
代码
+关注
关注
30文章
4787浏览量
68589 -
uac
+关注
关注
0文章
9浏览量
4116
原文标题:灵动微课堂 (第265讲)|基于MM32F0163D7P的USB Audio Class(UAC)音频设备
文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
USB音频设备没有得到任何数据
使用USB_Audio_Class进行语音设备设计时需要解决的音频信号同步问题是什么?
基于Linux内核的Rockchip USB Gadget UAC开发资料分享
D类音频放大器是什么;Class D Audio Ampli
Class D Audio Amplifier Output
High-efficiency Class D audio
USB音频设备类的音频信号同步解决方案
基于MM32F0163D7P的I2S接口的音乐播放器实验
基于MM32F0163D7P的USB接口TinyUSB应用:移植和新增设备(二)

基于MM32F0163D7P的USB Audio Class(UAC)音频设备
评论