专家您好,最近我在开发6467音频时遇到个问题,采集到的音频数据播放出来会有卡顿现象,我通过./dev/dsp录制一首歌保存到一个文件中,然后再把这个文件中的数据write回/dev/dsp设备节点,播放出来的声音有出现卡顿现象,我通过播放出来的音乐感觉出来好像卡的时候丢弃了部分音频数据。请问这个问题可能的原因会有哪些?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
专家您好,最近我在开发6467音频时遇到个问题,采集到的音频数据播放出来会有卡顿现象,我通过./dev/dsp录制一首歌保存到一个文件中,然后再把这个文件中的数据write回/dev/dsp设备节点,播放出来的声音有出现卡顿现象,我通过播放出来的音乐感觉出来好像卡的时候丢弃了部分音频数据。请问这个问题可能的原因会有哪些?
我是先采集,然后保存到一个文件中,在把这个文件中的内容以相同的采样率、量化位数等参数播放出来。
没错,这个文件应该可以导出来吧?在PC上播放下看看文件有没有问题呗。
问题是我是直接从/dev//dsp设备节点用read系统调用读取的数据,然后直接保存到文件中,没有做任何格式处理,在PC上能播放出来吗?用什么软件可以?
问题是我是直接从/dev//dsp设备节点用read系统调用读取的数据,然后直接保存到文件中,没有做任何格式处理,在PC上能播放出来吗?用什么软件可以?
可能是PCM,尝试用CoolEdit之类的软件播放
您这提到的 可能是PCM 是指的什么意思啊?
昨天给您描述的是单声道录制和播放声音,是出现卡顿的现象。当采用双声道录制和播放声音时,出现的现象是左右声道同时只有一边有声音。
下面是我今天采用双声道录制的一段歌曲,然后用昨天您告诉我的CoolEdit软件播放出来,结果也是左右声道同一时间只有一边有声音,下图是cooledit软件播放我录制的文件时的波形图:

从上图可以看出,上下两个通道的波形同一时间只有一个通道上有波形。
请问出现这个问题可能会是什么原因啊?
从你双声道的情况来看就是采集就不对了。单声道你也看看是怎么回事确认一下
你采集用的什么芯片和接口呢?如果是I2S,就测一下信号是不是时断时续的,如果不是,那是否符合规范的要求。
单声道的波形图和刚才那个双声道的波形图一样的,就是只有上面那一半的波形,下面一半的波形为空,波形状况也是断断续续的。我们用的是I2S总线,我测量过WCLK、BCLK等信号线,示波器上没有显示出信号断断续续的现象。
采集芯片用的adv7611,HDMI输入接口,音频输出模式是I2S模式。
I2S貌似可以规定是在LR变化后几个时钟才采样数据的吧,你看看那个会不会有可以设置的地方。
另外,看看LR的占空比如何,似乎在漂的样子
我换了一个音频采集芯片,gs2971(SDI输入接口的),也是音频输出I2S模式,结果采集的音频也存在这个现象,和之前用HDMI芯片不同的是左右声道相互交换着响的频率没这么高,但同一时间还是只有一个声道有声音,下面是使用SDI接口采集到的音频文件在cooledit中的波形图:

通过这个实验,用两个不同的音频采集芯片接DM6467,都出现了左右声道同一时间只有一个声道有声音,是否可以排除是采集音频的芯片的问题呢?而是DM6467音频模块存在问题呢?
音频芯片和DM6467哪个做master?
DM6467是做从设备,时钟是音频采集芯片提供的,我用示波器同时测量了LRCLK和数据输入引脚(DM6467的引脚)的波形图,下图:

黄色线是LRCLK时钟线,蓝色是数据输入引脚的波形图,从图中可以看出,LRCLK高低电平都有数据输入DM6467,说明左右声道应该是都存在声音数据的,但我们通过/dev/dsp设备节点采集出来的音频数据在cooledit软件中显示左右声道同一时间只有一个通道有声音。
我也在弄这个DM8168的音频,双声道编码和你波形一样。。现在单声道没问题,双声道就不行了。。可以留个联系方式一起探讨下么?
可以 583340363 我的QQ
lingpeiye ,请问如果是edma的bidx只传输了一个声道的大小,那该怎么改成两个声道的大小呢?在什么位置改
应该是采集过来的数据就是单声道的,应该修改
srcbidx = 0;
desbidx = acnt ;
acnt = mcbsp一次传输的个数,如果mcbsp一次传输2个声道,共32bit,那么acnt=4.
这个文件应该在sound/soc/davinci/davinci-pcm.c里面xxx_enqueue_xx
我们DM6467用的是mcasp,但您给的意见很有参考意义,但有些地方我还不是很明白,还麻烦您能再给我解释解释。
您提到的:acnt = mcbsp一次传输的个数,如果mcbsp一次传输2个声道,共32bit,那么acnt=4.
acnt是一个什么参数,用途? mcbsp参数是表示传输声道数乘以2吗?为什么需要乘以2呢?
首先我需要清楚你采用的
音频芯片左右声道各是多少位的,
mcasp是几个相位,每个相位多少个word,每个word多少长度,采集是什么方式触发的,高电平还是低电平,
edma传输每次传输是多少大小。
mcbsp没有传输声道之说,只有几个word,每个word多少字。
我们的adv7611输给DM6467的音频数据格式是:声道位数是24bit,word长度是16bit,输出的是立体声,至于您说的相位以及6467 edma每次传输大小,我并不清楚,不知道哪里设置。
您之前说 mcbsp可能只使能了一个声道 ,在DM6467 mcasp的手册,下面这个位我设置的是2h:

这个应该就是表示双声道吧? 我们的ADV7611输出的也是I2S模式
可能的原因是,dm6467的mcbsp当作slave使用,需要emda有非常高的优先级,才能确保输入的数据及时搬移到memory中。这个优先级要求一定是实时的,任何超过一定界限的延迟都将造成数据丢失。
但是这个问题解决起来却非常棘手!
原因在于edma的通道分配被davinci大量了隐藏起来了,目前还没有找到如何才能干预或者调整这个优先级。简单的
调整TC0~TC3效果并不理想,需要搞清楚davinci的具体通道分配,再进行有针对性的调整。
谁能说说,davinci具体如何对通道的优先级进行分配的?