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,
};
下载