红色标题是本博客讲解的内容 , 黑色是前几篇讲过的内容 ;
使用 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_);
创建 AAudio 音频流 : 创建 AAudio 音频流 , 就是打开音频流 , 注意要在音频流参数设置完毕后才能打开音频流 ;
// 打开音频流 ( 该步骤就是创建音频流 )
aaudio_result_t result = AAudioStreamBuilder_openStream(builder, &playStream_);
销毁 AAudio 音频流构建器 : 在音频流创建 ( 打开 ) 完毕后 , 应该马上销毁 AAudio 音频流构建器 ;
//销毁音频流构建器
AAudioStreamBuilder_delete(builder);
使用 AAudio 音频流 进行 录音 或 播放操作 , 使用完毕后需要 销毁 AAudio 音频流 ;
停止 AAudio 音频流 : 如果 AAudio 音频流不再使用 , 需要马上销毁 AAudio 音频流 , 销毁前需要先将音频流停止 , 然后才能销毁 ;
//先停止音频流 , 然后才能关闭
aaudio_result_t result = AAudioStream_requestStop(playStream_);
关闭 AAudio 音频流 : 如果 AAudio 音频流不再使用 , 需要马上销毁 AAudio 音频流 , 该流会占据音频设备资源 , 不用应马上销毁 ;
//关闭音频流 , 关闭后 , 该音频流就彻底释放了 , 如果在使用 , 必须重新创建
result = AAudioStream_close(playStream_);
1 . AAudio 音频流有 6 种稳定状态 :
总结 : 处于 暂停 ( Paused ) , 停止 ( Stopped ) , 刷写 ( Flushed ) 状态下 , 可以调用 AAudioStream_requestStart() 方法 , 恢复成 Started 状态 ; 刷写 ( Flushed ) 状态 必须 有前置状态 暂停状态 ( Paused ) 才能进入该状态 , 其它状态下是无法进入 刷写状态的 ;
2 . AAudio 音频流有 5 种 过渡状态 : 过渡状态是两种稳定状态之间的状态 ;
3 . 11 个状态之间的状态机转化关系如下图 :
1 . AAudio 音频流状态监听简介 :
2 . AAudioStream_waitForStateChange 方法简介 :
AAUDIO_API aaudio_result_t AAudioStream_waitForStateChange(
AAudioStream *stream,
aaudio_stream_state_t inputState,
aaudio_stream_state_t *nextState,
int64_t timeoutNanoseconds
)
1 . 监听暂停操作 : 在 Started 状态下 , 调用 AAudioStream_requestPause() 方法 , 设置 AAudio 音频流暂停操作 ;
2 . 理论上的状态改变 : 方法调用后 , AAudio 音频流 会立刻进入 Pausing 过渡状态 , 然后处理过渡操作 , 处理完毕后 , 进入 Paused 状态 ;
3 . 代码实现 :
//设置当状态与该状态不一致时解除阻塞
aaudio_stream_state_t inputState = AAUDIO_STREAM_STATE_PAUSING;
//用于记录下一个状态 , 将其地址传入 AAudioStream_waitForStateChange 方法 第三个参数
aaudio_stream_state_t nextState = AAUDIO_STREAM_STATE_UNINITIALIZED;
//超时时间
int64_t timeoutNanos = 100 * AAUDIO_NANOS_PER_MILLISECOND;
//申请暂停 , 方法执行后 , 状态立刻变成 Pausing 状态
result = AAudioStream_requestPause(stream);
//阻塞程序 , 直到状态由 Pausing 转为 Paused 状态 , 或超时 , 才能解除阻塞
result = AAudioStream_waitForStateChange(stream, inputState, &nextState, timeoutNanos);
1 . 申请关闭 操作 无法监听状态 : 当前如果是 Stopped 状态 , 调用 AAudioStream_close() 方法后 AAudio 音频流会直接被删除 , 无法调用 AAudioStream_waitForStateChange 方法监听 音频流 状态 ;
2 . 监听时不要关闭流 : 如果调用了 AAudioStream_waitForStateChange () 方法监听 AAudio 音频流 状态 , 当前线程虽然在阻塞状态 , 无法操作 , 但是不要在另外的线程中关闭该 AAudio 音频流 ;