特效流程(audio effect)
特效流程
AudioEffect.cpp
从AudioEffect.cpp开始,上层主要传入对应的特效so文件的uid,根据其他特效猜测。
AudioEffect(C++)的构造代码调用了set(),set()中进一步调用了audioFlinger->createEffect()来创建音效。
——frameworks/av/media/libmedia/AudioEffect.cpp
进入set函数
Paste_Image.png调用audioFliner的create方法,audioFliner还是通过audiosystem来生成。
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
流程正式和AudioFlinger挂钩,并将创建特效的职责转给AudioFlinger,应用层作为一个客户端(Binder)。
Binder通信相关的流程略。
AudioFlinger.cpp
调用:sp<IEffect> AudioFlinger::createEffect
原本:
ThreadBase *thread = checkRecordThread_l(io);
sp<Client> client = registerPid_l(pid);
// create effect on selected output thread(音效是在线程上的)
handle = thread->createEffect_l(client, effectClient, priority, sessionId,
&desc, enabled, &lStatus);
被ice接管:
Paste_Image.pngThread 是根据线程id在线程池中得到的。
int threadidx = FastMixSessionIdToThreadIdx(sessionId); 线程id生成方式
thread = mPlaybackThreads.valueAt(threadidx);
thread->createEffect_l()在线程上创建音效;
Threads.cpp
createEffect_l中创建了效果链,并把new EffectModule(this,chain, desc, id, sessionId)加入效果链。
——frameworks/av/services/audioflinger/Threads.cpp
创建effect handle连接effect module
Paste_Image.png返回handle,他是effect实例在上层的一个代理类,操控effect实例。
在AudioFlinger::PlaybackThread::threadLoop()中
Paste_Image.png启用音效。
effects.cpp
EffectModule的构造函数中调用了EffectFactory的EffectCreate方法来创建音效实例。——frameworks/av/services/audioflinger/Effects.cpp
//从effectfactory中得到特效实例
Paste_Image.png在这里就发现没有什么内部类,派生类,因为工厂类是c写的。
EffectsFactory.c
EffectCreate中枚举并创建了具体的效果类。
/frameworks/av/media/libeffects/factory/EffectsFactory.c
从library中创建effect
Paste_Image.png这些库是由system/etc/audio_effects.conf这个配置文件中声明。加载该文件的地方有两个,一个是libeffect.so的EffectsFactory类,另外一个是libaudioflinger.so中的AudioPolicyService类。类工厂EffectsFactory使用了两个链表分别保存了lib和每个效果的结构体。
在运行的时候调用innit()函数,打AUDIO_EFFECT_DEFAULT_CONFIG_FILE目录,读取so文件,并且对这些库逐个调用loadLibrary解析出库文件的函数符号以及音效描述符,将这些信息添加到循环链表的节点上。
存放到列表中,为上面调用。
Libeffect.so也就是EffectFactory是在init()中加载的。
libraries指明了库的加载路径,默认是在/system/lib/soundfx/目录下。
effects包含了该系统支持的所有音效,音效所使用的库,以及音效的uuid。
有了这些信息,就可以创建音效实例了。
创建方法为ret =l->desc->create_effect(uuid, sessionId, ioId, &itfe);
注意:此处的itfe就是创造出来的音效实例。
从而调用类工厂EffectsFactory的EffectQueryNumberEffects查询并调用EffectQueryEffect创建Effect的对象。
根据UID从LIb中得到一个object对象为effect实例。
Paste_Image.pngC:
当创建一个音效时,由上层传入UUID到EffectsFactory中链表保存的音效中查询获得,在构造AudioEffect的构造函数中,根据Effect的UUID调用AudioFlinger的createEffect函数,从而调用类工厂EffectsFactory的EffectQueryNumberEffects查询喝EffectQueryEffect创建Effect的对象。