查看: 7380|回复: 1

[其他] 环绕立体声(5.1声道)的USB传输、播放与实现

[复制链接]

该用户从未签到

72

主题

80

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
724
最后登录
2020-1-3
发表于 2019-1-24 21:52:03 | 显示全部楼层 |阅读模式
5.1环绕声是六声道环绕声音响系统的通用名称,是家庭影院中最常用的布局。它使用五个全带宽声道和一个低频效果,包括左前、右前、中前、低频增强、左环绕和右环绕,共六个声道。

随着人们对音乐质量和体验的要求越来越高,为了有效地控制成本,使用微控制器实现5.1声道音频的传输和播放,成为很多音箱控制系统的首选。

那么,小编就在这里和大家分享一下,在微控制器上实现5.1声道环绕立体声通过USB传输和播放的知识。

5.1声道环绕立体声音响的最小系统如下图所示,USB主机通过USB连接USB设备(音响),按照USB音频协议传输音频数据。音响通过I2S总线时分复用,将音频数据输出至音频CODEC(DAC),经过模数转换,输出到扬声器。

QQ浏览器截图20190124214938.png

按照音频数据流动的顺序,小编首先介绍USB主机和作为USB设备节点的5.1声道音频的USB传输,然后介绍通过I2S将5.1声道音频输出到扬声器。

5.1声道音频USB传输

说起音频通过USB传输,不得不提起USB 音频类。

USB 音频类(USB Audio Class)由USB-IF定义,用于所有处理USB设备(Device)或复合设备中嵌入音频功能(Audio Function),常见的应用包括USB音响、USB麦克风、USB耳机等。

USB音响最小系统配置,包含一个音频控制接口和一个音频流接口。

音频控制接口用于处理音频功能中的所有音频控制,如音量控制、声道增强/均衡、延时及静音等。

而音频流接口用于将音频数据流传入USB设备。

属于同一功能的音频控制接口、音频流接口以及MIDI流接口的集合,称为音频接口集(AIC)。

为了能描述USB音频设备的功能属性,USB音频类协议将每个设备中的各个部件,按功能分解为可寻址的实体(Entity)。

USB音频类协议定义了两种通用的实体,分别叫做单元(Unit)和终端(Terminal)。

单元提供了完整地描述大多数音频功能的基本构建模块,音频功能正是通过连接多个单元来构建的。

每个单元有一个或多个输入终端和一个输出终端。

USB音响的最小系统有一个输入终端,一个特征单元或处理单元,及一个输出终端。

QQ浏览器截图20190124214944.png

输入终端是音频功能外部模块到内部其它单元的接口,是流入音频信息的入口;当数据从原始音频流中正确解析至各逻辑声道后,输入终端作为其它单元的数据源,将由逻辑声道组成声道簇,通过单一输出节点输出。

所有声道的音频信息是紧密相关且互相同步的,它们的组合称作声道簇。声道簇中各声道的音频信息有相同的特性(如采样率、采样精度等)。声道簇中的声道编号范围为1至声道个数。

5.1声道USB音响与传统单声道或者双声道USB音响的区别,在于声道簇的变化。根据USB音频类协议,输入终端描述声道簇的构成和拓扑,具体上讲,声道簇描述符包括bNrChannels域和BmChannelConfig域。

bNrChannels域描述了声道簇中逻辑声道的数量,对于5.1声道环绕立体声,bNrChannels为6。

BmChannelConfig域描述了声道簇中各个声道的空间位置关系,简单地说就是各扬声器的摆放位置,5.1声道环绕立体声包括左前、右前、中前、低频增强、左环绕,右环绕六个声道。

除了输入节点的变化,音频流接口描述和音频流端点包大小,也需要根据声道进行调整。


5.1声道音频的播放

上面简单介绍了USB音频传输中的基本概念,以及5.1声道传输的特殊性,下面讨论一下在实现USB音频传输时,一些需要考虑的要点。

5.1声道音频的播放需要特定音频CODEC(音频数模转换器)的支持,这些音频CODEC一般通过I2C总线配置控制参数,通过I2S总线接收来自微控制器的音频数据。

一个简单的USB设备音响的软件架构如下图所示。

QQ浏览器截图20190124214948.png

全速USB以1ms为单位进行数据传输,USB主机每1ms传输的音频数据量,可以通过声道数、音频采样率和采样精度相乘得出。

这些音频数据被放入音频缓冲区中。音频缓冲区的作用在于防止偶然的传输延迟导致的音频破音。一般情况下,软件上应该保证只有当音频缓冲区到达一定水平时,才开始将数据取出缓冲区送向I2S外设。

为了保持音频数据持续高效地从音频缓冲区送向I2S设备,I2S DMA通常是音频播放的不二选择,通过两个相互连接的DMA描述符,双缓冲区DMA交替从音频缓冲区读取数据和向I2S外设输出数据,当ARM内核完成一个缓冲区的填充时,DMA控制器操控另一个缓冲区将数据发射到外设。

音频缓冲区的大小和DMA缓冲区的大小,都正比于音频声道的数量,对于5.1声道音频,缓冲区内存通常会占用较大的SRAM空间。

I2S外设控制器需要配置成为TDM模式以支持5.1声道音频的传输,这个配置对于LPC5460x系列微控制器来讲简单的难以置信,只需要2步3行程序即可。

  • 设置I2S传输帧长为(16bits每采样点每声道)


  1. 1s_TxConfig.frameLength = 16 * AUDIO_FORMAT_CHANNELS;
复制代码

  • 设置I2S子通道1/2的帧偏移


  1. <p> 2I2S_EnableSecondaryChannel(I2S_TX, kI2S_SecondaryChannel1, false, 32); </p><p> 3I2S_EnableSecondaryChannel(I2S_TX, kI2S_SecondaryChannel2, false, 64); </p>
复制代码

在LPC5460x SDK中,双声道USB音频播放的实例是usb_device_audio_speaker。该例子实现了上述软件框架中的所有部分,借用它小编只改了不到十行的代码,就成功地实现了5.1声道音频的USB传输和播放。注:音频播放需要外部音频CODEC支持,原开发板上的WM8094不支持5.1声道音频播放,须替换合适的CODEC。

当代码修改完成后,就可以将USB音响设备连接到笔记本电脑进行测试了。USB音响连接到电脑后,Windows可以自动安装默认USB音频设备驱动,并枚举USB设备。当USB 5.1声道音响设备枚举成功后,可以通过WINDOWS音频控制台来进行基本测试。

QQ浏览器截图20190124214955.png

代码改动部分

如上所述,支持5.1声道的音频播放的程序,由双声道的USB音频播放实例修改而来,以下红色代码所示(包裹在SURROUDING_AUDIO宏内部)的部分就是改动的部分。

在usb_device_descriptor.h中:

QQ浏览器截图20190124215001.png

在usb_device_descriptor.c中:

QQ浏览器截图20190124215006.png

在Audio_speaker.c中:

QQ浏览器截图20190124215010.png

经过以上修改,一个双声道的USB音频播放程序,摇身一变就可以用于六声道的5.1环绕声设备了。

各位看官,您不动手实际体验一下?!

我知道答案 目前已有1人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2019-1-30 19:09:20 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-14 04:23 , Processed in 0.087107 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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