【Android 高性能音频】AAudio 音频流 音频设备 相关配置 ( 音频设备ID | 音频流方向 | 音频设备共享模式 )(一)

简介: 【Android 高性能音频】AAudio 音频流 音频设备 相关配置 ( 音频设备ID | 音频流方向 | 音频设备共享模式 )(一)

I . AAudio 音频流创建流程


使用 AAudio 音频库 , 首先需要导入 AAudio.h 头文件 ;


#include <AAudio.h>


创建 AAudio 音频流 , 需要先创建 AAudio 音频流构建器 , 然后在通过该构建器创建音频流 ;


 

//创建构建器 , AAudio 音频流通过该构建器创建
    //声明 AAudio 音频流构建器 指针
    AAudioStreamBuilder *builder = nullptr;
    //创建 AAudio 音频流构建器 , 注意传入二维指针
    aaudio_result_t result = AAudio_createStreamBuilder(&builder);


设置音频设备 ID ;


// 设置音频流设备 ID
    AAudioStreamBuilder_setDeviceId(builder, playbackDeviceId_);


设置音频流方向 ;


 

// 设置音频流方向
    AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT);


设置音频设备共享模式 ;


   // 设置共享模式 , 独占模式性能更高 , 延迟更低 ; 如果 该音频设备正在被使用 , 设置失败会自动设置成 共享模式

AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE)

;


设置性能模式 ;


 

// 设置性能模式
    AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);



下面会着重对上面的流程细节进行详细解析 ;

每个方法的参数 , 原理 , 返回值 等细节都会讲解到 ;




II . AAudio 音频流构建器 设置音频设备 ID AAudioStreamBuilder_setDeviceId


设置 AAudio 音频流设备 ID :


① 函数作用 : 设备 ID 用于标识音频设备 , 该方法是为 AAudio 音频流申请访问该音频设备 ;

② 函数原型 :

AAUDIO_API void AAudioStreamBuilder_setDeviceId(
  AAudioStreamBuilder *builder,
  int32_t deviceId
)


③ 参数 AAudioStreamBuilder *builder : AAudio 音频流构建器指针 , 注意是一级指针 ;

④ 参数 int32_t deviceId : 音频设备 ID , 如果没有指定可以传入 AAUDIO_UNSPECIFIED 参数 , 使用默认音频设备 ;

⑤ 代码示例 :

 

// 设置音频流设备 ID
    AAudioStreamBuilder_setDeviceId(builder, playbackDeviceId_);



III . AAudio 音频设备 ID 获取


音频设备 ID 获取方法 :


① 调用 Java API : 音频设备的 ID 可以调用 Java 的 API 中的 AudioManager 的 getDevices() 方法获取 Android 设备上的音频设备信息 ;

② 返回值 : 其返回一个 AudioDeviceInfo 对象数组 , 该 AudioDeviceInfo 对象中就封装了音频设备 ID ;

③ 提取音频设备 ID : 调用 AudioDeviceInfo 对象的 getId() 方法 , 即可获取 int 类型的 音频设备 ID , 在 C/C++ 中是 int32 类型 ;



IV . AAudio 音频流 默认 音频设备设置


AAudio 音频流 默认设备使用 :


① 默认选项 : 这里除了指定一个实际的音频设备 ID 之外 , 还可以指定 AAUDIO_UNSPECIFIED 作为音频设备 ID ;

② 默认设备 : 如果设置了该参数 , 系统会默认使用 Android 手机当前音频流的默认音频设备 ;

③ 举例 : 如果当前音频流方向是输出 , 从内存 -> 音频设备 , 即发音 , 那么默认设备就是 耳机 > 自带喇叭 ;



V . AAudio 音频流构建器 设置 音频流方向 AAudioStreamBuilder_setDirection


AAudio 音频流方向设置 :


① 函数原型 :

AAUDIO_API void AAudioStreamBuilder_setDirection(
  AAudioStreamBuilder *builder,
  aaudio_direction_t direction
)


② 方法作用 : 设置 AAudio 音频流方向 , 音频输入 还是 音频输出 , 默认是音频输出 ;

③ 参数 AAudioStreamBuilder *builder : AAudio 音频流构建器 ;

④ 参数 aaudio_direction_t direction : 音频流方向枚举 , 取值 AAUDIO_DIRECTION_OUTPUT ( 音频输出 ) 或 AAUDIO_DIRECTION_INPUT ( 音频输入 ) ;

⑤ 代码示例 :

// 设置音频流方向
    AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT);



VI . AAudio 音频流方向


AAudio 音频流方向 说明 : 该值 是 aaudio_direction_t 类型 , 该类型是 int32_t 类型 , 取值是一个枚举 ;


① 枚举类型定义 :

enum {
    /**
     * Audio data will travel out of the device, for example through a speaker.
     */
    AAUDIO_DIRECTION_OUTPUT,
    /**
     * Audio data will travel into the device, for example from a microphone.
     */
    AAUDIO_DIRECTION_INPUT
};
typedef int32_t aaudio_direction_t;


② AAUDIO_DIRECTION_OUTPUT : 音频数据输出到音频设备 , 这是手机发音的过程 ;

③ AAUDIO_DIRECTION_INPUT : 音频数据从音频设备输入到手机 , 这是手机接收声音的过程 ;


目录
相关文章
|
2月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
113 0
玩转安卓之配置gradle-8.2.1
|
4月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
266 1
|
4月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
86 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
4月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
84 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
4月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
115 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
4月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
61 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
4月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
65 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
4月前
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
209 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
|
4月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
299 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?