文章目录

  • 一、创建并设置 AudioStreamCallback 对象
  • 二、打开 Oboe 音频流
  • 三、日志封装

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 播放器功能开发 ;

在 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback ) 介绍了如何创建 AudioStreamBuilder , 以及 创建 AudioStreamCallback 回调 ;

一、创建并设置 AudioStreamCallback 对象


在上一篇博客 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback ) 中定义了 AudioStreamCallback 回调类 ;

此处 创建该 自定义 AudioStreamCallback 对象 , 并将其设置给 AudioStreamBuilder 对象 ;

注意要在堆内存中创建 AudioStreamCallback 对象 , 不能在栈内存中创建 , 否则方法执行完毕后 , 该对象会被自动回收 , 因此在使用完毕后 , 要及时释放该对象 ;

调用 AudioStreamBuilder 的 setCallback 方法设置 AudioStreamCallback 对象时 , 需要设置的类型是 AudioStreamCallback * 指针类型 ;

代码示例 :

// 创建 MyCallback 对象
MyCallback myCallback = MyCallback();// 设置回调对象 , 注意要设置 AudioStreamCallback * 指针类型
builder.setCallback(&myCallback);// 在未来某个时间 , 释放该 堆内存中的 对象
delete myCallback;

二、打开 Oboe 音频流


首先 声明并创建 Oboe 音频流 , 这里在栈内存中创建 ;

    // 声明 Oboe 音频流oboe::ManagedStream managedStream = oboe::ManagedStream();

打开音频流 , 调用 AudioStreamBuilder 创建器的 openManagedStream 方法 , 传入的参数是 oboe::ManagedStream 类型参数 , 直接将 managedStream 传入即可

    // 通过 AudioStreamBuilder 打开 Oboe 音频流oboe::Result result = builder.openManagedStream(managedStream);

另外一种方式 : 如果使用 new 在堆内存中创建 ManagedStream , 可以进行如下操作 :

注意 打开音频流 , 调用 AudioStreamBuilder 创建器的 openManagedStream 方法 , 传入的参数是 oboe::ManagedStream 类型参数 , 目前的 managedStream 是指针类型 , 因此需要使用 * 符号 , 取出地址中的 ManagedStream 对象数据 ;

    // 声明 Oboe 音频流oboe::ManagedStream *managedStream = new oboe::ManagedStream;// 通过 AudioStreamBuilder 打开 Oboe 音频流oboe::Result result = builder.openManagedStream(*managedStream);

部分代码示例 :

    // 声明 Oboe 音频流oboe::ManagedStream managedStream;// 通过 AudioStreamBuilder 打开 Oboe 音频流oboe::Result result = builder.openManagedStream(managedStream);// 打印 Oboe 音频流创建结果if (result != oboe::Result::OK) {LOGE("Failed to create stream. Error: %s", oboe::convertToText(result));}else{LOGE("Success to create stream. Result: %s", oboe::convertToText(result));}

执行结果 :

2020-10-14 16:43:29.149 12156-12156/kim.hsl.oboedemo I/octopus: AudioStreamBuilder 创建完毕
2020-10-14 16:43:29.162 12156-12156/kim.hsl.oboedemo E/octopus: Success to create stream. Result: OK

三、日志封装


Google 中提供了一个很好的 log 封装头文件 , logging_macros.h , 很多官方示例中都使用这个头文件 ;

#ifndef __SAMPLE_ANDROID_DEBUG_H__
#define __SAMPLE_ANDROID_DEBUG_H__
#include <android/log.h>#if 1
#ifndef MODULE_NAME
#define MODULE_NAME  "octopus"
#endif#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, MODULE_NAME, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, MODULE_NAME, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, MODULE_NAME, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,MODULE_NAME, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,MODULE_NAME, __VA_ARGS__)
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,MODULE_NAME, __VA_ARGS__)#define ASSERT(cond, ...) if (!(cond)) {__android_log_assert(#cond, MODULE_NAME, __VA_ARGS__);}
#else#define LOGV(...)
#define LOGD(...)
#define LOGI(...)
#define LOGW(...)
#define LOGE(...)
#define LOGF(...)
#define ASSERT(cond, ...)#endif#endif // __SAMPLE_ANDROID_DEBUG_H__

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

  1. 【Android 高性能音频】AAudio 状态机 ( 创建 | 打开 Open | 开始 Started | 暂停 Paused | 刷写 Flushed | 停止 Stopped | 关闭 )

    文章目录 I . AAudio 音频流 创建 配置 使用 销毁 流程 II . AAudio 音频流 稳定状态 与 过渡状态 III . AAudio 音频流 状态改变 监听 IV . AAudio ...

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

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

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

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

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

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

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

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

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

    文章目录 一.包含头 Oboe 头文件 二.音频流构建器 AudioStreamBuilder 三.音频流回调 AudioStreamCallback Oboe GitHub 主页 : GitHub/ ...

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

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

  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. windows安装MongoDB环境以及在pycharm中配置可视化插件
  2. linux下创建多进程,linux之多进程fork:进程创建
  3. boost::geometry::closeable_view用法的测试程序
  4. 在电脑上安装Linux操作系统(ubuntu)
  5. exe软件ui嵌套软件_UI设计行业中的PS软件起什么用途
  6. linux磁盘信息文件,Linux查看硬盘信息方法总结归纳
  7. 【强化学习】A3C原理
  8. 【APICloud系列|9】APICloud自定义APPloader一个月未更新,快速更新的办法
  9. 腾讯云实验之搭建 GIT 服务器教程
  10. 解决django前端使用iframe标签报错127.0.0.1 refused to connect.
  11. 【Flink】Flink Table 基于Processing Time、Event Time的多种Window实现
  12. ide 两个模块的jdk版本不一样_Java平台模块系统(3)- JDK工具
  13. gradle DSL method not found: android()
  14. 重新编译hadoop-2.7.2-src的native以支持Snappy解压压缩库
  15. OpenERP的外贸企业ERP方案
  16. UE5 c++ 写一个livelink插件
  17. 03-鸢尾花分类问题(120个样本的实验)
  18. Python编程从入门到实践 第一部分基础知识 代码合集
  19. java web中 生成图片验证码,转自逍遥郎
  20. 欧式距离和曼哈顿距离的比较

热门文章

  1. 《青春飞扬》诗集出版历程与思考分享 之三:游记、感悟与思考
  2. [导入]用Ext做的登陆窗口的例子
  3. 查询x,y之间的素数
  4. 设计模式之:适配器模式
  5. 实践lnmpde 的安装
  6. 【集训第四天·继续刷题】之 lgh怒刚ypj
  7. 《京东技术解密》读后感
  8. 关于在linux python源文件头部添加 “#!/usr/bin/env python” 不能直接运行的问题
  9. multipart/form-data ajax 提交问题(未解决)
  10. 2.6_Database Interface JDBC及驱动类型