当前位置: 首页 > news >正文

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider?

顾名思义,Audio音频数据缓冲提供,就是提供音频数据的缓冲类,而且这个AudioBufferProvider派生出许多子类,每个子类有不同的用途,至关重要;那它在Android哪个地方使用呢?

在PlaybackTread中,接收应用层传递而来的数据,那为什么要专门用这么多Provider类来处理呢?而不只是简单的转发,将应用层的数据转发到PlaybackThread就行了;

No、No、No!因为PlaybackThread负责接收应用层诸多应用的音频数据,每个音源的数据format、channel等不同,需要进行不同format转换、channel扩张/裁剪、down/upMix等,甚至会对其数据做一些音频特性如变速等操作,这就要对数据进行预处理,每一个provider的派生类就是用来做这些的

AudioBufferProvider类派生关系图

在这里插入图片描述

整体框架图如上,类的大致用途在图片中已简单标识,简而言之,右侧SourceAudioBufferProvider是专用于数据提供,而左侧的BufferProvider则是对数据进行一些特殊处理,那系统是如何串联这些对象呢?那就和父类的virtual函数有关系,重点关注AudioBufferProvider和PassthruBufferProvider这两个祖先类

AudioBufferProvider

class AudioBufferProvider
{
public:// FIXME merge with AudioTrackShared::Buffer, AudioTrack::Buffer, and AudioRecord::Buffer//       and rename getNextBuffer() to obtainBuffer()struct Buffer {Buffer() : raw(NULL), frameCount(0) { }//联合体所有成员共用一个空间union {void*       raw;short*      i16;int8_t*     i8;};size_t frameCount;};// On entry://  buffer              != NULL//  buffer->raw         unused//  buffer->frameCount  maximum number of desired frames// On successful return://  status              NO_ERROR//  buffer->raw         non-NULL pointer to buffer->frameCount contiguous available frames//  buffer->frameCount  number of contiguous available frames at buffer->raw,//                      0 < buffer->frameCount <= entry value// On error return://  status              != NO_ERROR//  buffer->raw         NULL//  buffer->frameCount  0//buffer.raw地址 buffer.frameCount长度,也就是数据是读出来,读到buffer中去virtual status_t getNextBuffer(Buffer* buffer) = 0;

始祖类AudioBufferProvider定义了数据Buffer结构体,而getNextBuffer就是获取音频数据的,调用此方法后数据会存到buffer参数中去;

PassthruBufferProvider工作模式—责任链模式

class PassthruBufferProvider : public AudioBufferProvider {virtual void setBufferProvider(AudioBufferProvider *p) {mTrackBufferProvider = p;}protected:AudioBufferProvider *mTrackBufferProvider;
}

上面是定义,可以按如下伪代码使用:

std::unique_ptr<PassthruBufferProvider> mAdjustChannelsBufferProvider = AdjustChannelsBufferProvider();
std::unique_ptr<PassthruBufferProvider> mReformatBufferProvider = ReformatBufferProvider().setsetBufferProvider(mAdjustChannelsBufferProvider);
std::unique_ptr<PassthruBufferProvider> mTimestretchBufferProvider = TimestretchBufferProvider().setsetBufferProvider(mReformatBufferProvider);

这样mAdjustChannelsBufferProvider处理完了,就交给mReformatBufferProvider处理,在交给mTimestretchBufferProvider处理,直至处理完成;

在Android中哪个地方使用?

哈哈,据我所知,目前在2个地方看到:

/framework/av/services/audioflinger/threads.cpp
/frameworks/av/media/libaudioprocessing/AudioMixer.cpp

在threads里面的threadLoop_write方法里面,通常写入到sink对象,如下:

ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
{.....ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);....
}

这里就是接收应用层的数据,通常是写入到SourceBufferProvider中去;mNormalSink是MonoPipe类型,而MonoPipe怎么又和SourceBufferProvider扯上关系了呢?见下图:
在这里插入图片描述

当write写入到MonoPipe中去了以后,在SourceBufferProvider中,虚函数使用getNextBuffer拉去数据即可

而在AudioMixer中,在混音时通常会创建许多BufferProvider,对音频数据进行预处理,如下:
在这里插入图片描述

相关文章:

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider&#xff1f; 顾名思义&#xff0c;Audio音频数据缓冲提供&#xff0c;就是提供音频数据的缓冲类&#xff0c;而且这个AudioBufferProvider派生出许多子类&#xff0c;每个子类有不同的用途&#xff0c;至关重要&#xff1b;那它在Android哪个地方使…...

加密与安全_密钥体系的三个核心目标之完整性解决方案

文章目录 Pre机密性完整性1. 哈希函数&#xff08;Hash Function&#xff09;定义特征常见算法应用散列函数常用场景散列函数无法解决的问题 2. 消息认证码&#xff08;MAC&#xff09;概述定义常见算法工作原理如何使用 MACMAC 的问题 不可否认性数字签名&#xff08;Digital …...

【C++】:继承[下篇](友元静态成员菱形继承菱形虚拟继承)

目录 一&#xff0c;继承与友元二&#xff0c;继承与静态成员三&#xff0c;复杂的菱形继承及菱形虚拟继承四&#xff0c;继承的总结和反思 点击跳转上一篇文章&#xff1a; 【C】&#xff1a;继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数…...

昇思25天学习打卡营第13天|基于MindNLP+MusicGen生成自己的个性化音乐

关于MindNLP MindNLP是一个依赖昇思MindSpore向上生长的NLP&#xff08;自然语言处理&#xff09;框架&#xff0c;旨在利用MindSpore的优势特性&#xff0c;如函数式融合编程、动态图功能、数据处理引擎等&#xff0c;致力于提供高效、易用的NLP解决方案。通过全面拥抱Huggin…...

nigix的下载使用

1、官网&#xff1a;https://nginx.org/en/download.html 双击打开 nginx的默认端口是80 配置文件 默认访问页面 在目录下新建pages&#xff0c;放入图片 在浏览器中输入地址进行访问 可以在电脑中配置本地域名 Windows设置本地DNS域名解析hosts文件配置 文件地址&#xf…...

nginx+lua 实现URL重定向(根据传入的参数条件)

程序版本说明 程序版本URLnginx1.27.0https://nginx.org/download/nginx-1.27.0.tar.gzngx_devel_kitv0.3.3https://github.com/simpl/ngx_devel_kit/archive/v0.3.3.tar.gzluajitv2.1https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20240626.tar.gzlua-nginx-m…...

算法学习笔记(8.4)-完全背包问题

目录 Question&#xff1a; 图例&#xff1a; 动态规划思路 2 代码实现&#xff1a; 3 空间优化&#xff1a; 代码实现&#xff1a; 下面是0-1背包和完全背包具体的例题&#xff1a; 代码实现&#xff1a; 图例&#xff1a; 空间优化代码示例 Question&#xff1a; 给定n个物品…...

C++catch (...)陈述

catch (...)陈述 例外处理可以有多个catch&#xff0c;如果catch后的小括弧里面放...&#xff0c;就表示不限型态种类的任何例外。 举例如下 #include <iostream>int main() {int i -1;try {if (i > 0) {throw 0;}throw 2.0;}catch (const int e) {std::cout <…...

Redis实践

Redis实践 使用复杂度高的命令 如果在使用Redis时&#xff0c;发现访问延迟突然增大&#xff0c;如何进行排查&#xff1f; 首先&#xff0c;第一步&#xff0c;建议你去查看一下Redis的慢日志。Redis提供了慢日志命令的统计功能&#xff0c;我们通过以下设置&#xff0c;就…...

【Lora模型推荐】Stable Diffusion创作具有玉石翡翠质感的图标设计

站长素材AI教程是站长之家旗下AI绘图教程平台 海量AI免费教程&#xff0c;每日更新干货内容 想要深入学习更多AI绘图教程&#xff0c;请访问站长素材AI教程网&#xff1a; AI教程_深度学习入门指南 - 站长素材 (chinaz.com) logo版权归各公司所有&#xff01;本笔记仅供AIGC…...

vscode 远程开发

目录 vscode 远程连接 选择 Python 环境 vscode 远程连接 按 CtrlShiftP 打开命令面板。输入并选择 Remote-SSH: Open SSH Configuration File...。选择 ~/.ssh/config 文件&#xff08;如果有多个选项&#xff09;。在打开的文件中添加或修改你的 SSH 配置。 这个可以右键…...

前端Vue组件化实践:打造灵活可维护的地址管理组件

随着前端技术的不断演进&#xff0c;复杂度和开发难度也随之上升。传统的一体化开发模式使得每次小小的修改或功能增加都可能牵一发而动全身&#xff0c;严重影响了开发效率和维护成本。组件化开发作为一种解决方案&#xff0c;通过模块化、独立化的开发方式&#xff0c;实现了…...

虚幻引擎ue5游戏运行界面白茫茫一片,怎么处理

根剧下图顺序即可调节游戏运行界面光照问题&#xff1a; 在大纲里找到post&#xff0c;然后选中它&#xff0c;找到Exposure 把最低亮度和最高亮度的0改为1即可...

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理&#xff1f; 因为有的网站会封IP&#xff0c;用户如果没有登录&#xff0c;那IP就是身份标识&#xff0c;如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求&#xff0c;帮你转交的人对面不熟&a…...

Kotlin Flow 防抖 节流

防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。 一:防抖&#xff08;debounce&#xff09;的概念&#xff1a; 防抖是指当持续触发事件时&#xff0c;一定时间段内没有再触发事件&#xff0c;事件处理函数才会执行一次&#xff0c; 如果设定时间到来之前&#x…...

Android Studio下载与安装

Android Studio下载与安装_android studio下载安装-CSDN博客...

【LC刷题】DAY24:122 55 45 1005

122. 买卖股票的最佳时机 II class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for(int i 1; i < prices.size(); i ){result max(prices[i] - prices[ i - 1], 0);}return result;} };55. 跳跃游戏 link class Solution { public…...

从零开始的python学习生活2

接上封装 class Phone:__volt0.5def __keepsinglecore(self):print("让cpu以单核运行")def if5G(self):if self.__volt>1:print("5G通话已开启")else:self.__keepsinglecore()print("电量不足&#xff0c;无法使用5G通话&#xff0c;已经设置为单…...

【并发编程】进程 线程 协程

进程&#xff08;Process&#xff09;、线程&#xff08;Thread&#xff09;和协程&#xff08;Coroutine&#xff09;构成了计算机科学中实现任务并发执行的三种核心抽象机制。通常&#xff0c;为了提高程序的执行效率&#xff0c;开发者会根据应用场景和性能需求&#xff0c;…...

Vue的生命周期函数有哪些?详细说明

Vue.js 的生命周期函数包括以下几个阶段&#xff0c;每个阶段都有相应的钩子函数可以用来在特定时机执行自定义的逻辑。这些生命周期钩子函数使得我们可以在组件的不同阶段进行操作&#xff0c;从而管理组件的状态和行为。 1. beforeCreate&#xff1a; - 描述&#xff1a;…...

智能硬件开发实战:用天问Block给ASRPRO芯片添加声控功能(含完整代码)

智能硬件开发实战&#xff1a;用天问Block给ASRPRO芯片实现声控LED系统 在智能家居和玩具开发领域&#xff0c;语音交互正成为最自然的控制方式。传统嵌入式开发需要编写复杂代码&#xff0c;而天问Block的图形化编程让创客们能像搭积木一样快速实现语音控制功能。本文将带你用…...

从理论到拟合:如何让ADS差分线前仿真结果更贴近实际PCB?我的经验复盘

从理论到拟合&#xff1a;如何让ADS差分线前仿真结果更贴近实际PCB&#xff1f;我的经验复盘 在高速数字电路设计中&#xff0c;差分传输线的信号完整性仿真一直是工程师面临的挑战。许多团队投入大量时间进行前仿真&#xff0c;却发现仿真结果与实测数据存在显著差异。这种差距…...

避坑指南:vsftpd服务重启后仍报530?检查这5个隐藏配置项

避坑指南&#xff1a;vsftpd服务重启后仍报530&#xff1f;检查这5个隐藏配置项 当你已经按照常规流程检查了vsftpd服务状态、用户列表和基础配置文件&#xff0c;却依然遭遇"530 Permission denied"的顽固错误时&#xff0c;问题往往隐藏在那些容易被忽略的配置细节…...

PostgreSQL实战:使用pg_dump精准导出特定模式下的表结构

1. 为什么需要精准导出特定模式下的表结构 在实际的数据库管理工作中&#xff0c;我们经常会遇到只需要导出特定模式&#xff08;schema&#xff09;下表结构的需求。比如在微服务架构中&#xff0c;每个服务可能对应数据库中的一个模式&#xff1b;或者在进行数据库迁移时&…...

如何免费快速转换音频格式:fre:ac音频转换器完整指南

如何免费快速转换音频格式&#xff1a;fre:ac音频转换器完整指南 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 想要高效处理音频文件却不想花钱购买专业软件&#xff1f;fre:ac音频转换器是您的最佳选…...

深度学习模型的绿色优化:Torch-Pruning减少能源消耗的终极指南

深度学习模型的绿色优化&#xff1a;Torch-Pruning减少能源消耗的终极指南 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning …...

5大核心功能解析:MAA_Punish如何实现《战双帕弥什》全自动游戏体验

5大核心功能解析&#xff1a;MAA_Punish如何实现《战双帕弥什》全自动游戏体验 【免费下载链接】MAA_Punish 战双帕弥什每日任务自动化 | Assistant For Punishing Gray Raven 项目地址: https://gitcode.com/gh_mirrors/ma/MAA_Punish MAA_Punish是一款专为《战双帕弥什…...

FatFileSystem:面向资源受限MCU的轻量级FAT文件系统

1. FatFileSystem 嵌入式 FAT 文件系统库深度解析FatFileSystem 是一个轻量级、可移植的嵌入式 FAT 文件系统实现&#xff0c;专为资源受限的微控制器环境设计。它并非完整重写的 FAT32 标准栈&#xff08;如 FatFs&#xff09;&#xff0c;而是对经典开源 FAT 实现的精简裁剪与…...

3大突破 Koodo Reader 2.1.8:跨设备同步引擎重新定义数字阅读体验

3大突破 Koodo Reader 2.1.8&#xff1a;跨设备同步引擎重新定义数字阅读体验 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/ko…...

BepInEx Linux部署实战指南:从环境诊断到故障自愈

BepInEx Linux部署实战指南&#xff1a;从环境诊断到故障自愈 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 一、环境诊断&#xff1a;你的Linux系统准备好了吗&#xff1f; 为什…...