[alsa-devel] Application hangs with different period sizes
Takashi Iwai
tiwai at suse.de
Fri Aug 8 08:18:24 CEST 2008
At Thu, 7 Aug 2008 15:48:49 +0530,
anuj aggarwal wrote:
>
> Hi,
>
> Regarding the below mentioned problem, we added some debugging in ALSA layer
> and our audio codec driver to understand the problem. And I think, we
> understand the root cause of the issue.
> Whenever we call *snd_pcm_writei* function from application, it executes
> kernel function *snd_pcm_lib_write1* from sound/core/pcm_lib.c. This
> function copies the user buffer and updates some alsa variables
> and trigger the DMA ( if alsa is in PREPARED state). And same thing is
> done in snd_pcm_readi() function call.
>
> In case of DMA transfer, the DMA callback will update the hw_ptr depending
> on the number of bytes xfered. So now two functions are updating the hw_ptr
> (DMA callback and write/read function) and this is the problem. Only DMA
> callback should update the hw_ptr because DMA is the one who is doing the
> real transfer, not the write/read function. Read and write function should
> only update the appl_ptr and leave the hw_ptr for DMA callback.
>
> After applying the below patch, my application works fine. Can someone look
> into the patch provided below and confirm our understanding?
The hw_ptr can be updated at any time. It can be updated at hwsync or
other calls, too. And, the update is protected via a substream lock,
it's no racy.
I guess your problem is the implementation of pointer callback. The
update of hw_ptr purely depends on the value returned from the pointer
callback. Or, the driver assumes wrongly about the handling of
hw_ptr...
Takashi
More information about the Alsa-devel
mailing list