Android Audio相关 AudioFlinger类

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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值