Android 音频tinyalsa开发

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=false

ifeq ($(strip $(AUDIO_FORCE_LEGACY)), true)
    include $(MY_LOCAL_PATH)/legacy_hal/Android.mk
else
    include $(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/tinyalsa

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/bin/amix:system/bin/amix

PRODUCT_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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值