Android多媒体:AudioTrack
2015-07-18 09:10
579 查看
AudioTrack是和PlaybackThread中创建的Track一一对应的,Track是Bn,AudioTrack是Bp。音乐APP通过操作AudioTrack来进行音乐数据的传输。具体过程如下:
应用initAudioTrack ,new一个AudioTrack, 注意里面的flag(比如AUDIO_OUTPUT_FLAG_FAST,那说明这个output是需要FastMixer的)。并且调用了AudioTrack的set函数,注册了audioCallback做callback函数。这个callback是AT和应用交互数据的接口。
在set函数里,调用了AudioSystem::getOutput,然后是hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp调用了getOutput,这里会找一个完全满足输入参数如bit-depth的output,否则返回0。然后调用client的openOutput。client这里是AudioFLinger,所以findSuitableHwDev_l,open_output_stream,然后new Mixer。所以,一个Output对应一个playback线程。手机里面的output是由audio_policy.conf定义的。由各个厂家自己实现。
在set函数里,创建了AudioTrackThread线程,这个线程不停的执行threadLoop,除非有人pause或stop它。threadLoop中有一个重要的函数processAudioBuffer。其中通过proxy的obtainBuffer,再通过mCblk的rear和front算出来自己的mRaw指针的地址,然后传给AudioTrack的processAudioBuffer的参数audioBuffer。audioBuffer是一个输入输出参数,它既负责输入又负责输出,最终执行完processAudioBuffer后输出填好的buffer的数据指针和大小。
如果new出AudioTrack的模块没有给AudioTrack提供callback,就无法使用上面的方式来填充数据,而是要自己调用AudioTrack::write函数来写。可以清晰的看出:采用callback的方式属于下层驱动,上层被动;采用write函数调用的方式属于上层主动,下层被动。
相关文章推荐
- Android 编程下两种方式注册广播的区别
- Android多媒体:AudioMixer
- Android:EditText属性大全
- Gradle Tips#2-语法
- Android中自定义样式与View的构造函数中的第三个参数defStyle的意义
- AndroidStudio中的包管理
- Android--IntentService简介
- Android开发环境搭建
- 提高 Android 代码质量的4个工具
- Android官方SDK下载(含API文档)
- Android源代码 之 构建 编译源码的环境(Ubuntu篇)
- Android源代码 之 下载源代码
- Android源代码 之 源代码分支、版本号、支持设备列表
- Android 之 View透明度的设置
- Android 之 adapter.notifyDataSetChanged() 无响应
- 教你如何不翻墙就可以快速更新AndroidSDK Manager中的内容
- Android源代码 之 源代码版本名称、版本号、API级别对照表
- achartengine(Google给android提供的绘图工具包)的介绍和使用
- Android 蓝牙开发记录
- Android Volley (1)