UAC功能使用说明


1. 概述

UAC 即USB Audio Class,是USB音频协议的一种,协议分为UAC1 与UAC2版本,本文介绍的是UAC1的使用。


2. Uac新架构

新版本的uac实现,将uac设备模拟成alsa设备,允许在应用层进行访问MIC的Raw数据以便音频算法进行处理。

公版默认已经开启uac功能uac*_function_*enable=2,需要加载的ko如下:

图2-1


2.1. 内核配置

  1. Power Manager支持

    -> Power management options

    -> Device power management core functionality

    注意:为snd框架依赖,需替换内核

  2. 音频框架的支持

    -> Device Drivers

    -> Sound card support

    -> Advanced Linux Sound Architecture

    [*] PCM timer interface

    生成驱动: soundcore.ko snd.ko snd-timer.ko snd-pcm.ko

  3. Gadget Uac的支持

    -> Device Drivers

    -> USB support

    -> USB Gadget Support

    -> USB Gadget Drivers

    -> USB Webcam Gadget

    [*] Include configuration with UAC (Audio)

    生成驱动:u_audio.ko usb_f_uac1.ko


2.1.1. 驱动装载顺序

soundcore.ko

snd.ko

snd-timer.ko

snd-pcm.ko

u_audio.ko

usb_f_uac1.ko (依赖于libcomposite.ko)

g_webcam.ko


2.1.2. 驱动参数解析

  1. soundcore.ko 和**snd**.ko 驱动默认build in kernel,故不需加载;

  2. g_webcam.ko 参数:

  3. playback: device->host

  4. capture: host->device

  5. uac*_function_*enable:

    0: 关闭uac功能, 1: 开启喇叭功能, 2:开启麦克风功能, 3:开启喇叭与麦克风

  6. p_srate:

    playback的采样率

  7. c_srate:

    capture的采样率

  8. c_chmask:

    capture的通道数

  9. p_chmask:

    playback的通道数

该架构需要在user 层串接uac应用,将mi audio与uac 串接起来

Pudding参考demo:

sdk/verify/mi\_demo/alderaan/uac

若开启uvc和uac系统启动后会生成相关的结点:

Uac: /dev/ snd/*

Uvc:/dev/ video*


2.2. Uac旧架构

旧版本的uac实现,通过向alsa设备获取或者发送音频数据,直接在内核层串通整个flow

以下需要在配置完webcam的基础上增加配置。

  1. 参考相应的“编译补充说明文档”,重新编译kernel,然后将如下3个ko拷贝到板子上(例如拷贝到 /config/modules/4.9.84/):

    snd-timer.ko

    snd-pcm.ko

    usb_f_uac1.ko

  2. 查看/customer/demo.sh文件,确认板子是否有insmod mi_alsa.ko,(如果没有的话,可以在sdk中编译得到)

  3. 在insmod mi_alsa.ko前先insmod snd-timer.ko和snd-pcm.ko,

    修改/customer/demo.sh文件.

    insmod /config/modules/4.9.84/snd-timer.ko
    
    insmod /config/modules/4.9.84/snd-pcm.ko
    
    insmod /config/modules/4.9.84/mi_alsa.ko //如果没有insmod mi_alsa.ko,则需新增
    
  4. 在insmod g_webcam.ko前insmod usb_f_uac1.ko,且开启uac功能,并加上相关的参数。在/customer/demo.sh中做如下修改:

    insmod /config/modules/4.9.84/usb_f_uac1.ko
    
    insmod /config/modules/4.9.84/g_webcam.ko
    
    streaming_maxpacket=3072 streaming_maxburst=13
    
    uac_function_enable=2 audio_capture_buf_size=48000
    
    audio_capture_period_size=4096 in_req_buf_size=1024
    
  5. 修改完成后重启板子,在PC端的应用Potplayer打开USB CAM设备时加上如下两项设置即可打开UAC,正常的话打开设备后,PC端就可以听到板子端的麦克风声音了。

    图2-2

  6. 驱动参数解析:

    g_webcam.ko

    1. uac_function_enable

      0:关闭uac功能,1:开启喇叭功能,2:开启麦克风功能,3:开启喇叭与麦克风

      注意:在加载g_webcam.ko驱动前需确保平台有alsa设备存在,目前由mi_alsa.ko创建。

    2. playback_channel_count/capture_channel_count

      通道的数量

    3. playback_sample_rate/capture_sample_rate

      采样率大小

    4. out_req_buf_size/in_req_buf_size

      isoc endpoint最大包大小

    5. out_req_count/in_req_count

      isoc 请求数量

    6. audio_playback_buf_size/audio_capture_buf_size

      数据缓存buf大小