Hi folks,
after processing all periods of DMA buffer (at the end of each calling snd_pcm_period_elapsed()) I leave last DMA callback. Then snd_pcm_playback_drain() function is entered and waiting on (10*HZ) timeout started. This timed out everytime. This means, that state of that stream is set to EXPIRED and everything ends with error message. Detailed listing of debug messages follows at the end of mail. I know, that schedule_timeout() could be interrupted, but I don't know how I should do that. Are there some actions, that must be undertaken to get next DMA buffer for transmission? 2Jaroslav: Please, should you commit my changes to CVS so others could help me. Thanks Listing: playback_open audio_init set_samplerate rate: 44100 l3_configure fs: 256 format: 1 set_samplerate done (new rate: 44100) dma_reset stop_dma stop + clear done ... playback_ioctl hw_params playback_prepare set_samplerate rate: 8000 l3_configure fs: 512 format: 1 set_samplerate done (new rate: 8000) playback_ioctl playback_trigger pcm_trigger id: 0 cmd: 1 sound: 2 x 8000 [Hz] periods: 4 x 1000 [fr] buffer_size: 4000 [fr] dma_addr c0e68000 process_dma sending period 4 (dma_size[B]: 4000 offset[B]: 000000)... OK sending period 3 (dma_size[B]: 4000 offset[B]: 004000)... OK sending period 2 (dma_size[B]: 4000 offset[B]: 008000)... pcm_trigger done playback_pointer get_dma_pos 704 -> 176 [fr] hw_ptr_interrupt: 00000000 updated pos [fr]: 176 dma_callback -> period done (still pending 1) <- playback_pointer get_dma_pos 4288 -> 1072 [fr] hw_ptr_interrupt: 00000000 updated pos [fr]: 1072 process_dma sending period 2 (dma_size[B]: 4000 offset[B]: 008000)... OK sending period 1 (dma_size[B]: 4000 offset[B]: 012000)... dma_callback done playback_pointer get_dma_pos 5272 -> 1318 [fr] hw_ptr_interrupt: 000003e8 updated pos [fr]: 1318 dma_callback -> period done (still pending 1) <- playback_pointer get_dma_pos 8304 -> 2076 [fr] hw_ptr_interrupt: 000003e8 updated pos [fr]: 2076 process_dma sending period 1 (dma_size[B]: 4000 offset[B]: 012000)... OK dma_callback done playback_pointer get_dma_pos 9128 -> 2282 [fr] hw_ptr_interrupt: 000007d0 updated pos [fr]: 2282 dma_callback -> period done (still pending 1) <- playback_pointer get_dma_pos 12296 -> 3074 [fr] hw_ptr_interrupt: 000007d0 updated pos [fr]: 3074 process_dma dma_callback done playback_pointer get_dma_pos 12912 -> 3228 [fr] hw_ptr_interrupt: 00000bb8 updated pos [fr]: 3228 dma_callback -> period done (still pending 0) <- playback_pointer get_dma_pos 16000 -> 4000 [fr] hw_ptr_interrupt: 00000bb8 updated pos [fr]: 4000 process_dma dma_callback done waiting in drain ..... timed out in drain ... ALSA ../alsa-kernel/core/pcm_native.c:1087: playback drain error (DMA or IRQ trouble?) playback_pointer get_dma_pos 16000 -> 4000 [fr] hw_ptr_interrupt: 00000fa0 updated pos [fr]: 4000 playback_trigger pcm_trigger id: 0 cmd: 0 sound: 2 x 8000 [Hz] periods: 4 x 1000 [fr] buffer_size: 4000 [fr] dma_addr c0e68000 stop_dma stop + clear done ... pcm_trigger done hw_free hw_free playback_close And here is (modified) part of snd_pcm_playback_drain() function: while (1) { set_current_state(TASK_INTERRUPTIBLE); if (signal_pending(current)) { state = SIGNALED; break; } spin_unlock_irq(&runtime->lock); printk("waiting in drain .....\n"); if (schedule_timeout(10 * HZ) == 0) { printk("timed out in drain ...\n"); spin_lock_irq(&runtime->lock); state = runtime->status->state == SNDRV_PCM_STATE_SUSPENDED ? SUSPENDED : EXPIRED; break; } spin_lock_irq(&runtime->lock); if (runtime->status->state != SNDRV_PCM_STATE_DRAINING) { state = READY; break; } } -- Tomas Kasparek (sioux, xkaspa06) Tomas.Kasparek@[seznam.cz,volny.cz] [EMAIL PROTECTED] student UIVT FEI VUT Brno _______________________________________________ Alsa-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-devel