summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2000-12-23 22:24:43 +0000
committercg <cg@FreeBSD.org>2000-12-23 22:24:43 +0000
commit45ae398e8d2e92b28a95384d228de709b718eea0 (patch)
treebd8c65b2258efa785586158bc02ba40b45331ed5 /sys
parenta30b886e02c59df86eb23d4a90f19ddfab21063f (diff)
downloadFreeBSD-src-45ae398e8d2e92b28a95384d228de709b718eea0.zip
FreeBSD-src-45ae398e8d2e92b28a95384d228de709b718eea0.tar.gz
implement setblocksize properly
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/sound/pci/es137x.c58
1 files changed, 25 insertions, 33 deletions
diff --git a/sys/dev/sound/pci/es137x.c b/sys/dev/sound/pci/es137x.c
index 1a57f1a..dc37803 100644
--- a/sys/dev/sound/pci/es137x.c
+++ b/sys/dev/sound/pci/es137x.c
@@ -82,7 +82,7 @@ struct es_chinfo {
pcm_channel *channel;
snd_dbuf *buffer;
int dir, num;
- u_int32_t fmt;
+ u_int32_t fmt, blksz, bufsz;
};
struct es_info {
@@ -253,8 +253,10 @@ 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->bufsz = ES_BUFFSIZE;
+ ch->blksz = ch->bufsz / 2;
ch->num = ch->parent->num++;
- if (sndbuf_alloc(ch->buffer, es->parent_dmat, ES_BUFFSIZE) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, es->parent_dmat, ch->bufsz) == -1) return NULL;
return ch;
}
@@ -265,19 +267,13 @@ eschan_setdir(kobj_t obj, void *data, int dir)
struct es_info *es = ch->parent;
if (dir == PCMDIR_PLAY) {
- 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(sndbuf_getbuf(ch->buffer)));
- bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff,
- (sndbuf_getsize(ch->buffer) >> 2) - 1);
+ 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(sndbuf_getbuf(ch->buffer)));
+ bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 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(sndbuf_getbuf(ch->buffer)));
- bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff,
- (sndbuf_getsize(ch->buffer) >> 2) - 1);
+ 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(sndbuf_getbuf(ch->buffer)));
+ bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1);
}
ch->dir = dir;
return 0;
@@ -332,7 +328,13 @@ eschan1371_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
eschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
- return blocksize;
+ struct es_chinfo *ch = data;
+
+ ch->blksz = blocksize;
+ ch->bufsz = ch->blksz * 2;
+ sndbuf_resize(ch->buffer, 2, ch->blksz);
+
+ return ch->blksz;
}
static int
@@ -345,38 +347,28 @@ eschan_trigger(kobj_t obj, void *data, int go)
if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
return 0;
- cnt = (sndbuf_runsz(ch->buffer) / sndbuf_getbps(ch->buffer)) - 1;
+ cnt = (ch->blksz / sndbuf_getbps(ch->buffer)) - 1;
if (ch->dir == PCMDIR_PLAY) {
if (go == PCMTRIG_START) {
int b = (ch->fmt & AFMT_S16_LE)? 2 : 1;
es->ctrl |= CTRL_DAC2_EN;
- es->sctrl &= ~(SCTRL_P2ENDINC | SCTRL_P2STINC |
- SCTRL_P2LOOPSEL | SCTRL_P2PAUSE |
- SCTRL_P2DACSEN);
+ es->sctrl &= ~(SCTRL_P2ENDINC | SCTRL_P2STINC | SCTRL_P2LOOPSEL | SCTRL_P2PAUSE | SCTRL_P2DACSEN);
es->sctrl |= SCTRL_P2INTEN | (b << SCTRL_SH_P2ENDINC);
- bus_space_write_4(es->st, es->sh,
- ES1370_REG_DAC2_SCOUNT, cnt);
+ bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_SCOUNT, cnt);
/* start at beginning of buffer */
- bus_space_write_4(es->st, es->sh, ES1370_REG_MEMPAGE,
- ES1370_REG_DAC2_FRAMECNT >> 8);
- bus_space_write_4(es->st, es->sh,
- ES1370_REG_DAC2_FRAMECNT & 0xff,
- (sndbuf_getsize(ch->buffer) >> 2) - 1);
+ bus_space_write_4(es->st, es->sh, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMECNT >> 8);
+ bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1);
} else es->ctrl &= ~CTRL_DAC2_EN;
} else {
if (go == PCMTRIG_START) {
es->ctrl |= CTRL_ADC_EN;
es->sctrl &= ~SCTRL_R1LOOPSEL;
es->sctrl |= SCTRL_R1INTEN;
- bus_space_write_4(es->st, es->sh,
- ES1370_REG_ADC_SCOUNT, cnt);
+ bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_SCOUNT, cnt);
/* start at beginning of buffer */
- bus_space_write_4(es->st, es->sh, ES1370_REG_MEMPAGE,
- ES1370_REG_ADC_FRAMECNT >> 8);
- bus_space_write_4(es->st, es->sh,
- ES1370_REG_ADC_FRAMECNT & 0xff,
- (sndbuf_getsize(ch->buffer) >> 2) - 1);
+ bus_space_write_4(es->st, es->sh, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMECNT >> 8);
+ bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1);
} else es->ctrl &= ~CTRL_ADC_EN;
}
bus_space_write_4(es->st, es->sh, ES1370_REG_SERIAL_CONTROL, es->sctrl);
OpenPOWER on IntegriCloud