0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

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

冬至子 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-09-01 16:40 ? 次閱讀

1 TinyUSB(UAC)音頻簡介

UAC是USB Audio Class的縮寫,USB音頻類,一個像USB這樣的通用數(shù)據(jù)接口,可以有很多種實現(xiàn)數(shù)字音頻數(shù)據(jù)傳輸?shù)姆绞?。不同?a target="_blank">開發(fā)者可以根據(jù)自己的喜好和需求,定義任意的控制方式,傳輸模式,音頻格式等等參數(shù)。

在上一節(jié)我們在MM32F0163D7P 平臺上成功的移植了TinyUSB,基于這個平臺,今天我們來實現(xiàn)一個 uac2_headset 音頻設(shè)備,這個設(shè)備支持基礎(chǔ)的錄音和放音功能,如果要支持音量調(diào)節(jié)/靜音功能,還需要再添加一個 HID 變成復(fù)合設(shè)備。

2 快速移植一個UAC+HID復(fù)合設(shè)備

按照前面兩篇文章,我們可以快速的移植出一個基于TinyUSB的UAC+HID復(fù)合設(shè)備,主要的代碼片段如下:

/*------------- MAIN -------------*/
int main(void)
{
  USB_DeviceClockInit();//board_init();

  CONSOLE_Init(460800);  //enable printf debug

  // init device stack on configured roothub port
  tud_init(BOARD_TUD_RHPORT);

  TU_LOG1("UAC Headset & HID runningrn");   // CFG_TUSB_DEBUG for debugging #if CFG_TUSB_DEBUG
// 0 : no debug 
// 1 : print error
// 2 : print warning
// 3 : print info

  while (1)
  {
    tud_task(); // TinyUSB device task
    audio_task();
    hid_task();
  }

  return 0;
}
#define EPNUM_AUDIO_IN    0x01
#define EPNUM_AUDIO_OUT   0x01

#define EPNUM_HID   0x03


uint8_t const desc_configuration[] =
{
    // Interface count, string index, total length, attribute, power in mA
    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),

    // Interface number, string index, EP Out & EP In address, EP size
    TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR(2, EPNUM_AUDIO_OUT, EPNUM_AUDIO_IN | 0x80),

    // Interface number, string index, protocol, report descriptor len, EP Out & In address, size & polling interval
    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), 

};
//--------------------------------------------------------------------+
// String Descriptors
//--------------------------------------------------------------------+

// array of pointer to string descriptors
char const* string_desc_arr [] =
{
  (const char[]) { 0x09, 0x04 },  // 0: is supported language is English (0x0409)
  "TinyUSB",                      // 1: Manufacturer
  "TinyUSB headset",              // 2: Product
  "000001",                       // 3: Serials, should use chip ID
  "TinyUSB Speakers",             // 4: Audio Interface
  "TinyUSB Microphone",           // 5: Audio Interface
  "TinyUSB HID",                  // 6: HID Interface
};

image.png

圖1 枚舉過程

image.png

圖2 枚舉設(shè)備

工程文件樹:

image.png

3 耳機設(shè)備設(shè)置修改音量

在耳機屬性里面可以操作修改音量大小,同時通過抓包工具可以抓到主機下發(fā)的SET CUR命令。

image.png

圖3 設(shè)置音量

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

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

image.png

圖4 設(shè)置采樣頻率和位深度

通過設(shè)置,下位機可以在播放或者錄音時處理不同的采樣頻率和位深度。樣例中全局變量current_resolution是位深度,current_sample_rate是采樣頻率。

5 音頻數(shù)據(jù)的收發(fā)處理

播放時ISOC下發(fā)的數(shù)據(jù)包緩存在spk_buf里面。

錄用時麥克風(fēng)的聲音采樣數(shù)據(jù)寫入mic_buf,通過ISOC同步上傳到電腦端。(例程是將播放的數(shù)據(jù)包處理后通過接口又返回電腦端,由tud_audio_write((uint8_t * ) mic_buf, (uint16_t) (spk_data_size / 2))實現(xiàn))

//--------------------------------------------------------------------+
// AUDIO Task
//--------------------------------------------------------------------+

void audio_task(void)
{
  // When new data arrived, copy data from speaker buffer, to microphone buffer
  // and send it over
  // Only support speaker & headphone both have the same resolution
  // If one is 16bit another is 24bit be care of LOUD noise !
  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));  //mm32 test code 
      tud_audio_write((uint8_t *)mic_buf, (uint16_t) (spk_data_size / 2));
      spk_data_size = 0;
    }
    else if (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 音頻設(shè)備插入PC,在計算機管理->設(shè)備管理器->音頻輸入和輸出里面出現(xiàn)耳機和麥克風(fēng)兩個TinyUSB headset設(shè)備證明枚舉成功。

image.png

圖5 設(shè)備管理器音頻設(shè)備

電腦端播放音樂使用抓包工具抓到ISOC的數(shù)據(jù)包:

image.png

圖6 ISOC數(shù)據(jù)包

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19100

    瀏覽量

    228814
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16103

    瀏覽量

    177074
  • USB接口
    +關(guān)注

    關(guān)注

    9

    文章

    699

    瀏覽量

    55537
  • HID設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6324
收藏 人收藏

    評論

    相關(guān)推薦

    USB音頻設(shè)備沒有得到任何數(shù)據(jù)

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

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

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

    基于Linux內(nèi)核的Rockchip USB Gadget UAC開發(fā)資料分享

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

    USB音頻設(shè)備的設(shè)計與實現(xiàn)

             在介紹USB 音頻設(shè)備及其驅(qū)動程序結(jié)構(gòu)的基礎(chǔ)上,對USB Audio 功能節(jié)
    發(fā)表于 09-14 08:26 ?68次下載

    D音頻放大器是什么;Class D Audio Ampli

    Class D amplif iers, f irst proposed in 1958, have becomeincreasingly popular in recent years. What
    發(fā)表于 03-05 10:14 ?45次下載

    Class D Audio Amplifier Output

    Abstract: This application note examines the effect of the output filter on audio Class D amplifier
    發(fā)表于 05-06 11:59 ?1543次閱讀
    <b class='flag-5'>Class</b> <b class='flag-5'>D</b> <b class='flag-5'>Audio</b> Amplifier Output

    音頻設(shè)備

    音頻設(shè)備              音頻設(shè)備主要是對音
    發(fā)表于 01-07 11:48 ?762次閱讀

    音頻設(shè)備類型

    音頻設(shè)備類型              設(shè)備類型指音頻設(shè)備的類型,就是音頻設(shè)備屬于功
    發(fā)表于 01-07 11:46 ?2087次閱讀

    High-efficiency Class D audio

    High-efficiency Class D audio amplifiers extend battery life in portable applications
    發(fā)表于 09-22 09:21 ?1752次閱讀
    High-efficiency <b class='flag-5'>Class</b> <b class='flag-5'>D</b> <b class='flag-5'>audio</b>

    USB音頻設(shè)備類的音頻信號同步解決方案

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

    Class-D音頻功放的應(yīng)用及方案

    隨著高品質(zhì)音頻持續(xù)上升以及對音頻設(shè)備小型化高效節(jié)能的追求,音頻功放從Class A和Class AB向C
    的頭像 發(fā)表于 06-24 09:27 ?7414次閱讀
    <b class='flag-5'>Class-D</b><b class='flag-5'>音頻</b>功放的應(yīng)用及方案

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

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

    基于MM32F0163D7PUSB接口TinyUSB應(yīng)用:移植和新增設(shè)備(二)

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

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

    UACUSB Audio Class的縮寫,USB音頻類,一個像
    的頭像 發(fā)表于 07-27 16:34 ?1204次閱讀
    基于<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'>音頻設(shè)備</b>

    USB音頻設(shè)備介紹

    USB專業(yè)錄音聲卡不僅僅是用于一般消費者級別的USB音頻設(shè)備,而是專門為專業(yè)音頻制作環(huán)境設(shè)計的工具,其功能和性能遠超普通USB
    的頭像 發(fā)表于 06-24 17:59 ?1360次閱讀
    <b class='flag-5'>USB</b><b class='flag-5'>音頻設(shè)備</b>介紹