1、继承自BinderService<AudioFlinger>和BnAudioFlinger。
2、定义了一些枚举常量。
hardware_call_state : AUDIO_HW_OUTPUT_OPEN等
track_state : RESUMING等
3、类 PlaybackThread : public ThreadBase中用到的常量:
enum type {
MIXER,
DIRECT,
DUPLICATING
};
enum mixer_state {
MIXER_IDLE,
MIXER_TRACKS_ENABLED,
MIXER_TRACKS_READY
};
4、构造函数中:
调用函数AudioHardwareInterface::create()创建一个AudioHardware,之后的实现基本上是调用该AudioHardware对象来完成的。
5、有两个DefaultKeyedVector类型的成员变量:
mPlaybackThreads:用于记录播放线程。
mRecordThreads:用于记录录音线程。
DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads;
DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;
函数checkPlaybackThread_l和函数checkRecordThread_l分别将mPlaybackThreads和mRecordThreads中记录的线程按编号返回。
函数checkMixerThread_l返回的也是mPlaybackThreads中记录的线程,不过将返回值转换为了MixerThread类型的指针。
6、函数createTrack中,
首先调用函数checkPlaybackThread_l获取播放线程。output是调用函数createTrack时传入的参数。
PlaybackThread *thread = checkPlaybackThread_l(output);
然后调用PlaybackThread的函数createTrack_l创建一个track。
sp<PlaybackThread::Track> track;
track = thread->createTrack_l(client, streamType, sampleRate, format,
channelCount, frameCount, sharedBuffer, lSessionId, &lStatus);
然后以track为参数创建一个rackHandle
sp<TrackHandle> trackHandle;
trackHandle = new TrackHandle(track);
最后将trackHandle作为返回值返回。
7、接下来几个函数的实现方法类似,都是先调用函数checkPlaybackThread_l获取播放线程。output是各函数的输入参数。
PlaybackThread *thread = checkPlaybackThread_l(output);
然后调用PlaybackThread的相应函数实现功能。
这样的函数包括:
sampleRate
channelCount
format
frameCount
latency
8、接下来有两个实现方法类似的函数,setMasterVolume和setMode。
都是首先调用mAudioHardware的对应函数,然后再调用mPlaybackThreads的对应函数。
例如,函数setMasterVolume:
mAudioHardware->setMasterVolume(value)
for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
mPlaybackThreads.valueAt(i)->setMasterVolume(value);
可见,对mAudioHardware的函数的调用完成对硬件的操作,对mPlaybackThreads的函数的调用修改了audioflinger层保存的状态。
9、接下来的两个函数setMicMute和getMicMute,都是通过调用mAudioHardware的函数来实现的。
10、函数setMasterMute中,
遍历mPlaybackThreads中的各个线程,并分别调用他们的setMasterMute函数。
for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
mPlaybackThreads.valueAt(i)->setMasterMute(muted);
由此看来,MasterMute控制所有的播放线程。
11、接下来两个函数masterVolume和masterMute,分别将对应 的成员变量返回。
12、接下来是函数setStreamVolume,
如果传入的output不为0,调用函数checkPlaybackThread_l获取对应的线程,然后调用该线程的setStreamVolume函数。
否则,遍历mPlaybackThreads,分别调用各线程的setStreamVolume函数。
13、函数setStreamMute,
遍历mPlaybackThreads,分别调用各线程的setStreamMute函数。
14、函数streamVolume中,
传入的output参数若不为0,调用函数checkPlaybackThread_l获取对应的线程,然后调用该线程的streamVolume函数,并将结果作为返回值返回。
若传入的output为0,取成员变量数组mStreamTypes对应stream的volume,并返回。
成员变量数组mStreamTypes的定义:
PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
15、函数streamMute,取成员变量数组mStreamTypes对应stream的mute,并返回。
16、函数isStreamActive,遍历mPlaybackThreads,分别调用各线程的isStreamActive,遇到函数isStreamActive返回true时,即退出循环并返回true。
如果遍历结束,没有true的情况,即返回false。
17、函数setParameters中,
如果ioHandle为0,即表示参数是对整个audio hardware interface有效的,调用mAudioHardware的函数setParameters,并将结果返回。
result = mAudioHardware->setParameters(keyValuePairs);
否则,调用函数checkPlaybackThread_l和checkRecordThread_l获取ioHandle对应的线程,然后调用线程的setParameters函数。
18、函数getParameters的处理,与函数setParameters类似。
如果ioHandle为0,调用mAudioHardware的函数getParameters,并返回。
否则,调用checkPlaybackThread_l和checkRecordThread_l,获取对应的线程,并调用对应线程的getParameters函数。
19、函数getInputBufferSize,直接调用mAudioHardware的getInputBufferSize函数,并返回。
20、函数getInputFramesLost,调用checkRecordThread_l获取录音线程,然后调用线程的getInputFramesLost函数。
21、函数setVoiceVolume,直接调用mAudioHardware的setVoiceVolume函数,并将结果返回。
22、getRenderPosition函数,
调用函数checkPlaybackThread_l获取播放线程,然后调用播放线程的getRenderPosition函数并将结果返回。
23、函数registerClient,
首先获取调用pid:
int pid = IPCThreadState::self()->getCallingPid();
创建一个NotificationClient对象:
sp<NotificationClient> notificationClient = new NotificationClient(this,
client,
pid);
调用mNotificationClients的add函数,实现notificationClient对象的注册:
mNotificationClients.add(pid, notificationClient)
遍历mPlaybackThreads,分别调用各线程的sendConfigEvent函数发送AudioSystem::OUTPUT_OPENED事件。
遍历mRecordThreads,分别调用各线程的sendConfigEvent函数,发送AudioSystem::INPUT_OPENED事件。
24、函数removeNotificationClient,
调用mNotificationClients的removeItem函数,删除相应的item。
25、函数audioConfigChanged_l,
遍历mNotificationClients,分别调用各notification client的ioConfigChanged函数。
函数中没有做AudioFlinger::mLock处理,调用该函数时必须做AudioFlinger::mLock处理。
26、函数removeClient_l,
调用mClients的函数removeItem,删除item。
在函数createTrack,openRecord和createEffect中会调用mClients的函数add追加item。