[alsa-devel] Backported sbxfi driver (UNTESTED!)
The Source
thesourcehim at gmail.com
Fri Oct 17 11:58:20 CEST 2008
Takashi Iwai пишет:
> 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)
>
>
After patch:
Without system timer:
aplay --period-size=1024 96000_16_Stereo.wav
Plays fine
aplay --period-size=1024 22050_16_Mono.wav
BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
Hang
With system timer:
aplay --period-size=1024 96000_16_Stereo.wav
Superglitch. Each sample is played many times before advancing to next one.
aplay --period-size=1024 22050_16_Mono.wav
Instant reboot.
More information about the Alsa-devel
mailing list