--- sys/dev/sound/pci/ich.c.orig Sun Jun 10 04:53:42 2007 +++ sys/dev/sound/pci/ich.c Sun Jun 10 13:07:44 2007 @@ -178,6 +178,7 @@ uint32_t regbase, spdreg; uint32_t imask; uint32_t civ; + uint32_t ptr; struct snd_dbuf *buffer; struct pcm_channel *channel; @@ -561,6 +562,7 @@ ICH_LOCK(sc); ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (uint32_t)(ch->desc_addr), 4); ich_wr(sc, ch->regbase + ICH_REG_X_CR, ICH_X_CR_RPBM | ICH_X_CR_LVBIE | ICH_X_CR_IOCE, 1); + ch->ptr = 0; ICH_UNLOCK(sc); break; @@ -569,6 +571,7 @@ ich_resetchan(sc, ch->num); ICH_UNLOCK(sc); ch->run = 0; + ch->ptr = 0; break; } return (0); @@ -588,11 +591,17 @@ __func__); ); +#if 1 + ICH_LOCK(sc); + pos = ch->ptr; + ICH_UNLOCK(sc); +#else ICH_LOCK(sc); ch->civ = ich_rd(sc, ch->regbase + ICH_REG_X_CIV, 1) % ch->blkcnt; ICH_UNLOCK(sc); pos = ch->civ * ch->blksz; +#endif return (pos); } @@ -668,6 +677,8 @@ if (st & (ICH_X_SR_BCIS | ICH_X_SR_LVBCI)) { /* block complete - update buffer */ if (ch->run) { + ch->ptr += sndbuf_getblksz(ch->buffer); + ch->ptr %= sndbuf_getsize(ch->buffer); ICH_UNLOCK(sc); chn_intr(ch->channel); ICH_LOCK(sc);