Android AudioFlinger(一)
来源:互联网 发布:jquery.topology.js 编辑:程序博客网 时间:2024/05/14 22:48
AudioFlinger的类结构
下面的图示描述了AudioFlinger类的内部结构和关系:
不知道各位是否和我一样,第一次看到AudioFlinger类的定义的时候都很郁闷--这个类实在是庞大和臃肿,可是当你理清他的关系以后,你会觉得相当合理。下面我们一一展开讨论。
IAudioFlinger接口
这是AudioFlinger向外提供服务的接口,例如openOutput,openInput,createTrack,openRecord等等,应用程序或者其他service通过ServiceManager可以获得该接口。该接口通过继承BnAudioFlinger得到。
ThreadBase
在AudioFlinger中,Android为每一个放音/录音设备均创建一个处理线程,负责音频数据的I/O和合成,ThreadBase是这些线程的基类,所有的播放和录音线程都派生自ThreadBase
TrackBase
应用程序每创建一个音轨(AudioTrack/AudioRecord),在AudioFlinger中都会创建一个对应的Track实例,TrackBase就是这些Track的基类,他的派生类有:
PlaybackTread::Track // 用于普通播放,对应于应用层的AudioTrack
PlaybackThread::OutputTrack // 用于多重设备输出,当蓝牙播放开启时使用
RecordThread::RecordTrack // 用于录音,对应于应用层的AudioRecord
播放
默认的播放线程是MixerThread,它由AudioPolicyManager创建,在AudioPolicyManager的构造函数中,有以下代码:
Java代码:
- mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
- &outputDesc->mSamplingRate,
- &outputDesc->mFormat,
- &outputDesc->mChannels,
- &outputDesc->mLatency,
- outputDesc->mFlags);
最终会进入AudioFlinger的openOut函数:
Java代码:
- thread = new MixerThread(this, output, ++mNextThreadId);
- ......
- mPlaybackThreads.add(mNextThreadId, thread);
- ......
- return mNextThreadId;
可以看到,创建好的线程会把该线程和它的Id保存在AudioFlinger的成员变量mPlaybackThreads中,mPlaybackThreads是一个Vector,AudioFlinger创建的线程都会保存在里面,最后,openOutput返回该线程的Id,该Id也就是所谓的audio_io_handle_t,AudioFlinger的调用者这能看到这个audio_io_handle_t,当需要访问时传入该audio_io_handle_t,AudioFlinger会通过mPlaybackThreads,得到该线程的指针。
createTrack会调用PlaybackThread类的createTrack_l函数:
Java代码:
- track = thread->createTrack_l(client, streamType, sampleRate, format,
- channelCount, frameCount, sharedBuffer, &lStatus);
再跟入createTrack_l函数中,可以看到创建了PlaybackThread::Track类,然后加入播放线程的track列表mTracks中。
Java代码:
- track = thread->createTrack_l(client, streamType, sampleRate, format,
- channelCount, frameCount, sharedBuffer, &lStatus);
- ......
- mTracks.add(track);
在createTrack的最后,创建了TrackHandle类并返回,TrackHandle继承了IAudioTrack接口,以后,createTrack的调用者可以通过IAudioTrack接口与AudioFlinger中对应的Track实例交互。
Java代码:
- trackHandle = new TrackHandle(track);
- ......
- return trackHandle;
- Android AudioFlinger(一)
- [Android Audio]AudioFlinger(一)AudioFlinger的启动
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android音频系统之AudioFlinger(一)
- Android Audioflinger
- Android AudioFlinger
- Android AudioFlinger
- Android AudioFlinger
- android audioflinger
- android 音频子系统-AudioFlinger(二)
- Android-Audio-System---AudioFlinger
- javascript中的window对象
- syslog.conf 配置(2)
- C#调用系统API实现内存注入的代码
- XML访问技术(1)--C++.
- APACHE FTP 文件上传丢失数据的解决方法
- Android AudioFlinger(一)
- java 1.5 Enum
- \Home\bin\Home.apk installed on device
- Object-C 001
- shell特定变量和Makefile中自动化变量的对比记忆
- 将UIPickerView横放到UIActionSheet中
- 巧用EditPlus删除文档多余空行
- Velcro实施小结-20110725
- java 读写INI文件