On Wed, Apr 21, 2010 at 04:32:17PM +0200, Eric Faurot wrote:
> Hi,
> 
> - update to 0.6
> - implement sndio backend and get rid of ossaudio
> 
> comments? ok?
> 

Great! Few comment inlined below:

> +
> +#define bPS  16
> +#define BPS  2
> +
> +ad_rec_t *
> +ad_open_dev(const char *dev, int32 rate)
> +{
> +     struct sio_hdl  *hdl;
> +     struct sio_par   param;
> +
> +     hdl = sio_open(dev, SIO_REC, 1);
> +     if (hdl == NULL) {
> +             fprintf(stderr, "ad_open_dev: sio_open(%s) failed\n");
> +             return NULL;
> +     }
> +
> +     sio_initpar(&param);
> +     param.bits = bPS;
> +     param.bps = BPS;
> +     param.sig = 1;
> +     param.le = 1;

this forces little endian on any arch; not 100% sure, but
looking at the alsa backend, native endianness seems what
the program expects. Ex.

        par.le = SIO_LE_NATIVE;
        
> +     param.rchan = 1;
> +     param.rate = rate;
> +     if (sio_setpar(&hdl, &param)) {

        sio_setpar() returns 1 on success, so it should be:

        if (!sio_setpar...)

> +             fprintf(stderr, "ad_open_dev: sio_setpar() failed\n");
> +             sio_close(hdl);
> +             return NULL;
> +     }
> +     if (sio_getpar(&hdl, &param)) {

        if (!sio_getpar...)


> +             fprintf(stderr, "ad_open_dev: sio_getpar() failed\n");
> +             sio_close(hdl);
> +             return NULL;
> +     }
> +     if (param.bits != bPS ||
> +         param.bps != BPS ||
> +         param.sig != 1 ||
> +         param.le != 1 ||
                        SIO_LE_NATIVE
> +         param.rchan != 1 ||
> +         param.rate != rate) {
> +             fprintf(stderr, "ad_open_dev: can't set specified params\n");
> +             sio_close(hdl);
> +             return NULL;
> +     }
> +
> +     return (ad_rec_t*)hdl;
> +}
> +
> +ad_rec_t *
> +ad_open_sps(int32 rate)
> +{
> +     return ad_open_dev(NULL, rate);
> +}
> +
> +ad_rec_t *
> +ad_open(void)
> +{
> +     return ad_open_sps(DEFAULT_SAMPLES_PER_SEC);
> +}
> +
> +int32
> +ad_start_rec(ad_rec_t *r)
> +{
> +     struct sio_hdl  *hdl = (struct sio_hdl*)r;
> +
> +     if (sio_start(hdl))
> +             return AD_ERR_GEN;

        if (!sio_start(hdl))

> +
> +     return (0);
> +}
> +
> +int32
> +ad_stop_rec(ad_rec_t *r)
> +{
> +     struct sio_hdl  *hdl = (struct sio_hdl*)r;
> +
> +     if (sio_stop(hdl))
> +             return AD_ERR_GEN;

        if (!sio_stop())

> +
> +     return (0);
> +}
> +
> +
> +int32
> +ad_read(ad_rec_t *r, int16 *buf, int32 max)
> +{
> +     size_t           n;
> +     struct sio_hdl  *hdl = (struct sio_hdl*)r;
> +
> +     n = sio_read(hdl, buf, max * BPS);

sio_read() may return a partial read, which may cause
alignement error in the next read, to avoid this:

        n = sio_read(..., max * BPS);
        todo = n % BPS;
        while (todo > 0) {
                done = sio_read(..., todo);
                if (done == 0)
                        break;          /* error */
                todo -= done;
        }
        return n / BPS;


> +     return (n / 2);
> +}
> +
> +int32
> +ad_close(ad_rec_t *r)
> +{
> +     struct sio_hdl  *hdl = (struct sio_hdl*)r;
> +
> +     sio_close(hdl);
> +     return (0);
> +}

-- Alexandre

Reply via email to