Re: Application hangs with different period sizes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux