Android4.0 音效卡配置-高通msm8916移植

来源:https://www.cnblogs.com/linhaostudy/archive/2018/01/03/8183292.html
-Advertisement-
Play Games

一個正常的UAC設備插入Android 7.0是預設打開UAC配置的,列印的log如下: 而Android4.0是沒有預設打開,是需要進行相應的配置的;這裡可以看到其驅動程式為snd-usb-audio,依據這個關鍵詞在內核中查找到如下內容: 需要在 /kernel/arch/arm/configs ...


一個正常的UAC設備插入Android 7.0是預設打開UAC配置的,列印的log如下:

[ 2367.490491] usb 3-3.2: new full-speed USB device number 9 using xhci_hcd
[ 2367.580010] usb 3-3.2: New USB device found, idVendor=0d8c, idProduct=0132
[ 2367.580018] usb 3-3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2367.580023] usb 3-3.2: Product: USB PnP Audio Device
[ 2367.580027] usb 3-3.2: Manufacturer: C-Media Electronics Inc.
[ 2367.581679] input: C-Media Electronics Inc. USB PnP Audio Device as /devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3.2/3-3.2:1.2/0003:0D8C:0132.0004/input/input18
[ 2367.581999] hid-generic 0003:0D8C:0132.0004: input,hidraw3: USB HID v1.11 Device [C-Media Electronics Inc. USB PnP Audio Device] on usb-0000:00:14.0-3.2/input2
[ 2367.913280] usbcore: registered new interface driver snd-usb-audio

 

而Android4.0是沒有預設打開,是需要進行相應的配置的;這裡可以看到其驅動程式為snd-usb-audio,依據這個關鍵詞在內核中查找到如下內容:

1 root@ubuntu:/home/lh/work/git/ML16/kernel# grep "registered new interface driver" ./ -rn
2 ./drivers/usb/core/driver.c:914:        pr_info("%s: registered new interface driver %s\n",

需要在 /kernel/arch/arm/configs目錄下增加msm8916_defconfig和msm8916-perf_defconfig配置;

在AndroidBoard.mk就已經定義了我們kernel配置文件的屬性:

 

CONFIG_SND_USB_AUDIO=y就行了,因為sound/usb/中的makefile包含了:

 

 

sound/usb/card.c

1 static struct usb_driver usb_audio_driver = {
2     .name =     "snd-usb-audio",
3     .probe =    usb_audio_probe,
4     .disconnect =   usb_audio_disconnect,
5     .suspend =  usb_audio_suspend,
6     .resume =   usb_audio_resume,
7     .id_table = usb_audio_ids,
8     .supports_autosuspend = 1,
9 };

 

根據probe方法snd_usb_audio_probe調用了snd_usb_apply_boot_quirksnd_card_register,查到了:

 1 static int usb_audio_probe(struct usb_interface *intf,
 2                const struct usb_device_id *id)
 3 {
 4     struct snd_usb_audio *chip;
 5     chip = snd_usb_audio_probe(interface_to_usbdev(intf), intf, id);
 6     if (chip) {
 7         usb_set_intfdata(intf, chip);
 8         return 0;
 9     } else
10         return -EIO;
11 }
12 
13 
14 // linux-3.4.y/sound/usb/quirks.c
15 int snd_usb_apply_boot_quirk(struct usb_device *dev,
16                  struct usb_interface *intf,
17                  const struct snd_usb_audio_quirk *quirk)
18 {
19     u32 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
20             le16_to_cpu(dev->descriptor.idProduct));
21 
22     switch (id) {
23     case USB_ID(0x041e, 0x3000):
24         /* SB Extigy needs special boot-up sequence */
25         /* if more models come, this will go to the quirk list. */
26         return snd_usb_extigy_boot_quirk(dev, intf);
27 
28     case USB_ID(0x041e, 0x3020):
29         /* SB Audigy 2 NX needs its own boot-up magic, too */
30         return snd_usb_audigy2nx_boot_quirk(dev);
31 
32     case USB_ID(0x10f5, 0x0200):
33         /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */
34         return snd_usb_cm106_boot_quirk(dev);
35 
36     case USB_ID(0x0d8c, 0x0102):
37         /* C-Media CM6206 / CM106-Like Sound Device */
38     case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */
39         return snd_usb_cm6206_boot_quirk(dev);
40 
41     case USB_ID(0x133e, 0x0815):
42         /* Access Music VirusTI Desktop */
43         return snd_usb_accessmusic_boot_quirk(dev);
44 
45     case USB_ID(0x17cc, 0x1000): /* Komplete Audio 6 */
46     case USB_ID(0x17cc, 0x1010): /* Traktor Audio 6 */
47     case USB_ID(0x17cc, 0x1020): /* Traktor Audio 10 */
48         return snd_usb_nativeinstruments_boot_quirk(dev);
49     case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
50         return snd_usb_fasttrackpro_boot_quirk(dev);
51     }
52 
53     return 0;
54 }

 

snd_usb_audio_probe:

  1 /*
  2  * probe the active usb device
  3  *
  4  * note that this can be called multiple times per a device, when it
  5  * includes multiple audio control interfaces.
  6  *
  7  * thus we check the usb device pointer and creates the card instance
  8  * only at the first time.  the successive calls of this function will
  9  * append the pcm interface to the corresponding card.
 10  */
 11 static struct snd_usb_audio *
 12 snd_usb_audio_probe(struct usb_device *dev,
 13             struct usb_interface *intf,
 14             const struct usb_device_id *usb_id)
 15 {
 16     const struct snd_usb_audio_quirk *quirk = (const struct snd_usb_audio_quirk *)usb_id->driver_info;
 17     int i, err;
 18     struct snd_usb_audio *chip;
 19     struct usb_host_interface *alts;
 20     int ifnum;
 21     u32 id;
 22 
 23     alts = &intf->altsetting[0];
 24     ifnum = get_iface_desc(alts)->bInterfaceNumber;
 25     id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
 26             le16_to_cpu(dev->descriptor.idProduct));
 27     if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum)
 28         goto __err_val;
 29 
 30     if (snd_usb_apply_boot_quirk(dev, intf, quirk) < 0)
 31         goto __err_val;
 32 
 33     /*
 34      * found a config.  now register to ALSA
 35      */
 36 
 37     /* check whether it's already registered */
 38     chip = NULL;
 39     mutex_lock(&register_mutex);
 40     for (i = 0; i < SNDRV_CARDS; i++) {
 41         if (usb_chip[i] && usb_chip[i]->dev == dev) {
 42             if (usb_chip[i]->shutdown) {
 43                 snd_printk(KERN_ERR "USB device is in the shutdown state, cannot create a card instance\n");
 44                 goto __error;
 45             }
 46             chip = usb_chip[i];
 47             chip->probing = 1;
 48             break;
 49         }
 50     }
 51     if (! chip) {
 52         /* it's a fresh one.
 53          * now look for an empty slot and create a new card instance
 54          */
 55         for (i = 0; i < SNDRV_CARDS; i++)
 56             if (enable[i] && ! usb_chip[i] &&
 57                 (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) &&
 58                 (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) {
 59                 if (snd_usb_audio_create(dev, i, quirk, &chip) < 0) {
 60                     goto __error;
 61                 }
 62                 snd_card_set_dev(chip->card, &intf->dev);
 63                 chip->pm_intf = intf;
 64                 break;
 65             }
 66         if (!chip) {
 67             printk(KERN_ERR "no available usb audio device\n");
 68             goto __error;
 69         }
 70     }
 71 
 72     /*
 73      * For devices with more than one control interface, we assume the
 74      * first contains the audio controls. We might need a more specific
 75      * check here in the future.
 76      */
 77     if (!chip->ctrl_intf)
 78         chip->ctrl_intf = alts;
 79 
 80     chip->txfr_quirk = 0;
 81     err = 1; /* continue */
 82     if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) {
 83         /* need some special handlings */
 84         if ((err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk)) < 0)
 85             goto __error;
 86     }
 87 
 88     if (err > 0) {
 89         /* create normal USB audio interfaces */
 90         if (snd_usb_create_streams(chip, ifnum) < 0 ||
 91             snd_usb_create_mixer(chip, ifnum, ignore_ctl_error) < 0) {
 92             goto __error;
 93         }
 94     }
 95 
 96     /* we are allowed to call snd_card_register() many times */
 97     if (snd_card_register(chip->card) < 0) {
 98         goto __error;
 99     }
100 
101     usb_chip[chip->index] = chip;
102     chip->num_interfaces++;
103     chip->probing = 0;
104     mutex_unlock(&register_mutex);
105     return chip;
106 
107  __error:
108     if (chip) {
109         if (!chip->num_interfaces)
110             snd_card_free(chip->card);
111         chip->probing = 0;
112     }
113     mutex_unlock(&register_mutex);
114  __err_val:
115     return NULL;
116 }

probe依次調用了:

 

1 snd_usb_apply_boot_quirk
2 snd_usb_audio_create
3 snd_usb_create_quirk
4 snd_usb_create_streams
5  snd_usb_create_stream
6   snd_usb_parse_audio_interface 這裡根據usb的信息解析成pcm參數(如聲道數量,採樣率等等)
7 
8 snd_usb_create_mixer
9 snd_card_register

 

總結:

UAC設備的參數是通過USB描述符確定的。比如聲道bNrChannels位深bBitResolution採樣率bSamFreqType。截取其中一段說明:

bNrChannels             1
bSubframeSize           2
bBitResolution         16
bSamFreqType            7 Discrete
tSamFreq[ 0]         8000
tSamFreq[ 1]        11025
tSamFreq[ 2]        16000
tSamFreq[ 3]        22050
tSamFreq[ 4]        32000
tSamFreq[ 5]        44100
tSamFreq[ 6]        48000
聲道1,位深16,波特率8000~48000。  

 

 

 



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下涉及到的所有資源都在這裡: 鏈接:https://pan.baidu.com/s/1eSctT5K 密碼:174s *我的VS2010的安裝位置:D:\Program Files (x86)\Microsoft Visual Studio 10.0 1.關於Glut的配置 1.1. 下載GLUT ...
  • Linux的root密碼破解不像Windows的密碼破解,windows的登錄密碼破解需要介入工具進行破解。Centos6和centos7的密碼方法也是不一樣的,具體如下: 首先是Centos 6的Root密碼破解 開機按esc 按 e 鍵進入編輯模式 選擇Kernel /vmlinz-2.6.32 ...
  • 上章分析了uboot啟動流程後,接下來便來配置新的單板,實現nor、nand啟動 1.首先在uboot里新建單板2440 1.1將2410的單板文件夾拷貝成2440: 然後將smdk2440下的smdk2410.c改為smdk2440.c,以及修改更改好的Makefile 1.2 將2410的頭文件 ...
  • 這是我在項目實戰中的個人總結,寫的倉促,有些東西也不一定准確,有些是自己推斷的,還希望各位多多指教,多多評論。 關於QCombox如果不需要自定義,其實寫UI是很簡單的。 創建實例:QComboBox* m_pMicrophoneCombox = new QComboBox; 我是用的QSS去的寫樣 ...
  • 安裝apache 1.安裝yum -y install httpd 2.設置apache服務開機啟動systemctl enable httpd.service 3.開啟apache服務systemctl start httpd.service 使用公網訪問能看到apache就說明安裝成功;如果未成 ...
  • 1、顯示硬碟及所屬分區情況。在終端視窗中輸入如下命令 可以看到要掛在的2T磁碟 2、對硬碟進行分區。在終端視窗中輸入如下命令: 如下圖所示:在Command (m for help)提示符後面輸入m顯示一個幫助菜單。 在Command (m for help)提示符後面輸入n,執行 add a ne ...
  • 在向伺服器拷貝文件的時候卡死,直接任務管理器結束應用程式,但是隨之引發一個問題,就是之後不能從本地向伺服器拷貝文件了,只能伺服器自己複製粘貼。 解決辦法重啟rdpclip.exe,先在任務管理器中結束rdpclip.exe 進程,然後重新運行(開始->運行->rdpclip.exe ),解決問題。 ...
  • 上次介紹了ES集群搭建的方法,希望能幫助大家,這兒我再接著介紹kafka集群,接著上次搭建的效果。 首先我們來簡單瞭解下什麼是kafka和zookeeper? Apache kafka 是一個分散式的基於push-subscribe的消息系統,它具備快速、可擴展、可持久化的特點。它現在是Apache ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...