1 . AAudio 音频流的 采样 缓冲 播放 流程 : 样本采样完成后 , 存入缓冲区 , 然后将其通过 AAudio 播放出来 , 采样阶段采集
个样本 , 然后将其放入缓冲区 , 将缓冲区的数据 写出到 AAudio 音频流中播放出来 ;
2 . 采样速度高于播放速度 : 如果采样采集多了 , 不能立刻播放 , 此时就会产生延迟 , 并且如果超出缓冲区大小 , 超出部分采样就会溢出 , 造成数据损失 , 样本不连续 , 就会产生电流 ;
3 . 采样速度低于播放速度 : 如果采样少了 , 不能向 AAudio 音频流中写入足够的数据 , 就会造成电流杂音等情况 ;
4 . 数据回调函数 引入 : 数据回调函数就是为了解决上述问题 , 引入的机制 ;
5 . 数据回调函数 简介 :
之后如果采样播放完毕 , 继续调用回调函数 ;
下面会着重讲解该数据回调函数的细节
数据回调函数原型 : AAudio 只定义了一个函数类型 , 该函数的实际内容需要开发者自己开发 , 一般是 采样 , 然后 设置数据给 AAudio 音频流 的操作 ;
typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
AAudioStream *stream,
void *userData,
void *audioData,
int32_t numFrames);
aaudio_data_callback_result_t (*)(
AAudioStream *stream,
void *userData,
void *audioData,
int32_t numFrames)
aaudio_data_callback_result_t (*)(
AAudioStream *stream,
void *userData,
void *audioData,
int32_t numFrames)
1 . 数据回调函数设置给 AAudio 音频流 : AAudio 中通过 AAudioStreamBuilder_setDataCallback() 函数 , 将用户自己实现的 AAudioStream_dataCallback 回调函数的函数指针设置给 AAudio 音频流 , 当 AAudio 音频流需要数据时会自动回调该函数 ;
2 . 输出流回调函数实现内容 : 在该函数中需要 按照 AAudio 音频流的当前数据格式 ( 通道数/每帧样本数 , 采样率 ) , 采集 numFrames 帧的 PCM 音频样本数据 ( 每帧的采样数与通道数一致 ) , 将这些样本数据写出到 void *audioData 指针指向的内存中 , 之后这些数据会被自动输出到 AAudio 音频流中 ;
3 . 输入流回调函数实现内容 : 在函数中需要从 void *audioData 指针指向的内存中 , 读取 numFrames 帧 ( 每帧的采样数与通道数一致 ) 的采样数据 , 注意需要按照当前的 采样格式 ( 通道数/每帧样本数 , 采样率 ) 计算读取的字节大小 ;
4 . 采样数据自动传输 ( 不需要手动干预 ) : 在回调函数中 , 将 numFrames 帧的数据传递给 void *audioData , AAudio 在该回调函数执行完毕后 , 会自动将这些数据 读/写 到 AAudio 音频流中 , 不需要 开发者 手动调用 AAudioStream_read() 或 AAudioStream_write() 方法 , 一调用必出错 ;
5 . 每次读写的帧数 int32_t numFrames :
6 . 不能执行耗时操作 : 在该回调函数中 , 不能执行太耗时的操作 或 阻塞操作 , 如果阻塞时间超过了采样播放的时间 , 就会造成后续采样无法及时 读取 或 写入 到 AAudio 音频流中 , 出现音频故障 ;
7 . 回调函数中不能执行的操作 : 该回调函数的回调频率很高 , 可能达到每秒几百到几千次 , 因此有很多 耗时操作 或 访问本地资源 的逻辑不能再该函数中运行 , 尽可能只对内存数据进行操作 ;
8 . 回调函数中可以进行的操作 :
9 . 非阻塞技术 : 如果需要在回调函数中 读取 或 输出 数据 , 建议使用非阻塞技术 , 如 FIFO 技术 ;
1 . 数据回调函数设置方法 :
AAUDIO_API void AAudioStreamBuilder_setDataCallback(
AAudioStreamBuilder *builder,
AAudioStream_dataCallback callback,
void *userData
)
typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
AAudioStream *stream,
void *userData,
void *audioData,
int32_t numFrames);
2 . 音频数据传递方式 : 在 AAudioStream_dataCallback 函数指针类型的回调函数中 , 音频流的数据不是通过 AAudioStream_read 或 AAudioStream_write 方法进行读写的 , 只要将音频采样数据设置给函数的第三个参数 audioData 指针即可 , 第四个参数 numFrames 用于说明读写数据的帧数 , 每帧的采样数 就是 采样的通道数 ;
3 . 数据回调函数工作机制 :