spdif调试总结

噪音问题

播放不同采样率的音频情况:

16bit:

32000

44100

48000

88200

96000

176400

192000

正常

正常

正常

正常

正常

正常

正常

24bit

32000

44100

48000

88200

96000

176400

192000

正常

正常

正常

噪音

正常

噪音

噪音

16bit全部正常,24bit部分会出现噪音情况。

排查思路

1.首先想到芯片发出的波形是否正确?

通过与正常音频发出的波形进行对比,发现波形基本正确,似乎找不到什么突破口

注:spdif发出的波形为BMC编码,时钟与数据混合在一起进行编码。

2.然后怀疑时钟,驱动中设置的时钟是否正确?

经过确认,没有问题

2.alsa的period_size设置有问题?

修改之后无效果

3.采样率为24bit的音频文件数据存储有两种方式,在驱动层对两种方式处理有问题?
  1. S24_LE:

24bit的数据(也即一个采样点的数据)采用32bit空间进行存储

| 8bit | 8bit | 8bit | 补零 | 8bit | 8bit | 8bit | 补零 | 8bit | 8bit | 8bit | 补零 | …

  1. S24_3LE:
    24bit的数据(也即一个采样点的数据)采用24bit空间进行存储
    | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | …

经过确认,控制器针对此种情况会有处理,分为packed与unpacked两种情况,在驱动中已经正确设置

4.spdif out 与spdif in引脚短接,并比较源文件与录音文件的二进制数据,会不会有数据错位?

毫无规律可言

5.驱动中设置dma描述符的时候,对于播放不同的音频文件(采样率/采样位数/声道数),搬移次数(需要搬移的总数据/每次搬移的大小)是否有除不尽的情况?

经过确认,当播放有噪音的音频时,得到的搬移次数均是整数

问题原因

  • 之前为了解决在播放开始会丢失极短时间的声音问题,在正常的音频数据之前加了一些零数据,正是这零数据出现了问题。
  • 在设置这些零数据的描述符的时候,dma搬移的次数出现了除不尽的情况,这样会导致有部分数据dma未搬移,出现丢失情况,但是当使搬移次数为整数时,仍是噪音。
  • 后来考虑到S24_3LE格式的音频数据的排布,也即24bit紧接着又是下一个24bit,上述制造的零数据是否是24bit的整数倍?如果不是的话,假如最后多出8bit,这样会导致后面连接的正常的音频数据产生这8bit的错位,从而导致后面的数据全错位,最终表现为噪音。
  • 如果只满足为24bit的整数倍,但是不满足每次搬移大小的整数倍,最终仍可能会导致dma实际搬移的数据不是24bit的整数倍,所以零数据的大小应该满足如下条件:
  1. 24bit的整数倍
  2. 每次搬移大小的整数倍

总结

1.时钟一般会影响音频的播放速度
2.噪音本质上和正常的声音没有什么区别,只不过是给的数据不对,该问题一般是音频数据有错位导致的