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

  • ② 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 回调 ;

    【Android 高性能音频】Oboe 开发流程 ( 创建并设置 AudioStreamCallback 对象 | 打开 Oboe 音频流 | 日志封装 logging_macros.h ) 博客中介绍了 设置 AudioStreamCallback 对象 , 打开 Oboe 音频流 操作 , 以及 Google 官方提供的日志封装有文件 ;

    一、检查 Oboe 音频流属性

    检查已创建的 Oboe 音频流属性 , 如果没有指定 声道数 , 采样率 , 采样格式 , 需要检查其默认的 Oboe 音频流配置 , 如果指定了这三个属性中的任意一个值 , 就会得到指定的值 ;

    推荐手动设置上述三个值 , 不要让系统自动设置 ;

    采样格式 属性指定的是 oboe::AudioStreamCallback 中的 onAudioReady 回调方法的 void *audioData 缓冲区的音频类型 ;

        virtual DataCallbackResult onAudioReady(
                AudioStream *oboeStream,
                void *audioData,
                int32_t numFrames) = 0;
    

    获取音频采样格式 , 并打印出来 :

    // 获取采样格式
    oboe::AudioFormat format = stream->getFormat();
    // 打印采样格式 
    LOGI("AudioStream format is %s", oboe::convertToText(format));
    二、开始播放 
    

    调用 oboe::ManagedStream 音频流的 requestStart() 方法 , 可以开启 Oboe 音频播放 ;

        // 3. 开始播放
        result = managedStream->requestStart();
        LOGI("requestStart result : %s", oboe::convertToText(result));
    三、停止播放 
    

    调用 oboe::ManagedStream 音频流的 requestStop() 方法 , 可以停止 Oboe 音频播放 ;

        // 停止播放
        result = managedStream->requestStop();
        LOGI("requestStart result : %s", oboe::convertToText(result));
    四、关闭音频流 
    

    当不使用 Oboe 音频流时 , 必须关闭该音频流 , 因为 Oboe 音频流会占用音频设备资源 ;

    尤其是设置的 Oboe 音频流 共享模式 SharingMode 是独占模式 Exclusive 时 , 只要该音频流不关闭 , 其它的音频流将无法访问该低延迟音频流 ;

    不再播放音频时 , 要及时关闭 Oboe 音频流 , 建议在 Activity 界面中的 onPause 方法中关闭音频流 ;


    显示关闭 Oboe 音频流 : 直接 调用音频流的 close() 方法 , 显示关闭音频流 ; 该方法是一个阻塞调用 , 调用后 , 会停止音频流播放 ;

    managedStream ->close();
    

    Oboe 音频流超出作用域自动关闭 : 栈内存音频流超出作用域时 , 会自动关闭该 Oboe 音频流 ;

    ManagedStream mStream; AudioStreamBuilder().build(mStream); mStream->requestStart(); } // 超出作用域音频流自动关闭
    五、重新配置 Oboe 音频流属性

    如果要修改现有 Oboe 音频流的配置 , 只需要 先设置对应属性 后 , 再调用 oboe::AudioStreamBuilder 构建器的 openManagedStream 方法 即可 , 调用该方法后, 会关闭销毁现有的 Oboe 音频流 , 然后会 重新创建新的 Oboe 音频流 ;

    // 在 Oboe 音频流运行时 , 通过构建器修改音频流属性 
    builder.setDeviceId(MY_DEVICE_ID);
    // 重新打开设置了新属性的音频流 
    // 旧的 Oboe 音频流会被自动关闭并销毁 
    builder.openManagedStream(managedStream);
    

    最佳实践 :

    手动关闭销毁 : 使用 Oboe 音频流 ManagedStream 时 , 需要 手动负责关闭 和 销毁操作 ; 自动关闭销毁 : 如果在自动分配上下文的环境中 , 如该 音频流作为类的成员变量 , 当应用中不再使用音频流时 , 确保该 Oboe 音频流对象超出了封闭的作用范围 ;

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

    下一篇:【集合论】二元关系 ( 二元关系运算示例 | 逆运算示例 | 合成运算示例 | 限制运算示例 | 像运算示例 )

    【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 设置 Oboe 音频设备 ID | setDeviceId 函数原型 | AudioStream 音频流 )

    一、设置 Oboe 音频设备 ID ( AAudio )、二、设置 Oboe 音频设备 ID ( OpenSL ES)、三、oboe :: AudioStreamBuilder :: setDeviceId 函数原型、四、oboe :: AudioStream 音频流、五、相关资料、

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

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

    【音频处理】Melodyne 导入音频 ( 使用 Adobe Audition 录制音频 | 在 Melodyne 中打开录制的音频 | Melodyne 对音频素材的操作 | 音频分析算法 )

    一、使用 Adobe Audition 录制音频、二、在 Melodyne 中打开录制的音频、三、Melodyne 对音频素材的操作、四、Melodyne 音频分析算法、