[alsa-devel] Backported sbxfi driver (UNTESTED!)
tiwai at suse.de
Fri Oct 17 11:35:38 CEST 2008
At Fri, 17 Oct 2008 11:57:08 +0400,
The Source wrote:
> Takashi Iwai пишет:
> > At Thu, 16 Oct 2008 22:18:07 +0400,
> > The Source wrote:
> >>>> Ok. OpenAL with alsa also seem to cause problems.
> >>> In both cases, check the period_size and buffer_size values (shown in
> >>> the kernel message, or /proc/asound/card0/pcm0p/sub0/hw_params).
> >>> And, try to aplay with these parameters, whether you get the similar
> >>> problem.
> >>> % aplay -v --period-size=xxx --buffer-size=yyy foo.wav
> >>> Takashi
> >> I'm sorry, but any attemp to play file with ossplay results in complete
> >> system hang with error:
> >> unable to handle NULL ponter dereference at address
> >> 0000000000000008.....(hang, no more output).
> >> I tried many wav formats. So I can't get error log or period and buffer
> >> sizes, sorry.
> > Can anyone confirm to reproduce Oops with OSS apps (ossplay)?
> > I'm wondering whether this has anything to do with the capture.
> > Can you record the sound, and change the capture mixer element properly?
> > thanks,
> > Takashi
> I checked mplayer. It uses period size 1024 instead of 4096 and 16384
> buffer size (default). Sound is choppy (sound pauses is more frequent
> when rate is lower).
> However an attempt to play the same file with the same period and buffer
> sizes with aplay results in complete system hang.
OK, that looks like a problem. Looks like the timer resolution can be
short like that, or something racy in the timer handling.
Can you check whether this happens with XXX_SYSTEM_TIMER, too?
Or, does the patch below avoid the problem, at least?
diff --git a/sound/pci/sbxfi/sbxfi.c b/sound/pci/sbxfi/sbxfi.c
index 26a6cd3..5ceb228 100644
@@ -277,6 +277,7 @@ static void sbxfi_rearm_timer(struct sbxfi *chip, int ticks)
#define MAX_TICKS ((1 << 13) - 1)
+#define MIN_TICKS 1000 /* FIXME: really so? */
static void sbxfi_init_timer(struct sbxfi *chip)
@@ -287,6 +288,8 @@ static void sbxfi_set_timer(struct sbxfi *chip, int ticks)
LOG(2, "SET TIMER TICKS = %d\n", ticks);
if (ticks > MAX_TICKS)
ticks = MAX_TICKS;
+ else if (ticks < MIN_TICKS)
+ ticks = MIN_TICKS;
sbxfi_write(chip, TIMR, ticks | TIMR_IE | TIMR_IP);
static void sbxfi_stop_timer(struct sbxfi *chip)
More information about the Alsa-devel