Deleted Added
full compact
26c26
< * $FreeBSD: head/sys/dev/sound/pcm/dsp.c 54535 1999-12-13 03:29:09Z cg $
---
> * $FreeBSD: head/sys/dev/sound/pcm/dsp.c 55204 1999-12-29 03:46:54Z cg $
220,221c220,222
< if (wrch && wrch->buffer.dl) chn_dmaupdate(wrch);
< *arg_i = wrch? wrch->buffer.fl : 0;
---
> if (wrch && wrch->buffer.dl)
> while (chn_wrfeed(wrch) > 0);
> *arg_i = wrch? wrch->buffer2nd.fl : 0;
227d227
< splx(s);
235,236c235,236
< if (wrch) p->play_size = wrch->blocksize;
< if (rdch) p->rec_size = rdch->blocksize;
---
> if (wrch) p->play_size = wrch->blocksize2nd;
> if (rdch) p->rec_size = rdch->blocksize2nd;
243d242
< splx(s);
275,276c274,275
< p->bufsize = min(rdch? rdch->buffer.bufsize : 1000000,
< wrch? wrch->buffer.bufsize : 1000000);
---
> p->bufsize = min(rdch? rdch->buffer2nd.bufsize : 1000000,
> wrch? wrch->buffer2nd.bufsize : 1000000);
290d288
< splx(s);
304,305c302,304
< if (rdch && rdch->buffer.dl) chn_dmaupdate(rdch);
< *arg_i = rdch? rdch->buffer.rl : 0;
---
> if (rdch && rdch->buffer.dl)
> while (chn_rdfeed(rdch) > 0);
> *arg_i = rdch? rdch->buffer2nd.rl : 0;
328c327,332
< *arg_i = CHN_2NDBUFBLKSIZE;
---
> if (wrch)
> *arg_i = wrch->blocksize2nd;
> else if (rdch)
> *arg_i = rdch->blocksize2nd;
> else
> *arg_i = 0;
332d335
< splx(s);
338a342
> splx(s);
346c350
< if (wrch) chn_sync(wrch, wrch->buffer.bufsize - 4);
---
> if (wrch) chn_sync(wrch, wrch->buffer2nd.bufsize - 4);
403,405c407,422
< splx(s);
< if (rdch) chn_setblocksize(rdch, bytes);
< if (wrch) chn_setblocksize(wrch, bytes);
---
> if (count == 0)
> count = CHN_2NDBUFWHOLESIZE / bytes;
> if (count < 2) {
> ret = EINVAL;
> break;
> }
> if (rdch) {
> chn_setblocksize(rdch, bytes * count);
> rdch->blocksize2nd = bytes;
> rdch->fragments = rdch->buffer2nd.bufsize / rdch->blocksize2nd;
> }
> if (wrch) {
> chn_setblocksize(wrch, bytes * count);
> wrch->blocksize2nd = bytes;
> wrch->fragments = wrch->buffer2nd.bufsize / wrch->blocksize2nd;
> }
410,411c427,428
< count = c->buffer.bufsize / c->blocksize;
< bytes = ffs(c->blocksize) - 1;
---
> count = c->buffer2nd.bufsize / c->blocksize2nd;
> bytes = ffs(c->blocksize2nd) - 1;
416,417c433,434
< case SNDCTL_DSP_GETISPACE:
< /* return space available in the input queue */
---
> case SNDCTL_DSP_GETISPACE: /* XXX Space for reading? Makes no sense... */
> /* return the size of data available in the input queue */
422,426c439,449
< if (b->dl) chn_dmaupdate(rdch);
< a->bytes = b->fl;
< a->fragments = 1;
< a->fragstotal = b->bufsize / rdch->blocksize;
< a->fragsize = rdch->blocksize;
---
> snd_dbuf *bs = &rdch->buffer2nd;
> if (b->dl)
> /*
> * Suck up the secondary and DMA buffer.
> * chn_rdfeed*() takes care of the alignment.
> */
> while (chn_rdfeed(rdch) > 0);
> a->bytes = bs->rl;
> a->fragments = a->bytes / rdch->blocksize2nd;
> a->fragstotal = bs->bufsize / rdch->blocksize2nd;
> a->fragsize = rdch->blocksize2nd;
437,441c460,473
< if (b->dl) chn_dmaupdate(wrch);
< a->bytes = b->fl;
< a->fragments = 1;
< a->fragstotal = b->bufsize / wrch->blocksize;
< a->fragsize = wrch->blocksize;
---
> snd_dbuf *bs = &wrch->buffer2nd;
> if (b->dl) {
> /*
> * Fill up the secondary and DMA buffer.
> * chn_wrfeed*() takes care of the alignment.
> * Check for underflow before writing into the buffers.
> */
> chn_checkunderflow(wrch);
> while (chn_wrfeed(wrch) > 0);
> }
> a->bytes = bs->fl;
> a->fragments = a->bytes / wrch->blocksize2nd;
> a->fragstotal = bs->bufsize / wrch->blocksize2nd;
> a->fragsize = wrch->blocksize2nd;
450,455c482,492
< snd_dbuf *b = &rdch->buffer;
< if (b->dl) chn_dmaupdate(rdch);
< a->bytes = b->total;
< a->blocks = (b->total - b->prev_total) / rdch->blocksize;
< a->ptr = b->fp;
< b->prev_total += a->blocks * rdch->blocksize;
---
> snd_dbuf *b = &rdch->buffer;
> snd_dbuf *bs = &rdch->buffer2nd;
> if (b->dl)
> /*
> * Suck up the secondary and DMA buffer.
> * chn_rdfeed*() takes care of the alignment.
> */
> while (chn_rdfeed(rdch) > 0);
> a->bytes = bs->total;
> a->blocks = bs->rl / rdch->blocksize2nd;
> a->ptr = bs->rl % rdch->blocksize2nd;
465,469c502,514
< if (b->dl) chn_dmaupdate(wrch);
< a->bytes = b->total;
< a->blocks = (b->total - b->prev_total) / wrch->blocksize;
< a->ptr = b->rp;
< b->prev_total += a->blocks * wrch->blocksize;
---
> snd_dbuf *bs = &wrch->buffer2nd;
> if (b->dl) {
> /*
> * Fill up the secondary and DMA buffer.
> * chn_wrfeed*() takes care of the alignment.
> * Check for underflow before writing into the buffers.
> */
> chn_checkunderflow(wrch);
> while (chn_wrfeed(wrch) > 0);
> }
> a->bytes = bs->total;
> a->blocks = bs->rl / wrch->blocksize2nd;
> a->ptr = bs->fl % wrch->blocksize2nd;
507,515c552,562
< case SNDCTL_DSP_GETODELAY:
< if (wrch) {
< snd_dbuf *b = &wrch->buffer;
< if (b->dl)
< chn_dmaupdate(wrch);
< *arg = b->total;
< } else
< ret = EINVAL;
< break;
---
> case SNDCTL_DSP_GETODELAY:
> if (wrch) {
> snd_dbuf *b = &wrch->buffer;
> if (b->dl) {
> chn_checkunderflow(wrch);
> while (chn_wrfeed(wrch) > 0);
> }
> *arg = b->total;
> } else
> ret = EINVAL;
> break;
558a606
> printf("dsp_mmap.\n");
560c608
< return atop(vtophys(c->buffer.buf + offset));
---
> return atop(vtophys(c->buffer2nd.buf + offset));