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>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>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文章
8438瀏覽量
284444 -
audio
+關注
關注
1文章
332瀏覽量
61398 -
音頻設備
+關注
關注
0文章
130瀏覽量
14931 -
代碼
+關注
關注
30文章
4967瀏覽量
73954 -
uac
+關注
關注
0文章
11瀏覽量
4375
原文標題:靈動微課堂 (第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)音頻設備
評論