summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2000-12-23 03:16:13 +0000
committercg <cg@FreeBSD.org>2000-12-23 03:16:13 +0000
commitd0b795f25b705ff883368ba3e49f31c3541d3b11 (patch)
tree076eb63fe5bbf4764062f83df117a0ee11cfc3ed /sys/dev/sound/pci
parent818087b543b4be6d1211cb39cb7b7204e9ae9f6c (diff)
downloadFreeBSD-src-d0b795f25b705ff883368ba3e49f31c3541d3b11.zip
FreeBSD-src-d0b795f25b705ff883368ba3e49f31c3541d3b11.tar.gz
update code dealing with snd_dbuf objects to do so using a functional interface
modify chn_setblocksize() to pick a default soft-blocksize appropriate to the sample rate and format in use. it will aim for a power of two size small enough to generate block sizes of at most 20ms. it will also set the hard-blocksize taking into account rate/format conversions in use. update drivers to implement setblocksize correctly: updated, tested: sb16, emu10k1, maestro, solo updated, untested: ad1816, ess, mss, sb8, csa not updated: ds1, es137x, fm801, neomagic, t4dwave, via82c686 i lack hardware to test: ad1816, csa, fm801, neomagic others will be updated/tested in the next few days.
Diffstat (limited to 'sys/dev/sound/pci')
-rw-r--r--sys/dev/sound/pci/aureal.c5
-rw-r--r--sys/dev/sound/pci/csapcm.c18
-rw-r--r--sys/dev/sound/pci/ds1.c14
-rw-r--r--sys/dev/sound/pci/emu10k1.c69
-rw-r--r--sys/dev/sound/pci/es137x.c20
-rw-r--r--sys/dev/sound/pci/fm801.c5
-rw-r--r--sys/dev/sound/pci/maestro.c21
-rw-r--r--sys/dev/sound/pci/neomagic.c3
-rw-r--r--sys/dev/sound/pci/solo.c16
-rw-r--r--sys/dev/sound/pci/t4dwave.c24
-rw-r--r--sys/dev/sound/pci/via82c686.c13
11 files changed, 120 insertions, 88 deletions
diff --git a/sys/dev/sound/pci/aureal.c b/sys/dev/sound/pci/aureal.c
index e957b07..09ead9f 100644
--- a/sys/dev/sound/pci/aureal.c
+++ b/sys/dev/sound/pci/aureal.c
@@ -242,7 +242,7 @@ au_prepareoutput(struct au_chinfo *ch, u_int32_t format)
{
struct au_info *au = ch->parent;
int i, stereo = (format & AFMT_STEREO)? 1 : 0;
- u_int32_t baseaddr = vtophys(ch->buffer->buf);
+ u_int32_t baseaddr = vtophys(sndbuf_getbuf(ch->buffer));
au_wr(au, 0, 0x1061c, 0, 4);
au_wr(au, 0, 0x10620, 0, 4);
@@ -301,9 +301,8 @@ auchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = au;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = AU_BUFFSIZE;
ch->dir = dir;
- if (chn_allocbuf(ch->buffer, au->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, au->parent_dmat, AU_BUFFSIZE) == -1) return NULL;
return ch;
}
diff --git a/sys/dev/sound/pci/csapcm.c b/sys/dev/sound/pci/csapcm.c
index c3ae93e..8bad7b5 100644
--- a/sys/dev/sound/pci/csapcm.c
+++ b/sys/dev/sound/pci/csapcm.c
@@ -523,8 +523,7 @@ csachan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = csa;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = CS461x_BUFFSIZE;
- if (chn_allocbuf(ch->buffer, csa->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, csa->parent_dmat, CS461x_BUFFSIZE) == -1) return NULL;
return ch;
}
@@ -538,9 +537,9 @@ csachan_setdir(kobj_t obj, void *data, int dir)
resp = &csa->res;
if (dir == PCMDIR_PLAY)
- csa_writemem(resp, BA1_PBA, vtophys(ch->buffer->buf));
+ csa_writemem(resp, BA1_PBA, vtophys(sndbuf_getbuf(ch->buffer)));
else
- csa_writemem(resp, BA1_CBA, vtophys(ch->buffer->buf));
+ csa_writemem(resp, BA1_CBA, vtophys(sndbuf_getbuf(ch->buffer)));
ch->dir = dir;
return 0;
}
@@ -606,12 +605,7 @@ csachan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
csachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
-#if notdef
- return blocksize;
-#else
- struct csa_chinfo *ch = data;
- return ch->buffer->bufsize / 2;
-#endif /* notdef */
+ return CS461x_BUFFSIZE / 2;
}
static int
@@ -648,11 +642,11 @@ csachan_getptr(kobj_t obj, void *data)
resp = &csa->res;
if (ch->dir == PCMDIR_PLAY) {
- ptr = csa_readmem(resp, BA1_PBA) - vtophys(ch->buffer->buf);
+ ptr = csa_readmem(resp, BA1_PBA) - vtophys(sndbuf_getbuf(ch->buffer));
if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
ptr >>= 1;
} else {
- ptr = csa_readmem(resp, BA1_CBA) - vtophys(ch->buffer->buf);
+ ptr = csa_readmem(resp, BA1_CBA) - vtophys(sndbuf_getbuf(ch->buffer));
if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
ptr >>= 1;
}
diff --git a/sys/dev/sound/pci/ds1.c b/sys/dev/sound/pci/ds1.c
index c215b5a..5d76502 100644
--- a/sys/dev/sound/pci/ds1.c
+++ b/sys/dev/sound/pci/ds1.c
@@ -431,8 +431,8 @@ ds_setuppch(struct sc_pchinfo *ch)
stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
b16 = (ch->fmt & AFMT_16BIT)? 1 : 0;
c = stereo? 1 : 0;
- buf = ch->buffer->buf;
- sz = ch->buffer->bufsize;
+ buf = sndbuf_getbuf(ch->buffer);
+ sz = sndbuf_getsize(ch->buffer);
ds_initpbank(ch->lslot, c, stereo, b16, ch->spd, buf, sz);
ds_initpbank(ch->lslot + 1, c, stereo, b16, ch->spd, buf, sz);
@@ -450,8 +450,8 @@ ds_setuprch(struct sc_rchinfo *ch)
stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
b16 = (ch->fmt & AFMT_16BIT)? 1 : 0;
- buf = ch->buffer->buf;
- sz = ch->buffer->bufsize;
+ buf = sndbuf_getbuf(ch->buffer);
+ sz = sndbuf_getsize(ch->buffer);
pri = (ch->num == DS1_RECPRIMARY)? 1 : 0;
for (i = 0; i < 2; i++) {
@@ -480,14 +480,13 @@ ds1pchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch = &sc->pch[sc->pchn++];
ch->buffer = b;
- ch->buffer->bufsize = 4096;
ch->parent = sc;
ch->channel = c;
ch->dir = dir;
ch->fmt = AFMT_U8;
ch->spd = 8000;
ch->run = 0;
- if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 4096) == -1)
return NULL;
else {
ch->lsnum = sc->pslotfree;
@@ -602,13 +601,12 @@ ds1rchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch = &sc->rch[sc->rchn];
ch->num = sc->rchn++;
ch->buffer = b;
- ch->buffer->bufsize = 4096;
ch->parent = sc;
ch->channel = c;
ch->dir = dir;
ch->fmt = AFMT_U8;
ch->spd = 8000;
- if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 4096) == -1)
return NULL;
else {
ch->slot = (ch->num == DS1_RECPRIMARY)? sc->rbank + 2: sc->rbank;
diff --git a/sys/dev/sound/pci/emu10k1.c b/sys/dev/sound/pci/emu10k1.c
index e199446..e816572 100644
--- a/sys/dev/sound/pci/emu10k1.c
+++ b/sys/dev/sound/pci/emu10k1.c
@@ -68,7 +68,7 @@ struct sc_info;
/* channel registers */
struct sc_pchinfo {
- int spd, fmt, run;
+ int spd, fmt, blksz, run;
struct emu_voice *master, *slave;
snd_dbuf *buffer;
pcm_channel *channel;
@@ -76,7 +76,7 @@ struct sc_pchinfo {
};
struct sc_rchinfo {
- int spd, fmt, run, num;
+ int spd, fmt, run, blksz, num;
u_int32_t idxreg, basereg, sizereg, setupreg, irqmask;
snd_dbuf *buffer;
pcm_channel *channel;
@@ -97,7 +97,7 @@ struct sc_info {
int regtype, regid, irqid;
void *ih;
- int timer;
+ int timer, timerinterval;
int pnum, rnum;
struct emu_mem mem;
struct emu_voice voice[64];
@@ -303,12 +303,39 @@ emu_enaint(struct sc_info *sc, char channel, int enable)
/* stuff */
static int
+emu_settimer(struct sc_info *sc)
+{
+ struct sc_pchinfo *pch;
+ struct sc_rchinfo *rch;
+ int i, tmp, rate;
+
+ rate = 0;
+ for (i = 0; i < EMU_CHANS; i++) {
+ pch = &sc->pch[i];
+ tmp = (pch->spd * sndbuf_getbps(pch->buffer)) / pch->blksz;
+ if (tmp > rate)
+ rate = tmp;
+ }
+
+ for (i = 0; i < 3; i++) {
+ rch = &sc->rch[i];
+ tmp = (rch->spd * sndbuf_getbps(rch->buffer)) / rch->blksz;
+ if (tmp > rate)
+ rate = tmp;
+ }
+ RANGE(rate, 48, 9600);
+ sc->timerinterval = 48000 / rate;
+ emu_wr(sc, TIMER, sc->timerinterval & 0x03ff, 2);
+
+ return sc->timerinterval;
+}
+
+static int
emu_enatimer(struct sc_info *sc, int go)
{
u_int32_t x;
if (go) {
if (sc->timer++ == 0) {
- emu_wr(sc, TIMER, 256, 2);
x = emu_rd(sc, INTE, 4);
x |= INTE_INTERVALTIMERENB;
emu_wr(sc, INTE, x, 4);
@@ -430,10 +457,8 @@ emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
buf = emu_memalloc(sc, sz);
if (buf == NULL)
return -1;
- if (c != NULL) {
- c->buffer.buf = buf;
- c->buffer.bufsize = sz;
- }
+ if (c != NULL)
+ sndbuf_setup(&c->buffer, buf, sz);
m->start = emu_memstart(sc, buf) * EMUPAGESIZE;
m->end = m->start + sz;
m->channel = NULL;
@@ -631,6 +656,9 @@ emupchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->buffer = b;
ch->parent = sc;
ch->channel = c;
+ ch->blksz = EMU_BUFFSIZE / 2;
+ ch->fmt = AFMT_U8;
+ ch->spd = 8000;
ch->master = emu_valloc(sc);
ch->slave = emu_valloc(sc);
if (emu_vinit(sc, ch->master, ch->slave, EMU_BUFFSIZE, ch->channel))
@@ -645,7 +673,7 @@ emupchan_free(kobj_t obj, void *data)
struct sc_pchinfo *ch = data;
struct sc_info *sc = ch->parent;
- return emu_memfree(sc, ch->buffer->buf);
+ return emu_memfree(sc, sndbuf_getbuf(ch->buffer));
}
static int
@@ -669,6 +697,14 @@ emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
+ struct sc_pchinfo *ch = data;
+ struct sc_info *sc = ch->parent;
+ int irqrate, blksz;
+
+ ch->blksz = blocksize;
+ emu_settimer(sc);
+ irqrate = 48000 / sc->timerinterval;
+ blksz = (ch->spd * sndbuf_getbps(ch->buffer)) / irqrate;
return blocksize;
}
@@ -684,6 +720,7 @@ emupchan_trigger(kobj_t obj, void *data, int go)
if (go == PCMTRIG_START) {
emu_vsetup(ch);
emu_vwrite(sc, ch->master);
+ emu_settimer(sc);
emu_enatimer(sc, 1);
#ifdef EMUDEBUG
printf("start [%d bit, %s, %d hz]\n",
@@ -737,9 +774,9 @@ emurchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
KASSERT(dir == PCMDIR_REC, ("emurchan_init: bad direction"));
ch = &sc->rch[sc->rnum];
ch->buffer = b;
- ch->buffer->bufsize = EMU_BUFFSIZE;
ch->parent = sc;
ch->channel = c;
+ ch->blksz = EMU_BUFFSIZE / 2;
ch->fmt = AFMT_U8;
ch->spd = 8000;
ch->num = sc->rnum;
@@ -769,10 +806,10 @@ emurchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
break;
}
sc->rnum++;
- if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sc->parent_dmat, EMU_BUFFSIZE) == -1)
return NULL;
else {
- emu_wrptr(sc, 0, ch->basereg, vtophys(ch->buffer->buf));
+ emu_wrptr(sc, 0, ch->basereg, vtophys(sndbuf_getbuf(ch->buffer)));
emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
return ch;
}
@@ -805,6 +842,14 @@ emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
+ struct sc_rchinfo *ch = data;
+ struct sc_info *sc = ch->parent;
+ int irqrate, blksz;
+
+ ch->blksz = blocksize;
+ emu_settimer(sc);
+ irqrate = 48000 / sc->timerinterval;
+ blksz = (ch->spd * sndbuf_getbps(ch->buffer)) / irqrate;
return blocksize;
}
diff --git a/sys/dev/sound/pci/es137x.c b/sys/dev/sound/pci/es137x.c
index 15779e8..0206dce 100644
--- a/sys/dev/sound/pci/es137x.c
+++ b/sys/dev/sound/pci/es137x.c
@@ -253,9 +253,8 @@ eschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = es;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = ES_BUFFSIZE;
ch->num = ch->parent->num++;
- if (chn_allocbuf(ch->buffer, es->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, es->parent_dmat, ES_BUFFSIZE) == -1) return NULL;
return ch;
}
@@ -269,16 +268,16 @@ eschan_setdir(kobj_t obj, void *data, int dir)
bus_space_write_1(es->st, es->sh, ES1370_REG_MEMPAGE,
ES1370_REG_DAC2_FRAMEADR >> 8);
bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMEADR & 0xff,
- vtophys(ch->buffer->buf));
+ vtophys(sndbuf_getbuf(ch->buffer)));
bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff,
- (ch->buffer->bufsize >> 2) - 1);
+ (sndbuf_getsize(ch->buffer) >> 2) - 1);
} else {
bus_space_write_1(es->st, es->sh, ES1370_REG_MEMPAGE,
ES1370_REG_ADC_FRAMEADR >> 8);
bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMEADR & 0xff,
- vtophys(ch->buffer->buf));
+ vtophys(sndbuf_getbuf(ch->buffer)));
bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff,
- (ch->buffer->bufsize >> 2) - 1);
+ (sndbuf_getsize(ch->buffer) >> 2) - 1);
}
ch->dir = dir;
return 0;
@@ -346,10 +345,7 @@ eschan_trigger(kobj_t obj, void *data, int go)
if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
return 0;
- ss = 1;
- ss <<= (ch->fmt & AFMT_STEREO)? 1 : 0;
- ss <<= (ch->fmt & AFMT_16BIT)? 1 : 0;
- cnt = ch->buffer->dl / ss - 1;
+ cnt = (sndbuf_runsz(ch->buffer) / sndbuf_getbps(ch->buffer)) - 1;
if (ch->dir == PCMDIR_PLAY) {
if (go == PCMTRIG_START) {
@@ -366,7 +362,7 @@ eschan_trigger(kobj_t obj, void *data, int go)
ES1370_REG_DAC2_FRAMECNT >> 8);
bus_space_write_4(es->st, es->sh,
ES1370_REG_DAC2_FRAMECNT & 0xff,
- (ch->buffer->bufsize >> 2) - 1);
+ (sndbuf_getsize(ch->buffer) >> 2) - 1);
} else es->ctrl &= ~CTRL_DAC2_EN;
} else {
if (go == PCMTRIG_START) {
@@ -380,7 +376,7 @@ eschan_trigger(kobj_t obj, void *data, int go)
ES1370_REG_ADC_FRAMECNT >> 8);
bus_space_write_4(es->st, es->sh,
ES1370_REG_ADC_FRAMECNT & 0xff,
- (ch->buffer->bufsize >> 2) - 1);
+ (sndbuf_getsize(ch->buffer) >> 2) - 1);
} else es->ctrl &= ~CTRL_ADC_EN;
}
bus_space_write_4(es->st, es->sh, ES1370_REG_SERIAL_CONTROL, es->sctrl);
diff --git a/sys/dev/sound/pci/fm801.c b/sys/dev/sound/pci/fm801.c
index a01ea8e..33b9915 100644
--- a/sys/dev/sound/pci/fm801.c
+++ b/sys/dev/sound/pci/fm801.c
@@ -331,9 +331,8 @@ fm801ch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = fm801;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = FM801_BUFFSIZE;
ch->dir = dir;
- if( chn_allocbuf(ch->buffer, fm801->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, fm801->parent_dmat, FM801_BUFFSIZE) == -1) return NULL;
return (void *)ch;
}
@@ -435,7 +434,7 @@ fm801ch_trigger(kobj_t obj, void *data, int go)
{
struct fm801_chinfo *ch = data;
struct fm801_info *fm801 = ch->parent;
- u_int32_t baseaddr = vtophys(ch->buffer->buf);
+ u_int32_t baseaddr = vtophys(sndbuf_getbuf(ch->buffer));
snd_dbuf *b = ch->buffer;
u_int32_t k1;
diff --git a/sys/dev/sound/pci/maestro.c b/sys/dev/sound/pci/maestro.c
index 5955f77..82e84bf 100644
--- a/sys/dev/sound/pci/maestro.c
+++ b/sys/dev/sound/pci/maestro.c
@@ -85,6 +85,7 @@ struct agg_chinfo {
snd_dbuf *buffer;
bus_addr_t offset;
u_int32_t blocksize;
+ u_int32_t speed;
int dir;
u_int num;
u_int16_t aputype;
@@ -518,9 +519,9 @@ aggch_start_dac(struct agg_chinfo *ch)
{
u_int wpwa = APU_USE_SYSMEM | (ch->offset >> 9);
u_int size = AGG_BUFSIZ >> 1;
- u_int speed = ch->channel->speed;
+ u_int speed = ch->speed;
u_int offset = ch->offset >> 1;
- u_int cp = ch->buffer->rp >> 1;
+ u_int cp = 0;
u_int16_t apuch = ch->num << 1;
u_int dv;
int pan = 0;
@@ -613,7 +614,7 @@ calc_timer_freq(struct agg_chinfo *ch)
if (ch->aputype == APUTYPE_8BITLINEAR)
ss >>= 1;
- return (ch->channel->speed * ss + ch->blocksize - 1) / ch->blocksize;
+ return (ch->speed * ss) / ch->blocksize;
}
static void
@@ -641,6 +642,7 @@ aggch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
struct agg_info *ess = devinfo;
struct agg_chinfo *ch;
bus_addr_t physaddr;
+ void *p;
ch = (dir == PCMDIR_PLAY)? ess->pch + ess->playchns : &ess->rch;
@@ -650,9 +652,10 @@ aggch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->num = ess->playchns;
ch->dir = dir;
- b->buf = dma_malloc(ess, AGG_BUFSIZ, &physaddr);
- if (b->buf == NULL)
+ p = dma_malloc(ess, AGG_BUFSIZ, &physaddr);
+ if (p == NULL)
return NULL;
+ sndbuf_setup(b, p, AGG_BUFSIZ);
ch->offset = physaddr - ess->baseaddr;
if (physaddr < ess->baseaddr || ch->offset > WPWA_MAXADDR) {
@@ -663,7 +666,6 @@ aggch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
return NULL;
}
- b->bufsize = AGG_BUFSIZ;
ch->wcreg_tpl = (physaddr - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
if (dir == PCMDIR_PLAY) {
@@ -683,7 +685,7 @@ aggch_free(kobj_t obj, void *data)
struct agg_info *ess = ch->parent;
/* free up buffer - called after channel stopped */
- dma_free(ess, ch->buffer->buf);
+ dma_free(ess, sndbuf_getbuf(ch->buffer));
/* return 0 if ok */
return 0;
@@ -719,7 +721,10 @@ aggch_setplayformat(kobj_t obj, void *data, u_int32_t format)
static int
aggch_setspeed(kobj_t obj, void *data, u_int32_t speed)
{
- return speed;
+ struct agg_chinfo *ch = data;
+
+ ch->speed = speed;
+ return ch->speed;
}
static int
diff --git a/sys/dev/sound/pci/neomagic.c b/sys/dev/sound/pci/neomagic.c
index 1e2760c..5a6ca8c 100644
--- a/sys/dev/sound/pci/neomagic.c
+++ b/sys/dev/sound/pci/neomagic.c
@@ -338,8 +338,7 @@ nmchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
chnbuf = (dir == PCMDIR_PLAY)? sc->pbuf : sc->rbuf;
ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch;
ch->buffer = b;
- ch->buffer->bufsize = NM_BUFFSIZE;
- ch->buffer->buf = (u_int8_t *)rman_get_virtual(sc->buf) + chnbuf;
+ sndbuf_setup(ch->buffer, (u_int8_t *)rman_get_virtual(sc->buf) + chnbuf, NM_BUFFSIZE);
if (bootverbose)
device_printf(sc->dev, "%s buf %p\n", (dir == PCMDIR_PLAY)?
"play" : "rec", ch->buffer->buf);
diff --git a/sys/dev/sound/pci/solo.c b/sys/dev/sound/pci/solo.c
index 7cb10f3..71a00f1 100644
--- a/sys/dev/sound/pci/solo.c
+++ b/sys/dev/sound/pci/solo.c
@@ -80,7 +80,7 @@ struct ess_chinfo {
pcm_channel *channel;
snd_dbuf *buffer;
int dir, hwch, stopping;
- u_int32_t fmt, spd;
+ u_int32_t fmt, spd, blksz;
};
struct ess_info {
@@ -477,7 +477,7 @@ ess_start(struct ess_chinfo *ch)
struct ess_info *sc = ch->parent;
DEB(printf("ess_start\n"););
- ess_setupch(sc, ch->hwch, ch->dir, ch->spd, ch->fmt, ch->buffer->dl);
+ ess_setupch(sc, ch->hwch, ch->dir, ch->spd, ch->fmt, ch->blksz);
ch->stopping = 0;
if (ch->hwch == 1) {
ess_write(sc, 0xb8, ess_read(sc, 0xb8) | 0x01);
@@ -519,9 +519,8 @@ esschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = sc;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = ESS_BUFFSIZE;
ch->dir = dir;
- if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sc->parent_dmat, ESS_BUFFSIZE) == -1)
return NULL;
ch->hwch = 1;
if ((dir == PCMDIR_PLAY) && (sc->duplex))
@@ -555,7 +554,10 @@ esschan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
esschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
- return blocksize;
+ struct ess_chinfo *ch = data;
+
+ ch->blksz = blocksize;
+ return ch->blksz;
}
static int
@@ -570,7 +572,7 @@ esschan_trigger(kobj_t obj, void *data, int go)
switch (go) {
case PCMTRIG_START:
- ess_dmasetup(sc, ch->hwch, vtophys(ch->buffer->buf), ch->buffer->bufsize, ch->dir);
+ ess_dmasetup(sc, ch->hwch, vtophys(sndbuf_getbuf(ch->buffer)), sndbuf_getsize(ch->buffer), ch->dir);
ess_dmatrigger(sc, ch->hwch, 1);
ess_start(ch);
break;
@@ -780,7 +782,7 @@ ess_dmapos(struct ess_info *sc, int ch)
i, p);
i = port_rd(sc->vc, 0x4, 2) + 1;
p = port_rd(sc->vc, 0x4, 2) + 1;
- } while ((p > sc->dmasz[ch -1 ] || i < p || (p - i) > 0x8) && j++ < 1000);
+ } while ((p > sc->dmasz[ch - 1] || i < p || (p - i) > 0x8) && j++ < 1000);
ess_dmatrigger(sc, ch, 1);
}
else if (ch == 2)
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c
index dee0f9f..1dace66 100644
--- a/sys/dev/sound/pci/t4dwave.c
+++ b/sys/dev/sound/pci/t4dwave.c
@@ -52,7 +52,7 @@ struct tr_chinfo {
u_int32_t eso, delta;
u_int32_t rvol, cvol;
u_int32_t gvsel, pan, vol, ctrl;
- int index, ss;
+ int index;
snd_dbuf *buffer;
pcm_channel *channel;
struct tr_info *parent;
@@ -391,10 +391,9 @@ trchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->index = -1;
}
ch->buffer = b;
- ch->buffer->bufsize = TR_BUFFSIZE;
ch->parent = tr;
ch->channel = c;
- if (chn_allocbuf(ch->buffer, tr->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, tr->parent_dmat, TR_BUFFSIZE) == -1) return NULL;
else return ch;
}
@@ -405,9 +404,9 @@ trchan_setdir(kobj_t obj, void *data, int dir)
struct tr_info *tr = ch->parent;
if (dir == PCMDIR_PLAY && ch->index >= 0) {
ch->fmc = ch->fms = ch->ec = ch->alpha = 0;
- ch->lba = vtophys(ch->buffer->buf);
+ ch->lba = vtophys(sndbuf_getbuf(ch->buffer));
ch->cso = 0;
- ch->eso = ch->buffer->bufsize - 1;
+ ch->eso = sndbuf_getsize(ch->buffer) - 1;
ch->rvol = ch->cvol = 0;
ch->gvsel = 0;
ch->pan = 0;
@@ -423,10 +422,10 @@ trchan_setdir(kobj_t obj, void *data, int dir)
i = tr_rd(tr, TR_REG_DMAR11, 1) & 0x03;
tr_wr(tr, TR_REG_DMAR11, i | 0x54, 1);
/* set up base address */
- tr_wr(tr, TR_REG_DMAR0, vtophys(ch->buffer->buf), 4);
+ tr_wr(tr, TR_REG_DMAR0, vtophys(sndbuf_getbuf(ch->buffer)), 4);
/* set up buffer size */
i = tr_rd(tr, TR_REG_DMAR4, 4) & ~0x00ffffff;
- tr_wr(tr, TR_REG_DMAR4, i | (ch->buffer->bufsize - 1), 4);
+ tr_wr(tr, TR_REG_DMAR4, i | (sndbuf_getsize(ch->buffer) - 1), 4);
} else return -1;
return 0;
}
@@ -438,12 +437,9 @@ trchan_setformat(kobj_t obj, void *data, u_int32_t format)
struct tr_info *tr = ch->parent;
u_int32_t bits = tr_fmttobits(format);
- ch->ss = 1;
- ch->ss <<= (format & AFMT_STEREO)? 1 : 0;
- ch->ss <<= (format & AFMT_16BIT)? 1 : 0;
if (ch->index >= 0) {
tr_rdch(tr, ch->index, ch);
- ch->eso = (ch->buffer->bufsize / ch->ss) - 1;
+ ch->eso = (sndbuf_getsize(ch->buffer) / sndbuf_getbps(ch->buffer)) - 1;
ch->ctrl = bits | 0x01;
tr_wrch(tr, ch->index, ch);
} else {
@@ -482,7 +478,7 @@ static int
trchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
struct tr_chinfo *ch = data;
- return ch->buffer->bufsize / 2;
+ return sndbuf_getsize(ch->buffer) / 2;
}
static int
@@ -516,8 +512,8 @@ trchan_getptr(kobj_t obj, void *data)
if (ch->index >= 0) {
tr_rdch(tr, ch->index, ch);
- return ch->cso * ch->ss;
- } else return tr_rd(tr, TR_REG_DMAR0, 4) - vtophys(ch->buffer->buf);
+ return ch->cso * sndbuf_getbps(ch->buffer);
+ } else return tr_rd(tr, TR_REG_DMAR0, 4) - vtophys(sndbuf_getbuf(ch->buffer));
}
static pcmchan_caps *
diff --git a/sys/dev/sound/pci/via82c686.c b/sys/dev/sound/pci/via82c686.c
index 27d7aef..70dd9db 100644
--- a/sys/dev/sound/pci/via82c686.c
+++ b/sys/dev/sound/pci/via82c686.c
@@ -217,9 +217,8 @@ viachan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = via;
ch->channel = c;
ch->buffer = b;
- b->bufsize = VIA_BUFFSIZE;
- if (chn_allocbuf(ch->buffer, via->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, via->parent_dmat, VIA_BUFFSIZE) == -1) return NULL;
return ch;
}
@@ -240,14 +239,14 @@ viachan_setdir(kobj_t obj, void *data, int dir)
* is feeding.
*/
ado = via->sgd_table;
- chunk_size = ch->buffer->bufsize / SEGS_PER_CHAN;
+ chunk_size = sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN;
if (dir == PCMDIR_REC) {
ado += SEGS_PER_CHAN;
}
DEB(printf("SGD table located at va %p\n", ado));
- phys_addr = vtophys(ch->buffer->buf);
+ phys_addr = vtophys(sndbuf_getbuf(ch->buffer));
for (i = 0; i < SEGS_PER_CHAN; i++) {
ado->ptr = phys_addr;
flag = (i == SEGS_PER_CHAN-1) ?
@@ -339,7 +338,7 @@ viachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
struct via_chinfo *ch = data;
- return ch->buffer->bufsize / 2;
+ return sndbuf_getsize(ch->buffer) / 2;
}
static int
@@ -409,7 +408,7 @@ DEB(printf("viachan_getptr: len / base = %x / %x\n", len, base));
if (seg == 0) seg = SEGS_PER_CHAN;
/* Now work out offset: seg less count */
- ptr = seg * ch->buffer->bufsize / SEGS_PER_CHAN - len;
+ ptr = seg * sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN - len;
DEB(printf("return ptr=%d\n", ptr));
return ptr;
}
@@ -430,7 +429,7 @@ DEB(printf("viachan_getptr: len / base = %x / %x\n", len, base));
if (seg == 0) seg = SEGS_PER_CHAN;
/* Now work out offset: seg less count */
- ptr = seg * ch->buffer->bufsize / SEGS_PER_CHAN - len;
+ ptr = seg * sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN - len;
/* DMA appears to operate on memory 'lines' of 32 bytes */
/* so don't return any part line - it isn't in RAM yet */
OpenPOWER on IntegriCloud