本篇文章,只研究架构,不谈具体音效的实现算法、
一,上层的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 工厂-代理模式,这个比常用,而且较为复杂,下面细说
工厂代理使用音效的模式,调用架构如下