ALSA driver--pcm_read和pcm_write的阻塞问题

一张图先看下pcm_write的调用流程

ALSA driver--pcm_read和pcm_write的阻塞问题_第1张图片

做的工作一是将数据送到dma 中,另外就是更新alsa的缓冲区指针

在snd_pcm_lib_write1接口中看到这样一个函数wait_for_avail

ALSA driver--pcm_read和pcm_write的阻塞问题_第2张图片

wait_for_avail函数将会将当前写或读数据的任务通过add_wait_queue加入一个队列中,等待被唤醒,如果有没有收到唤醒,schedule_timeout将会挂起直到设置的timeout时间后继续执行

ALSA driver--pcm_read和pcm_write的阻塞问题_第3张图片

而每次读、写在会又platform驱动主动调用snd_pcm_period_elapsed去唤醒

ALSA driver--pcm_read和pcm_write的阻塞问题_第4张图片

而这个调用通常是在一个中断处理中调用的,某些情况下中断不在工作,指针得不到更新,snd_pcm_lib_write1或snd_pcm_lib_read1将会被挂起,直到设置的10s timeout之后才会得到执行

你可能感兴趣的:(Linux,Alsa)