QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
432
查看: 88|回复: 4

Android(海思平台)实现HDMI和I2S同时输出音频

[复制链接]
最佳答案
0 
累计签到:2 天
连续签到:1 天
zhaohuarong 发表于 2017-12-7 17:05:08 884 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 zhaohuarong 于 2017-12-7 17:05 编辑

最近工作中需要在Android板上HDMI和I2S(喇叭)做声音切换输出。基本思路就是不使用Android原生的AudioTrack进行声音输出。使用封装的类进行声音的播放,进行两路同时输出,然后切换的时候每次将一个设备设置为静音即可。搞了一个星期才搞定这个事情,写篇文章记录一下,绝对一个字一个字的敲出来的。辛苦啊!

原有的声音播放方式使用的是AudioTrack,专门用于播放声音码流。基本的用法就是不断的去调用AudioTrack.write(byteBuffer, sizeInBytes, AudioTrack.WRITE_BLOCKING);缓冲区中的数据会自动进行播放。但是这个方法无法设置外部声音设备,即无法指定输出设备。

原生的AudioTrack在Android源码中的位置
1.png
2.png
3.png

下面介绍一下实现AudioTrack的write的替代方法,只是可以同时进行双输出。

1.进入厂商的目录下的frameworks目录,可以看见厂商为Android额外增加的一些模块。
1.png

2. 我选择将新功能放到hiaudio模块中去。进入hiaudio,我们可以看见该模块的代码结构分类,java中存放该模块面向应用的Java接口,jni中存放的是jni接口,libs中存放的是cpp实现。现在需要按照这个顺序依次将接口从Java层引入到cpp中。
1.png

3.打开java目录中的HiAudioManager.java,在该类中添加如下代码
1.png
分别表示设置HDMI静音、设置I2S静音、初始化、写入数据。简单的几行代码就定义了在APP中的调用接口。

4.打开jni目录中的cpp文件,该cpp文件为刚才定义的Java接口的jni类型定义,作用相当于一个翻译人员,负责将Java接口翻译成本地化的cpp接口。函数体类调用的都是后面需要实现的cpp接口。
1.png
1.png

5.下面在进入到libs目录下的虚函数接口类中。在头文件中添加如下声明。
1.png
相应的在CPP文件中添加函数体。
1.png

6.下面进入到真正的函数执行部分了,上面的步骤都只是为了数据传递,将接口一步一步的向上暴露给Android程序调用,现在我们已经进入Android底层CPP代码。在头文件中添加函数体声明。
1.png
然后在CPP中对每个函数进行实现,此时不再是像上面那样固定的编码格式,而是业务逻辑代码。实现具体功能。
1.png
这两个函数相对比较简单,直接调用厂商的底层接口即可完成相应的功能。不做过多的介绍了。
1.png
初始化函数非常的长,就不全部截图了。目的就是将声音设备初始化,然后绑定到两个物理音频设备上去,这样就可以同时发出声音了。
1.png
这个writeData函数是反复调用的,在线音频或者本地音频,通过每次读取固定的长度的内存到缓冲区进行播放。



7.最后一步就是在Android app中调用了。
先import HiAudioManager这个包。这里我播放的是一个音频文件,在线音频码流原理是一样的。
2.png

评分

参与人数 2荣誉 +16 鱼币 +16 贡献 +16 收起 理由
小甲鱼 + 6 + 6 + 6 支持楼主!
不二如是 + 10 + 10 + 10 安卓大神压阵!

查看全部评分

楼层
跳转到指定楼层
最佳答案
173 
累计签到:2258 天
连续签到:7 天
小甲鱼 发表于 6 天前 | 显示全部楼层
干货!支持!
最佳答案
0 
累计签到:2 天
连续签到:1 天
zhaohuarong  楼主| 发表于 2017-12-7 22:13:08 | 显示全部楼层
最佳答案
0 
累计签到:2 天
连续签到:1 天
zhaohuarong  楼主| 发表于 2017-12-7 22:13:21 | 显示全部楼层
最佳答案
9 
累计签到:39 天
连续签到:35 天
感谢楼主分享

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-12-18 22:33

快速回复 返回顶部 返回列表