X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=oss_write.c;h=794f4242368b623a27f84d822e6c4960951cd919;hb=bb899fb1a0c279a2890ff30d11bf7aec50fb92ed;hp=d4b765857a852013bd3145e1a042589957d3f2aa;hpb=e5de57de1b8bf1df96c152fc92f5a49f75d6d96c;p=paraslash.git diff --git a/oss_write.c b/oss_write.c index d4b76585..794f4242 100644 --- a/oss_write.c +++ b/oss_write.c @@ -57,7 +57,7 @@ static int get_oss_format(enum sample_format sf) case SF_S16_BE: return AFMT_S16_BE; case SF_U16_LE: return AFMT_U16_LE; case SF_U16_BE: return AFMT_U16_BE; - default: return AFMT_S16_LE; + default: return -E_BAD_SAMPLE_FORMAT; } } @@ -71,7 +71,7 @@ static void oss_pre_select(struct sched *s, void *context) return; if (ret < 0 || !powd) return sched_min_delay(s); - para_fd_set(powd->fd, &s->wfds, &s->max_fileno); + sched_monitor_writefd(powd->fd, s); } static void oss_close(struct writer_node *wn) @@ -113,10 +113,14 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate, if (ret < 0) goto err; /* set PCM format */ - sample_format = format = get_oss_format(sample_format); + ret = get_oss_format(sample_format); + if (ret < 0) + return ret; + sample_format = format = ret; ret = ioctl(powd->fd, SNDCTL_DSP_SETFMT, &format); if (ret < 0) { ret = -ERRNO_TO_PARA_ERROR(errno); + PARA_ERROR_LOG("could not set sample format\n"); goto err; } ret = -E_BAD_SAMPLE_FORMAT; @@ -195,9 +199,15 @@ static int oss_post_select(__a_unused struct sched *s, void *context) if (sound_device_is_busy()) return 0; - get_btr_sample_rate(btrn, &rate); - get_btr_channels(btrn, &ch); - get_btr_sample_format(btrn, &format); + ret = get_btr_sample_rate(btrn, &rate); + if (ret < 0) + goto out; + ret = get_btr_channels(btrn, &ch); + if (ret < 0) + goto out; + ret = get_btr_sample_format(btrn, &format); + if (ret < 0) + goto out; ret = oss_init(wn, rate, ch, format); if (ret < 0) goto out; @@ -212,7 +222,7 @@ static int oss_post_select(__a_unused struct sched *s, void *context) goto out; } ret = 0; - if (!FD_ISSET(powd->fd, &s->wfds)) + if (!sched_write_ok(powd->fd, s)) goto out; /* get maximal number of bytes that can be written */ ret = ioctl(powd->fd, SNDCTL_DSP_GETOSPACE, &abi);