android高级

特效流程(audio effect)

2016-11-09  本文已影响716人  681b0d2bf597

特效流程
AudioEffect.cpp
从AudioEffect.cpp开始,上层主要传入对应的特效so文件的uid,根据其他特效猜测。
AudioEffect(C++)的构造代码调用了set(),set()中进一步调用了audioFlinger->createEffect()来创建音效。
——frameworks/av/media/libmedia/AudioEffect.cpp

Paste_Image.png

进入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

Paste_Image.png

原本:
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.png

Thread 是根据线程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

Paste_Image.png Paste_Image.png Paste_Image.png

创建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

Paste_Image.png Paste_Image.png

从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解析出库文件的函数符号以及音效描述符,将这些信息添加到循环链表的节点上。

Paste_Image.png Paste_Image.png

存放到列表中,为上面调用。

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.png

C:
当创建一个音效时,由上层传入UUID到EffectsFactory中链表保存的音效中查询获得,在构造AudioEffect的构造函数中,根据Effect的UUID调用AudioFlinger的createEffect函数,从而调用类工厂EffectsFactory的EffectQueryNumberEffects查询喝EffectQueryEffect创建Effect的对象。

上一篇下一篇

猜你喜欢

热点阅读