UAC是USB Audio Class的縮寫(xiě),USB音頻類(lèi),一個(gè)像USB這樣的通用數(shù)據(jù)接口,可以有很多種實(shí)現(xiàn)數(shù)字音頻數(shù)據(jù)傳輸?shù)姆绞?。不同?a target="_blank">開(kāi)發(fā)者可以根據(jù)自己的喜好和需求,定義任意的控制方式,傳輸模式,音頻格式等等參數(shù)。
在上一節(jié)我們?cè)?a target="_blank">MM32F0163D7P 平臺(tái)上成功的移植了TinyUSB,基于這個(gè)平臺(tái),今天我們來(lái)實(shí)現(xiàn)一個(gè) uac2_headset 音頻設(shè)備,這個(gè)設(shè)備支持基礎(chǔ)的錄音和放音功能,如果要支持音量調(diào)節(jié)/靜音功能,還需要再添加一個(gè) HID 變成復(fù)合設(shè)備。
2快速移植一個(gè)UAC+HID復(fù)合設(shè)備
按照前面兩篇文章,我們可以快速的移植出一個(gè)基于TinyUSB的UAC+HID復(fù)合設(shè)備,主要的代碼片段如下:
/*-------------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 枚舉過(guò)程
圖2 枚舉設(shè)備
工程文件樹(shù):
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耳機(jī)設(shè)備設(shè)置修改音量
在耳機(jī)屬性里面可以操作修改音量大小,同時(shí)通過(guò)抓包工具可以抓到主機(jī)下發(fā)的SET CUR命令。
圖3 設(shè)置音量
4耳機(jī)設(shè)備設(shè)置修改采樣頻率和位深度
在耳機(jī)屬性高級(jí)里面默認(rèn)格式可以看到下拉框有兩種格式,一個(gè)是2通道 16位48000Hz,另外一個(gè)是2通道 24位 48000Hz,播放聲音下發(fā)ISOC包的時(shí)候根據(jù)這個(gè)選擇傳輸。
圖4 設(shè)置采樣頻率和位深度
通過(guò)設(shè)置,下位機(jī)可以在播放或者錄音時(shí)處理不同的采樣頻率和位深度。樣例中全局變量current_resolution是位深度,current_sample_rate是采樣頻率。
5音頻數(shù)據(jù)的收發(fā)處理
播放時(shí)ISOC下發(fā)的數(shù)據(jù)包緩存在spk_buf里面。
錄用時(shí)麥克風(fēng)的聲音采樣數(shù)據(jù)寫(xiě)入mic_buf,通過(guò)ISOC同步上傳到電腦端。(例程是將播放的數(shù)據(jù)包處理后通過(guò)接口又返回電腦端,由tud_audio_write((uint8_t *)mic_buf, (uint16_t) (spk_data_size / 2))實(shí)現(xiàn))
//--------------------------------------------------------------------+ //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功能驗(yàn)證測(cè)試
將uac2_headset 音頻設(shè)備插入PC,在計(jì)算機(jī)管理->設(shè)備管理器->音頻輸入和輸出里面出現(xiàn)耳機(jī)和麥克風(fēng)兩個(gè)TinyUSB headset設(shè)備證明枚舉成功。
圖5 設(shè)備管理器音頻設(shè)備
電腦端播放音樂(lè)使用抓包工具抓到ISOC的數(shù)據(jù)包:
圖6 ISOC數(shù)據(jù)包
審核編輯:湯梓紅
-
usb
+關(guān)注
關(guān)注
60文章
7985瀏覽量
266186 -
audio
+關(guān)注
關(guān)注
1文章
320瀏覽量
59431 -
音頻設(shè)備
+關(guān)注
關(guān)注
0文章
91瀏覽量
14075 -
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69091 -
uac
+關(guān)注
關(guān)注
0文章
9瀏覽量
4137
原文標(biāo)題:靈動(dòng)微課堂 (第265講)|基于MM32F0163D7P的USB Audio Class(UAC)音頻設(shè)備
文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
USB音頻設(shè)備沒(méi)有得到任何數(shù)據(jù)
使用USB_Audio_Class進(jìn)行語(yǔ)音設(shè)備設(shè)計(jì)時(shí)需要解決的音頻信號(hào)同步問(wèn)題是什么?
基于Linux內(nèi)核的Rockchip USB Gadget UAC開(kāi)發(fā)資料分享
USB音頻設(shè)備的設(shè)計(jì)與實(shí)現(xiàn)
D類(lèi)音頻放大器是什么;Class D Audio Ampli
Class D Audio Amplifier Output
![<b class='flag-5'>Class</b> <b class='flag-5'>D</b> <b class='flag-5'>Audio</b> Amplifier Output](https://file1.elecfans.com//web2/M00/A4/D9/wKgZomUMNfOAD3s-AAAiUawyiQg613.gif)
音頻設(shè)備類(lèi)型
High-efficiency Class D audio
![High-efficiency <b class='flag-5'>Class</b> <b class='flag-5'>D</b> <b class='flag-5'>audio</b>](https://file1.elecfans.com//web2/M00/A5/B7/wKgZomUMOcOACNkgAAAaro6jv0I369.gif)
USB音頻設(shè)備類(lèi)的音頻信號(hào)同步解決方案
![<b class='flag-5'>USB</b><b class='flag-5'>音頻設(shè)備</b>類(lèi)的<b class='flag-5'>音頻</b>信號(hào)同步解決方案](https://file1.elecfans.com//web2/M00/A6/0D/wKgZomUMO36AH7DeAAAPV_aJWPw664.jpg)
Class-D音頻功放的應(yīng)用及方案
![<b class='flag-5'>Class-D</b><b class='flag-5'>音頻</b>功放的應(yīng)用及方案](https://file.elecfans.com//web2/M00/4D/74/pYYBAGK1ExaAGZLgAAI-jdM1Vkc676.png)
基于MM32F0163D7P的I2S接口的音樂(lè)播放器實(shí)驗(yàn)
![基于<b class='flag-5'>MM32F0163D7P</b>的I2S接口的音樂(lè)播放器實(shí)驗(yàn)](https://file1.elecfans.com/web2/M00/8C/8C/wKgZomSuIO2ASsdjAAL2lOmTq28612.jpg)
基于MM32F0163D7P的USB接口TinyUSB應(yīng)用:移植和新增設(shè)備(二)
![基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b>接口TinyUSB應(yīng)用:移植和新增<b class='flag-5'>設(shè)備</b>(二)](https://file1.elecfans.com/web2/M00/8D/52/wKgaomS4-WqAGYHkAAA_FixSHhw658.png)
USB音頻設(shè)備介紹
![<b class='flag-5'>USB</b><b class='flag-5'>音頻設(shè)備</b>介紹](https://file1.elecfans.com/web2/M00/EB/ED/wKgZomZgPKmALBZ8AACpJhh6l9Q479.png)
評(píng)論