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);
设置 AAudio 音频流通道数 :
// 设置通道个数 AAudioStreamBuilder_setChannelCount(builder, sampleChannels_);
设置 AAudio 音频流样本格式 :
// 设置音频格式 AAudioStreamBuilder_setFormat(builder, sampleFormat_);
设置 AAudio 音频流缓冲区大小 : 这里的缓冲区是播放器的缓冲区 , 单位是帧 , 每帧的采样数就是通道数 , 单声道 每帧 1 个采样, 双声道立体声每帧 2 个采样 , 分别对应左右声道的采样 ;
// 设置每帧的缓冲区大小 , 可以通过该设置达到尽可能低的延迟 AAudioStream_setBufferSizeInFrames(playStream_, framesPerBurst_);
下面会着重对上面的流程细节进行详细解析 ;
每个方法的参数 , 原理 , 返回值 等细节都会讲解到 ;
II . AAudio 音频流构建器 设置 通道数 AAudioStreamBuilder_setChannelCount
1 . AAudio 音频流通道数设置 :
① 函数原型 :
AAUDIO_API void AAudioStreamBuilder_setChannelCount( AAudioStreamBuilder *builder, int32_t channelCount )
② 函数作用 : 设置音频流的通道数 , 设置 1 代表 单声道 , 设置 2 代表 立体声 ;
③ 代码示例 :
// 设置通道个数 AAudioStreamBuilder_setChannelCount(builder, sampleChannels_);
2 . 默认处理 :
① 默认值 : 如果没有调用该函数设置通道数 , 默认为 AAUDIO_UNSPECIFIED ;
② 默认情况处理 : 如果通道数未指定 , 打开流时系统自动选择一个最佳通道数 , 不同设备可能有不同的通道数 ;
3. 指定通道值情况处理 : 如果指定了通道数 , 那么打开流时会使用该通道数 ; 如果通道数与设备不匹配 , 那么 AAudio 音频流打开时会报错 ;
III . AAudio 音频流构建器 设置音频格式 AAudioStreamBuilder_setFormat
1 . AAudio 音频流格式设置 :
① 函数原型 :
AAUDIO_API void AAudioStreamBuilder_setFormat( AAudioStreamBuilder *builder, aaudio_format_t format )
② 函数作用 : 设置 AAudio 音频流的样本数据格式 ;
③ 参数 AAudioStreamBuilder *builder : AAudio 音频流构建器 ;
④ 参数 aaudio_format_t format : 音频格式 , 一般是 AAUDIO_FORMAT_PCM_FLOAT ( 浮点型采样格式 ) 或 AAUDIO_FORMAT_PCM_I16 ( 每个采样 16 位 ) ;
⑤ 代码示例 :
// 设置音频格式 AAudioStreamBuilder_setFormat(builder, sampleFormat_);
2 . 默认设置 :
① 默认值 : 如果没有设置音频流样本格式 , 那么会默认设置成 AAUDIO_UNSPECIFIED ;
② 默认值打开流 : 默认值 AAUDIO_UNSPECIFIED 状态下 , 如果打开 AAudio 音频流 , 系统会自动选择一个最佳的样本格式 , 这个值可能由 Android 设备决定 , 每个设备的值可能都不一样 ;
IV . AAudio 音频流 样本格式
AAudio 音频流 样本格式 :
① 样本格式定义 : aaudio_format_t 是 int32_t 类型数据 , 该枚举有四种取值 ;
e
num { AAUDIO_FORMAT_INVALID = -1, AAUDIO_FORMAT_UNSPECIFIED = 0, /** * This format uses the int16_t data type. * The maximum range of the data is -32768 to 32767. */ AAUDIO_FORMAT_PCM_I16, /** * This format uses the float data type. * The nominal range of the data is [-1.0f, 1.0f). * Values outside that range may be clipped. * * See also 'floatData' at * https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int) */ AAUDIO_FORMAT_PCM_FLOAT }; typedef int32_t aaudio_format_t
② AAUDIO_FORMAT_UNSPECIFIED 格式 : 未定义格式 , 默认的格式 , 如果音频流打开系统跟自动选择合适的采样格式 ;
③ AAUDIO_FORMAT_PCM_I16 格式 : 每个样本是 16 位 , 其取值范围是 -32768 ~ 32767 ;
④ AAUDIO_FORMAT_PCM_FLOAT 格式 : 样本由浮点型表示 , 取值范围 -1.0 ~ +1.0 ;