美文网首页android高级
特效流程(audio effect)

特效流程(audio effect)

作者: 681b0d2bf597 | 来源:发表于2016-11-09 09:35 被阅读716次

    特效流程
    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的对象。

    相关文章

      网友评论

        本文标题:特效流程(audio effect)

        本文链接:https://www.haomeiwen.com/subject/hfvzuttx.html