[Android] AudioEffect架构:从上层调用到底层音效驱动

本篇文章,只研究架构,不谈具体音效的实现算法、

一,上层的API说明

这个可以参考google文档
本地文档路径:

linux_x86/docs/reference/android/media/audiofx/AudioEffect.html

1.AudioEffect不可以直接使用,而需要实现其方法的子类,如Equlizer.java
2,每种音效都对应有一个UUID,具体请查阅AudioEffect.class中间的说明

二,JNI以及配置文件相关文件

源码:
就只有这个目录下面的两个文件:frameworks/base/media/jni/audioeffect/
android_media_Visualizer.cpp
android_media_AudioEffect.cpp


//android_media_AudioEffect.cpp 
// Dalvik VM type signatures
static const JNINativeMethod gMethods[] = {
    {
  "native_init",          "()V",      (void *)android_media_AudioEffect_native_init},
    {
  "native_setup",         "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;II[I[Ljava/lang/Object;Ljava/lang/String;)I",
                                         (void *)android_media_AudioEffect_native_setup},
    {
  "native_finalize",      "()V",      (void *)android_media_AudioEffect_native_finalize},
    {
  "native_release",       "()V",      (void *)android_media_AudioEffect_native_release},
    {
  "native_setEnabled",    "(Z)I",      (void *)android_media_AudioEffect_native_setEnabled},
    {
  "native_getEnabled",    "()Z",      (void *)android_media_AudioEffect_native_getEnabled},
    {
  "native_hasControl",    "()Z",      (void *)android_media_AudioEffect_native_hasControl},
    {
  "native_setParameter",  "(I[BI[B)I",  (void *)android_media_AudioEffect_native_setParameter},
    {
  "native_getParameter",  "(I[BI[B)I",  (void *)android_media_AudioEffect_native_getParameter},
    {
  "native_command",       "(II[BI[B)I", (void *)android_media_AudioEffect_native_command},
    {
  "native_query_effects", "()[Ljava/lang/Object;", (void *)android_media_AudioEffect_native_queryEffects},
    {
  "native_query_pre_processing", "(I)[Ljava/lang/Object;",
            (void *)android_media_AudioEffect_native_queryPreProcessings},
};

音效配置文件audio_effects.conf,可以看到音效的声明格式如下:

# Default pre-processing library. Add to audio_effect.conf "libraries" section if
# audio HAL implements support for default software audio pre-processing effects
#
#  pre_processing {
   
#    path /system/lib/soundfx/libaudiopreprocessing.so
#  } 说明对应音效的所在库文件

# list of effects to load. Each effect element must contain a "library" and a "uuid" element.
# The value of the "library" element must correspond to the name of one library element in the
# "libraries" element.
# The name of the effect element is indicative, only the value of the "uuid" element
# designates the effect.
# The uuid is the implementation specific UUID as specified by the effect vendor. This is not the
# generic effect type UUID.
#    effects {
   
#        <fx name> {
   
#            library <lib name>
#            uuid <effect uuid>
#        }
#        ...
#    }  这种声明的音效多为指定某一种效果,不需要proxy sw/hw库支持

effects {

# additions for the proxy implementation
# Proxy implementation
  #effectname {
    #library proxy
    #uuid  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

    # SW implemetation of the effect. Added as a node under the proxy to
    # indicate this as a sub effect.
      #libsw {
         #library libSW
         #uuid  yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
      #} End of SW effect

    # HW implementation of the effect. Added as a node under the proxy to
    # indicate this as a sub effect.
      #libhw {
         #library libHW
         #uuid  zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz
      #}End of HW effect
  #} End of effect proxy   工厂-代理模式,这个比常用,而且较为复杂,下面细说

工厂代理使用音效的模式,调用架构如下

Created with Raphaël 2.1.0 EffectFactory EffectFactory proxy proxy libsw libsw libhw libhw EffectProxyCreate effect_interface_s
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值