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?
thanks,
Takashi
diff --git a/sound/pci/sbxfi/sbxfi.c b/sound/pci/sbxfi/sbxfi.c index 26a6cd3..5ceb228 100644 --- a/sound/pci/sbxfi/sbxfi.c +++ b/sound/pci/sbxfi/sbxfi.c @@ -277,6 +277,7 @@ static void sbxfi_rearm_timer(struct sbxfi *chip, int ticks) #else
#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)