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. at this point, i get [~] cat /proc/asound/ice/pcm0p/sub0/status state: <NULL> trigger_time: 1022886587.196499 tstamp : 1022886605.224624 delay : -790953 avail : 795049 avail_max : 795049 and a little later [~] cat /proc/asound/ice/pcm0p/sub0/status state: <NULL> trigger_time: 1022886587.196499 tstamp : 1022886607.877699 delay : -907955 avail : 912051 avail_max : 912051 and so on, so the card is firing irqs (a fact cat /proc/interrupts confirms). if i haven't run my code under gdb i then need to reboot the box to work with the card because the module is claimed 'busy'. tim ps: i think "state: <NULL>" in the output from /proc above suggests that "char * snd_pcm_state_names[]" (in kernel/pcm.c:139) needs a revision. a patch is attached. pps: please, please, please somebody of you authors of alsa-driver/*, do add some comments around the code. i have absolutely no clue why a stream that is about to be closed needs draining in the first place.
Index: alsa-driver/kernel/pcm.c =================================================================== RCS file: /cvsroot/alsa/alsa-driver/kernel/Attic/pcm.c,v retrieving revision 1.120 diff -u -r1.120 pcm.c --- alsa-driver/kernel/pcm.c 12 Oct 2001 10:43:18 -0000 1.120 +++ alsa-driver/kernel/pcm.c 31 May 2002 23:45:54 -0000 @@ -141,7 +141,9 @@ STATE(PREPARED), STATE(RUNNING), STATE(XRUN), + STATE(DRAINING), STATE(PAUSED), + STATE(SUSPENDED), }; char *snd_pcm_access_names[] = {