From mboxrd@z Thu Jan 1 00:00:00 1970 From: Raymond Yau Subject: Re: hw_ptr_interrupt removal broke interrupt pointer updates Date: Wed, 27 Jan 2010 11:09:41 +0800 Message-ID: <4f3252891001261909pd14a997p40e10fe270890772@mail.gmail.com> References: <4B5EF09B.3040900@ladisch.de> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail-pw0-f53.google.com (mail-pw0-f53.google.com [209.85.160.53]) by alsa0.perex.cz (Postfix) with ESMTP id 9DEAC10382B for ; Wed, 27 Jan 2010 04:09:42 +0100 (CET) Received: by pwi4 with SMTP id 4so9320599pwi.32 for ; Tue, 26 Jan 2010 19:09:41 -0800 (PST) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org 2010/1/27 Jaroslav Kysela > On Tue, 26 Jan 2010, Clemens Ladisch wrote: > > > Commit "cleanup & merge hw_ptr update functions" says: > >> The main change is hw_ptr_interrupt variable removal to simplify code > >> logic. This variable can be computed directly from hw_ptr. > > > > The hw_ptr_interrupt variable was needed to differentiate between the > > position at the last normal pointer update and the position of the last > > signaled period boundary. > > > > if (in_interrupt) { > > /* we know that one period was processed */ > > /* delta = "expected next hw_ptr" for in_interrupt != 0 */ > > delta = old_hw_ptr - (old_hw_ptr % runtime->period_size) > > + runtime->period_size; > > if (delta > new_hw_ptr) { > > hw_base += runtime->buffer_size; > > > > It is possible for the status/delay ioctls to be called when the sound > > card's pointer register alreay shows a position at the beginning of the > > new period, but immediately before the interrupt is actually executed. > > (This happens regularly on a SMP machine with mplayer.) When that > > happens, the code thinks that the position must be at least one period > > ahead of the current position and drops an entire buffer of data. > > Clements, thank you for nice explanation how I was wrong. I returned > hw_ptr_interrupt variable back. I am testing this patch now: > > > http://git.alsa-project.org/?p=alsa-kernel.git;a=commitdiff;h=04d64a69fcb9fd182d73d6f1a8de55b2f527a1de > > A review is always welcome. Thanks. > > > Jaroslav > > do snd_pcm_period_elapsed really handle the case when more than one period are elasped ? For au88x0 , each substream have four sets of hardware registers , it seem that the driver can recover lost interrupt with no underrun when using very small period size http://www.alsa-project.org/~tiwai/writing-an-alsa-driver/ch05s07.html#pcm-interface-interrupt-handler-boundary On calling snd_pcm_period_elapsed() In both cases, even if more than one period are elapsed, you don't have to call snd_pcm_period_elapsed() many times. Call only once. And the pcm layer will check the current hardware pointer and update to the latest status.