文章目录

  • 一、包含头 Oboe 头文件
  • 二、音频流构建器 AudioStreamBuilder
  • 三、音频流回调 AudioStreamCallback

Oboe GitHub 主页 : GitHub/Oboe

  • ① 简单使用 : Getting Started

  • ② Oboe 全指南 : Full Guide To Oboe

  • ③ Oboe API 参考 : API reference

  • ④ Android 音频框架发展 : Android audio history

在 【Android 高性能音频】Oboe 开发流程 ( 导入 Oboe 库 | 使用预构建的二进制库和头文件 | 编译 Oboe 源码 ) 博客中介绍了 如何导入 Oboe 函数库到项目中 , 本博客中在导入 Oboe 函数库的基础上 , 进行 Oboe 播放器功能开发 ;

一、包含头 Oboe 头文件


#include <oboe/Oboe.h>

二、音频流构建器 AudioStreamBuilder


创建 AudioStreamBuilder 对象 :

// 音频流构建器
oboe::AudioStreamBuilder builder = oboe::AudioStreamBuilder();

通过 AudioStreamBuilder 配置 Oboe 音频流 : 配置 音频流方向 , 性能优先级 , 共享模式 , 音频采样格式 , 声道数 ;

// 设置音频流方向
builder.setDirection(oboe::Direction::Output);
// 设置性能优先级
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
// 设置共享模式 , 独占
builder.setSharingMode(oboe::SharingMode::Exclusive);
// 设置音频采样格式
builder.setFormat(oboe::AudioFormat::Float);
// 设置声道数 , 单声道/立体声
builder.setChannelCount(oboe::ChannelCount::Mono);

三、音频流回调 AudioStreamCallback


定义 音频流回调类 AudioStreamCallback , 当 音频流需要新的 PCM 音频数据时 , 会自动回调 AudioStreamCallback 类 中的 onAudioReady 方法 ;

下面是文档中给出的代码示例 : 这是 Google 文档中给出的示例 , 仅做参考 ;

class MyCallback : public oboe::AudioStreamCallback {public:oboe::DataCallbackResultonAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames) {// 请求音频格式 AudioFormat::Float , 假设已经得到了相应数据.// 对于生产者 ( 生产音频 ) 代码 , // 检查音频流中的音频数据格式 , 与自己生产的音频数据格式是否一致// 如果不一致需要转转数据类型// 这里将数据类型转为生产的数据类型 auto *outputData = static_cast<float *>(audioData);// 生成随机数 (白噪音) 以 0 为中心值 .const float amplitude = 0.2f;for (int i = 0; i < numFrames; ++i){outputData[i] = ((float)drand48() - 0.5f) * 2 * amplitude;}return oboe::DataCallbackResult::Continue;}
};

AudioStreamCallback 类简介 : 该类定义在 oboe 命名空间下 ,

① 数据格式 : 对于输出流 , 该方法应该渲染和写出指定帧数的数据到音频数据缓冲区中 , 这些数据的格式与当前流的格式相同 , 如果不一致需要转转数据类型 ;

② 输出流 : 对于输出流 , 该方法应该 渲染和写出指定帧数的数据到音频数据缓冲区中 , 这些数据的格式与当前流的格式相同 ;

③ 输入流 : 对于输入流 , 该方法应该 从音频数据缓冲区中读取和处理相应帧数的数据 ;

④ 数据传递 : 音频数据通过缓冲区传递 , 不需要额外在音频流中调用 read() 或 write() 方法 ;

⑤ 该方法中不能进行如下操作 :

  • 分配内存操作 , 如 malloc() 或者 new 操作
  • 文件操作 , 如打开 , 读取 , 写出 , 关闭 等文件操作
  • 网络相关操作
  • 使用互斥操作 或 同步操作 , 即不能在该方法中阻塞等待
  • 休眠 sleep
  • Oboe 音频流的 oboeStream->stop(), pause(), flush() or close() 操作
  • Oboe 音频流的 oboeStream->read() 操作
  • Oboe 音频流的 boeStream->write() 操作

总的来说 , 该方法可能要在 1 秒钟内调用几百上千次 , 不能做任何耗时操作 ;

⑥ 在该回调函数中可以进行的操作:

  • oboeStream->get*()
  • oboe::convertToText()
  • oboeStream->setBufferSizeInFrames()
#ifndef OBOE_STREAM_CALLBACK_H
#define OBOE_STREAM_CALLBACK_H#include "oboe/Definitions.h"namespace oboe {class AudioStream;/*** AudioStreamCallback 定义了如下回调接口:** 1) 通过 'onAudioReady' 方法 , 将数据放入/取出音频流* 2) 当音频流出现错误 , 回调 `onError*` 方法用于示警**/
class AudioStreamCallback {public:virtual ~AudioStreamCallback() = default;/*** 缓冲区已经准备好进行相应处理.** 对于输出流 , 该方法应该渲染和写出指定帧数的数据到音频数据缓冲区中 , * 这些数据的格式与当前流的格式相同* * 对于输入流 , 该方法应该从音频数据缓冲区中读取和处理相应帧数的数据 .* * 音频数据通过缓冲区传递 . * 不需要额外在音频流中调用 read() 或 write() 方法 .** 除非调用 AudioStreamBuilder::setFramesPerCallback() 方法 , * 读写的帧数可以改变 .* * 该回调函数应该被看做实时的 .* 在该函数中不应该执行任何耗时操作 , 否则会导致音频电流等故障 ; * * 该方法中不能进行如下操作 : * 1. 分配内存操作 , 如 malloc() 或者 new 操作 * 2. 文件操作 , 如打开 , 读取 , 写出 , 关闭 等文件操作 * 3. 网络相关操作* 4. 使用互斥操作 或 同步操作 , 即不能在该方法中阻塞等待* 5. 休眠 sleep * 6. Oboe 音频流的 oboeStream->stop(), pause(), flush() or close() 操作 * 7. Oboe 音频流的 oboeStream->read() 操作 * 8. Oboe 音频流的 boeStream->write() 操作 * 总的来说 , 该方法可能要在 1 秒钟内调用几百上千次 , 不能做任何耗时操作 ; ** 在该回调函数中可以进行的操作:* 1. oboeStream->get*()* 2. oboe::convertToText()* 3. oboeStream->setBufferSizeInFrames()* * 如果你需要移动数据 , 如 MIDI 指令 , 传入/传输到该回调类方法中 , 推荐使用非阻塞技术 , 如 atomic FIFO .** @param oboeStream Oboe 音频流指针 * @param audioData 输入/输出 音频数据缓冲区* @param numFrames 要处理的帧数 * @return DataCallbackResult::Continue or DataCallbackResult::Stop*/virtual DataCallbackResult onAudioReady(AudioStream *oboeStream,void *audioData,int32_t numFrames) = 0;
};} // namespace oboe#endif //OBOE_STREAM_CALLBACK_H

【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )相关推荐

  1. 【Android 高性能音频】Oboe 开发流程 ( Oboe 音频帧简介 | AudioStreamCallback 中的数据帧说明 )

    文章目录 一.音频帧概念 二.AudioStreamCallback 中的音频数据帧说明 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getting Started ② ...

  2. 【Android 高性能音频】Oboe 开发流程 ( Oboe 完整代码示例 )

    文章目录 一.GitHub 地址 二.Oboe C++ 代码 三.日志封装 四.Activity 代码 五.AndroidManifest.xml 配置文件 六.CMakeLists.txt 构建脚本 ...

  3. 【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )

    文章目录 一.检查 Oboe 音频流属性 二.开始播放 三.停止播放 四.关闭音频流 五.重新配置 Oboe 音频流属性 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : G ...

  4. 【Android 高性能音频】Oboe 开发流程 ( 创建并设置 AudioStreamCallback 对象 | 打开 Oboe 音频流 | 日志封装 logging_macros.h )

    文章目录 一.创建并设置 AudioStreamCallback 对象 二.打开 Oboe 音频流 三.日志封装 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getti ...

  5. 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )

    文章目录 一.获得最佳延迟 二.Oboe 音频流 三.Oboe 音频设备 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getting Started ② Oboe 全指 ...

  6. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )

    文章目录 一.动态注册广播接收者监听耳机插拔事件 二.jni 层的 Oboe 播放器代码 ( 重新打开 Oboe 音频流 ) 三.相关资料 基于 [Android 高性能音频]Oboe 开发流程 ( ...

  7. 【Android 高性能音频】高性能音频简介 ( 高性能音频问题引入 | 使用场景 | 相关开发库及技术 )

    文章目录 I 高性能音频使用场景 II 高性能音频开发库 III 相关开发资料 I 高性能音频使用场景 Android 手机的音频问题 : 1. 普通音频功能 : ① 常用音频开发方式 : 当前使用 ...

  8. 【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )

    文章目录 一.Oboe 输出测试参数面板 二.Oboe 输出测试参数 API 及 设备选择 三.Oboe 输出测试参数 音频参数 四.Oboe 输出测试参数 播放偏好 五.Oboe 输出测试参数 ( ...

  9. 【Android 高性能音频】OboeTest 音频性能测试应用 ( 应用简介 | 测试内容 | 输出测试 | Oboe 缓冲区 与 工作负载修改 | 测试案例 )

    文章目录 一.Oboe 测试应用 二.Oboe 测试内容 三.Oboe 输出测试 四.Oboe 缓冲区 与 工作负载修改 五.Oboe 输出测试 ( Pixel 2 | Android 10 ) 一. ...

最新文章

  1. 关于BMP格式图像的理解和读写(c++).docx
  2. Struts 2创始人Patrick Lightbody作序推荐
  3. PHP连接达梦数据库
  4. 动手动脑 - 继承与多态
  5. seata xid是什么_阿里开源的分布式事务框架 Seata
  6. Java常用性能分析工具 jconsole、jvisualvm、 jstat、jinfo、jmap、jhat、jstack
  7. android黑屏日志_Android启动页黑屏的解决方案
  8. 美国服务器远程卡,RAKsmart Windows美国服务器远程连接VNC方法
  9. 水质php比较低,鱼缸水质的PH太高或太低怎么办?调节PH值一般用以下4件物品
  10. dorado7.x form提交数据报错
  11. mac安装yarn的方法
  12. 云数智驱动数据高速增长,浪潮存储提供EB级容量扩展
  13. 布莱叶盲文-谷歌生态
  14. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?
  15. 棋牌游戏网站分析——远航游戏中心
  16. ios获得设备处理器cpu类型
  17. 三玖天下第一!让三玖陪你写代码(为VScode加入背景图片)
  18. 闭关修炼(一)多线程
  19. 多店管理软件莱赞帮助Lazada本土店家了解印尼市场
  20. Protein Ising Model Problem

热门文章

  1. 小心!目录删除及重命名操作 ,一定丢失Session~~!
  2. 渗透测试-基于白名单执行payload--Compiler
  3. 学习进度条(第六周)
  4. css hover图片hover效果兼容ie8
  5. 机器学习工作流程第一步:如何用Python做数据准备?
  6. Android 透明度百分比对应的 十六进制
  7. XTUOJ 1206 Dormitory's Elevator
  8. 实践重于理论——创建一个监控程序探测WCF的并发处理机制
  9. python之异常处理
  10. [BZOJ1724][Usaco2006 Nov]Fence Repair 切割木板