libmedia
源代码位于:frameworks/av/media/libmedia。
类名 | 说明 |
AudioEffect | 创建、控制音效引擎。封装IEffect接口,实际Effect对象由AudioFlinger创建。AudioEffect::EffectClient实现IEffectClient接口,处理Effect的回调。 |
AudioParameter | 处理配置参数的工具类,内部保存一个字典。 |
AudioRecord | 封装IAudioRecord接口,实际对象由AudioFlinger创建。AudioRecord:: AudioRecordThread生成回调事件并调用回调。 |
AudioSystem | 提供静态方法调用AudioFlinger和AudioPolicyService的接口方法;注册AudioFlingerClient,接收回调用于在本地建立OutputDescriptor数据缓存。 |
AudioTrack | 封装IAudioTrack接口,实际对象由AudioFlinger创建。AudioTrack:: AudioTrackThread生成回调事件并调用回调。 |
audio_track_cblk_t | 维护客户、服务对共享缓存的使用情况,同步跨进程访问,需要创建在共享内存上。当由服务提供共享内存时,使用AudioTrackSharedStreaming维护读写指针,当客户提供共享内存时,使用AudioTrackSharedStatic维护。 |
AudioTrackSharedStreaming | 通过两个位置标示客户端和服务端的读写位置。 |
AudioTrackSharedStatic | 有一个仅包含一个StaticAudioTrackState元素的循环队列,客户端将循环播放请求通过该队列传给服务端。 |
Proxy | 类体系封装对共享缓存的操作,Proxy为其子类保存共享缓存属性。 |
ClientProxy | 继承Proxy,处理客户这边的缓存申请释放操作。 |
AudioTrackClientProxy | 继承ClientProxy,增加了设置音量等逻辑。 |
StaticAudioTrackClientProxy | 继承AudioTrackClientProxy,增加设置循环播放方式的接口。 |
AudioRecordClientProxy | 简单继承了ClientProxy。 |
ServerProxy | 继承Proxy,处理服务这边的缓存申请释放操作,实现缓存获取释放。 |
AudioTrackServerProxy | 继承ServerProxy,增加了获取音量设置等逻辑。 |
StaticAudioTrackServerProxy | 继承AudioTrackServerProxy,重新实现缓存申请释放操作,根据循环播放方式返回缓存。 |
ServerProxy | 简单继承了ServerProxy。 |
- Understanding Atomic Operations
- An Introduction to Lock-Free Programming
- Memory Ordering at Compile Time
- Memory Ordering in Modern Microprocessors
- Lockless Programming Considerations for Xbox 360 and Microsoft Windows
libscheduling_policy
设置调度优先级,好像没有什么地方使用。
源代码位于:frameworks/av/services/audioflinger。涉及源文件:
- ISchedulingPolicyService.cpp
- SchedulingPolicyService.cpp
libaudioresampler
源代码位于:frameworks/av/services/audioflinger。涉及源文件:
- AudioResampler.cpp.arm
- AudioResamplerCubic.cpp.arm
- AudioResamplerSinc.cpp.arm
libaudioflinger
源代码位于:frameworks/av/services/audioflinger。
AudioFlinger::ThreadBase定义一个基本的线程,主要功能有:
- 维护声音配置属性
修改属性有:mSampleRate、mFrameCount、mChannelMask、mChannelCount、mFrameSize、mFormat。
- 提供配置线程同步机制
使用mNewParameters保存配置参数,mWaitWorkCV通知内部线程,mParamStatus返回配置执行状态,mParamCond通知外部客户。
- 处理配置事件
有IoConfigEvent、PrioConfigEvent两类事件。mConfigEvents用作线程内外中转队列,mWaitWorkCV用于同步唤醒,processConfigEvents执行。
- 维护声音设备
mStandby、mOutDevice、mInDevice(audio_devices_t)、mAudioSource
- 维护声音句柄和音效
mId(audio_io_handle_t)、mEffectChains、mSuspendedSessions。
- 电源管理
申请释放POWERMANAGER_PARTIAL_WAKE_LOCK 锁,mWakeLockToken、mDeathRecipient。
AudioFlinger::ThreadBase::TrackBase代表一个声音流,持有AudioFlinger::Client对象引用,
AudioFlinger::ThreadBase::TrackBase实现ExtendedAudioBufferProvider接口
AudioFlinger::PlaybackThread继承AudioFlinger::ThreadBase,管理多个Track(mTracks、mActiveTracks),其线程函数循环处理混音、音效、输出。
AudioFlinger::AsyncCallbackThread辅助转发HAL的回调,当设置并且HAL支持异步输出时,AudioFlinger::PlaybackThread创建并管理AsyncCallbackThread。
mediaserver
源代码位于:frameworks/av/media/mediaserver。
mediaserver启动AudioFlinger、AudioPolicyService。
服务名分别是“media.audio_flinger”、“media.audio_policy”。
frameworks/av/media/mediaserver/main_mediaserver.cpp: ------------------------------------------------------------------------- AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); AudioPolicyService::instantiate(); |