Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
之前有提到上层可以通过dump pcm数据查看波形来确定录音采样的数据是否正常,这里给出驱动层查看方法。
当一次传输完成后会调用dmaengine_pcm_dma_complete(),而rockchip其实已经添加了调试方法,只是在本文件中把宏CONFIG_ARCH_ROCKCHIP关闭了。
static void dmaengine_pcm_dma_complete(void *arg)
{
struct snd_pcm_substream *substream = arg;
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
//本文件中被undef了,要自己打开。
#ifdef CONFIG_ARCH_ROCKCHIP
if(debug_audio_timeout){
struct snd_pcm_runtime *runtime = substream->runtime;
static ktime_t before = {0},after = {0};
s64 t;
before = after;
after = ktime_get();
//t就是一次DMA传输完成时间间隔。
t = ktime_to_us(ktime_sub(after, before));
//右边的表示理论DMA一次传输需要的时间,单位是us,+32可能是rk经过测试之后可以容忍的出错帧数。
//当条件成立的时候,说明DMA没出完完成,这时就会有问题了。
if(t > (snd_pcm_lib_period_bytes(substream)/4+32)*1000*1000/runtime->rate
&& t != ktime_to_us(after)) // (23220)4096/4/44100 + 32/44100
{
//当在kmsg中频繁看到这条Log音频应该有异常了。
printk(KERN_DEBUG "Time out:: Audio DMA buffdone time out!!! the time = %lld!n", t);
}
//printk(KERN_DEBUG "audio DMA callback time = %lldn", t);
}
#endif
prtd->pos += snd_pcm_lib_period_bytes(substream);
if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream))
prtd->pos = 0;
snd_pcm_period_elapsed(substream);
}
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
之前有提到上层可以通过dump pcm数据查看波形来确定录音采样的数据是否正常,这里给出驱动层查看方法。
当一次传输完成后会调用dmaengine_pcm_dma_complete(),而rockchip其实已经添加了调试方法,只是在本文件中把宏CONFIG_ARCH_ROCKCHIP关闭了。
static void dmaengine_pcm_dma_complete(void *arg)
{
struct snd_pcm_substream *substream = arg;
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
//本文件中被undef了,要自己打开。
#ifdef CONFIG_ARCH_ROCKCHIP
if(debug_audio_timeout){
struct snd_pcm_runtime *runtime = substream->runtime;
static ktime_t before = {0},after = {0};
s64 t;
before = after;
after = ktime_get();
//t就是一次DMA传输完成时间间隔。
t = ktime_to_us(ktime_sub(after, before));
//右边的表示理论DMA一次传输需要的时间,单位是us,+32可能是rk经过测试之后可以容忍的出错帧数。
//当条件成立的时候,说明DMA没出完完成,这时就会有问题了。
if(t > (snd_pcm_lib_period_bytes(substream)/4+32)*1000*1000/runtime->rate
&& t != ktime_to_us(after)) // (23220)4096/4/44100 + 32/44100
{
//当在kmsg中频繁看到这条Log音频应该有异常了。
printk(KERN_DEBUG "Time out:: Audio DMA buffdone time out!!! the time = %lld!n", t);
}
//printk(KERN_DEBUG "audio DMA callback time = %lldn", t);
}
#endif
prtd->pos += snd_pcm_lib_period_bytes(substream);
if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream))
prtd->pos = 0;
snd_pcm_period_elapsed(substream);
}
举报