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

做网站可以申请个体户么在线一键免费生成网页网站

做网站可以申请个体户么,在线一键免费生成网页网站,wordpress密码_,西安 房产网站建设什么是AudioBufferProvider? 顾名思义,Audio音频数据缓冲提供,就是提供音频数据的缓冲类,而且这个AudioBufferProvider派生出许多子类,每个子类有不同的用途,至关重要;那它在Android哪个地方使…

什么是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,对音频数据进行预处理,如下:
在这里插入图片描述

http://www.yidumall.com/news/16141.html

相关文章:

  • 没有网站怎么快速做cps网站开通
  • 顺德新网站建设重庆seo入门教程
  • 网站设计用什么软件竞价推广怎样管理
  • 24小时学会网站建设下载网址导航浏览器下载
  • 网络游戏称号大全张家港seo建站
  • 维修网站怎么做淘宝关键词搜索量查询
  • 工作总结教师seo优化轻松seo优化排名
  • 内网网站建设方案优化大师下载安装
  • 龙岩网站优化费用推广引流话术
  • 做体育赛事网站公司百度收录申请
  • 2021年不付费黄台软件下载抖音优化公司
  • 潍坊小企业网站建设整合营销理论
  • 个人可以做导购网站吗搜索百度指数
  • swoole怎么做直播网站快速提升关键词排名软件
  • 个人如何做网站软件云南网络推广服务
  • 企业站网站建设百度推广入口
  • 做电商网站一般要多少钱营销型网站建设的重要原则
  • 网站如何做宣传推广智慧教育
  • 携程特牌 的同时做别的网站厦门百度竞价开户
  • 宜昌网站设计公司推广联盟平台
  • 徐州手机网站建设公司国外引流推广软件
  • 网站建设怎么选择武汉网站运营专业乐云seo
  • 网站页面大小优化怎么做免费推广途径与原因
  • wordpress自动采集翻译插件怎么用windows优化大师怎么下载
  • 济南网站建设(力选聚搜网络)谷歌chrome浏览器下载
  • 有没有人与动物做的电影网站太原网站快速排名提升
  • 网站推广方法主要有哪些阿里云空间+1对1私人专属设计师
  • 做网站设计的电话个人如何注册网站
  • 鱼台县建设局网站免费网页在线客服制作
  • 软件开发工具具有哪些基本功能网站信息组织优化