小工具知识网

当前位置: 首页 > 行业知识 > RK3568平台 TinyAlsa集成第三方音频算法

行业知识

RK3568平台 TinyAlsa集成第三方音频算法

2026-11-07 05:11:09 来源:互联网转载

一.tinyalsa介绍

ALSA(Advanced Linux Sound Architecture)是一个开源项目,涵盖了用户空间和内核空间对音频设备的操作接口,通过应用层使用alsalib可以实现对音频设备的控制

        TinyAlsa是android推出的一个精简的ALSA库,当然alsa-driver这块没有改动

        alsa包含:1、内核 alsa-driver 2.用户空间 alsa-lib(android使用的TinyAlsa)

二.使用tinyplay测试音频

tinycap /data/test.wav -D pdm声卡号   -d 0 -c 10 -r 48000 -b 16 -p 1024 -n 4    //D 后面接pdm声卡的声卡号

三.在TinyAlsa集成第三方音频降

tinyalsa目录:

hardware\rockchip\audio\tinyalsa_hal\

第三方算法供应商提供的音频降噪算法so库:

修改Android:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libElevocMeetingVoice+LOCAL_SRC_FILES_32 := lib_out_honghe/armeabi-v7a/libElevocMeetingVoice.so+LOCAL_SRC_FILES_64 := lib_out_honghe/arm64-v8a/libElevocMeetingVoice.soLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_MODULE_SUFFIX := .soLOCAL_PROPRIETARY_MODULE := trueLOCAL_MULTILIB := bothinclude $(BUILD_PREBUILT)include $(CLEAR_VARS)LOCAL_MODULE := audio.primary.$(TARGET_BOARD_HARDWARE)LOCAL_PROPRIETARY_MODULE := trueLOCAL_MODULE_RELATIVE_PATH := hwLOCAL_SRC_FILES := \bitstream/audio_iec958.c \bitstream/audio_bitstream.c \bitstream/audio_bitstream_manager.c \audio_hw.c \alsa_route.c \alsa_mixer.c \voice_preprocess.c \audio_hw_hdmi.c \out_honghe.c \denoise/rkdenoise.cLOCAL_C_INCLUDES += \$(call include-path-for, audio-utils) \$(call include-path-for, audio-route) \$(call include-path-for, speex)LOCAL_CFLAGS += -Wno-error+LOCAL_SHARED_LIBRARIES := liblog libcutils libaudioutils libaudioroute +libhardware_legacy libspeexresampler libElevocMeetingVoice#API 31 -> Android 12.0, Android 12.0 link libtinyalsa_iec958ifneq (1, $(strip $(shell expr $(PLATFORM_SDK_VERSION) \ 

这样降噪音频算法so就集成在Android里面了。

一般算法供应商会提供调用的算法的demo供我们集成在tinyalsa里面。

四.使用算法供应商提供的demo测试音频

main.cpp:

//#include #include #include #include #include #include #include #include #include #include //#include "wav_io.h"#include "ElevocAIOTProcess.h"#ifdef _WIN32#include #else#include #include #endif#include using namespace std;#define ELEV_FRMAE_SIZE 256#define ELEV_MIC_NUM 8#define ELEV_REF_NUM 2#define ELEV_ALL_NUM (ELEV_MIC_NUM+ELEV_REF_NUM)static const char* fname_mdl = "./model-1477000--11.475842399597168_export_convert_mdl_q16.EM2";void test_short(){ELEVOC_AIOT_PROCESS* p = elevoc_aiot_init(fname_mdl);string record_filePath = "./";string input_path = record_filePath + "in.pcm";// "testg12_6ch_230815.raw";// "testg12_230815.raw";//  "testg12.raw"; //"testg12.raw";FILE* ifp = fopen(input_path.c_str(), "rb");size_t input_size = 0;if (ifp != NULL) {if (!fseek(ifp, 0, SEEK_END)) {input_size = ftell(ifp);fseek(ifp, 0, SEEK_SET);}}else {fprintf(stderr, "file open error\n");}printf("samplers : %zd\n", input_size / sizeof(float));string outPath = record_filePath + "out.pcm";FILE* pFout = fopen(outPath.c_str(), "wb");size_t once_read = ELEV_FRMAE_SIZE * ELEV_ALL_NUM;size_t left_size = input_size / sizeof(int16_t);size_t readSize = 0;int16_t readBuffer[ELEV_FRMAE_SIZE * ELEV_ALL_NUM];int16_t outputBuffer[ELEV_FRMAE_SIZE];int16_t output[ELEV_FRMAE_SIZE];printf("start ...\n");clock_t start, finish;double total_time;int frm = 0;#ifdef COUNT_ELAPSE    double elapseSum = 0;    double maxElapse = 0;    double minElapse = 100;#endifwhile (true) {frm++;/*if (frm>=63*114){printf("debug\n");}*/readSize = left_size  maxElapse) {            maxElapse = elapseDouble;        }        if (minElapse > elapseDouble) {            minElapse = elapseDouble;        }        elapseSum += elapseDouble;#endif//finish = clock();//long total_time = (finish - start);//printf("time %ld msec \n", total_time);for (int i = 0; i  

Android: 

LOCAL_PATH := $(call my-dir)LOCAL_C_INCLUDES += \    elemain/ElevocAIOTProcess.hinclude $(CLEAR_VARS)LOCAL_CFLAGS += -Wno-errorLOCAL_SRC_FILES := \main.cppLOCAL_MODULE:= elemainLOCAL_PROPRIETARY_MODULE := trueLOCAL_SHARED_LIBRARIES := liblog libc libcutils libElevocMeetingVoiceinclude $(BUILD_EXECUTABLE)

这样测试demo会被编译成可执行文件elemain。

上一篇:服务器怎么设置跨域头?

下一篇:宝塔面板备份操作详解,轻松上手备份使用指南!