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

这篇具有很好参考价值的文章主要介绍了RK3568平台 TinyAlsa集成第三方音频算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.tinyalsa介绍

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

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

        alsa包含:1、内核 alsa-driver 2.用户空间 alsa-lib(android使用的TinyAlsa)
RK3568平台 TinyAlsa集成第三方音频算法,瑞芯微,音视频

二.使用tinyplay测试音频

RK3568平台 TinyAlsa集成第三方音频算法,瑞芯微,音视频

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库:

RK3568平台 TinyAlsa集成第三方音频算法,瑞芯微,音视频

修改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.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

LOCAL_MODULE := audio.primary.$(TARGET_BOARD_HARDWARE)
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_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.c

LOCAL_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_iec958
ifneq (1, $(strip $(shell expr $(PLATFORM_SDK_VERSION) \< 31)))
LOCAL_SHARED_LIBRARIES += libtinyalsa_iec958
else
LOCAL_SHARED_LIBRARIES += libtinyalsa
endif

ifeq ($(strip $(BOARD_SUPPORT_MULTIAUDIO)), true)
LOCAL_CFLAGS += -DSUPPORT_MULTIAUDIO
endif

LOCAL_STATIC_LIBRARIES := libspeex
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_CFLAGS += -Wno-error
LOCAL_SRC_FILES:= amix.c alsa_mixer.c
LOCAL_MODULE:= amix
LOCAL_PROPRIETARY_MODULE := true
LOCAL_SHARED_LIBRARIES := liblog libc libcutils
include $(BUILD_EXECUTABLE)

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

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

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

main.cpp:

//#include <stdio.h>
#include <string>
#include <math.h>
#include <vector>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <memory>
#include <iostream>
#include <time.h>
//#include "wav_io.h"
#include "ElevocAIOTProcess.h"

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#include <sys/time.h>
#endif
#include <chrono>
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;
#endif
	while (true) {
		frm++;
		/*if (frm>=63*114)
		{
		printf("debug\n");
		}*/
		readSize = left_size < once_read ? left_size : once_read;
		if (readSize < once_read) {
			break;
		}
		fread(readBuffer, sizeof(int16_t), once_read, ifp);

		//start = clock();
#ifdef COUNT_ELAPSE
        auto startTime = std::chrono::system_clock::now();
#endif
        printf("guyilian elevoc_aiot_process_short start ...\n");
		elevoc_aiot_process_short(p, readBuffer, once_read* sizeof(short), outputBuffer);
		printf("guyilian elevoc_aiot_process_short end ...\n");

#ifdef COUNT_ELAPSE
        auto endTime = std::chrono::system_clock::now();
        std::chrono::duration<double, std::milli> elapse = endTime - startTime;
        double elapseDouble = elapse.count();
        if (elapseDouble > 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 < ELEV_FRMAE_SIZE; i++)
		{
			output[i] = (int16_t)(outputBuffer[i] * 1);
		}
		fwrite(output, sizeof(int16_t), ELEV_FRMAE_SIZE, pFout);
		left_size -= readSize;
	}
#ifdef COUNT_ELAPSE
    std::printf("each frame process avg = cost %f ms ,[min = %f][max = %f] \n",
                elapseSum / (double)frm, minElapse, maxElapse);
#endif
	printf("end ...\n");

	fclose(pFout);
}


int main() {
	//test();
	test_short();
	system("PAUSE");
	return 0;
}

Android: 



LOCAL_PATH := $(call my-dir)

LOCAL_C_INCLUDES += \
    elemain/ElevocAIOTProcess.h

include $(CLEAR_VARS)
LOCAL_CFLAGS += -Wno-error
LOCAL_SRC_FILES := \
	main.cpp
LOCAL_MODULE:= elemain
LOCAL_PROPRIETARY_MODULE := true
LOCAL_SHARED_LIBRARIES := liblog libc libcutils libElevocMeetingVoice
include $(BUILD_EXECUTABLE)

这样测试demo会被编译成可执行文件elemain。文章来源地址https://www.toymoban.com/news/detail-818732.html

到了这里,关于RK3568平台 TinyAlsa集成第三方音频算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot集成常用第三方框架-ES

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库

    2024年02月03日
    浏览(38)
  • 第三方平台创建小程序步骤

    创建小程序 第一步: 登录微信开放平台 https://open.weixin.qq.com/ 第二步: 找到图片对应的位置,复制 登录授权的发起页域名 第三步: 登录,如果不记得账号密码的话在开发平台的通知中心里面有消息提示中有默认的账号和密码 第四步: 选择开发辅助中的开发调试,获取 component_acces

    2024年02月09日
    浏览(52)
  • 微信开放平台之第三方平台开发,从哪里入手?

    大家好,我是悟空码字 疫情之下,最近有不少兄弟没有挺进决赛,半途成了小羊人,可谓是出师未捷身先死。话说回来,不管怎么样,尽量保护好自己,能越晚变羊越好。 开始说正事,不管是自己在创业或学习也好,还是公司的开发任务也罢,有很多小伙伴在开发多小程序

    2024年02月10日
    浏览(40)
  • 微信第三方平台对接小程序发版

    微信第三方平台是商家把公众号或小程序代交给服务商来管理, 当商家把小程序授权给第三方平台后,同时授权小程序开发与数据分析,小程序后台就无法发版 ,必须开发人员调小程序的api才能实现发版;如不需要调第三方平台接口的方式发布,取消 小程序开发与数据分析

    2024年02月16日
    浏览(62)
  • Xcode通过Add package自动集成第三方SDK问题汇总

    问题1:  解决方法:这个问题可能是因为 Adjust 或者 Facebook 的库当中依赖的某些类库的仓库地址是 git:// 协议,通过这种协议与 GitHub 通讯时会使用到你的 SSH 配置,你电脑上相关的 ssh key 使用了 GitHub 不再支持的格式,请参考提示中的网址重新生成相关的 SSH key:https://githu

    2024年02月13日
    浏览(27)
  • 海康威视iSC 平台第三方对接门禁权限分享

    一、 场景描述 iSC 平台的门禁产品及功能在项目应用广泛,第三方对接门禁权限功能的需求也越来也 多,由于门禁权限下发需要涉及到往设备上下发,第三方接口调用一旦不正确,不合理的接 口调用很容易给我们平台造成额外的性能消耗,甚至导致我们平台挂掉,特此梳理

    2024年02月02日
    浏览(255)
  • 京东数据分析工具推荐(京东第三方数据平台)

    京东平台的店铺众多,同行数不胜数。作为商家,如果连自己竞争对手的情况都不知道的话,很难在这个平台存活下去。 那么,这次鲸参谋就来重点说一下我们的京东数据分析工具里的“竞品分析”功能。 竞品分析,主要是对京东店铺运营期间竞争对手的市场经营状况与策略

    2024年02月04日
    浏览(43)
  • Android基于JNA集成调用第三方C/C++的so库

    Android基于JNA集成调用第三方C/C++的so库 (1)引入JNA。 基于JNA开源项目,JNA对Android NDK的封装,简化Android层JNI集成调用C/C++的so库。 GitHub - java-native-access/jna: Java Native Access Java Native Access. Contribute to java-native-access/jna development by creating an account on GitHub. https://github.com/java-native-ac

    2024年02月02日
    浏览(33)
  • Flink保姆级教程,超详细,教学集成多个第三方工具(从入门到精通)

    目录 一.Flink简介 Flink发展历程 Flink特性 二、Flink 部署及启动 1. 本地执行 (Local Execution) 2. Standalone 集群部署 2.1 会话模式(Session Mode) 2.2 单作业模式(Per-Job Mode)和应用模式(Application Mode) 3. 资源管理器集成部署 三.Flink架构和执行原理 Flink架构 任务槽和资源 Flink资源管

    2024年04月29日
    浏览(30)
  • 基于Docker部署OpenLDAP,同时集成第三方系统(GitLab、JIRA、Nexus、Harbor)

    这里可以了解什么是LDAP,为什么要用它 下面通过docker-compose一键部署openLDAP、phpldapadmin和self-service-password。(通过K8s部署的方式大同小异) 准备open-ldap的docker-compose文件 执行 docker-compose up 命令,就可以一键部署openldap、phpldapadmin(他就是openldap的操作页面)、self-service-passw

    2023年04月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包