androidAudio系统.docx
- 文档编号:902312
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:13
- 大小:179.56KB
androidAudio系统.docx
《androidAudio系统.docx》由会员分享,可在线阅读,更多相关《androidAudio系统.docx(13页珍藏版)》请在冰豆网上搜索。
androidAudio系统
Audio系统
----李昊天
包括三方面的内容:
1,AudioRecord和AudioTrack,对外提供API类,分别完成音频数据的采集和输出。
2,AudioFlinger,工作引擎,管理音频流的输入输出,音频数据的混音读写Audio硬件等。
3,AudioPolicyService,策略控制中心,声音设备的选择和切换,音量控制等。
--AudioTrack
工作流程如下所示(java层)
1,根据音频数据的特性来确定缓冲区的最小size:
AudioTrack.getMinBufferSize(
intsampleRateInHz,//采样率
intchannelConfig,//声道数
intaudioFormat//采样精度
)
2,AudioTrack构造
newAudioTrack(intstreamType,//音频流类型
intsampleRateInHz,
intchannelConfig,
intaudioFormat,
intbufferSizeInBytes,//前面获取的缓冲大小
intmode//数据加载模式
)
说明1:
数据加载模式两种
MODE_STREAM:
通过write一次次把音频数据写到AudioTrack中;
MODE_STATIC:
在play之前把所有数据通过一次write传递到AudioTrack的内部缓冲区中,适合内存占用小,延时要求高的文件。
说明2;常见的流类型,定义于AudioManager
STREAM_ALARM;警告声
STREAM_MUSIC:
音乐声
STREAM_RING;铃声
STREAM_SYSTEM:
系统声音
STREAM_VOCIE_CALL;通话声
----AudioTrackde的构造流程图
说明1:
native_setup对应于jni层的
Android_media_AudioTrack_native_setup,主要工作:
1,进行一些信息查询;
2,java层的值和jni层的值转换,java层的streamType转换为native层的streamType。
streamType定义于AudioSystem:
DEFAULT默认
VOICE_CALL通话声
SYSTEM系统声
RING来电铃声
MUSIC音乐声
……
3,AudiotrackJniStorage对象,保存一些信息,与共享内存有关。
AT与AF见的数据传递就是通过共享内存的方式来完成的。
STATIC模式用该对象的allocSharedMem(intsizeInBytes)创建共享内存,STREAM模式下共享内存由AF创建。
4,调用native层的set(…)函数。
说明2:
native层的set(…)函数:
1,调用AudioSystem:
:
getOutput(…)根据流类型等参数获取合适的工作线程,并返回该线程的索引号。
工作线程由AudioFlinger创建,后面细讲。
2,调用createTrack(…)
说明3:
createTrack(…):
1,得到AudioFlinger的Binder代理端;
2,调用得到的audioFlinger的createTrack(…),该函数得到track的同时还创建了共享内存cblk;
3,对上述的共享内存做处理,在这个共享内存的首部中加入audio_track_cblk_t对象。
1)audio_track_cblk_t对象声明在AudioTrackShared.h,定义在AudioTrack.cpp中。
2)该对象加与共享内存的首部用来控制AT和AF生产和消费数据的步伐
----开始播放play(),调用jni层的start(),jni层的start()在调用native层的start(),最终会调用AudioFlinger的AudioFlinger:
:
PlaybackThread:
:
Track:
:
start(),后文细讲。
----调用write()写数据,最终会调用android_media_AudioTrack.cpp的writeToTrack(),接着如果是STREAM模式的话,就调用native层的AudioTrack的write(),而在STATIC模式下,直接把数据memcpy到共享内存。
STREAM模式下的流程图如下:
----调用release()释放相关资源
总结一下AudioTrack与AudioFlinger交互的流程图:
--AudioFlinger
1,构造函数
2,AudioFlinger:
:
createTrack(…)图解
这样就返回了一个track并创建了一个共享内存。
图中的client对象是AudioFlinger对客户端的封装。
3,下面是AudioFlinger中几个重要的工作线程:
PlaybackThread:
回放线程,音频输出。
有一个mOutput为AudioStreamOutput类型,说明它直接与音频的输出设备建立了联系;
MixerThread:
继承了PlaybackThread,混音线程,将多个源的音频数据混音后在输出;
DirectOutputThread:
直接输出线程;
DuplicatingThread:
多线程输出,继承了MixerThread,可以把混音的数据写到多个输出中。
4,工作线程的创建过程,跟AudioPolicyService有关:
AudioFlinger创建线程收到了AudioPolicyService的控制。
5,start()分析:
其中AudioMixer:
:
process()解析如下:
process()过程:
调用getNextBuffer得到刻度缓冲;数据处理,即混音;调用releaseBuffer释放数据缓冲。
6,stop()
7,audio_track_cblk_t对象
将线性缓冲巧妙地变为了环形缓冲
关键变量user----当前读位置
Server-----当前写位置
userBase,serverBase配合user,server
---AudioPolicyService
1,AudioPolicyInterface主要提供了一些设备切换管理和音量控制的借口,每个厂商有各自的实现方式,Audio系统提供了一个通用的实现类AudioPolicyManagerBase。
2,AudioSystem定义了一些重要的类型,比如音频流类型,音频设备等:
1)streamtype(音频流类型)
如DEFAULT默认
VOICE_CALL通话声
SYSTEM系统声
RING来电铃声
……
2)audiomode(声音模式)和电话的状态有直接的关系
如MODE_NOMAL正常,既不打电话,也不接电话
MODE_RINGTONE有来电
MODE_IN_CALL通话状态
……
3)forceuse和config强制使用及配置
强制使用某种设备由forced_config控制
FORCE_NONE
FORCE_SPEAKER强制使用扬声器
FORCE_HEADPHONE强制使用耳机
……
在什么情况下需要强制使用由force_use控制
FOR_COMMUNICATION通话情况
FOR_MEDIA媒体相关情况
……
4)输出设备的定义audio_devices
DEVICE_OUT_EARPIECE=0x1听筒
DEVICE_OUT_SPEAKER=0x2扬声器
DEVICE_OUT_WIRED_HEADSET=0x4耳机
DEVICE_OUT_WIRED_HEADPHONE=0x8另一种耳机
……
编号规律1,10,100,1000…便于对设备号的&,|操作
3,AudioPolicyManagerBase
实现了AudioPolicyInterface
回顾:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- androidAudio 系统