关于音频的输出通路,可以有多重选择:HDMI-out,喇叭,耳机,LINE-in,USB声卡,蓝牙等,切换不同的通路音频就从不同的通路输出或者录入,这里主要以HDMIin为例来简单说一下相关AUDIO通路方面的内容。

RK3399 HDMI IN声卡通路选择

当前RK3399有三路i2s通道,HDMIOUT音频通路芯片内置为i2s2。当前RK3399 开发板上的音频芯片还有蓝牙、rt5651、tc358749,音频通路配置如下:

RK3399 I2S2 没有使用来作为蓝牙通话,则可以 TC358749 I2S 接口接到 RK3399的单独一个 I2S 上(I2S/PCM 不能跟其他 I2S 设备共用,否则造成 I2S 信号的干扰,声音有杂音),另外的 I2S 接口接 codec 通过功放输出 ANDROID 系统声音。

RK3399 HDMI IN 声卡通路配置

通路1:HDMIIn –> RK3399 I2S1- > RK3399 HDMI TX -> HDMI 电视机
通路2:HDMIIn –> RK3399 I2S1- > RK3399 I2S0 -> CODEC ->hp/Speaker

TC358749 I2S 信号送给 RK3399 录音,然后 RK3399 在通过播放给 HDMI TX 输出,需要注册两个声卡,TC358749 声卡,以及HDMI audio out 声卡,系统默认已经有HDMI audio out 注册,需要dts中开启即可,TC358749 需要再重新写一个声卡驱动。

RK3399 HDMI IN内核实现方案

该部分的总体思路是,注册东芝 tc358749x 芯片(约定以下简称 749 侧)声卡,当声卡成功注册后,打开 hdmiin apk 时,能用 tinyalsa 工具正常的进行录(tinycap)播(tinyplay)时,此部分即可调通。
rk3399 具有三组I2S 控制器,所以在硬件上连接方式有所不同。根据应用场景的不同,当 749 侧的 I2S 连接到cpu 或 codec 的 I2S 时,需区分 I2S 的主从模式,一般来说,由于 749 侧只能作为 master 模式,所以当和 749 侧连接的另一侧,则需要配置为 slave 模式

Android 7.1/ kernel 4.4 的 的 I2S M/S

4.4 内核使用了 simple-card 通用的 machine 驱动进行声卡的注册,为了配置主控的 I2S为 slave 模式。

    配置文件:arch/arm64/boot/dts/rockchip/rk3399-box-rev2-ne4000.dtstc358749x_sound:tc358749x-sound {compatible = "simple-audio-card";simple-audio-card,format = "i2s";simple-audio-card,name = "rockchip,tc358749x-codec";simple-audio-card,bitclock-master = <&sound0_master>;simple-audio-card,frame-master = <&sound0_master>;simple-audio-card,cpu {sound-dai = <&spdif>;sound-dai = <&i2s1>;};sound0_master: simple-audio-card,codec {sound-dai = <&tc358749x>;};};对于rk3399具有多组 I2S 的平台,注册声卡的方式是把 749 和 codec注册成一张声卡,压缩包补丁默认是用这种方式注册的。rt5651-sound {status = "disabled";};hdmiin-sound {compatible = "rockchip,rockchip-rt5651-tc358749x-sound";rockchip,cpu = <&i2s0 &i2s1>;rockchip,codec = <&rt5651 &tc358749x>;status = "okay";};原dts中未对tc358749对应的i2s做配置,添加i2s1配置+&i2s1 {status = "okay";rockchip,i2s-broken-burst-len;rockchip,playback-channels = <2>;rockchip,capture-channels = <2>;#sound-dai-cells = <0>;};当前tc358749芯片挂在i2c1下面,在i2c1下面配置tc358749tc358749x: tc358749x@0f {#sound-dai-cells = <0>;compatible = "toshiba,tc358749x";reg = <0x0f>;power-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>; //GPIO4_A7stanby-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; //GPIO3_C0 change to GPIO1_B5reset-gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>; //GPIO3_D6int-gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>; //GPIO4_A5pinctrl-names = "default";pinctrl-0 = <&hdmiin_gpios>;status = "okay";};添加当前音频配置方案,需修改音频驱动代码,根据RK提供修改方案进行修改

#测试驱动是否正常
1、tool & cmds :
mmm external/tinyalsa/ [ tinymix tinyplay tinycap ] //从sdk源码中编译出tinyalsa测试工具

    当前系统提供tinyalsa音频测试工具可直接用于音频测试tinymix         音频通路配置tinypcminfo     用于查看pcm通道的相关信息tinyplay        播放音频tinycap         录音(默认情况下该工具不安装,需在external/tinyalsa目录下编译才会生成)录音:tinycap 001.wav -D 1 -d 1001.wav 音频文件(tinycap只能录到wav格式的音频文件)-D  声卡 number-d  pcm number结束录音用 ctrl+c 组合键结束
播放: tinyplay 001.wav -D 0 -d 0

调试注意事项

在测试HDMI IN录音时出现无法录音的情况,检查后发现在i2s1的配置中出现GPIO口复用,需将复用的GPIO口注掉:
      i2s1 {i2s1_2ch_bus: i2s1-2ch-bus {rockchip,pins =<4 3 RK_FUNC_1 &pcfg_pull_none>,<4 4 RK_FUNC_1 &pcfg_pull_none>,//<4 5 RK_FUNC_1 &pcfg_pull_none>,<4 6 RK_FUNC_1 &pcfg_pull_none>;//<4 7 RK_FUNC_1 &pcfg_pull_none>;};};

问题调试排查的一些方法

1、通过cat /proc/asound/cards确认声卡有没有注册上

 rk3399_mid:/ # cat /proc/asound/cards0 [rkhdmidpsound  ]: rk-hdmi-dp-soun - rk-hdmi-dp-soundrk-hdmi-dp-sound1 [realtekrt5651co]: realtekrt5651co - realtekrt5651codec_hdmiinrealtekrt5651codec_hdmiin

2、查看当前声卡设备:

        rk3399_mid:/ # ls /dev/snd/                                              controlC0 controlC1 pcmC0D0p pcmC1D0c pcmC1D0p pcmC1D1c timer p   播放设备c   录音设备HDMI out:pcmC0D0pcodec : pcmC1D0c pcmC1D0pHDMI IN : pcmC1D1c

3、tc358749 连接到cpu的某组i2s,其对应的pcm设备在某声卡某pcm下,比如”pcmC1D0c”,说明749对应的pcm设备在声卡1,pcm号为0,则先打开 hdmiin apk,可以这样录音:

tinycap /sdcard/test.wav -D 1 -d 0 -c 2 -r 44100 -b 16

-D:声卡 number
-d:pcm number

结束录音用 ctrl+c 组合键结束。 注:不能用 windows 的 cmd 命令窗口进行 ctrl+c 结束 。录音结束后,拷贝 test.wav 出来看看是否正常录到音。如果没有的话,确认声卡注册成功,用示波器量 tc358749 端的 i2s 信号,SDO 脚是否有信号,没有的找东芝的 FAE 咨询。

4、常用查看声卡状态和信息info 的命令操作:

 cat /proc/asound/card*/pcm*/sub*/status |grep 'stat|close' -EC1cat /proc/asound/card*/pcm*/sub*/info|grep id -C1|grep name -vcat /proc/asound/card*/pcm*/sub*/info
rk3288:/ $ cat /proc/asound/card*/pcm*/sub*/info
card: 0
device: 0 //输入设备类型
subdevice: 0
stream: CAPTURE //录音设备
id: RT5651 PCM rt5651-aif1-0
name:
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1
card: 0
device: 0 //输出设备类型
subdevice: 0
stream: PLAYBACK //放音设备
id: RT5651 PCM rt5651-aif1-0
name:
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1

RK3399 HDMIIN HAL层实现方案

    HAL 层的实现是基于音频驱动已经调好的情况下来实现的,其基本思路是用 alsa-soc lib的API 来做的,主要API如下:1. pcm_open打开指定声卡下的 pcm 设备2. pcm_frames_to_bytes返回读回帧数的总大小用字节3. pcm_read读音频数据4. pcm_wirte写音频数据5. pcm_close关闭 pcm 设备

一般的编程步骤都是按 linux 的编程习惯统一调用界面来的,也即:pcm_open - > pcm_write/
pcm_read -> pcm_close
综上,HAL 层要做的便是按上面顺序进行的,pcm_read 从某声卡 pcm 设备读取音频数据,也即是对 749 声卡进行录音,pcm_write 把读到的音频数据写到某声卡中去,也即是把得到 749的音频数据通过这张声卡播放,具体的业务逻辑依据实际需求而定。

HAL层对HDMIIN的音频通路做了单独的处理,同时对上层apk进行了修改,根据RK提供的补丁处理上层音频通路

分析HAL层log

logcat -s AudioHardwareTiny audio_hw_hdmiin alsa_route

RK3399 HDMIIN音频采样率

当前HDMIIN可读取的音频采样率为44.1khz,还无法适配其他采样率,当其他音频采样率接入时,录取的声音会出现断断续续的状态,根据RK提供的补丁进行修改

hal部分 相关函数说明

调试阶段,单独编译mmm hardware/rockchip/audio/tinyalsa_hal/ 得到
audio.primary.rk30board.so,push进机器验证即可。

out/target/product/rk3288/vendor/lib/hw/audio.primary.rk30board.so

hardware/rockchip/audio/tinyalsa_hal/audio_hw.c文件中start_output_stream函数为判断输出(声音输出)设备类型,选择音频输出通路:
根据out-> device 类型判断
if (out->device & (AUDIO_DEVICE_OUT_AUX_DIGITAL)

然后选择使用音频路由输出:
card = adev->out_card[SND_OUT_SOUND_CARD_HDMI];

然后对应打开哪张声卡:
out->pcm[SND_OUT_SOUND_CARD_HDMI]=pcm_open(card,PCM_DEVICE_HDMIOUT, PCM_OUT | PCM_MONOTONIC, &out->config);

hardware/rockchip/audio/tinyalsa_hal/audio_hw.c文件中start_input_stream函数为判断输入(声音录入)设备类型,选择音频输入通路。

audio_hw.c文件中read_in_sound_card 接口 //从节点获取声卡信息:
file = fopen(SND_CARDS_NODE,“r”);
while(get_line(file,buf,sizeof(buf)) >= 0){
if(is_mic_in_sound_card(buf)){
device->in_card[SND_IN_SOUND_CARD_MIC] = get_card_number(buf);
}

audio_hw.c文件的 adev_set_parameters 函数会去获取一些属性参数,然后设置走哪个route,route的宏定义在alsa_audio.h文件。

然后在adev_set_parameters中调用str_parms_get_str获取对应字符串的属性(下面的例子是获取字符串HDMIin_enable的属性,该属性在apk中调用原生的接口

AudioManager.setParameters("HDMIin_enable=true")):3060     /* HDMIin enable/disable */
3061     val = str_parms_get_str(parms, "HDMIin_enable", value, sizeof(value));
3062     if (0 <= val) {3063         if (strcmp(value, "true") == 0) {3064              ALOGD("\n##[czd]%s:-------- HDMIin_enable(%s) ---------##\n\n", __func__, value);
3065             adev->hdmiin_state = true;
3066             //route_pcm_open(HDMI_IN_NORMAL_ROUTE);
3067             route_pcm_open(HDMI_IN_CAPTURE_ROUTE);
3068             ALOGD("Enable HDMIin");
3069         } else if (strcmp(value, "false") == 0) {3070              ALOGD("\n##[czd]%s:-------- HDMIin_disable(%s) ---------##\n\n", __func__, value);
3071             route_pcm_open(HDMI_IN_OFF_ROUTE);
3072             adev->hdmiin_state = false;
3073             ALOGD("Disable HDMIin");
3074         } else {3075              ALOGD("\n##[czd]%s:-------- HDMIin_enable(%s) ---------##\n\n", __func__, value);
3076             ALOGE("Unknown HDMIin state %s!!!", value);
3077             ret = -EINVAL;
3078         }
3079     }

rk3399_android7.1音频通路相关说明相关推荐

  1. 简单聊一下Android音频通路的切换

    Android支持多种设备的的输出.一台正常的机子,本身就自带话筒,扬声器,麦克风等多个声音输入输出设备,再加上五花八门的外置设备(通过耳机,蓝牙,wifi等方式连接),使声音的输出更具多样性.And ...

  2. Qualcomm Audio HAL 音频通路设置

    1. 音频框图概述 | Front End PCMs | SoC DSP | Back End DAIs | Audio devices |************* PCM0 <------- ...

  3. Qualcomm Audio HAL 音频通路设置(基于8996平台)

    1. 音频框图概述 | Front End PCMs | SoC DSP | Back End DAIs | Audio devices |************* PCM0 <------- ...

  4. Qualcomm Audio HAL 音频通路设置【转】

    本文转载自:https://blog.csdn.net/azloong/article/details/79383323 1. 音频框图概述 | Front End PCMs | SoC DSP | ...

  5. 智能音箱 之 音频通路质量--测试与参数

    一.概述 当将语音识别算法接入到设备时,务必要保证设备的音频通路具有足够的质量.因此对设备进行音频测试,以评估能够影响语音识别性能的音频前端的音频参数.如下要点对语音识别至关重要: 自然声音 合适的增 ...

  6. MATLAB 与 音频处理 相关内容摘记

    原文地址为: MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 1 MATLAB 音频相关函数 1 MATLAB 处理音频信 ...

  7. 02 Cadence Tensilica Xtensa HiFi 音频解码器相关介绍

    <Cadence Tensilica Xtensa HiFi 音频解码器相关介绍> 作者 将狼才鲸 日期 2022-01-13 Cadence HiFi名词解释:Cadence Tensi ...

  8. RK Audio HAL 音频通路设置与Codec原理

    由 b178903294创建, 最后修改于3月 18, 2020 一个平板项目中采用螃蟹卡ALC56561 作为硬件codec.由于声音播放前后过程中有pop声,所以对其硬件原理和驱动控制做了一番研究 ...

  9. 我的收藏 - 音频处理相关网站

    自己平时用chrome浏览器,用Google帐号同步标签,但有时还是容易丢失一些网址,因此做个简单的同步! 慢慢更新中... === 音频相关算法 === http://www.jjj.de/fxt/ ...

  10. 安卓音频处理相关资料集合贴

    ## 1 音频处理基础知识 ### 1.1 文件格式和编码之间的关系 首先需要说明的是,文件格式和编码之间的关系如同碗与烹饪手法之间的关系. 文件格式只代表一个容器,这个容器可以包含视频或者音频,以及 ...

最新文章

  1. ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
  2. CVPR 2018 Siam-RPN:《High Performance Visual Tracking with Siamese Region Proposal Network》论文笔记
  3. [BZOJ3874/AHOI2014]宅男计划
  4. C# winform窗体 ComboBox控件
  5. 2021年春季学期期末统一考试 高级财务会计 试题
  6. qq接入和分享android,Android社交登录授权、分享SDK,支持微信、微博和QQ
  7. Flex 布局实例教程
  8. Struts2之ajax初析
  9. java 代码走查_代码走查如何保证软件质量
  10. 深度学习用于图像/视频增强的损失函数(loss)及评价指标
  11. Hi Developer,您有一份来自华为云学院的微服务开发攻略请查收
  12. 迈克尔·霍利:当我看到人们急着加入新行列、抛弃高度发展的老技术时,我就感到很伤心
  13. LinkedIn高级分析师王益:大数据时代的理想主义和现实主义(图灵访谈)
  14. azkaban报Error Chunking during uploading files to db
  15. 《预训练周刊》第66期:智源2022大模型创新论坛、 ChatGPT手把手debug代码、AI与物理的交融...
  16. 上海高二物理公式整理
  17. 是德科技34461a万用表
  18. opencv 去除背景
  19. 【电力电子技术】电力电子器件:概述
  20. 网站盈利的10种方式

热门文章

  1. 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的错误问题
  2. Linux Vsftpd 连接超时解决方法(被动模式)
  3. 垃圾回收机制,是不是这样理解?
  4. 关于.net 页面提交后 css失效或者部分失效的问题
  5. 推荐系统数据稀疏性问题
  6. AAAI2021年,录用了165篇图神经网络相关论文,图网络究竟在研究什么?
  7. 上下求索——基于双向推理的多跳知识库问答技术
  8. 【关系抽取】从头来看关系抽取-远程监督来袭
  9. 【推荐系统】BERT4Rec:使用Bert进行序列推荐
  10. 【精华版】cw2vec理论及其实现