me wrote:

>me wrote:
>
>>Takashi Iwai wrote:
>>
>>>At Thu, 30 May 2002 17:14:03 +0200 (CEST),
>>>Tim Goetze wrote:
>>>> 
>>>> hi all,
>>>> 
>>>> both emu8k and ice1712 pcm drivers hang forever in ioctl(2) when
>>>> closing a playback stream if the stream has been linked to the 
>>>> same card's capture, has been prepared and written data to, but was
>>>> never started:
>>>> 
>>>> Program received signal SIGINT, Interrupt.
>>>> 0x403b8fa4 in ioctl () from /lib/libc.so.6
>>>> (gdb) bt
>>>> #0  0x403b8fa4 in ioctl () from /lib/libc.so.6
>>>> #1  0x40580abc in __DTOR_END__ () from /usr/lib/libasound.so.2
>>>> #2  0x4053bde9 in snd_pcm_drain (pcm=0x81c6ae8) at pcm.c:813
>>>> #3  0x4053b649 in snd_pcm_close (pcm=0x81c6ae8) at pcm.c:552
>>>> #4  0x40462d79 in AlsaStream::~AlsaStream (this=0x81bf6a8,
>>>> __in_chrg=0)
>>>>     at AlsaStream.cc:41
>>>> #5  0x4049ef01 in AlsaOut::~AlsaOut (this=0x81bf6a8, __in_chrg=3)
>>>>     at PyType.h:110
>>>
>>>it seems stalling at drain ioctl.  can you figure out which stream is?
>>
>>playback. 
>
>a playback stream not linked to any other stream behaves the same.
>
>before calling snd_pcm_close(), i get
>
>[~] cat /proc/asound/ice/pcm0p/sub0/status 
>state: PREPARED
>trigger_time: 0.000000
>tstamp      : 1022886544.305384
>delay       : -1053620964
>avail       : 0
>avail_max   : 0
>
>this is what happens in snd_pcm_playback_drain() when i call
>snd_pcm_close() now:
>
>the stream is started ok. the stream state is then switched to
>SNDRV_PCM_STATE_DRAINING and then the interruptible loop waiting for
>the stream to go to a different state is running forever because
>stream->state remains 5 = SNDRV_PCM_STATE_DRAINING. 

since state never changes, i checked what happens when the card is
firing an interrupt. following the code path, i think the only point
the state can be changed is in snd_pcm_update_hw_ptr_interrupt()
where 'avail' is checked against 'runtime->stop_threshold'. if this
value is the same as stop_threshold in 

[~] cat /proc/asound/ice/pcm0p/sub0/sw_params 
tstamp_mode: NONE
period_step: 1
sleep_min: 0
avail_min: 2048
xfer_align: 2048
start_threshold: 4294967295
stop_threshold: 4294967295
silence_threshold: 0
silence_size: 0
boundary: 1073741824

then it will take quite some time to reach (not forever though).

i modified my code to set stop_threshold to exactly ring buffer size,
and a playback stream alone closes on the ice within short time. on
the awe (at 128 frames) snd_pcm_close() hangs for a few seconds and
then i get: 

pcm.c:656: snd_pcm_hw_free: Assertion `snd_pcm_state(pcm) ==
SND_PCM_STATE_SETUP || snd_pcm_state(pcm) == SND_PCM_STATE_PREPARED'
failed.

and

[~] cat /proc/asound/awe64/pcm0p/sub0/status    
state: DRAINING
trigger_time: 1022892601.216727
tstamp      : 1022892616.804303
delay       : -687208
avail       : 687464
avail_max   : 687464

i modified my code to again use capture and playback in a linked setup
with the new stop_threshold, and now i get the same assertion failure
on both cards, plus:

Jun  1 02:20:31 localhost kernel: ALSA pcm_native.c:654: snd_pcm_stop
bogus call from c88e9239?
Jun  1 02:21:02 localhost last message repeated 10529 times

etc etc, on both cards.

giving up. i hope i've gathered enough clues, and expressed them
clearly enough, for somebody with more insight to fix this. en tout
cas, the bug(s) can be easily reproduced and most probably isn't
limited to the specific cards here.

tim




_______________________________________________________________

Don't miss the 2002 Sprint PCS Application Developer's Conference
August 25-28 in Las Vegas -- http://devcon.sprintpcs.com/adp/index.cfm

_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to