<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于MM32F0163D7P的USB Audio Class(UAC)音頻設備

靈動MM32MCU ? 來源:靈動MM32MCU ? 2023-07-27 16:34 ? 次閱讀

1TinyUSB(UAC)音頻簡介

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
};

256709be-2c58-11ee-815d-dac502259ad0.png

圖1 枚舉過程

25ab9322-2c58-11ee-815d-dac502259ad0.png

圖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命令。

25d1e6da-2c58-11ee-815d-dac502259ad0.png

圖3 設置音量

4耳機設備設置修改采樣頻率和位深度

在耳機屬性高級里面默認格式可以看到下拉框有兩種格式,一個是2通道 16位48000Hz,另外一個是2通道 24位 48000Hz,播放聲音下發ISOC包的時候根據這個選擇傳輸。

260c005e-2c58-11ee-815d-dac502259ad0.png

圖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設備證明枚舉成功。

262fb1ca-2c58-11ee-815d-dac502259ad0.png

圖5 設備管理器音頻設備

電腦端播放音樂使用抓包工具抓到ISOC的數據包:

264ef58a-2c58-11ee-815d-dac502259ad0.png

圖6 ISOC數據包

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    59

    文章

    7493

    瀏覽量

    259502
  • audio
    +關注

    關注

    1

    文章

    316

    瀏覽量

    58896
  • 音頻設備
    +關注

    關注

    0

    文章

    49

    瀏覽量

    13694
  • 代碼
    +關注

    關注

    30

    文章

    4569

    瀏覽量

    67064
  • uac
    uac
    +關注

    關注

    0

    文章

    9

    瀏覽量

    4074

原文標題:靈動微課堂 (第265講)|基于MM32F0163D7P的USB Audio Class(UAC)音頻設備

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    USB序列號字符串被識別為兩個USB音頻設備

    時,它們可以被識別為兩個USB音頻設備,但是在MAC中只有一個USB音頻設備被識別。我發現原因是,當我配置了UBFS時,序列號串的選擇i選擇了用戶輸入的文本(附加1)。EXT I將這個
    發表于 02-25 13:20

    USB音頻設備沒有得到任何數據

    我有一個FX2LP設計與一組描述符來創建一個USB音頻設備。該設備實現了揚聲器,所以我有一個USB流輸入和揚聲器輸出。該設備被Windows
    發表于 05-30 08:10

    使用USB_Audio_Class進行語音設備設計時需要解決的音頻信號同步問題是什么?

    不同方向的設計者進行開發,定義了不同的USB設備類(USB Device Class)。本文針對使用USB_Audio_Class進行語音
    發表于 06-08 06:32

    基于Linux內核的Rockchip USB Gadget UAC開發資料分享

    1、Rockchip USB Gadget UAC開發步驟本文檔提供 Rockchip 平臺基于 Linux 內核的 USB Gadget UAC
    發表于 08-10 16:03

    如何在imx8mp android 11 bsp上啟用UVC+UAC復合小工具?

    我們正在使用 imx8mp android 11 bsp,我們想要啟用 UVC+UAC 復合小工具功能,我們啟用的內核配置: CONFIG_USB_CONFIGFS_F_UVC=y
    發表于 06-09 07:08

    USB音頻設備的設計與實現

             在介紹USB 音頻設備及其驅動程序結構的基礎上,對USB Audio 功能節
    發表于 09-14 08:26 ?68次下載

    音頻設備的規格

    音頻設備的規格 規格簡述主要是指各種音頻設備的規格大小和設備功能,因為產品類型較多,所以此處只舉兩個重要一點的產品來說明:    
    發表于 01-07 11:47 ?713次閱讀

    音頻設備

    音頻設備              音頻設備主要是對音
    發表于 01-07 11:48 ?700次閱讀

    音頻設備類型

    音頻設備類型              設備類型指音頻設備的類型,就是音頻設備屬于功
    發表于 01-07 11:46 ?1782次閱讀

    USB音頻設備類的音頻信號同步解決方案

    本文針對使用USB_Audio_Class進行語音設備設計時需要解決的音頻 信號同步 問題進行了介紹,并給出了相應的解決方法和部分源代碼。 引 言 USB總線協議經歷了從
    發表于 10-26 14:52 ?9517次閱讀
    <b class='flag-5'>USB</b><b class='flag-5'>音頻設備</b>類的<b class='flag-5'>音頻</b>信號同步解決方案

    音頻設備中的幻象電源

    音頻設備中的幻象電源
    發表于 10-28 12:00 ?0次下載
    <b class='flag-5'>音頻設備</b>中的幻象電源

    基于MM32F0163D7P的I2S接口的音樂播放器實驗

    I2S(Inter-IC Sound)總線,又稱集成電路內置音頻總線,是飛利浦公司為數字音頻設備之間的音頻數據傳輸而制定的一種總線標準。
    發表于 07-12 11:42 ?729次閱讀
    基于<b class='flag-5'>MM32F0163D7P</b>的I2S接口的音樂播放器實驗

    基于MM32F0163D7PUSB接口TinyUSB應用:移植和新增設備(二)

    如果用戶想增加一個device設備但是在TinyUSB class里面又沒有參考示例,本次我們一起來移植一個CDC+printer復合設備。操作步驟還是和上篇一樣,先將TinyUSB 從GitHub上克隆下來,將src 整個文件
    的頭像 發表于 07-20 17:05 ?860次閱讀
    基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b>接口TinyUSB應用:移植和新增<b class='flag-5'>設備</b>(二)

    基于MM32F0163D7PUSB Audio Class(UAC)音頻設備

    UACUSB Audio Class的縮寫,USB音頻類,一個像
    的頭像 發表于 09-01 16:40 ?774次閱讀
    基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b> <b class='flag-5'>Audio</b> <b class='flag-5'>Class</b>(<b class='flag-5'>UAC</b>)<b class='flag-5'>音頻設備</b>

    使用MPLAB Harmony在PIC32 MCU上創建USB音頻設備

    電子發燒友網站提供《使用MPLAB Harmony在PIC32 MCU上創建USB音頻設備.pdf》資料免費下載
    發表于 09-25 09:30 ?0次下載
    使用MPLAB Harmony在PIC32 MCU上創建<b class='flag-5'>USB</b><b class='flag-5'>音頻設備</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>