[alsa-devel] Could you help me about the ALSA?

Jaroslav Kysela perex at perex.cz
Fri Dec 14 09:36:20 CET 2012


Date 14.12.2012 09:07, Zhang wei wrote:
> Good afternoon .
> 
> Excuse me if I disturb you, I found your contact information from the
> alsa-devel
> http://mailman.alsa-project.org/pipermail/alsa-devel/2010-August/030605.html
> .
> 
> Recently I am studying the alsa-driver and the code blocked me which
> from the function snd_pcm_update_hw_ptr0inthe pcm_lib.c.
> 
> =====================start==============================è
> 
>          if (in_interrupt) {
> 
>                    /* we know that one period was processed */
> 
>                    /* delta = "expected next hw_ptr" for in_interrupt !=
> 0 */
> 
>                    delta = runtime->hw_ptr_interrupt + runtime->period_size;
> 
>                    if (delta > new_hw_ptr) {
> 
>                             /* check for double acknowledged interrupts */
> 
>                             hdelta = jiffies - runtime->hw_ptr_jiffies;
> 
>                             if (hdelta > runtime->hw_ptr_buffer_jiffies/2) {
> 
>                                      hw_base += runtime->buffer_size;
> 
>                                      if (hw_base >= runtime->boundary)
> 
>                                                hw_base = 0;
> 
>                                      new_hw_ptr = hw_base + pos;
> 
>                                      goto __delta;
> 
>                             }
> 
>                    }
> 
>          }
> 
> ç================end=================================
> 
> I’ve already read your mail but I still do not understand your intend. I
> know the target of the pices of code is prevent the variable hw_ptr and
> hw_base delayed update from some kind of case .so my question is
> 
> (1)     how could happen on delta>new_hw_ptr? And why?
> 
> (2)     Why we can conclue the hw_ptr crossed the boundary of
> buffer_size when hdelta>runitme->hw_ptr_jiffies/2? What principle we
> based on?

The interrupts can be lost or delayed in some cases (small period sizes
etc.). So you need to check for these situations. The driver returns
only position in the ring buffer without count of "cross" points, so we
need to trace these situations using another clock source (like system
clock).

					Jaroslav

-- 
Jaroslav Kysela <perex at perex.cz>
Linux Kernel Sound Maintainer
ALSA Project; Red Hat, Inc.


More information about the Alsa-devel mailing list