首先介绍一些AudioFlienger 用到的内部类
一 client 内部类
可能存在很多个AudioTrack 或者AudioRecord (客户端)与AudioFlienger 对接。每个客户端由PId 分辨。
每注册一个客户端, 则生成一个client 对象,保存到DefaultKeyedVector< pid_t, wp<Client> > mClients 中
class Client : public RefBase {
public:
Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
virtual ~Client();
sp<MemoryDealer> heap() const;
pid_t pid() const { return mPid; }
sp<AudioFlinger> audioFlinger() const { return mAudioFlinger; }
private:
Client(const Client&);
Client& operator = (const Client&);
const sp<AudioFlinger> mAudioFlinger;
sp<MemoryDealer> mMemoryDealer;
const pid_t mPid;
};
二 AudioFlinger 的初始化
AudioFlinger的初始化是从main_audioserver.cpp 初始化。
这是系统启动服务的典型方法。
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
AudioPolicyService::instantiate();
RadioService::instantiate();
SoundTriggerHwService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
我们只关心AudioFlinger::instantial()函数, 但是此函数并不是在AudioFlinger.cpp 中定义。
AudioFlinger 继承了BinderService,
class AudioFlinger :
public BinderService<AudioFlinger>,
public BnAudioFlinger
template<typename SERVICE>
class BinderService
{
public:
static status_t publish(bool allowIsolated = false) {
sp<IServiceManager> sm(defaultServiceManager());
return sm->addService(
String16(SERVICE::getServiceName()),
new SERVICE(), allowIsolated);
}
......
static void instantiate() { publish(); }
其实就是执行,
sp<IServiceManager> sm(defaultServiceManager());
sm->addService( String16(AudioFlinger::getServiceName()),
new AudioFlinger, allowIsolated);
向ServiceManager 中注册AudioFlinger。
三 建立Track, 反馈给AudioTracker
sp<IAudioTrack> AudioFlinger::createTrack(
audio_stream_type_t streamType,
uint32_t sampleRate,
audio_format_t format,
audio_channel_mask_t channelMask,
size_t *frameCount,
IAudioFlinger::track_flags_t *flags,
const sp<IMemory>& sharedBuffer,
audio_io_handle_t output,
pid_t pid,
pid_t tid,
audio_session_t *sessionId,
int clientUid,
status_t *status)
{
sp<PlaybackThread::Track> track;
sp<TrackHandle> trackHandle;
sp<Client> client;
status_t lStatus;
audio_session_t lSessionId;
const uid_t callingUid = IPCThreadState::self()->getCallingUid();
......
{
Mutex::Autolock _l(mLock);
// 1.根据索引号找到一个工作线程 playbackThread
PlaybackThread *thread = checkPlaybackThread_l(output);
client = registerPid(pid);
ALOGV("createTrack() lSessionId: %d", lSessionId);
//2.建立PlaybackThread::Track指针, 这个对象是AT调用AF 的中间接口
track = thread->createTrac