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相关推荐

  1. Android 中的混音器 AudioMixer 实现分析

    Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 Au ...

  2. android中的多媒体应用camera

    MainActivity.java 代码 package com.amaker.ch11.app; import java.io.File; import java.io.FileOutputStre ...

  3. Android运用手机多媒体

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 使用通知 通知的基本用法 通知的点击----PendingIntent 通知的高级功能 调用摄像头和相册 调用摄像头拍照 从 ...

  4. Android开发_多媒体的简单应用

    SoundPool类 SoundPool类适合用来播放一些短暂的反应速度要求高的声音.SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作.SoundPool类支持同时播放多个音效 ...

  5. Android基础——Android系统概览

    1. Android系统架构 android大致可以分为四层架构:Linux内核层,系统运行库层.应用框架层和应用层 Linux内核层 android系统是基于Linux内核,这一层为android设 ...

  6. 【Android】Android开源项目分类汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...

  7. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

  8. 视频教程-Android程序设计-Android

    Android程序设计 负责过多个软件项目的研发.设计和管理工作,拥有项目管理师认证.项目监理师中级认证.出版过的图书有<微信小程序开发图解案例教程><Axure RP8原型设计图解 ...

  9. android之android.intent.category.DEFAULT的用途和使用

    1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity , ...

  10. android:layout_with=,android – 难以理解layout_alignWithParentIfMissing

    这仅适用于使用RelativeLayout时. 如果您将元素设置为一个其他元素,则表示该元素位于该元素的左侧. 但是如果这个元素会丢失,因为你删除它,例如它将与父对齐. 举个例子 android:la ...

最新文章

  1. 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)
  2. Linux下Java Font 中文字体不显示
  3. java 原子引用_Java 原子性引用 AtomicReference
  4. Python 数据结构视频教程一
  5. 关于c++中map插入元素的问题
  6. storagesky存储天地
  7. 北京理工大学计算机学院乔磊,邸慧军_北京理工大学计算机学院
  8. 实时控制软件第二次作业
  9. Linux中下载,压缩,解压等命令
  10. 【视频】超级账本HyperLedger:Fabric源码走读(一):项目构建与代码结构
  11. opencv-python学习一--人脸检测
  12. 791A.Bear and Big Brother
  13. 适合做软件官网展示的源码
  14. 云计算到底有哪些魅力 云计算就业前景好不好
  15. 公司邮箱地址格式是什么?邮箱地址怎么写?邮箱地址大全
  16. 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
  17. 英语MuttonfatJade羊脂玉muttonfatjade单词
  18. oracle注册服务到监听,监听程序未启动或数据库服务未注册到该监听程序解决方法-Oracle...
  19. UltraEdit 不能复制粘贴
  20. ws2812C驱动示例主控芯片为HC32F460系列

热门文章

  1. 邮箱服务器如何配置?POP和IMAP如何定义?
  2. 网关gate启动报错Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.g
  3. GitHub上点击量破百万的宝藏级Spring,讲解的太到位了
  4. 目录穿越及文件包含漏洞
  5. 有限元基础及ANSYS应用 - 第4节 - 平面桁架结构的ANSYS分析
  6. Java方法的重载和重写
  7. UMD算法讲义——Lecture 2:算法设计:稳定婚姻问题
  8. word添加脚注后正文跑到下一页
  9. c语言汉字属于什么类型_带你学习C语言—数据类型
  10. python鸡兔同笼头35只_python_鸡兔同笼问题