From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757430AbZFOIaQ (ORCPT ); Mon, 15 Jun 2009 04:30:16 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755365AbZFOIaE (ORCPT ); Mon, 15 Jun 2009 04:30:04 -0400 Received: from cantor.suse.de ([195.135.220.2]:54711 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754532AbZFOIaB (ORCPT ); Mon, 15 Jun 2009 04:30:01 -0400 Date: Mon, 15 Jun 2009 10:30:01 +0200 Message-ID: From: Takashi Iwai To: Bartlomiej Zolnierkiewicz Cc: Sven =?ISO-8859-1?Q?K=F6hler?= , David Miller , linux-kernel@vger.kernel.org Subject: Re: sound skipping regression introduced in 2.6.30-rc8 In-Reply-To: <200906121344.26139.bzolnier@gmail.com> References: <20090610.112804.193703669.davem@davemloft.net> <4A317949.9090301@gmail.com> <200906121344.26139.bzolnier@gmail.com> User-Agent: Wanderlust/2.12.0 (Your Wildest Dreams) SEMI/1.14.6 (Maruoka) FLIM/1.14.7 (=?ISO-8859-4?Q?Sanj=F2?=) APEL/10.6 Emacs/22.3 (x86_64-suse-linux-gnu) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org At Fri, 12 Jun 2009 13:44:25 +0200, Bartlomiej Zolnierkiewicz wrote: > > > On Friday 12 June 2009 03:52:48 Takashi Iwai wrote: > > At Thu, 11 Jun 2009 23:38:17 +0200, > > Sven Köhler wrote: > > > > > > >>>> Can somebody point out, how I can set this xrun_debug thing or can > > > >>>> somebody provide a patch that reverts the change? > > > >>> Did you read my reply to David? > > > >> I will try, what is described there and I will report back if I get any > > > >> debug output. > > > > > > > > Thanks, that'll be be helpful. > > > > > > Below is the output. Note, that audacious 2.x was not only skipping a > > > little bit. In fact, the clock that was showing the time of audio played > > > was running twice as fast or even 4 times as fast. The sound was played > > > at the right samplerate but in fast it seems, that much of the audio > > > data was skipped and I only heard a series of short fragments of what > > > should have been the song I'm listening to. > > > > > > > > > PCM: hw_ptr skipping! (pos=4096, delta=7169, period=1024, jdelta=0/149) > > > > OK, it must be the same problem indeed as David and Bartlomiej see. > > > > Although Bartlomiej wrote that reverting the commit below didn't help, > > I still suspect it comes from there. > > commit da2436a23c038055b1da6fe30b6ea2886b1e07b0 > > Author: Jaroslav Kysela > > Date: Mon Apr 13 21:31:25 2009 +0200 > > [ALSA] intel8x0: do not use zero value from PICB register > > > > The below is a revised patch to fix the possible regression from this. > > Could you guys give it a try, or check reverting the above? > > The issue is still present with the revised patch. I think we should go back to basic. The patch below cuts off the position compensation but falls back to the last value, which is a safer option. How about this? thanks, Takashi --- diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 173bebf..1c02705 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -356,8 +356,6 @@ struct ichdev { unsigned int position; unsigned int pos_shift; unsigned int last_pos; - unsigned long last_pos_jiffies; - unsigned int jiffy_to_bytes; int frags; int lvi; int lvi_frag; @@ -844,7 +842,6 @@ static int snd_intel8x0_pcm_trigger(struct snd_pcm_substream *substream, int cmd case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: val = ICH_IOCE | ICH_STARTBM; ichdev->last_pos = ichdev->position; - ichdev->last_pos_jiffies = jiffies; break; case SNDRV_PCM_TRIGGER_SUSPEND: ichdev->suspended = 1; @@ -1048,7 +1045,6 @@ static int snd_intel8x0_pcm_prepare(struct snd_pcm_substream *substream) ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1; } snd_intel8x0_setup_periods(chip, ichdev); - ichdev->jiffy_to_bytes = (runtime->rate * 4 * ichdev->pos_shift) / HZ; return 0; } @@ -1073,19 +1069,13 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) break; } while (timeout--); + ptr = ichdev->last_pos; if (ptr1 != 0) { ptr1 <<= ichdev->pos_shift; ptr = ichdev->fragsize1 - ptr1; ptr += position; - ichdev->last_pos = ptr; - ichdev->last_pos_jiffies = jiffies; - } else { - ptr1 = jiffies - ichdev->last_pos_jiffies; - if (ptr1) - ptr1 -= 1; - ptr = ichdev->last_pos + ptr1 * ichdev->jiffy_to_bytes; - ptr %= ichdev->size; } + ichdev->last_pos = ptr; spin_unlock(&chip->reg_lock); if (ptr >= ichdev->size) return 0;