At Thu, 23 Oct 2008 21:17:01 +0100, Jason Harvey wrote:
Takashi Iwai wrote:
Just to be sure: is it the driver with my patch or without the patch? The patch seems broken anyway, so abandon it, and check only without the patch from now on.
Have reverted to unpatched version, now logging kernel messages to a file. The attached is the output for debug=2 from running the mplayer with the oss proc fix. WARNING... the gzip expands to 4.5MB, which explains the overflow on the dmesg ring buffer. But only the first hundred lines and last ten are different, the rest are all the same as far as I could see.
The only things I noticed that does change is that the repeated lines start like this :-
Oct 23 20:45:28 sentry kernel: SBXFI: IRQ = 0x500 Oct 23 20:45:28 sentry kernel: SBXFI: POINTER = 0x3e0 Oct 23 20:45:28 sentry kernel: SBXFI: SET TIMER TICKS = 16 Oct 23 20:45:28 sentry kernel: SBXFI: POINTER = 0x3e0 Oct 23 20:45:28 sentry kernel: SBXFI: POINTER = 0x3e0
And that the pattern changes after a short time dropping one of the POINTER lines. Screen output below to show commands used.
Thanks. I guess the problem was
Oct 23 20:45:28 sentry kernel: SBXFI: Allocate SRC 0 Oct 23 20:45:28 sentry kernel: SBXFI: allocated TLB at 0 for 16 pages Oct 23 20:45:28 sentry kernel: SBXFI: Setting TLB buffer page 0x1304a000 Oct 23 20:45:28 sentry kernel: SBXFI: release TLB at 0 for 16 pages Oct 23 20:45:28 sentry kernel: SBXFI: Disabling TLB buffer Oct 23 20:45:28 sentry kernel: SBXFI: PLAYBACK PREPARE: rate=96000, period_size=1024, buffer_size=16384
So the stream is started at the state where the TLB is cleared. The fix patch is below (and I already committed it).
Takashi
commit 9fc82bbe4ca9142cf2ae5db64eefaabc10e7f071 Author: Takashi Iwai tiwai@suse.de Date: Fri Oct 24 10:35:03 2008 +0200
sbxfi - Fix multiple hw_params calls
The last change seems breaking the case of multiple hw_params calls. Although the TLB is cleared unconditionally beforehand, it's not re-asssigned because snd_pcm_lib_malloc_pages() returns 0. Now, call sbxfi_setup_tlb() unconditionally, too.
Signed-off-by: Takashi Iwai tiwai@suse.de
--- diff --git a/sound/pci/sbxfi/sbxfi.c b/sound/pci/sbxfi/sbxfi.c index 458294f..e268413 100644 --- a/sound/pci/sbxfi/sbxfi.c +++ b/sound/pci/sbxfi/sbxfi.c @@ -1383,12 +1383,7 @@ static int sbxfi_pcm_hw_params(struct snd_pcm_substream *substream, err = snd_pcm_lib_malloc_pages(substream, bytes); if (err < 0) return err; - if (!err) - return 0; /* buffer unchanged */ - err = sbxfi_setup_tlb(chip, port, bytes); - if (err < 0) - return err; - return 1; /* buffer changed */ + return sbxfi_setup_tlb(chip, port, bytes); }
static int sbxfi_pcm_hw_free(struct snd_pcm_substream *substream)