安卓框架,新增usb mic device 的框架修改

2024-02-17 07:38

本文主要是介绍安卓框架,新增usb mic device 的框架修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/u013762045/article/details/82226382

新增usb mic还涉及到了音频部分,先看下audio_policy.conf


  usb {
    outputs {
      usb_accessory {
        sampling_rates 44100
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_USB_ACCESSORY
      }
      usb_device {
        sampling_rates dynamic
        channel_masks dynamic
        formats dynamic
        devices AUDIO_DEVICE_OUT_USB_DEVICE
      }
    }
    inputs {
      usb_device {
        sampling_rates dynamic
        channel_masks dynamic
        formats dynamic
        devices AUDIO_DEVICE_IN_USB_DEVICE
      }
    }
  }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

关注点:
1.比如你的android手机做host,要获得slave,用UsbDevice表示slave
要是你的android手机做slave,要获得host,用UsbAccessory表示host

2.输入输出设备必须是audio.h中列出的枚举类型

3”channel_masks”、”formats”、”devices”和”flags”必须为audio.h、audio_policy.h中定义的枚
举值,它们可以通过|连接,但不能包含空格和”\n”。

接着模仿新增一个usb

 usb2 {
//其它不做说明
    inputs {
      usb_device {
        sampling_rates dynamic
        channel_masks dynamic
        formats dynamic
        devices AUDIO_DEVICE_IN_USB_DEVICE |AUDIO_DEVICE_IN_USB_DEVICE_TYPE2
      }
    }
  }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

之前说devices 在audio.h、audio_policy.h中有对应,一搜AUDIO_DEVICE_IN_USB_DEVICE 果然在audio.h

audio.h

  AUDIO_DEVICE_IN_USB_DEVICE            = AUDIO_DEVICE_BIT_IN | 0x1000,
    在后面新增
    AUDIO_DEVICE_IN_USB_DEVICE_TYPE2=  AUDIO_DEVICE_BIT_IN | 0x80,

    1
    2
    3
    4
    5

AudioPolicyManager.cpp文件会加载audio_policy.conf,也需新增参数

const StringToEnum sDeviceNameToEnumTable[] = {
    STRING_TO_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY),
    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE),    
   // 新增AUDIO_DEVICE_IN_USB_DEVICE_TYPE2
     STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE_TYPE2),
}


audio_devices_t AudioPolicyManager::getDeviceForInputSource 中新增判断AUDIO_DEVICE_IN_USB_DEVICE_TYPE2的方法,模仿AUDIO_DEVICE_IN_USB_DEVICE 的做法就对了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

AudioSystem.java 也有对应的比特位

// reserved bits
public static final int DEVICE_BIT_IN = 0x80000000;

对应audio.h的
/* reserved bits */
AUDIO_DEVICE_BIT_IN = 0x80000000,

AUDIO_DEVICE_IN_USB_DEVICE_TYPE2= AUDIO_DEVICE_BIT_IN | 0x80,
所以java端的新增是
AUDIO_DEVICE_IN_USB_DEVICE_TYPE2 = DEVICE_BIT_IN | 0x80,

编译成so库
android-5.1.1/hardware/libhardware/modules/usbaudio/Android.mk

LOCAL_MODULE := audio.usb.default
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \
    audio_hw.c \
    alsa_device_profile.c \
    alsa_device_proxy.c \
    logging.c \
    format.c
LOCAL_C_INCLUDES += \
    external/tinyalsa/include \
    $(call include-path-for, audio-utils)
LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS := -Wno-unused-parameter

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := audio.usb2.default
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \
    audio_hw.c \
    alsa_device_profile.c \
    alsa_device_proxy.c \
    logging.c \
    format.c
LOCAL_C_INCLUDES += \
    external/tinyalsa/include \
    $(call include-path-for, audio-utils)
LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS := -Wno-unused-parameter

include $(BUILD_SHARED_LIBRARY)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

最后不要忘记
android-5.1.1/device/xxxx/xxxx/device.mk


PRODUCT_PACKAGES += \
        audio.a2dp.default \
        audio.usb.default \
        audio.usb2.default \

 

 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

补充:
判断声卡的方法

UsbAudioManager.java void deviceAdded 这里会调用区分声卡的方法

AlsaDevicesParser.java
public void scan() {
deviceRecords_.clear();

    final String devicesFilePath = "/proc/asound/devices";
    File devicesFile = new File(devicesFilePath);
    try {
        FileReader reader = new FileReader(devicesFile);
        BufferedReader bufferedReader = new BufferedReader(reader);
        String line = "";
        while ((line = bufferedReader.readLine()) != null) {
            if (isLineDeviceRecord(line)) {
                AlsaDeviceRecord deviceRecord = new AlsaDeviceRecord();
                deviceRecord.parse(line);
                deviceRecords_.add(deviceRecord);
            }
        }
        reader.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

涉及到的类
android-5.1.1/device/XXX/XXX/audio_policy.conf
android-5.1.1/device/XXXX/XXXX/device.mk
android-5.1.1/frameworks/av/services/audiopolicy/AudioPolicyManager.cpp
android-5.1.1/frameworks/base/media/java/android/media/AudioService.java
android-5.1.1/frameworks/base/media/java/android/media/AudioSystem.java
android-5.1.1/frameworks/base/services/usb/java/com/android/server/usb/UsbAudioManager.java
android-5.1.1/hardware/libhardware/modules/usbaudio/Android.mk
android-5.1.1/system/core/include/system/audio.h
---------------------
作者:1991415
来源:CSDN
原文:https://blog.csdn.net/u013762045/article/details/82226382
版权声明:本文为博主原创文章,转载请附上博文链接!

这篇关于安卓框架,新增usb mic device 的框架修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717106

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN 问题 我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误 java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 90314637791991

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Android13_SystemUI下拉框新增音量控制条

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Android13_SystemUI下拉框新增音量控制条 一、必备知识二、源码分析对比1.brightness模块分析对比2.statusbar/phone 对应模块对比对比初始化类声明对比构造方法 三、源码修改四、相关资源 一、必备知识 在Android12 版本上面已经完成了功能的实现,目前是在And