diff --git a/kern/devaudio-alsa.c b/kern/devaudio-alsa.c index 30dfd60..9c0405b 100644 --- a/kern/devaudio-alsa.c +++ b/kern/devaudio-alsa.c @@ -25,22 +25,22 @@ void audiodevopen(void) { if(snd_pcm_open(&playback, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0) - error("snd_pcm_open playback"); + error("snd_pcm_open(playback)"); if(snd_pcm_set_params(playback, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) - error("snd_pcm_set_params playback"); + error("snd_pcm_set_params(playback)"); if(snd_pcm_prepare(playback) < 0) - error("snd_pcm_prepare playback"); + error("snd_pcm_prepare(playback)"); if(snd_pcm_open(&capture, "default", SND_PCM_STREAM_CAPTURE, 0) < 0) - error("snd_pcm_open capture"); + error("snd_pcm_open(capture)"); if(snd_pcm_set_params(capture, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) - error("snd_pcm_set_params capture"); + error("snd_pcm_set_params(capture)"); if(snd_pcm_prepare(capture) < 0) - error("snd_pcm_prepare capture"); + error("snd_pcm_prepare(capture)"); } void @@ -85,7 +85,7 @@ audiodevwrite(void *v, int n) if (frames < 0) frames = snd_pcm_recover(playback, frames, 0); if (frames < 0) - error((char*)snd_strerror(frames)); + error("snd_pcm_writei"); m = frames*4; } @@ -100,9 +100,11 @@ audiodevread(void *v, int n) do { frames = snd_pcm_readi(capture, v, n/4); } while(frames == -EAGAIN); - if (frames < 0) - error((char*)snd_strerror(frames)); + frames = snd_pcm_recover(capture, frames, 0); + if (frames < 0) + error("snd_pcm_readi"); return frames*4; } + diff --git a/kern/devaudio.c b/kern/devaudio.c index 1655262..0009994 100644 --- a/kern/devaudio.c +++ b/kern/devaudio.c @@ -14,6 +14,7 @@ enum Aclosed = 0, Aread, Awrite, + Ardwr, Speed = 44100, Ncmd = 50, /* max volume command words */ @@ -31,7 +32,7 @@ static struct { QLock lk; Rendez vous; - int amode; /* Aclosed/Aread/Awrite for /audio */ + int amode; /* Aclosed/Aread/Awrite/Ardwr for /audio */ } audio; #define aqlock(a) qlock(&(a)->lk) @@ -114,6 +115,8 @@ audioopen(Chan *c, int omode) amode = Awrite; if((omode&7) == OREAD) amode = Aread; + else if((omode&7) == ORDWR) + amode = Ardwr; aqlock(&audio); if(waserror()){ aqunlock(&audio); @@ -178,7 +181,7 @@ audioread(Chan *c, void *v, long n, vlong off) return devdirread(c, a, n, audiodir, nelem(audiodir), devgen); case Qaudio: - if(audio.amode != Aread) + if(audio.amode != Aread && audio.amode != Ardwr) error(Emode); aqlock(&audio); if(waserror()){ @@ -324,7 +327,7 @@ audiowrite(Chan *c, void *vp, long n, vlong off) break; case Qaudio: - if(audio.amode != Awrite) + if(audio.amode != Awrite && audio.amode != Ardwr) error(Emode); aqlock(&audio); if(waserror()){