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的音频文件数据存储有两种方式,在驱动层对两种方式处理有问题?
- S24_LE:
24bit的数据(也即一个采样点的数据)采用32bit空间进行存储
| 8bit | 8bit | 8bit | 补零 | 8bit | 8bit | 8bit | 补零 | 8bit | 8bit | 8bit | 补零 | …
-
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的整数倍,所以零数据的大小应该满足如下条件:
- 24bit的整数倍
- 每次搬移大小的整数倍