全志audio hub使用和理解,以及如何同时开启多个声卡(Android HW层)

 上图是全志H6 audio hub的示意图,图中可以看到audio hub本身也是一个声卡,他用来连接了CPU的APB数据总线和音频数据接口,H6中的所有音频数据接口全部是通过ahub来传递给CPU中去的。这样做的目的是为了方便音频输入和输出的以及混音。典型的就是应用在卡拉OK场景中。

 详细的芯片说明可以参考官方的文档

《H6 音频模块说明书.pdf》

《Allwinner_H6_User_Manual_V1.0.pdf》

声卡的管理通过tinymix工具来管理

audio hub声卡默认是0声卡可以通过命令行tinymix -D 0来查看声卡的状态

我们可以通过tinymix来配置ahub的音频路径

其中5-17用于表示rxif连接的txif,可以配置的值如下

 比如配置APB0->I2S0播放

使用命令tinymix 13 4

 

配置路径的代码在SDK的audio_hw.c中进行配置

音频框架使用的是ASOC框架

 在源文件中可以看到使用的

 pcm_open

pcm_prepare

pcm_read

pcm_close

这些API来操作声卡的

比如我们获取I2S0对应声卡的PCM数据

 pcm_open打开I2S0对应的声卡

pcm_open打开audio hub声卡

I2S0 pcm_prepare

ahub pcm_prepare

配置音频通路

最后在in_read里面进行pcm_read读取音频数据

原始SDK中只能同时打开1个声卡,比如使用I2S0的时候就会只切到了I2S0

其实APB总线这端有3个端点,也就是APBIF0 APBIF1 APBIF2

我们可以把I2S0接到APBIF0 同时把I2S3接到APBIF1这样两个声卡的数据就都进入到APB总线上了。

通路配置好后好需要在audio_hw中添加代码来实现

pcm_open的时候第二个参数也就是端口号,对应了你打开了那个APBIF端点

这时候需要在start_input_stream的时候同时打开audio hub的APBIF0和APBIF1端点。也就是第二个参数要分别传0和1,并新加一个pcm指针来接收返回句柄

in->pcm = pcm_open(adev->cardMIX, 0, PCM_IN, &in->config);

in->i2s3_pcm = pcm_open(adev->cardMIX, 1, PCM_IN, &in->config);

这样在in_read里面在从这两个句柄里读数据就可以实现同时打开多个声卡了

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 .NET 中,要同时使用多个声卡播放不同的文本语音,可以使用 NAudio 库,该库提供了一些方便的类和方法,可以方便地实现多声卡播放功能。 以下是一个示例代码,可以使用 NAudio 库在两个不同的声卡上同时播放不同的语音文件: ``` using NAudio.Wave; class Program { static void Main(string[] args) { // 创建两个 WaveOutEvent 对象,分别用于播放不同的语音文件 var waveOut1 = new WaveOutEvent(); var waveOut2 = new WaveOutEvent(); // 打开两个语音文件 var audioFile1 = new AudioFileReader("audio1.wav"); var audioFile2 = new AudioFileReader("audio2.wav"); // 将两个 WaveOutEvent 对象绑定到对应的声卡 waveOut1.DeviceNumber = 0; // 第一个声卡的编号 waveOut2.DeviceNumber = 1; // 第二个声卡的编号 // 分别将两个语音文件设置到对应的 WaveOutEvent 对象中 waveOut1.Init(audioFile1); waveOut2.Init(audioFile2); // 分别开始播放两个语音文件 waveOut1.Play(); waveOut2.Play(); // 等待播放完成 while (waveOut1.PlaybackState == PlaybackState.Playing || waveOut2.PlaybackState == PlaybackState.Playing) { System.Threading.Thread.Sleep(100); } // 关闭 WaveOutEvent 对象和 AudioFileReader 对象 waveOut1.Dispose(); waveOut2.Dispose(); audioFile1.Dispose(); audioFile2.Dispose(); } } ``` 在上面的代码中,我们创建了两个 WaveOutEvent 对象,分别用于播放两个不同的语音文件。然后,我们使用 AudioFileReader 类打开这两个语音文件,并将它们设置到对应的 WaveOutEvent 对象中。最后,我们分别启动两个 WaveOutEvent 对象,等待它们播放完成后关闭相关对象。 需要注意的是,通过设置 WaveOutEvent 对象的 DeviceNumber 属性,可以将不同的 WaveOutEvent 对象绑定到不同的声卡上。如果你的电脑上有多个声卡,你可以通过更改 DeviceNumber 属性来控制语音播放的声卡

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍六七0804

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值