Here is the Asterisk alsa write code loop. I added the trap for -EIO. I'm getting an negative return from snd_pcm_recover. [Feb 14 20:08:25] ERROR[3085]: chan_alsa.c:404 alsa_write: snd_pcm_recover failed Input/output error Is there anything obvious which needs to be done to make this more pulse friendly? I'm still working on running with gdb. Jim static int alsa_write(struct ast_channel *chan, struct ast_frame *f) { static char sizbuf[8000]; static int sizpos = 0; int len = sizpos; int pos; int res = 0; /* size_t frames = 0; */ snd_pcm_state_t state; ast_mutex_lock(&alsalock); /* We have to digest the frame in 160-byte portions */ if (f->datalen > sizeof(sizbuf) - sizpos) { ast_log(LOG_WARNING, "Frame too large\n"); res = -1; } else { memcpy(sizbuf + sizpos, f->data, f->datalen); len += f->datalen; pos = 0; state = snd_pcm_state(alsa.ocard); if (state == SND_PCM_STATE_XRUN) snd_pcm_prepare(alsa.ocard); res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2); if (res == -EPIPE) { #if DEBUG ast_debug(1, "XRUN write\n"); #endif snd_pcm_prepare(alsa.ocard); res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2); if (res != len / 2) { ast_log(LOG_ERROR, "Write error: %s\n", snd_strerror(res)); res = -1; } else if (res < 0) { ast_log(LOG_ERROR, "Write error %s\n", snd_strerror(res)); res = -1; } } else if (res == -EIO) { res = snd_pcm_recover ( alsa.ocard, res, 1); if (res != 0) { ast_log(LOG_ERROR, "snd_pcm_recover failed %s\n", snd_strerror(res)); } } else { if (res == -ESTRPIPE) ast_log(LOG_ERROR, "You've got some big problems\n"); else if (res < 0) ast_log(LOG_NOTICE, "Error %d on write\n", res); } } ast_mutex_unlock(&alsalock); return res >= 0 ? 0 : res; } Jim Duda wrote: > Lennart, > > Asterisk does not call snd_pcm_recover( ) after receiving EIO. > There is no specific trap for EIO. > > Thanks for the reply, I will start with gdb and report back my findings. > > Jim > > > "Lennart Poettering" <lennart at poettering.net> wrote in message news:20080213115403.GA13794 at tango.0pointer.de... >> On Sun, 03.02.08 16:38, Jim Duda (jim at duda.tzo.com) wrote: >> >>> When I directly connect Asterisk to the sound card, everything works >>> fine. However, when I attempt to connect to the sound card through >>> Pulseaudio, the Asterisk application will crash after making the second >>> call connection. >>> >>> The only evidence of something I currently see going wrong is that the >>> alsa interface for Asterisk receives a -5 (-EIO) on a write to the alsa >>> interface. I don't know if that is the eventual cause of the crash. >> There are multiple reasons why ALSA or our ALSA backend might return >> EIO to the application. From this remote perspective it is not really >> possible for me to find out what the exact problem is. >> >> Please install the debugging symbols for alsa-plugins and use gdb to >> find out what the reason for the EIO might be. >> >> Does Asterisk call snd_pcm_recover() after getting the EIO? >> >> Lennart >> >> -- >> Lennart Poettering Red Hat, Inc. >> lennart [at] poettering [dot] net ICQ# 11060553 >> http://0pointer.net/lennart/ GnuPG 0x1A015CC4