android audiomixer,Android多媒体:AudioMixer
AudioMixer
每一个MixerThread在创建的时候都会创建一个AudioMixer赋值给mAudioMixer,也会创建一个mOutputSink。一个AudioMixer有一个mState,一个mState有最多32个track_t。而track_t是由track赋值的,在这里:在MixerThread的prepareTracks_l,对每一个mActiveTracks里的track,mAudioMixer通过setBufferProvider设置track给track_t的BufferProvider,同样,mAudioMixer调用setParameter给track_t的一系列参数赋值,包括VOLUME0,VOLUME1,AUXLEVEL,FORMAT,CHANNEL_MASK,MIXER_CHANNEL_MASK,RESAMPLE,MIXER_FORMAT,AUX_BUFFER,MAIN_BUFFER。在设置MAIN_BUFFER时,根据mMixerBufferEnabled把mMixBuffer或mSinkBuffer赋值给t.mainBuffer。这样,在ProcessXXX函数中,调用bufferProvider->getNextBuffer(&t.buffer,pts)即track->getNextBuffer, 调用mServerProxy->obtainBuffer(&buf)来给输出参数buf赋值。在process_validate中,判断应该使用哪种重采样和混音。然后在process_XXX中,调用到trackXXX,其中track_t里的in不停的赋值给outTemp,而outTmp是按照理论上最大的音频采样精度(32位)和channel数设置的局部变量。然后ConvertMixerFormat将所有采样精度转化为float和16bit,再通过memcpy,ditherAndClamp等把outTemp赋值给out,out就是t1.mainBuffer其实就是mMixBuffer或mSinkBuffer。所以,从App到AT,再从AT到AF都是一个共享内存。而AudioMixer使用了一块新内存来mix数据,就是mMixBuffer。在PlaybackThread::threadLoop_write中,通过mNormalSink->write(mMixBuffer+ offset, count)写入Sink。Mixer没有单独的混音线程,它运行在MixerThread线程。
mNormalSink->write在不使用FastMixer的时候,使用hardware\qcom\audio\hal\audio_hw.c中的out_write进行实际的写入。在播放mp3的时候,这种写入是阻塞的,耗时20ms。后来调用pcm_write来写入,最终调到tinyAlsa的pcm_write_mmap或pcm_write_nmmap。
当需要重采样时,调用的函数一般是
1. process
2. process__genericResampling
3. track__genericResample
4. virtual void resample(int32_t* out, size_toutFrameCount,
AudioBufferProvider* provider)
这个参数out其实是AudioMixer里面的outTemp,和别的需要或不需要重采样的track是叠加关系。
process__genericResampling里面,函数写的比较比较费解,但实际上就是:在所有enabled的track里,把mainBuffer相同的track分成组,就是e1,然后每组进行叠加,并最终复制到相同的mainBuffer里。里面用到了gcc的内嵌函数:
int __builtin_ffs (unsigned int x)
返回x的最后一位1的是从后向前第几位,比如7368(1110011001000)返回4。
int __builtin_clz(unsigned int x)
返回前导的0的个数。
int __builtin_ctz (unsigned int x)
返回后面的0个个数,和__builtin_clz相对。
int __builtin_popcount (unsigned int x)
返回二进制表示中1的个数。
int __builtin_parity (unsigned int x)
返回x的奇偶校验位,也就是x的1的个数模2的结果。
另外,也用到了CC_UNLIKELY
Android默认的Resampler都是软件实现的。系统根据所需Quality的不同来选择不同的resampler。在AudioMixer里面,每个track_t有一个Resampler,根据源采样率和目标采样率来确定不同的quality,从而创建不同的resampler。
android audiomixer,Android多媒体:AudioMixer相关推荐
- Android 中的混音器 AudioMixer 实现分析
Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 Au ...
- android中的多媒体应用camera
MainActivity.java 代码 package com.amaker.ch11.app; import java.io.File; import java.io.FileOutputStre ...
- Android运用手机多媒体
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 使用通知 通知的基本用法 通知的点击----PendingIntent 通知的高级功能 调用摄像头和相册 调用摄像头拍照 从 ...
- Android开发_多媒体的简单应用
SoundPool类 SoundPool类适合用来播放一些短暂的反应速度要求高的声音.SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作.SoundPool类支持同时播放多个音效 ...
- Android基础——Android系统概览
1. Android系统架构 android大致可以分为四层架构:Linux内核层,系统运行库层.应用框架层和应用层 Linux内核层 android系统是基于Linux内核,这一层为android设 ...
- 【Android】Android开源项目分类汇总
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
- Android 7.1.2(Android N) Android系统启动流程
Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...
- 视频教程-Android程序设计-Android
Android程序设计 负责过多个软件项目的研发.设计和管理工作,拥有项目管理师认证.项目监理师中级认证.出版过的图书有<微信小程序开发图解案例教程><Axure RP8原型设计图解 ...
- android之android.intent.category.DEFAULT的用途和使用
1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity , ...
- android:layout_with=,android – 难以理解layout_alignWithParentIfMissing
这仅适用于使用RelativeLayout时. 如果您将元素设置为一个其他元素,则表示该元素位于该元素的左侧. 但是如果这个元素会丢失,因为你删除它,例如它将与父对齐. 举个例子 android:la ...
最新文章
- 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)
- Linux下Java Font 中文字体不显示
- java 原子引用_Java 原子性引用 AtomicReference
- Python 数据结构视频教程一
- 关于c++中map插入元素的问题
- storagesky存储天地
- 北京理工大学计算机学院乔磊,邸慧军_北京理工大学计算机学院
- 实时控制软件第二次作业
- Linux中下载,压缩,解压等命令
- 【视频】超级账本HyperLedger:Fabric源码走读(一):项目构建与代码结构
- opencv-python学习一--人脸检测
- 791A.Bear and Big Brother
- 适合做软件官网展示的源码
- 云计算到底有哪些魅力 云计算就业前景好不好
- 公司邮箱地址格式是什么?邮箱地址怎么写?邮箱地址大全
- 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
- 英语MuttonfatJade羊脂玉muttonfatjade单词
- oracle注册服务到监听,监听程序未启动或数据库服务未注册到该监听程序解决方法-Oracle...
- UltraEdit 不能复制粘贴
- ws2812C驱动示例主控芯片为HC32F460系列
热门文章
- 邮箱服务器如何配置?POP和IMAP如何定义?
- 网关gate启动报错Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.g
- GitHub上点击量破百万的宝藏级Spring,讲解的太到位了
- 目录穿越及文件包含漏洞
- 有限元基础及ANSYS应用 - 第4节 - 平面桁架结构的ANSYS分析
- Java方法的重载和重写
- UMD算法讲义——Lecture 2:算法设计:稳定婚姻问题
- word添加脚注后正文跑到下一页
- c语言汉字属于什么类型_带你学习C语言—数据类型
- python鸡兔同笼头35只_python_鸡兔同笼问题