Android AudioEffect音效移植

Android AudioEffect 音效方案 Android2.3 增加了对音频混响的支持,通过 AudioEffect 可以方便地对 AudioTrack 和 MediaPlayer 播放的音乐进行音效控制。 Android 9.0 新增了用于 DynamicsProcessing 的 AudioEffect API,使用此类,我们可以构建基于通道的音频效果,包括各种类型的多个阶段,包括均衡,多频段压缩和限制。频段和活动阶段的数量是可配置的,并且大多数参数可以实时控制,例如增益、启动/释放时间、阈值等。...... 阅读详情
AI摘要

本文详细解析了Android AudioEffect构造流程,从Java调用JNI到C/C++实现,涉及配置文件、音效工厂、音效库加载和创建过程。同时介绍了如何自定义新音效库,如Visualizer的实现方式和步骤,以及如何在系统中注册和使用新音效。


原文链接:https://blog.youkuaiyun.com/wkw1125/article/details/65632960

AudioEffect构造流程跟踪
为了编写新的音效实现,需要了解Android底层在AudioEffect的底层实现:
在Java层new Equalizer();后,通过JNI进入底层C/C++的实现过程。在底层,通过层层调用,由音控中枢AudioFlinger.cpp负责音效的管理,在线程中使用音效工厂EffectFactory.c读取.conf配置文件完成音效实例的创建。

AudioEffect构造流程图


详细代码跟踪参考:安卓音效AudioEffect源码剖析1——构造流程
根据上文,我做了张图帮助理解,其中将涉及到的类、头文件的关系列出,并标明了代码路径方便查找。当然,图中只列出了构造流程的关键代码。

 这里写图片描述

音效工厂EffectsFactory.c中的EffectCreate方法中的三个调用:

// 从配置文件读取平台支持的音效信息
ret = init();
// 在支持的音效中查找是否有指定的音效type/uuid
ret = findEffect(NULL, uuid, &l, &d);
// 若有,则创建音效实例
ret = l->desc->create_effect(uuid, sessionId, ioId, &itfe);

配置文件路径
init()读取运行环境的音效配置文件,如果vendor/etc/audio_effects.conf存在则使用该配置,若不存在则使用系统的system/etc/audio_effects.conf。

配置文件的路径定义在
/system/media/audio_effects/include/audio_effects/audio_effects_conf.h,有以下值:

常量值顺序
AUDIO_EFFECT_VENDOR_CONFIG_FILEvendor/etc/audio_effects.conf优先
AUDIO_EFFECT_DEFAULT_CONFIG_FILEsystem/etc/audio_effects.conf其次


配置文件audio_effects.conf
audio_effects.conf配置文件内声明了平台所支持的音效库,新增音效库时需对该文件进行修改。
AOSP路径:/frameworks/av/media/libeffects/data/audio_effects.conf

配置内容如下:

#audio_effects.conf
libraries {
  ...
  bundle {
    path /system/lib/soundfx/libbundlewrapper.so
  }
  ...
}

effects {
  ...
  bassboost {
    library bundle
    uuid 8631f300-72e2-11df-b57e-0002a5d5c51b
  }
  equalizer {
    library bundle
    uuid ce772f20-847d-11df-bb17-0002a5d5c51b
  }
  ...

libraries指出了音效库.so文件路径,默认是在平台的/system/lib/soundfx/目录下,新增的音效库so也要放在此处。
effects定义了音效名、音效库、实现引擎uuid的关系。注意到,同一个音效库so可以包含多种音效引擎。

到此,Java层到底层C/C++层层调用,找到.so库完成对音效的创建。

两个关键头文件及结构体

android/hardware/libhardware/include/hardware/audio_effect.h

android/system/media/audio/include/system/audio_effect.h

定义了音效库接口,音效描述符以及音效控制接口,音效参数结构体等。

audio_effect_library_t   //定义了音效库的实现接口,每个音效库必须定义一个该结构体类型的变量,并命名为 AUDIO_EFFECT_LIBRARY_INFO_SYM,这样音效框架才能加载到。

effect_descriptor_t  //音效描述,名称、实现者、uuid、flags等

effect_interface_s  //该接口用于实际运行过程中,对音效的控制。如process执行数据处理,command向音效发命令或获取参数。

音效工厂 HAL接口

由于音效库加载和音效创建等都需要用到音效工厂HAL接口,这里简单介绍下。

AudioFlinger在构造过程中,会调用EffectsFactoryHalInterface::create(),执行到EffectFactoryHalHidl.cpp的createIEffectsFactorys(),调用getService()获取Hal进程的音效工厂实例,返回一个EffectFactoryHalHidl对象给AudioFlinger,保存在mEffectsFactoryHal变量中,后续通过mEffectsFactoryHal与HAL层工厂音效打交道。

音效库加载

音效库在EffectFactory.c的   init函数中加载,主要做两件事:

1、loadLibrarie,加载xml中的所有库文件

2、loadEffects,加载xml中的<effects>节点下配置的所有音效。

加载完成后会保存到gLibraryList指向的全局链表中,链表中每一个实体(lib_entry_t)代表一个音效库),lib_entry_t有一个成员属性effects,它也是一个链表,表示该音效库中所有的音效。在创建音效时,根据传入的uuid从该链表中查找对应的音效描述符desc,然后执行其creat_effect()。

音效的创建

音效的创建由应用层发起,涉及的模块从上到下依次为AudioEffect、AudioFlinger 、HalHidl、EffectsFactory和音效库。

音效数据处理

1、数据混音后,从mMixerBuffer拷贝到mEffectBuffer。

2、effectChains[i]->process_l 调用EffectBufferHalHidl对象的update方法,将数据拷贝到mAudioBuffer(AudioServer与HAL 音效线程的共享内存)。

3、在processImpl函数中,有主要分为两部分:

    3.1、调用prepareForProcessing函数,在HAL层创建线程PrecessThread,调用setProcessBuffers设置Buffer。这里只在第一次执行

   3.2 数据处理,这个是双端互相等待互相唤醒的过程。ProcessThread线程起来后,threadLoop()执行mEfGroup->wait(REQUEST_PROCESS_ALL)等待被唤醒。

AudioEffect音效库实现
公司导师要求做一个新的AudioEffect音效库实现音频的升降调,目前已经使用SoundTouch实现。
这里解读Android自带的音效库Visualizer实现,因为这个音效实现代码最为简约,模仿这个音效库容易写出新库。

Visualizer相关

Visualizer    路径
音效库.so    (运行平台)/system/lib/soundfx/libvisualizer.so
编译脚本    /frameworks/av/media/libeffects/visualizer/Android.mk
实现.cpp    /frameworks/av/media/libeffects/visualizer/EffectVisualizer.cpp
头文件.h    /system/media/audio_effects/include/audio_effects/effect_visualizer.h

创建新库的过程是编写EffectVisualizer.cpp实现effect_visualizer.h中的接口,并用编译脚本Android.mk编译为音效库libvisualizer.so。前3个对象是要编写的内容。

头文件effect_visualizer.h
#ifndef ANDROID_EFFECT_VISUALIZER_H_
#define ANDROID_EFFECT_VISUALIZER_H_

//------包含audio_effect.h,其中定义了音效库接口、音效控制接口
#include <hardware/audio_effect.h>

//------C/C++条件编译
#if __cplusplus
extern "C" {
#endif

//...省略...

//------参数常量,需要与Java中的定义保持同步(一致)
// to keep in sync with frameworks/base/media/java/android/media/audiofx/Visualizer.java
#define VISUALIZER_SCALING_MODE_NORMALIZED 0
#define VISUALIZER_SCALING_MODE_AS_PLAYED  1

//------音效参数枚举
//通过该参数进行对应控制,从Java层传进的参数序号正是与此对应
/* enumerated parameters for Visualizer effect */
typedef enum
{
    VISUALIZER_PARAM_CAPTURE_SIZE, // Sets the number PCM samples in the capture.
    VISUALIZER_PARAM_SCALING_MODE, // Sets the way the captured data is scaled
    VISUALIZER_PARAM_LATENCY,      // Informs the visualizer about the downstream latency
} t_visualizer_params;

//------音效控制命令
//audio_effect.h中已经预设了EFFECT_CMD_SET_PARAM等命令,此处是Visualizer自增的命令
/* commands */
typedef enum
{
    VISUALIZER_CMD_CAPTURE = EFFECT_CMD_FIRST_PROPRIETARY, // Gets the latest PCM capture.
}t_visualizer_cmds;

#if __cplusplus
}  // extern "C"
#endif

#endif /*ANDROID_EFFECT_VISUALIZER_H_*/

实现EffectVisualizer.cpp
#define LOG_TAG "EffectVisualizer"
//#define LOG_NDEBUG 0
#include <cutils/log.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <new>
#include <time.h>
#include <audio_effects/effect_visualizer.h> //包含头文件

extern "C" {

// effect_handle_t interface implementation for visualizer effect
extern const struct effect_interface_s gVisualizerInterface;

//------音效引擎描述结构体

//定义音效类型Type、实现引擎UUID、版本、连接模式、实现者等信息,与Java中的Descriptor类对应
//注意:在配置文件audio_effects.conf中effects的uuid元素是指实现引擎engine-uuid,而Java层的AudioEffect.java中定义的EFFECT_TYPE_XXX是音效类型effect-type。
//当AudioEffect.java的构造函数中只指定type参数(uuid参数为EFFECT_TYPE_NULL)时,系统自动查找该音效类型可用的实现引擎。若只指定uuid参数(type参数为EFFECT_TYPE_NULL)时,系统直接使用指定的音效实现引擎。

// Google Effect Type    : e46b26a0-dddd-11db-8afd-0002a5d5c51b
// Google Visualizer UUID: d069d9e0-8329-11df-9168-0002a5d5c51b
const effect_descriptor_t gVisualizerDescriptor = {
        {0xe46b26a0, 0xdddd, 0x11db, 0x8afd, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // effect-type 音效类型
        {0xd069d9e0, 0x8329, 0x11df, 0x9168, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // engine-uuid 实现引擎
        EFFECT_CONTROL_API_VERSION, //版本
        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST), //连接模式
        0, // CPU load
        1, // Data memory
        "Visualizer", // 音效名
        "The Android Open Source Project", //实现者
};

//------音效引擎状态
enum visualizer_state_e {
    VISUALIZER_STATE_UNINITIALIZED,//未初始化
    VISUALIZER_STATE_INITIALIZED,//已初始化
    VISUALIZER_STATE_ACTIVE,//激活
};

//------包装上下文
//持有一些处理对象
//***持有SoundTouch对象
struct VisualizerContext {
    const struct effect_interface_s *mItfe;
    effect_config_t mConfig;
    uint32_t mCaptureIdx;
    uint32_t mCaptureSize;
    uint32_t mScalingMode;
    uint8_t mState;
    uint8_t mLastCaptureIdx;
    uint32_t mLatency;
    struct timespec mBufferUpdateTime;
    uint8_t mCaptureBuf[CAPTURE_BUF_SIZE];
};

//------局部方法
//重置上下文
void Visualizer_reset(VisualizerContext *pContext)

//设置I/O配置:采样率、声道、格式等
int Visualizer_setConfig(VisualizerContext *pContext, effect_config_t *pConfig)

//依据配置初始化音效引擎
int Visualizer_init(VisualizerContext *pContext)


//------音效库接口实现

//每个音效库都必须有名为AUDIO_EFFECT_LIBRARY_INFO_SYM的audio_effect_library_t结构体,该结构体的定义位于audio_effect.h,它定义了音效库的5个音效处理函数指针。
//(按C/C++语法,该结构体的赋值应位于使用的5个函数指针定义之后,提前在这是为了为了方便理解)
audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = {
    tag : AUDIO_EFFECT_LIBRARY_TAG,
    version : EFFECT_LIBRARY_API_VERSION,
    name : "Visualizer Library",
    implementor : "The Android Open Source Project",
#if EFFECT_API_VERSION_MAJOR(EFFECT_LIBRARY_API_VERSION) <= 2
    query_num_effects : VisualizerLib_QueryNumberEffects,
    query_effect : VisualizerLib_QueryEffect,
#endif
    create_effect : VisualizerLib_Create,
    release_effect : VisualizerLib_Release,
    get_descriptor : VisualizerLib_GetDescriptor,
};
//该结构体中5个函数的定义分别为:

//音效库兼容性检查
//audio_effect_library_t的定义在audio_effect.h中,该结构体在Android4.3+时有发生变化,query_num_effects()和query_effect()被删除。如果希望做库兼容性,需要检测EFFECT_LIBRARY_API_VERSION
#if EFFECT_API_VERSION_MAJOR(EFFECT_LIBRARY_API_VERSION) <= 2
//查询音效数量(API版本检查)
int VisualizerLib_QueryNumberEffects(uint32_t *pNumEffects) 
//查询音效(API版本检查)
int VisualizerLib_QueryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
#endif

//创建音效库
int VisualizerLib_Create(const effect_uuid_t *uuid, int32_t sessionId, int32_t ioId, effect_handle_t *pHandle)
//释放音效库
int VisualizerLib_Release(effect_handle_t handle)
//获取音效描述(gVisualizerDescriptor)
int VisualizerLib_GetDescriptor(const effect_uuid_t *uuid, effect_descriptor_t *pDescriptor) 

//------音效控制接口实现

//音效控制接口effect_interface_s的实现
//effect_handle_s的定义位于audio_effect.h,定义了用于音效控制的3个函数指针
//(按C/C++语法,该结构体的赋值应位于使用的5个函数指针定义之后,提前在这是为了为了方便理解)
const struct effect_interface_s gVisualizerInterface = {
        Visualizer_process,//音效处理 函数指针
        Visualizer_command,//命令执行 函数指针
        Visualizer_getDescriptor,//获取音效描述 函数指针
        NULL,//见定义
};
//该结构体中3个函数的定义分别为:

//音效处理:对音频数据进行处理,实现具体效果
//***SoundTouch的处理应放在此处
int Visualizer_process(effect_handle_t self,audio_buffer_t *inBuffer, audio_buffer_t *outBuffer)

//执行命令:执行对音效的指定操作命令
int Visualizer_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, uint32_t *replySize, void *pReplyData) {
    VisualizerContext * pContext = (VisualizerContext *)self;
    int retsize;

    if (pContext == NULL || pContext->mState == VISUALIZER_STATE_UNINITIALIZED) {
        return -EINVAL;
    }

    switch (cmdCode) {//预设音效命令在audio_effect.h中定义
    case EFFECT_CMD_INIT://初始化
        if (pReplyData == NULL || *replySize != sizeof(int)) {
            return -EINVAL;
        }
        *(int *) pReplyData = Visualizer_init(pContext);
        break;
    case EFFECT_CMD_SET_CONFIG://配置
    case EFFECT_CMD_GET_CONFIG://读取配置
    case EFFECT_CMD_RESET://重置
    case EFFECT_CMD_ENABLE://启用
    case EFFECT_CMD_DISABLE://禁用
    case EFFECT_CMD_GET_PARAM: {//获取参数
        //...
        //根据传入的音效参数枚举,返回对应值
        switch (*(uint32_t *)p->data) {//(音效参数枚举在effect_visualizer.h中定义)
        case VISUALIZER_PARAM_CAPTURE_SIZE://音效参数之一
            ALOGV("get mCaptureSize = %d", pContext->mCaptureSize);
            *((uint32_t *)p->data + 1) = pContext->mCaptureSize;
            p->vsize = sizeof(uint32_t);
            *replySize += sizeof(uint32_t);
            break;
        case VISUALIZER_PARAM_SCALING_MODE://
        default://
        }
        } break;
    case EFFECT_CMD_SET_PARAM: {//设置参数
        //根据传入的音效参数枚举与值,设置参数
        switch (*(uint32_t *)p->data) {
        case VISUALIZER_PARAM_CAPTURE_SIZE://音效参数之一
            pContext->mCaptureSize = *((uint32_t *)p->data + 1);
            ALOGV("set mCaptureSize = %d", pContext->mCaptureSize);
            break;
        case VISUALIZER_PARAM_SCALING_MODE://
        case VISUALIZER_PARAM_LATENCY://
        default://
        }
        } break;
    case EFFECT_CMD_SET_DEVICE:
    case EFFECT_CMD_SET_VOLUME:
    case EFFECT_CMD_SET_AUDIO_MODE:
        break;

    //Visualizer自增的命令
    case VISUALIZER_CMD_CAPTURE:
        //...
        break;
    default://
    }

    return 0;
}

//获取音效描述(gVisualizerDescriptor)
//与int VisualizerLib_GetDescriptor(const effect_uuid_t *uuid, effect_descriptor_t *pDescriptor) 不同
int Visualizer_getDescriptor(effect_handle_t self, effect_descriptor_t *pDescriptor)

编译脚本Android.mk
LOCAL_PATH:= $(call my-dir)

# Visualizer library
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
    EffectVisualizer.cpp #实现源码.cpp

LOCAL_CFLAGS+= -O2

LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libdl 

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/soundfx #编译出so的输出位置,默认/system/lib/soundfx/
LOCAL_MODULE:= libvisualizer #so库名:libvisualizer.so

LOCAL_C_INCLUDES := \
    $(call include-path-for, graphics corecg) \
    $(call include-path-for, audio-effects) # 调用宏定义函数批量引入库,audio-effects的定义位于/build/core/pathmap.mk,其值为system/media/audio_effects/include ,该位置包含了effect_visualizer.h

include $(BUILD_SHARED_LIBRARY)

编译音效库.so
将编写的音效文件EffectVisualizer.cpp、effect_visualizer.h、Android.mk置于AOSP的/external/目录下,使用Android.mk进行编译,成功的话会在/system/lib/soundfx/目录中生成libvisualizer.so。

P.S.
在NDK中编译音效库是不够的,缺乏audio_effect.h相关库。

编写中介类Visualizer.java
完成了底层的音效库实现后,在Java层编写对应的类进行调用。Visualizer.java只是“中介”,代码十分简单,继承音效基类AudioEffect.java,实现相关的调用即可。具体编写可参考: AudioEffect与Equalizer解析(Java侧)中对中介类的解读。

type和uuid的区别?
对于Android预设的Equalizer等音效,在AudioEffect基类中定义的EFFECT_TYPE_EQUALIZER对应底层音效引擎.cpp中effect_descriptor_t结构体的type字段。因此,在Equalizer等预设音效类的构造函数中,均指定type参数而将uuid参数指定为EFFECT_TYPE_NULL,如:

public Equalizer(int priority, int audioSession)
    throws IllegalStateException, IllegalArgumentException,
           UnsupportedOperationException, RuntimeException {
        super(EFFECT_TYPE_EQUALIZER, EFFECT_TYPE_NULL, priority, audioSession);

按我的理解,如果只指定type,系统会自动查找支持该type音效的一个音效引擎进行实现;如果只指定uuid,那么不管是什么类型的音效,系统直接使用指定uuid的引擎进行实现。一开始在这上面弄糊涂了,导致系统一直找不到编写好的音效库。

如何使用@hide?
在Java层继承AudioEffect实现新的音效中介类时,会遇到AudioEffect的几乎所有的public字段、方法都被@hide 标记导致无法在子类中调用的问题。

原因与解决方法参考:Android中使用@hide成员

导入classes.jar包(注意:要勾上System library(addedto the boot class path),否则“Java heap space”爆满)
Java反射机制
修改配置文件audio_effects.conf
如果只是单独编译了新的音效库用于现有Android平台(手机)的使用,那么需要修改平台的system/etc/audio_effects.conf配置文件,加入新音效库的.so库路径以及新音效的effect uuid。
(猜测)如果是重编译整个Android版本的话,修改/frameworks/av/media/libeffects/data/audio_effects.conf文件后进行编译即可自动修改平台运行配置文件。

在手机上使用新音效
假设单独编译了新音效库libnew.so,也正确编写新应用.apk,那么要在手机上让新音效库生效,需要以下步骤:

将新音效库libnew.so放到/system/lib/soundfx/目录下
修改配置文件:system/etc/audio_effects.conf,加入新音效库路径path以及effect uuid
重启手机,运行apk
P.S.
修改手机system/下目录和文件需要root权限

#手机root后:
adb root  #进入root模式,$变#
adb remount  #重新挂载system目录
adb shell cp ...  #复制新内容到指定位置

参考
安卓音效AudioEffect源码剖析1——构造流程_xiaoyur347的博客-优快云博客_audioeffect
安卓音效AudioEffect源码剖析2——音效库接口_xiaoyur347的博客-优快云博客
Android Audio Effect 机制初探_pengcao89的博客-优快云博客_audioeffect
新浪博客
AudioEffect与Equalizer解析(Java侧)_wkw1125的博客-优快云博客_equalizer.java
Android中使用@hide成员_wkw1125的博客-优快云博客_android hide

Android audio系统六 AudioEffect音效加载 Android 的 AudioEffect 是音频后处理的核心框架,用于实现均衡器(EQ)、虚拟器(Virtualizer)、重低音(BassBoost)等音效。应用层(AudioEffect API) ↓JNI 层(android_media_AudioEffect.cpp) ↓Native 层(AudioEffect.cpp / Effect.cpp) ↓HAL 层(audio_effects.conf / 厂商实现)(1) 实现音效处理模块// 实现音效算法(如 FIR 滤波、动态范围控制) 阅读详情

相关推荐

Android音效开发实战:从AudioEffect到DSP的完整避坑指南

本文深入探讨Android音效开发的全流程,从基础的AudioEffect框架到高性能DSP集成,提供实战经验和避坑指南。涵盖音效配置、性能优化、DSP集成及兼容性处理等关键环节,帮助开发者提升音频处理能力,优化用户体验。

weixin_29178069的博客 418

android audio effects框架笔记

android audio effects框架笔记 标签(空格分隔): android sound effect android audio effects框架笔记 1 相关类及成员说明 1.1 AudioPolicyService类 1.2 AudioPolicyEffects类 1.3 audioEffect相关 1.3.1 audioEffect的创建位置 1.3.2 audio...

whshiyun的专栏 8758

Android音效API:AudioEffect中文API与应用示例

AudioEffect API是Android提供的一个用于音频效果处理的API。它允许开发者在音频流上应用各种音效,如均衡器、环绕音、混响等。通过使用AudioEffect API,开发者可以改变音频的声音特性,增强音频的质量,为用户提供更好的听觉体验。

2301_79331230的博客 587

Android Audio Effect 机制初探

Android Audio Effect Android 原生Audio Effect框架

caopeng的专栏 1万+

OTA包解析与杜比蝰蛇音效提取移植全攻略

在Android系统定制与ROM开发中,OTA升级包是固件分发与功能增强的核心载体。无论是传统zip结构还是新版A/B分区中的payload.bin,都隐藏着系统级音效模块的完整实现。理解OTA包的解构原理,是提取杜比音效、蝰蛇音效等音频增强框架的前提。本文从OTA包的类型判断入手,介绍使用payload-dumper-go、simg2img等工具解析分区镜像的方法,并围绕audio_effects.xml配置、SELinux上下文、32/64位音效库匹配等关键点,梳理音效模块提取、移植与排错的完整流程。无

weixin_28703507的博客 313

AEQ:AEQ-Android AudioEffect EQ

AEQ-Android AudioEffect EQ 一种将Android强大的音频增强功能与任何音乐(音频)应用程序结合使用的简便方法。 适用于Google Nexus和Pixel设备。 屏幕截图 支持 功能要求和错误:请。 归因 AEQ使用: 执照 版权所有 该文件是AEQ的一部分。 AEQ是免费软件:您可以根据自由软件基金会发布的GNU通用公共许可的条款(许可的版本3)或(根据您的判断)任何更高版本来重新分发和/或修改它。 分发AEQ的目的是希望它会有用,但不作任何担保; 甚至没有对适销性或特定用途适用性的暗示保证。 有关更多详细信息,请参见GNU通用公共许可证。 您应该已经与AEQ一起收到了GNU通用公共许可证的副本。 如果没有,请参阅 。 商标 Android是Google Inc.的商标。 版权所有(c)2017 Andrew Wright(andDevW)

Android Audio Effect

关系图。

zhang_jia_quan的博客 2270

DFT实训教程笔记2(bibili版本)- Scan synthesis practice

文章目录Scan synthesis practice 本博文是博主记录DFT实训教程的笔记版本,此笔记并没有对所有的知识进行记录,仅仅以自身的认知水平,来记录了一些部分笔记并加上了自己的理解。 Scan synthesis practice How to design scan clock structure? 假设一块chip里面有好几十个clock domain,如果每一个clock domain都用一个scan clock虽然会非常清晰,但是IO数目肯定不够用。 clock group: 1、no

ciscomonkey的博客 9082

Android Audio代码分析6 - AudioEffect

在看AudioSessionId相关代码的时候了解到,共用一个AudioSessionId的AudioTrack和MediaPlayer会共用一个AudioEffect。 今天就来看看AudioEffect是个什么东东。 看这个类的目的,主要是为了搞清楚AudioEffect是个什么东东。 打算重点看看类的介绍及其构造函数上。 *******************************...

mmdev 855

头歌工程实训答案-机器学习篇之手写体识别篇

第2关:激活函数'''x:负无穷到正无穷的实数'''if x<=0:return 0else:return x#***第3关:反向传播算法import os。

m0_71537260的博客 2518

采用MPU6050的手势遥控器

随着社会的发展与进步,电子产品日益更新,个人家庭迎来了越来越多的智能家电。然而,现在的智能电子设备产品的遥控器多数都是按键形的。操作繁琐不直观,学习成本大。并且对于有老人小孩的家庭,给他们的操作带来了巨大的障碍。手势遥控器是指利用简单的手势来指挥电子设备,获得便捷的操作体验。让家庭成员都可以享受科技发展带来的福利。MPU6050是一个运动传感器,内置陀螺仪,再由电子设备利用判断结果做出相应的响应即...

Sakura的博客小站 6602

什么是AudioEffect

这段时间接手 Android 音频子系统,相应 Framework 层的内容也让我在负责。这其中有一个叫 AudioEffect 的概念一直很困扰我,因为我之前一直是在底层开发转悠的,接触的都是 HAL、驱动、寄存器这些东西,里面也没看到过 AudioEffect 这种说法啊。按我之前的理解,音效的设定譬如均衡器、回声消除的配置应该是通过硬件来实现的,但在这 2 天解决一个 bug 的过程中,又看

一程山水一程歌 8381

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 642

Android13音频子系统分析(三)---音效算法集成框架

Android的音效架构中,将所有的音效算法全部挂载到AudioHAL进程中运行。根据音效算法应用的位置,可以分为三类:Track音效、Stream音效、Device音效。即:针对某一个Track的处理音效、针对某种StreamType的处理音效、针对某个Device的处理音效。在中我们已经看到,Track只是在APP层和AudioServer框架层中的概念,到了AudioHAL层已经没有Track的概念,只有Stream和Device。

余静江的博客 1万+

为什么我的 Spark Executor / Yarn Container 只有一个vCore?

在很多集群里,在关闭了Spark的DynamicAllocation的前提下(避免自动申请空闲资源,干扰测试结果),都会观察到:提交Spark作业时,申请 1 个 driver + n 个 executor 会在Yarn上会对应创建 n+1 个 container,但是每个container只有一个vCore,通过--driver-cores和--executor-cores设定的vCore数都未奏效。有人会因此错误的认为Yarn上的一个vCore对应一个Spark的executor,这是非常错误的,正确的

Laurence的技术博客 916

骑砍Ⅱ霸主MOD开发(5)-2D界面

本文介绍了2D界面开发的技术框架,主要包括以下内容: 2D界面架构:由多个GauntletLayer(菜单/对话框/定制页面)和SceneLayer(3D页面)组成,支持屏幕切换和管理。 GauntletLayer实现:采用Movie(HTML页面)+ViewModel(动态数据)模式,支持优先级管理、焦点控制和事件响应。 2D控件系统:包括颜色字体、坐标布局、背景图(Sprite/Texture)等配置方式,支持自定义控件开发。 定制化页面开发:详细说明了游戏菜单和对话框的实现方法,包括状态管理、事件回调

骑砍战团&霸主MOD开发 1181

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

一上层的API说明 二JNI以及配置文件相关文件 三交互 四音效驱动 五分析AudioEffect架构的意图 六代码以及控制说明 本篇文章,只研究架构,不谈具体音效的实现算法、 一,上层的API说明 这个可以参考google文档 本地文档路径: linux_x86/docs/reference/android/media/audiofx/AudioEffect.html 1.AudioEff...

Android系统攻城狮 4462

大数据安全 | 期末复习(上)| 补档

大数据定义:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

知识库搭建ing 2588

[Android] AudioEffect

[Android] AudioEffect架构:从上层调用到底层音效驱动 [Android] AudioEffect架构:从上层调用到底层音效驱动_Joymine的专栏-优快云博客 Android Audio Effect 机制初探 Android Audio Effect 机制初探_caopeng的专栏-优快云博客_audioeffect Android:AudioEffect——音乐特效控制 https://blog.youkuaiyun.com/qq_42192693/article/details/

menphyl的博客 1915

ABAP ALV 导出总被锁死为固定格式?把 Always Use Selected Format 一键重置到可选状态

摘要:SAP ALV报表导出时勾选"Always Use Selected Format"会导致导出格式被锁定,无法切换格式。文章分析该问题原因(系统持久化配置),提供用户自助解法(ALV list使用&RESET_EXCEL命令码,ALV grid通过右键菜单恢复弹窗),管理员治理方案(使用SALV_BS_ADMIN_MAINTAIN报表批量处理),并指出SAP_BASIS 7.02版本的特殊处理方式(需参考SAP Note 1716802和1590484)。最后给出排障清单,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 218

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android多媒体七:音乐的特效处理

Android提供了用于音乐播放时的音效控制器,比如均衡器、重低音以及显示音乐波形等。这些功能被定义在AudioEffect的子类中完成1: AcousticEchoCanceler:回声消除器 AutomaticGainControl:自动增强控制器 NoiseSuppressor:噪音抑制器 BassBoost:重低音调节器 Equalizer:均衡器 PresetReverb:预设音场控制器...

zk的博客 1561

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 音效,音效  |  Android 开源项目  |  Android Open Source Project

从 Android 11 开始,在为音频捕获或播放选择指定音频设备时,设备制造商可以自动附加和启用特定的音效。一项重大改进是,完全在音频 HAL(输入设备和输出设备之间的直接连接)之下实现的音频路径上插入的音效可以由音效框架控制。此功能主要面向汽车原始设备制造商 (OEM),但也可用于其他 Android 设备类型。一个示例应用是在通过音频 DSP 直接连接到免提时在 FM 调谐器输出中插入语音增...

weixin_36295010的博客 839

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android音效

  摘要:Android提供了一套音效处理的库,包括有BassBoost重低音,Equalizer均衡器,Virtualizer虚拟器,PresetReverb预置混响,EnvirenmentReverb环境音混响,Visaulizer可视化,downmix,preprocess(AGC(增益) AEC(回声消除) NS(噪声抑制))等。本文介绍音效库是如何从底层获取数据和为上层提供处理好的数据。...

weixin_30852419的博客 658

Android 之 AudioEffect

Java框架层:提供基础的AudioEffect控制类,不应该直接使用AudioEffect父类,而是使用具体音效实现的子类。C/C++ Native层:主要实现层,包含关键组件:• EffectModule:封装第三方音效引擎实现,控制process()/command()调用,管理音效状态机• EffectHandle:IEffect接口的具体实现,提供参数更新和状态跟踪• EffectChain:管理音效与audio session之间的关系。

aningxiaoxixi的博客 330

关于AudioEffect使用过程中的构造以及处理流程遇到的几个问题

最近遇到几个与AudioEffect相关的问题,在此记录下作为一个记忆总结 android系统中如果想使用自己开发或者第三方的音效算法,有一种比较简单的办法就是放到hal层的out_write接口中,这样做优点是简单,方便快速集成。还有标准的做法就是做成android标准的音效接口,上层应用就可以像使用android自带的音效一样来调用自己所添加的自定义音效。 如何实现自定义的音效库以及Aud...

和大伙儿去乘凉 4079

AudioEffect源码解析

 音效AudioEffect 如下图,应用程序开发者使用android.media.audiofx.AudioEffect来控制音效,它的子类包括:BassBoost, EnvironmentalReverb, Equalizer, PresetReverb, Virtualizer。 AudioEffect的接口如激活/去激活等,它将调用到JNI层,而JNI层将调用C++类AudioE

u011514076的专栏 1193
上一篇: STL与数据结构
下一篇: DSP优化
audiocool
博客等级 码龄9年 335粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值