Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/rockchip/rk_i2s.c
Show First 20 Lines • Show All 398 Lines • ▼ Show 20 Lines | rk_i2s_dai_intr(device_t dev, struct snd_dbuf *play_buf, struct snd_dbuf *rec_buf) | ||||
RK_I2S_LOCK(sc); | RK_I2S_LOCK(sc); | ||||
status = RK_I2S_READ_4(sc, I2S_INTSR); | status = RK_I2S_READ_4(sc, I2S_INTSR); | ||||
if (status & I2S_INTSR_TXEI) { | if (status & I2S_INTSR_TXEI) { | ||||
level = RK_I2S_READ_4(sc, I2S_TXFIFOLR) & TXFIFO0LR_MASK; | level = RK_I2S_READ_4(sc, I2S_TXFIFOLR) & TXFIFO0LR_MASK; | ||||
uint8_t *samples; | uint8_t *samples; | ||||
uint32_t count, size, readyptr, written; | uint32_t count, size, readyptr, written; | ||||
count = sndbuf_getready(play_buf); | count = sndbuf_getready(play_buf); | ||||
if (count > FIFO_SIZE - 1) | |||||
count = FIFO_SIZE - 1; | |||||
size = sndbuf_getsize(play_buf); | size = sndbuf_getsize(play_buf); | ||||
readyptr = sndbuf_getreadyptr(play_buf); | readyptr = sndbuf_getreadyptr(play_buf); | ||||
/* FIXME: check actual count size */ | |||||
samples = (uint8_t*)sndbuf_getbuf(play_buf); | samples = (uint8_t*)sndbuf_getbuf(play_buf); | ||||
written = 0; | written = 0; | ||||
for (; level < FIFO_SIZE - 1; level++) { | for (; level < count; level++) { | ||||
val = (samples[readyptr++ % size] << 0); | val = (samples[readyptr++ % size] << 0); | ||||
val |= (samples[readyptr++ % size] << 8); | val |= (samples[readyptr++ % size] << 8); | ||||
val |= (samples[readyptr++ % size] << 16); | val |= (samples[readyptr++ % size] << 16); | ||||
val |= (samples[readyptr++ % size] << 24); | val |= (samples[readyptr++ % size] << 24); | ||||
written += 4; | written += 4; | ||||
RK_I2S_WRITE_4(sc, I2S_TXDR, val); | RK_I2S_WRITE_4(sc, I2S_TXDR, val); | ||||
} | } | ||||
sc->play_ptr += written; | sc->play_ptr += written; | ||||
▲ Show 20 Lines • Show All 236 Lines • Show Last 20 Lines |