Platform: AIO-3399J

OS: Android 7.1

Kernel: v4.4.83

在开发完音频驱动后,通过tinyplay、tinycap测试音频驱动的播放和录音功能正常,但使用Android自带的APP进行播放和录音时,音频文件在播放时出现声音断断续续,一卡一卡的或类似“爆破”(Pop-Click)杂音的现象。开发音频的硬件抽象层的tinyalsa_hal的动态库audio.primary.rk30board.so,来修改pcm_config结构体参数的rate、period_size和period_count来改变dma的传输数据量。

1、Android下Tinyalsa的编译和使用方法

1、. build/envsetup.sh
2、mmm external/tinyalsa/
3、编译Android源码,将生成的tinyplay、tinycap和tinymix等工具打包到/system/bin/目录下
4、通过串口在开发板上测试播放和录音功能:
root@rk3366:/ # tinyplay /sdcard/3.wav -D 1 -d 0 -p 1024 -n 3
root@rk3366:/ # tinycap /sdcard/test.wav -D 1 -d 0 –p 1024 –n 3

2、添加firefly-rk3399-nougat/hardware/rockchip/audio的Android.mk

MY_LOCAL_PATH := $(call my-dir)
#false
AUDIO_FORCE_LEGACY=falseifeq ($(strip $(AUDIO_FORCE_LEGACY)), true)include $(MY_LOCAL_PATH)/legacy_hal/Android.mk
elseinclude $(MY_LOCAL_PATH)/tinyalsa_hal/Android.mk
endif

3、修改firefly-rk3399-nougat/hardware/rockchip/audio/tinyalsa_hal的Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := audio.primary.$(TARGET_BOARD_HARDWARE)
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \audio_hw.c \alsa_route.c \alsa_mixer.c \audio_hw_hdmi.c
LOCAL_C_INCLUDES += \external/tinyalsa/include \$(call include-path-for, audio-utils) \$(call include-path-for, audio-route) \$(call include-path-for, speex)LOCAL_CFLAGS := -Wno-unused-parameter
ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), box)
LOCAL_CFLAGS += -DBOX_HAL
endif
ifeq ($(strip $(TARGET_BOARD_PLATFORM)),rk3399)
LOCAL_CFLAGS += -DRK3399
endif
LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils libaudioroute libhardware_legacy
LOCAL_STATIC_LIBRARIES := libspeex
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= amix.c alsa_mixer.c
LOCAL_MODULE:= amix
LOCAL_SHARED_LIBRARIES := libc libcutils
LOCAL_MODULE_TAGS:= debug
include $(BUILD_EXECUTABLE)

4、编译tinyalsa_hal

vela@Apollo:/media/vela/nick/firefly-rk3399-nougat$ mmm hardware/rockchip/audio/tinyalsa_hal

5、将tinyalsa_hal生成的ami、audio.primary.rk30board.so(32/64位)拷贝到firefly-rk3399-nougat/vendor/rockchip/common/tinyalsa目录下

vela@Apollo:/media/vela/nick/firefly-rk3399-nougat/vendor/rockchip/common/tinyalsa$
1  cp out/target/product/rk3399_firefly_aio_box/system/bin/ami ./
2  cp ../../../../../../out/target/product/rk3399_firefly_aio_box/system/lib/hw/audio.primary.rk30board.so ./
3  cp ../../../../../../out/target/product/rk3399_firefly_aio_box/system/lib64/hw/audio.primary.rk30board.so ./

6、修改tinyalsa.mk

LOCAL_PATH := vendor/rockchip/common/tinyalsaPRODUCT_COPY_FILES += \$(LOCAL_PATH)/bin/amix:system/bin/amixPRODUCT_COPY_FILES += \$(LOCAL_PATH)/lib/hw/audio.primary.rk30board.so:system/lib/hw/audio.primary.rk30board.so PRODUCT_COPY_FILES += \$(LOCAL_PATH)/lib64/hw/audio.primary.rk30board.so:system/lib64/hw/audio.primary.rk30board.so

7、编译Android源码,发现可以播放但不能录音,通过make menuconfig配置内核

Device Drivers  --->
--- Sound card support --- Advanced Linux Sound Architecture--- ALSA for SoC audio support < >   ASoC support for Rockchip built-in HDMI and DP 

8、根据音频采样率修改(参考:基于RK3288解决Android5.1系统下音频Xrun(underrun或overrun)问题:https://blog.csdn.net/u010872301/article/details/84397167)

//修改HAL层的period_size 和 period_count路径...hardware/rockchip/audio/tinyalsa_hal/audio_hw.h
//播放
struct pcm_config pcm_config = {.channels = 2,.rate = 48000,.period_size = 2048,.period_count = 4,.format = PCM_FORMAT_S16_LE,};
//录音
struct pcm_config pcm_config_in = {.channels = 2,.rate = 48000,.period_size = 128,//1024.period_count = 32,//4.format = PCM_FORMAT_S16_LE,};

下载

https://download.csdn.net/download/u010872301/11251563

Android 音频tinyalsa开发相关推荐

  1. Android 音频技术开发总结

    转载地址:https://yq.aliyun.com/articles/8637 摘要: 在文章开头,我们先来了解几个概念,这样有利于对后面内容的理解. 1.概念理解 采样率:即采样频率,百科的解释是 ...

  2. android音频开发6,Android 音视频开发(一) : 通过三种方式绘制图片

    想要逐步入门音视频开发,就需要一步步的去学习整理,并积累.本文是音视频开发积累的第一篇. 对应的要学习的内容是:在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView ...

  3. Android音频开发(4):如何存储和解析wav文件

    2019独角兽企业重金招聘Python工程师标准>>> 无论是文字.图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图 ...

  4. Android音频开发(3):如何播放一帧音频

    本文重点关注如何在Android平台上播放一帧音频数据.阅读本文之前,建议先读一下<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的 ...

  5. Android音频开发(六)音频编解码之初识MediaCodec上

    前五篇我们介绍了关于音频的基础知识,今天来讲述一下音频的重点和难点部分,这一节依然是分上下俩个节点,深入讲述Android音频开发的编解码技术. 1.MediaCodec 介绍 MediaCodeC是 ...

  6. Android 音频开发(四) 如何播放一帧音频数据下

    再看这一篇文章前,如果你是小白,我建议你先看一下Android 音频开发(一) 基础入门篇这一篇.今天继续讲解如何通过Android SDK自带API实现播放一帧音频数据. 我们都知道,Android ...

  7. Android 音频开发(二) 采集一帧音频数据

    这一节主要介绍如何采集一帧音频数据,如果你对音频的基础概念比较陌生,建议看我的上一篇Android 音频开发(一) 基础入门篇.因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的基础知识后 ...

  8. Android 音频开发(一) 基础入门篇

    今天主要讲解下Android音频开发的入门知识,希望对想入门却不知如何下手的朋友有所帮助,同时希望能得到高手的指点和帮助. 深入细化基础技能知识点 大致细化如下10个知识点. 音频开发的主要应用有哪些 ...

  9. Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据

    一.实现说明 OpenSL ES的录音要比播放简单一些,在创建好引擎后,再创建好录音接口基本就可以录音了.在这里我们做的是流式录音,所以需要用至少2个buffer来缓存录制好的PCM数据,这里我们可以 ...

最新文章

  1. Singleton 单例模板
  2. CentOS软/硬RAID安装方法
  3. boost::mpl模块实现lambda相关的测试程序
  4. chromium浏览器_微软将全面向Windows 10用户推送Chromium版Edge浏览器
  5. 【技术贴】安装sql server 2005后不能连接服务器,没有studio express以及安
  6. 写出float x 与“零值”比较的if语句——一道面试题分析
  7. 记服务器系统安装中不识别固态硬盘问题
  8. windows 修改MySQL默认3306端口
  9. word参考文献[10]之后不对齐
  10. 看透网络执法官的本质
  11. 河北等保测评机构项目测评收费价格标准参考
  12. OpenCV:图像的基本操作之修改像素、拆分及合并RGB通道
  13. AI明星上市受阻,是继续融资还是割肉?
  14. 关于计算机的英语作文300字,关于电脑的英语作文集锦5篇
  15. 什么是iso认证周期,iso审核是一年一次吗?
  16. 关于跳跃连接 卷积网络
  17. 「文献解读」RNAi在油菜研究中的应用
  18. 招投标舞弊的22种方式及案例
  19. 骚操作,VSCode上发布知乎
  20. docsify 建立目录树脚本

热门文章

  1. 2015 年总结 - 十年
  2. 信号(signal)
  3. CentOS6.7安装Python3.4
  4. 浅谈设备租赁管理系统的选型之路
  5. DB2 常用的SQL
  6. mybatis和spring jdbc持久层框架事务支持分析
  7. 高性能微服务 Dubbo RPC Redis 分布式框架
  8. Android 开发工具集合 - (Android Dev Tools)
  9. OpenEphyra学习笔记1
  10. leecode - 入门 -- 双指针总结