aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/dummy.c46
-rw-r--r--sys/dev/sound/fdt/audio_soc.c2
-rw-r--r--sys/dev/sound/macio/aoa.c4
-rw-r--r--sys/dev/sound/midi/midi.c164
-rw-r--r--sys/dev/sound/midi/mpu401.c15
-rw-r--r--sys/dev/sound/pci/als4000.c62
-rw-r--r--sys/dev/sound/pci/atiixp.c43
-rw-r--r--sys/dev/sound/pci/cmi.c62
-rw-r--r--sys/dev/sound/pci/cs4281.c10
-rw-r--r--sys/dev/sound/pci/csapcm.c8
-rw-r--r--sys/dev/sound/pci/emu10k1.c65
-rw-r--r--sys/dev/sound/pci/emu10kx-pcm.c59
-rw-r--r--sys/dev/sound/pci/envy24.c68
-rw-r--r--sys/dev/sound/pci/envy24ht.c69
-rw-r--r--sys/dev/sound/pci/es137x.c42
-rw-r--r--sys/dev/sound/pci/fm801.c2
-rw-r--r--sys/dev/sound/pci/hda/hdaa.c77
-rw-r--r--sys/dev/sound/pci/hda/hdaa_patches.c9
-rw-r--r--sys/dev/sound/pci/hda/hdac.c27
-rw-r--r--sys/dev/sound/pci/hda/hdac.h4
-rw-r--r--sys/dev/sound/pci/hda/hdac_private.h2
-rw-r--r--sys/dev/sound/pci/hda/hdacc.c6
-rw-r--r--sys/dev/sound/pci/hdsp-pcm.c30
-rw-r--r--sys/dev/sound/pci/hdsp.c35
-rw-r--r--sys/dev/sound/pci/hdsp.h2
-rw-r--r--sys/dev/sound/pci/hdspe-pcm.c30
-rw-r--r--sys/dev/sound/pci/hdspe.c35
-rw-r--r--sys/dev/sound/pci/hdspe.h2
-rw-r--r--sys/dev/sound/pci/ich.c32
-rw-r--r--sys/dev/sound/pci/maestro3.c41
-rw-r--r--sys/dev/sound/pci/neomagic.c2
-rw-r--r--sys/dev/sound/pci/solo.c21
-rw-r--r--sys/dev/sound/pci/spicds.c34
-rw-r--r--sys/dev/sound/pci/t4dwave.c39
-rw-r--r--sys/dev/sound/pci/via8233.c127
-rw-r--r--sys/dev/sound/pci/via82c686.c42
-rw-r--r--sys/dev/sound/pci/vibes.c14
-rw-r--r--sys/dev/sound/pcm/ac97.c52
-rw-r--r--sys/dev/sound/pcm/buffer.c199
-rw-r--r--sys/dev/sound/pcm/buffer.h38
-rw-r--r--sys/dev/sound/pcm/channel.c252
-rw-r--r--sys/dev/sound/pcm/channel.h18
-rw-r--r--sys/dev/sound/pcm/dsp.c341
-rw-r--r--sys/dev/sound/pcm/feeder.c135
-rw-r--r--sys/dev/sound/pcm/feeder.h37
-rw-r--r--sys/dev/sound/pcm/feeder_chain.c30
-rw-r--r--sys/dev/sound/pcm/feeder_eq.c7
-rw-r--r--sys/dev/sound/pcm/feeder_format.c7
-rw-r--r--sys/dev/sound/pcm/feeder_matrix.c9
-rw-r--r--sys/dev/sound/pcm/feeder_mixer.c21
-rw-r--r--sys/dev/sound/pcm/feeder_rate.c7
-rw-r--r--sys/dev/sound/pcm/feeder_volume.c9
-rw-r--r--sys/dev/sound/pcm/mixer.c158
-rw-r--r--sys/dev/sound/pcm/mixer.h4
-rw-r--r--sys/dev/sound/pcm/sndstat.c79
-rw-r--r--sys/dev/sound/pcm/sound.c35
-rw-r--r--sys/dev/sound/pcm/sound.h136
-rw-r--r--sys/dev/sound/pcm/vchan.c22
-rw-r--r--sys/dev/sound/pcm/vchan.h9
-rw-r--r--sys/dev/sound/usb/uaudio.c2
60 files changed, 1207 insertions, 1732 deletions
diff --git a/sys/dev/sound/dummy.c b/sys/dev/sound/dummy.c
index 4df5b112d3f4..74ca1d0c924c 100644
--- a/sys/dev/sound/dummy.c
+++ b/sys/dev/sound/dummy.c
@@ -64,7 +64,7 @@ struct dummy_softc {
int chnum;
struct dummy_chan chans[DUMMY_NCHAN];
struct callout callout;
- struct mtx *lock;
+ struct mtx lock;
bool stopped;
};
@@ -74,7 +74,7 @@ dummy_active(struct dummy_softc *sc)
struct dummy_chan *ch;
int i;
- snd_mtxassert(sc->lock);
+ mtx_assert(&sc->lock, MA_OWNED);
for (i = 0; i < sc->chnum; i++) {
ch = &sc->chans[i];
@@ -104,13 +104,14 @@ dummy_chan_io(void *arg)
ch = &sc->chans[i];
if (!ch->run)
continue;
- if (ch->dir == PCMDIR_PLAY)
- ch->ptr += sndbuf_getblksz(ch->buf);
- else
+ if (ch->dir == PCMDIR_PLAY) {
+ ch->ptr += ch->buf->blksz;
+ ch->ptr %= ch->buf->bufsize;
+ } else
sndbuf_fillsilence(ch->buf);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->chan);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
if (!sc->stopped)
callout_schedule(&sc->callout, 1);
@@ -122,7 +123,7 @@ dummy_chan_free(kobj_t obj, void *data)
struct dummy_chan *ch =data;
uint8_t *buf;
- buf = sndbuf_getbuf(ch->buf);
+ buf = ch->buf->buf;
if (buf != NULL)
free(buf, M_DEVBUF);
@@ -140,7 +141,7 @@ dummy_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
sc = devinfo;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ch = &sc->chans[sc->chnum++];
ch->sc = sc;
@@ -149,7 +150,7 @@ dummy_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->buf = b;
ch->caps = &sc->caps;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
bufsz = pcm_getbuffersize(sc->dev, 2048, 2048, 65536);
buf = malloc(bufsz, M_DEVBUF, M_WAITOK | M_ZERO);
@@ -189,7 +190,7 @@ dummy_chan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
{
struct dummy_chan *ch = data;
- return (sndbuf_getblksz(ch->buf));
+ return (ch->buf->blksz);
}
static int
@@ -198,10 +199,10 @@ dummy_chan_trigger(kobj_t obj, void *data, int go)
struct dummy_chan *ch = data;
struct dummy_softc *sc = ch->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (sc->stopped) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -221,7 +222,7 @@ dummy_chan_trigger(kobj_t obj, void *data, int go)
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -319,8 +320,9 @@ dummy_attach(device_t dev)
sc = device_get_softc(dev);
sc->dev = dev;
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_dummy softc");
- callout_init_mtx(&sc->callout, sc->lock, 0);
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_dummy softc",
+ MTX_DEF);
+ callout_init_mtx(&sc->callout, &sc->lock, 0);
sc->cap_fmts[0] = SND_FORMAT(AFMT_S32_LE, 2, 0);
sc->cap_fmts[1] = SND_FORMAT(AFMT_S24_LE, 2, 0);
@@ -346,6 +348,12 @@ dummy_attach(device_t dev)
return (ENXIO);
mixer_init(dev, &dummy_mixer_class, sc);
+ /*
+ * Create an alias so that tests do not need to guess which one is the
+ * dummy device if there are more devices present in the system.
+ */
+ make_dev_alias(sc->info.dsp_dev, "dsp.dummy");
+
return (0);
}
@@ -355,12 +363,12 @@ dummy_detach(device_t dev)
struct dummy_softc *sc = device_get_softc(dev);
int err;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->stopped = true;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
callout_drain(&sc->callout);
err = pcm_unregister(dev);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
return (err);
}
diff --git a/sys/dev/sound/fdt/audio_soc.c b/sys/dev/sound/fdt/audio_soc.c
index c2bdea399364..84867cb3d781 100644
--- a/sys/dev/sound/fdt/audio_soc.c
+++ b/sys/dev/sound/fdt/audio_soc.c
@@ -249,7 +249,7 @@ audio_soc_chan_free(kobj_t obj, void *data)
ausoc_chan = (struct audio_soc_channel *)data;
- buffer = sndbuf_getbuf(ausoc_chan->buf);
+ buffer = ausoc_chan->buf->buf;
if (buffer)
free(buffer, M_DEVBUF);
diff --git a/sys/dev/sound/macio/aoa.c b/sys/dev/sound/macio/aoa.c
index 9861bbd92a0c..e0a6206c19a6 100644
--- a/sys/dev/sound/macio/aoa.c
+++ b/sys/dev/sound/macio/aoa.c
@@ -73,8 +73,8 @@ aoa_dma_set_program(struct aoa_dma *dma)
u_int32_t addr;
int i;
- addr = (u_int32_t) sndbuf_getbufaddr(dma->buf);
- KASSERT(dma->bufsz == sndbuf_getsize(dma->buf), ("bad size"));
+ addr = (u_int32_t)dma->buf->buf_addr;
+ KASSERT(dma->bufsz == dma->buf->bufsize, ("bad size"));
dma->slots = dma->bufsz / dma->blksz;
diff --git a/sys/dev/sound/midi/midi.c b/sys/dev/sound/midi/midi.c
index 6753f864ba9c..e14a28557406 100644
--- a/sys/dev/sound/midi/midi.c
+++ b/sys/dev/sound/midi/midi.c
@@ -32,45 +32,30 @@
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/queue.h>
+#include <sys/conf.h>
+#include <sys/fcntl.h>
#include <sys/kernel.h>
+#include <sys/kobj.h>
#include <sys/lock.h>
+#include <sys/module.h>
#include <sys/mutex.h>
-#include <sys/proc.h>
-#include <sys/signalvar.h>
-#include <sys/conf.h>
+#include <sys/poll.h>
+#include <sys/queue.h>
#include <sys/selinfo.h>
-#include <sys/sysctl.h>
-#include <sys/malloc.h>
#include <sys/sx.h>
-#include <sys/proc.h>
-#include <sys/fcntl.h>
-#include <sys/types.h>
+#include <sys/sysctl.h>
#include <sys/uio.h>
-#include <sys/poll.h>
-#include <sys/sbuf.h>
-#include <sys/kobj.h>
-#include <sys/module.h>
#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_snd.h"
#endif
#include <dev/sound/midi/midi.h>
-#include "mpu_if.h"
-
#include <dev/sound/midi/midiq.h>
-MALLOC_DEFINE(M_MIDI, "midi buffers", "Midi data allocation area");
-
-#ifndef KOBJMETHOD_END
-#define KOBJMETHOD_END { NULL, NULL }
-#endif
-#define MIDI_DEV_MIDICTL 12
+#include "mpu_if.h"
-enum midi_states {
- MIDI_IN_START, MIDI_IN_SYSEX, MIDI_IN_DATA
-};
+MALLOC_DEFINE(M_MIDI, "midi buffers", "Midi data allocation area");
#define MIDI_NAMELEN 16
struct snd_midi {
@@ -90,12 +75,6 @@ struct snd_midi {
struct selinfo rsel, wsel;
int hiwat; /* QLEN(outq)>High-water -> disable
* writes from userland */
- enum midi_states inq_state;
- int inq_status, inq_left; /* Variables for the state machine in
- * Midi_in, this is to provide that
- * signals only get issued only
- * complete command packets. */
- struct proc *async;
struct cdev *dev;
TAILQ_ENTRY(snd_midi) link;
};
@@ -330,10 +309,8 @@ static int midi_lengths[] = {2, 2, 2, 2, 1, 1, 2, 0};
int
midi_in(struct snd_midi *m, uint8_t *buf, int size)
{
- /* int i, sig, enq; */
int used;
- /* uint8_t data; */
MIDI_DEBUG(5, printf("midi_in: m=%p size=%d\n", m, size));
/*
@@ -345,111 +322,22 @@ midi_in(struct snd_midi *m, uint8_t *buf, int size)
used = 0;
mtx_lock(&m->qlock);
-#if 0
- /*
- * Don't bother queuing if not in read mode. Discard everything and
- * return size so the caller doesn't freak out.
- */
-
- if (!(m->flags & M_RX))
- return size;
-
- for (i = sig = 0; i < size; i++) {
- data = buf[i];
- enq = 0;
- if (data == MIDI_ACK)
- continue;
-
- switch (m->inq_state) {
- case MIDI_IN_START:
- if (MIDI_IS_STATUS(data)) {
- switch (data) {
- case 0xf0: /* Sysex */
- m->inq_state = MIDI_IN_SYSEX;
- break;
- case 0xf1: /* MTC quarter frame */
- case 0xf3: /* Song select */
- m->inq_state = MIDI_IN_DATA;
- enq = 1;
- m->inq_left = 1;
- break;
- case 0xf2: /* Song position pointer */
- m->inq_state = MIDI_IN_DATA;
- enq = 1;
- m->inq_left = 2;
- break;
- default:
- if (MIDI_IS_COMMON(data)) {
- enq = 1;
- sig = 1;
- } else {
- m->inq_state = MIDI_IN_DATA;
- enq = 1;
- m->inq_status = data;
- m->inq_left = MIDI_LENGTH(data);
- }
- break;
- }
- } else if (MIDI_IS_STATUS(m->inq_status)) {
- m->inq_state = MIDI_IN_DATA;
- if (!MIDIQ_FULL(m->inq)) {
- used++;
- MIDIQ_ENQ(m->inq, &m->inq_status, 1);
- }
- enq = 1;
- m->inq_left = MIDI_LENGTH(m->inq_status) - 1;
- }
- break;
- /*
- * End of case MIDI_IN_START:
- */
-
- case MIDI_IN_DATA:
- enq = 1;
- if (--m->inq_left <= 0)
- sig = 1;/* deliver data */
- break;
- case MIDI_IN_SYSEX:
- if (data == MIDI_SYSEX_END)
- m->inq_state = MIDI_IN_START;
- break;
- }
-
- if (enq)
- if (!MIDIQ_FULL(m->inq)) {
- MIDIQ_ENQ(m->inq, &data, 1);
- used++;
- }
- /*
- * End of the state machines main "for loop"
- */
+ MIDI_DEBUG(6, printf("midi_in: len %jd avail %jd\n",
+ (intmax_t)MIDIQ_LEN(m->inq),
+ (intmax_t)MIDIQ_AVAIL(m->inq)));
+ if (MIDIQ_AVAIL(m->inq) > size) {
+ used = size;
+ MIDIQ_ENQ(m->inq, buf, size);
+ } else {
+ MIDI_DEBUG(4, printf("midi_in: Discarding data qu\n"));
+ mtx_unlock(&m->qlock);
+ return 0;
}
- if (sig) {
-#endif
- MIDI_DEBUG(6, printf("midi_in: len %jd avail %jd\n",
- (intmax_t)MIDIQ_LEN(m->inq),
- (intmax_t)MIDIQ_AVAIL(m->inq)));
- if (MIDIQ_AVAIL(m->inq) > size) {
- used = size;
- MIDIQ_ENQ(m->inq, buf, size);
- } else {
- MIDI_DEBUG(4, printf("midi_in: Discarding data qu\n"));
- mtx_unlock(&m->qlock);
- return 0;
- }
- if (m->rchan) {
- wakeup(&m->rchan);
- m->rchan = 0;
- }
- selwakeup(&m->rsel);
- if (m->async) {
- PROC_LOCK(m->async);
- kern_psignal(m->async, SIGIO);
- PROC_UNLOCK(m->async);
- }
-#if 0
+ if (m->rchan) {
+ wakeup(&m->rchan);
+ m->rchan = 0;
}
-#endif
+ selwakeup(&m->rsel);
mtx_unlock(&m->qlock);
return used;
}
@@ -484,11 +372,6 @@ midi_out(struct snd_midi *m, uint8_t *buf, int size)
m->wchan = 0;
}
selwakeup(&m->wsel);
- if (m->async) {
- PROC_LOCK(m->async);
- kern_psignal(m->async, SIGIO);
- PROC_UNLOCK(m->async);
- }
}
mtx_unlock(&m->qlock);
return used;
@@ -530,7 +413,6 @@ midi_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
m->rchan = 0;
m->wchan = 0;
- m->async = 0;
if (flags & FREAD) {
m->flags |= M_RX | M_RXEN;
diff --git a/sys/dev/sound/midi/mpu401.c b/sys/dev/sound/midi/mpu401.c
index 224ebb1b01f4..7d3edb6323ef 100644
--- a/sys/dev/sound/midi/mpu401.c
+++ b/sys/dev/sound/midi/mpu401.c
@@ -27,17 +27,10 @@
*/
#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/kernel.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
#include <sys/kobj.h>
-#include <sys/malloc.h>
-#include <sys/bus.h> /* to get driver_intr_t */
#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_snd.h"
@@ -49,10 +42,6 @@
#include "mpu_if.h"
#include "mpufoi_if.h"
-#ifndef KOBJMETHOD_END
-#define KOBJMETHOD_END { NULL, NULL }
-#endif
-
#define MPU_DATAPORT 0
#define MPU_CMDPORT 1
#define MPU_STATPORT 1
diff --git a/sys/dev/sound/pci/als4000.c b/sys/dev/sound/pci/als4000.c
index 9d86713b379e..aea7cc6d3a64 100644
--- a/sys/dev/sound/pci/als4000.c
+++ b/sys/dev/sound/pci/als4000.c
@@ -79,7 +79,7 @@ struct sc_info {
struct resource *reg, *irq;
int regid, irqid;
void *ih;
- struct mtx *lock;
+ struct mtx lock;
unsigned int bufsz;
struct sc_chinfo pch, rch;
@@ -208,7 +208,7 @@ alschan_init(kobj_t obj, void *devinfo,
struct sc_info *sc = devinfo;
struct sc_chinfo *ch;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (dir == PCMDIR_PLAY) {
ch = &sc->pch;
ch->gcr_fifo_status = ALS_GCR_FIFO0_STATUS;
@@ -221,9 +221,9 @@ alschan_init(kobj_t obj, void *devinfo,
ch->channel = c;
ch->bps = 1;
ch->format = SND_FORMAT(AFMT_U8, 1, 0);
- ch->speed = DSP_DEFAULT_SPEED;
+ ch->speed = 8000;
ch->buffer = b;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
return NULL;
@@ -278,10 +278,10 @@ alschan_getptr(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
int32_t pos, sz;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
pos = als_gcr_rd(ch->parent, ch->gcr_fifo_status) & 0xffff;
- snd_mtxunlock(sc->lock);
- sz = sndbuf_getsize(ch->buffer);
+ mtx_unlock(&sc->lock);
+ sz = ch->buffer->bufsize;
return (2 * sz - pos - 1) % sz;
}
@@ -348,8 +348,8 @@ als_playback_start(struct sc_chinfo *ch)
struct sc_info *sc = ch->parent;
u_int32_t buf, bufsz, count, dma_prog;
- buf = sndbuf_getbufaddr(ch->buffer);
- bufsz = sndbuf_getsize(ch->buffer);
+ buf = ch->buffer->buf_addr;
+ bufsz = ch->buffer->bufsize;
count = bufsz / 2;
if (ch->format & AFMT_16BIT)
count /= 2;
@@ -397,7 +397,7 @@ alspchan_trigger(kobj_t obj, void *data, int go)
if (!PCMTRIG_COMMON(go))
return 0;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch(go) {
case PCMTRIG_START:
als_playback_start(ch);
@@ -409,7 +409,7 @@ alspchan_trigger(kobj_t obj, void *data, int go)
default:
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -451,8 +451,8 @@ als_capture_start(struct sc_chinfo *ch)
struct sc_info *sc = ch->parent;
u_int32_t buf, bufsz, count, dma_prog;
- buf = sndbuf_getbufaddr(ch->buffer);
- bufsz = sndbuf_getsize(ch->buffer);
+ buf = ch->buffer->buf_addr;
+ bufsz = ch->buffer->bufsize;
count = bufsz / 2;
if (ch->format & AFMT_16BIT)
count /= 2;
@@ -493,7 +493,7 @@ alsrchan_trigger(kobj_t obj, void *data, int go)
struct sc_chinfo *ch = data;
struct sc_info *sc = ch->parent;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch(go) {
case PCMTRIG_START:
als_capture_start(ch);
@@ -503,7 +503,7 @@ alsrchan_trigger(kobj_t obj, void *data, int go)
als_capture_stop(ch);
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -637,19 +637,19 @@ als_intr(void *p)
struct sc_info *sc = (struct sc_info *)p;
u_int8_t intr, sb_status;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
intr = als_intr_rd(sc);
if (intr & 0x80) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(sc->pch.channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
if (intr & 0x40) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(sc->rch.channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
/* ACK interrupt in PCI core */
@@ -667,7 +667,7 @@ als_intr(void *p)
if (sb_status & ALS_IRQ_CR1E)
als_ack_read(sc, ALS_CR1E_ACK_PORT);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return;
}
@@ -749,10 +749,7 @@ als_resource_free(device_t dev, struct sc_info *sc)
bus_dma_tag_destroy(sc->parent_dmat);
sc->parent_dmat = 0;
}
- if (sc->lock) {
- snd_mtxfree(sc->lock);
- sc->lock = NULL;
- }
+ mtx_destroy(&sc->lock);
}
static int
@@ -808,7 +805,8 @@ als_pci_attach(device_t dev)
char status[SND_STATUSLEN];
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_als4000 softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_als4000 softc",
+ MTX_DEF);
sc->dev = dev;
pci_enable_busmaster(dev);
@@ -882,11 +880,11 @@ als_pci_suspend(device_t dev)
{
struct sc_info *sc = pcm_getdevinfo(dev);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->pch.dma_was_active = als_playback_stop(&sc->pch);
sc->rch.dma_was_active = als_capture_stop(&sc->rch);
als_uninit(sc);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -895,16 +893,16 @@ als_pci_resume(device_t dev)
{
struct sc_info *sc = pcm_getdevinfo(dev);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (als_init(sc) != 0) {
device_printf(dev, "unable to reinitialize the card\n");
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ENXIO;
}
if (mixer_reinit(dev) != 0) {
device_printf(dev, "unable to reinitialize the mixer\n");
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ENXIO;
}
@@ -915,7 +913,7 @@ als_pci_resume(device_t dev)
if (sc->rch.dma_was_active) {
als_capture_start(&sc->rch);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
diff --git a/sys/dev/sound/pci/atiixp.c b/sys/dev/sound/pci/atiixp.c
index 90e5742e6523..12906ecc6253 100644
--- a/sys/dev/sound/pci/atiixp.c
+++ b/sys/dev/sound/pci/atiixp.c
@@ -129,7 +129,7 @@ struct atiixp_info {
uint32_t blkcnt;
int registered_channels;
- struct mtx *lock;
+ struct mtx lock;
struct callout poll_timer;
int poll_ticks, polling;
};
@@ -139,9 +139,9 @@ struct atiixp_info {
#define atiixp_wr(_sc, _reg, _val) \
bus_space_write_4((_sc)->st, (_sc)->sh, _reg, _val)
-#define atiixp_lock(_sc) snd_mtxlock((_sc)->lock)
-#define atiixp_unlock(_sc) snd_mtxunlock((_sc)->lock)
-#define atiixp_assert(_sc) snd_mtxassert((_sc)->lock)
+#define atiixp_lock(_sc) mtx_lock(&(_sc)->lock)
+#define atiixp_unlock(_sc) mtx_unlock(&(_sc)->lock)
+#define atiixp_assert(_sc) mtx_assert(&(_sc)->lock, MA_OWNED)
static uint32_t atiixp_fmt_32bit[] = {
SND_FORMAT(AFMT_S16_LE, 2, 0),
@@ -535,8 +535,8 @@ atiixp_chan_setfragments(kobj_t obj, void *data,
blksz &= ATI_IXP_BLK_ALIGN;
- if (blksz > (sndbuf_getmaxsize(ch->buffer) / ATI_IXP_DMA_CHSEGS_MIN))
- blksz = sndbuf_getmaxsize(ch->buffer) / ATI_IXP_DMA_CHSEGS_MIN;
+ if (blksz > (ch->buffer->maxsize / ATI_IXP_DMA_CHSEGS_MIN))
+ blksz = ch->buffer->maxsize / ATI_IXP_DMA_CHSEGS_MIN;
if (blksz < ATI_IXP_BLK_MIN)
blksz = ATI_IXP_BLK_MIN;
if (blkcnt > ATI_IXP_DMA_CHSEGS_MAX)
@@ -544,7 +544,7 @@ atiixp_chan_setfragments(kobj_t obj, void *data,
if (blkcnt < ATI_IXP_DMA_CHSEGS_MIN)
blkcnt = ATI_IXP_DMA_CHSEGS_MIN;
- while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->buffer)) {
+ while ((blksz * blkcnt) > ch->buffer->maxsize) {
if ((blkcnt >> 1) >= ATI_IXP_DMA_CHSEGS_MIN)
blkcnt >>= 1;
else if ((blksz >> 1) >= ATI_IXP_BLK_MIN)
@@ -553,14 +553,14 @@ atiixp_chan_setfragments(kobj_t obj, void *data,
break;
}
- if ((sndbuf_getblksz(ch->buffer) != blksz ||
- sndbuf_getblkcnt(ch->buffer) != blkcnt) &&
+ if ((ch->buffer->blksz != blksz ||
+ ch->buffer->blkcnt != blkcnt) &&
sndbuf_resize(ch->buffer, blkcnt, blksz) != 0)
device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n",
__func__, blksz, blkcnt);
- ch->blksz = sndbuf_getblksz(ch->buffer);
- ch->blkcnt = sndbuf_getblkcnt(ch->buffer);
+ ch->blksz = ch->buffer->blksz;
+ ch->blkcnt = ch->buffer->blkcnt;
return (0);
}
@@ -583,7 +583,7 @@ atiixp_buildsgdt(struct atiixp_chinfo *ch)
uint32_t addr, blksz, blkcnt;
int i;
- addr = sndbuf_getbufaddr(ch->buffer);
+ addr = ch->buffer->buf_addr;
if (sc->polling != 0) {
blksz = ch->blksz * ch->blkcnt;
@@ -610,7 +610,7 @@ atiixp_dmapos(struct atiixp_chinfo *ch)
volatile uint32_t ptr;
reg = ch->dt_cur_bit;
- addr = sndbuf_getbufaddr(ch->buffer);
+ addr = ch->buffer->buf_addr;
sz = ch->blkcnt * ch->blksz;
retry = ATI_IXP_DMA_RETRY_MAX;
@@ -739,8 +739,7 @@ atiixp_chan_trigger(kobj_t obj, void *data, int go)
ch->ptr = 0;
ch->prevptr = 0;
pollticks = ((uint64_t)hz * ch->blksz) /
- ((uint64_t)sndbuf_getalign(ch->buffer) *
- sndbuf_getspd(ch->buffer));
+ ((uint64_t)ch->buffer->align * ch->buffer->spd);
pollticks >>= 2;
if (pollticks > hz)
pollticks = hz;
@@ -781,8 +780,8 @@ atiixp_chan_trigger(kobj_t obj, void *data, int go)
else
ch = &sc->rch;
pollticks = ((uint64_t)hz * ch->blksz) /
- ((uint64_t)sndbuf_getalign(ch->buffer) *
- sndbuf_getspd(ch->buffer));
+ ((uint64_t)ch->buffer->align *
+ ch->buffer->spd);
pollticks >>= 2;
if (pollticks > hz)
pollticks = hz;
@@ -1020,7 +1019,7 @@ atiixp_chip_post_init(void *arg)
if (sc->codec_not_ready_bits == 0) {
/* wait for the interrupts to happen */
do {
- msleep(sc, sc->lock, PWAIT, "ixpslp", max(hz / 10, 1));
+ msleep(sc, &sc->lock, PWAIT, "ixpslp", max(hz / 10, 1));
if (sc->codec_not_ready_bits != 0)
break;
} while (--timeout);
@@ -1158,10 +1157,7 @@ atiixp_release_resource(struct atiixp_info *sc)
bus_dma_tag_destroy(sc->sgd_dmat);
sc->sgd_dmat = NULL;
}
- if (sc->lock) {
- snd_mtxfree(sc->lock);
- sc->lock = NULL;
- }
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
}
@@ -1191,7 +1187,8 @@ atiixp_pci_attach(device_t dev)
int i;
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_atiixp softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_atiixp softc",
+ MTX_DEF);
sc->dev = dev;
callout_init(&sc->poll_timer, 1);
diff --git a/sys/dev/sound/pci/cmi.c b/sys/dev/sound/pci/cmi.c
index 22f1e76a4d1f..99925d236c08 100644
--- a/sys/dev/sound/pci/cmi.c
+++ b/sys/dev/sound/pci/cmi.c
@@ -116,7 +116,7 @@ struct sc_info {
struct resource *reg, *irq;
int regid, irqid;
void *ih;
- struct mtx *lock;
+ struct mtx lock;
int spdif_enabled;
unsigned int bufsz;
@@ -255,10 +255,10 @@ cmi_dma_prog(struct sc_info *sc, struct sc_chinfo *ch, u_int32_t base)
{
u_int32_t s, i, sz;
- ch->phys_buf = sndbuf_getbufaddr(ch->buffer);
+ ch->phys_buf = ch->buffer->buf_addr;
cmi_wr(sc, base, ch->phys_buf, 4);
- sz = (u_int32_t)sndbuf_getsize(ch->buffer);
+ sz = (u_int32_t)ch->buffer->bufsize;
s = sz / ch->bps - 1;
cmi_wr(sc, base + 4, s, 2);
@@ -352,7 +352,7 @@ cmichan_init(kobj_t obj, void *devinfo,
ch->channel = c;
ch->bps = 1;
ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
- ch->spd = DSP_DEFAULT_SPEED;
+ ch->spd = 8000;
ch->buffer = b;
ch->dma_active = 0;
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0) {
@@ -361,13 +361,13 @@ cmichan_init(kobj_t obj, void *devinfo,
}
ch->dir = dir;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
cmi_dma_prog(sc, ch, CMPCI_REG_DMA0_BASE);
} else {
cmi_dma_prog(sc, ch, CMPCI_REG_DMA1_BASE);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ch;
}
@@ -394,7 +394,7 @@ cmichan_setformat(kobj_t obj, void *data, u_int32_t format)
f |= CMPCI_REG_FORMAT_MONO;
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
cmi_partial_wr4(ch->parent,
CMPCI_REG_CHANNEL_FORMAT,
@@ -408,7 +408,7 @@ cmichan_setformat(kobj_t obj, void *data, u_int32_t format)
CMPCI_REG_CH1_FORMAT_MASK,
f);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
ch->fmt = format;
return 0;
@@ -422,7 +422,7 @@ cmichan_setspeed(kobj_t obj, void *data, u_int32_t speed)
u_int32_t r, rsp __unused;
r = cmpci_rate_to_regvalue(speed);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
if (speed < 44100) {
/* disable if req before rate change */
@@ -450,7 +450,7 @@ cmichan_setspeed(kobj_t obj, void *data, u_int32_t speed)
rsp >>= CMPCI_REG_ADC_FS_SHIFT;
rsp &= CMPCI_REG_ADC_FS_MASK;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
ch->spd = cmpci_regvalue_to_rate(r);
DEB(printf("cmichan_setspeed (%s) %d -> %d (%d)\n",
@@ -484,7 +484,7 @@ cmichan_trigger(kobj_t obj, void *data, int go)
if (!PCMTRIG_COMMON(go))
return 0;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
switch(go) {
case PCMTRIG_START:
@@ -506,7 +506,7 @@ cmichan_trigger(kobj_t obj, void *data, int go)
break;
}
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -517,15 +517,15 @@ cmichan_getptr(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
u_int32_t physptr, bufptr, sz;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
physptr = cmi_rd(sc, CMPCI_REG_DMA0_BASE, 4);
} else {
physptr = cmi_rd(sc, CMPCI_REG_DMA1_BASE, 4);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
- sz = sndbuf_getsize(ch->buffer);
+ sz = ch->buffer->bufsize;
bufptr = (physptr - ch->phys_buf + sz - ch->bps) % sz;
return bufptr;
@@ -538,7 +538,7 @@ cmi_intr(void *data)
u_int32_t intrstat;
u_int32_t toclear;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
intrstat = cmi_rd(sc, CMPCI_REG_INTR_STATUS, 4);
if ((intrstat & CMPCI_REG_ANY_INTR) != 0) {
toclear = 0;
@@ -554,7 +554,7 @@ cmi_intr(void *data)
if (toclear) {
cmi_clr4(sc, CMPCI_REG_INTR_CTRL, toclear);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
/* Signal interrupts to channel */
if (intrstat & CMPCI_REG_CH0_INTR) {
@@ -565,14 +565,14 @@ cmi_intr(void *data)
chn_intr(sc->rch.channel);
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
cmi_set4(sc, CMPCI_REG_INTR_CTRL, toclear);
}
}
if(sc->mpu_intr) {
(sc->mpu_intr)(sc->mpu);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return;
}
@@ -799,10 +799,10 @@ cmi_muninit(struct mpu401 *arg, void *cookie)
{
struct sc_info *sc = cookie;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->mpu_intr = NULL;
sc->mpu = NULL;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -933,7 +933,8 @@ cmi_attach(device_t dev)
char status[SND_STATUSLEN];
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_cmi softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_cmi softc",
+ MTX_DEF);
pci_enable_busmaster(dev);
sc->dev = dev;
@@ -1007,8 +1008,7 @@ cmi_attach(device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
if (sc->reg)
bus_release_resource(dev, SYS_RES_IOPORT, sc->regid, sc->reg);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
if (sc)
free(sc, M_DEVBUF);
@@ -1037,7 +1037,7 @@ cmi_detach(device_t dev)
if (sc->mpu_reg)
bus_release_resource(dev, SYS_RES_IOPORT, sc->mpu_regid, sc->mpu_reg);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
return 0;
@@ -1048,11 +1048,11 @@ cmi_suspend(device_t dev)
{
struct sc_info *sc = pcm_getdevinfo(dev);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->pch.dma_was_active = cmi_ch0_stop(sc, &sc->pch);
sc->rch.dma_was_active = cmi_ch1_stop(sc, &sc->rch);
cmi_power(sc, 3);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -1061,17 +1061,17 @@ cmi_resume(device_t dev)
{
struct sc_info *sc = pcm_getdevinfo(dev);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
cmi_power(sc, 0);
if (cmi_init(sc) != 0) {
device_printf(dev, "unable to reinitialize the card\n");
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ENXIO;
}
if (mixer_reinit(dev) == -1) {
device_printf(dev, "unable to reinitialize the mixer\n");
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ENXIO;
}
@@ -1086,7 +1086,7 @@ cmi_resume(device_t dev)
cmichan_setformat(NULL, &sc->rch, sc->rch.fmt);
cmi_ch1_start(sc, &sc->rch);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
diff --git a/sys/dev/sound/pci/cs4281.c b/sys/dev/sound/pci/cs4281.c
index 7a25f7f4c08d..5b0b229a021b 100644
--- a/sys/dev/sound/pci/cs4281.c
+++ b/sys/dev/sound/pci/cs4281.c
@@ -326,9 +326,9 @@ cs4281chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channe
ch->channel = c;
ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
- ch->spd = DSP_DEFAULT_SPEED;
+ ch->spd = 8000;
ch->bps = 1;
- ch->blksz = sndbuf_getsize(ch->buffer);
+ ch->blksz = ch->buffer->bufsize;
ch->dma_chan = (dir == PCMDIR_PLAY) ? CS4281_DMA_PLAY : CS4281_DMA_REC;
ch->dma_setup = 0;
@@ -412,7 +412,7 @@ cs4281chan_getptr(kobj_t obj, void *data)
u_int32_t dba, dca, ptr;
int sz;
- sz = sndbuf_getsize(ch->buffer);
+ sz = ch->buffer->bufsize;
dba = cs4281_rd(sc, CS4281PCI_DBA(ch->dma_chan));
dca = cs4281_rd(sc, CS4281PCI_DCA(ch->dma_chan));
ptr = (dca - dba + sz) % sz;
@@ -493,9 +493,9 @@ adcdac_prog(struct sc_chinfo *ch)
if (!ch->dma_setup) {
go = adcdac_go(ch, 0);
cs4281_wr(sc, CS4281PCI_DBA(ch->dma_chan),
- sndbuf_getbufaddr(ch->buffer));
+ ch->buffer->buf_addr);
cs4281_wr(sc, CS4281PCI_DBC(ch->dma_chan),
- sndbuf_getsize(ch->buffer) / ch->bps - 1);
+ ch->buffer->bufsize / ch->bps - 1);
ch->dma_setup = 1;
adcdac_go(ch, go);
}
diff --git a/sys/dev/sound/pci/csapcm.c b/sys/dev/sound/pci/csapcm.c
index a966a2e66402..688aee6400d8 100644
--- a/sys/dev/sound/pci/csapcm.c
+++ b/sys/dev/sound/pci/csapcm.c
@@ -483,7 +483,7 @@ csa_setupchan(struct csa_chinfo *ch)
if (ch->dir == PCMDIR_PLAY) {
/* direction */
- csa_writemem(resp, BA1_PBA, sndbuf_getbufaddr(ch->buffer));
+ csa_writemem(resp, BA1_PBA, ch->buffer->buf_addr);
/* format */
csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
@@ -512,7 +512,7 @@ csa_setupchan(struct csa_chinfo *ch)
csa_setplaysamplerate(resp, ch->spd);
} else if (ch->dir == PCMDIR_REC) {
/* direction */
- csa_writemem(resp, BA1_CBA, sndbuf_getbufaddr(ch->buffer));
+ csa_writemem(resp, BA1_CBA, ch->buffer->buf_addr);
/* format */
csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
@@ -602,11 +602,11 @@ csachan_getptr(kobj_t obj, void *data)
resp = &csa->res;
if (ch->dir == PCMDIR_PLAY) {
- ptr = csa_readmem(resp, BA1_PBA) - sndbuf_getbufaddr(ch->buffer);
+ ptr = csa_readmem(resp, BA1_PBA) - ch->buffer->buf_addr;
if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
ptr >>= 1;
} else {
- ptr = csa_readmem(resp, BA1_CBA) - sndbuf_getbufaddr(ch->buffer);
+ ptr = csa_readmem(resp, BA1_CBA) - ch->buffer->buf_addr;
if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
ptr >>= 1;
}
diff --git a/sys/dev/sound/pci/emu10k1.c b/sys/dev/sound/pci/emu10k1.c
index e4b2c22f4f07..da2ddc99f5a1 100644
--- a/sys/dev/sound/pci/emu10k1.c
+++ b/sys/dev/sound/pci/emu10k1.c
@@ -218,7 +218,7 @@ struct sc_info {
struct resource *reg, *irq;
void *ih;
- struct mtx *lock;
+ struct mtx lock;
unsigned int bufsz;
int timer, timerinterval;
@@ -413,7 +413,7 @@ emu_settimer(struct sc_info *sc)
for (i = 0; i < sc->nchans; i++) {
pch = &sc->pch[i];
if (pch->buffer) {
- tmp = (pch->spd * sndbuf_getalign(pch->buffer))
+ tmp = (pch->spd * pch->buffer->align)
/ pch->blksz;
if (tmp > rate)
rate = tmp;
@@ -423,7 +423,7 @@ emu_settimer(struct sc_info *sc)
for (i = 0; i < 3; i++) {
rch = &sc->rch[i];
if (rch->buffer) {
- tmp = (rch->spd * sndbuf_getalign(rch->buffer))
+ tmp = (rch->spd * rch->buffer->align)
/ rch->blksz;
if (tmp > rate)
rate = tmp;
@@ -820,10 +820,10 @@ emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->blksz = sc->bufsz / 2;
ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
ch->spd = 8000;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ch->master = emu_valloc(sc);
ch->slave = emu_valloc(sc);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))
? NULL : ch;
@@ -837,9 +837,9 @@ emupchan_free(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
int r;
- snd_mtxlock(sc->lock);
- r = emu_memfree(sc, sndbuf_getbuf(ch->buffer));
- snd_mtxunlock(sc->lock);
+ mtx_lock(&sc->lock);
+ r = emu_memfree(sc, ch->buffer->buf);
+ mtx_unlock(&sc->lock);
return r;
}
@@ -869,9 +869,9 @@ emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
struct sc_info *sc = ch->parent;
ch->blksz = blocksize;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
emu_settimer(sc);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return blocksize;
}
@@ -884,7 +884,7 @@ emupchan_trigger(kobj_t obj, void *data, int go)
if (!PCMTRIG_COMMON(go))
return 0;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (go == PCMTRIG_START) {
emu_vsetup(ch);
emu_vwrite(sc, ch->master);
@@ -901,7 +901,7 @@ emupchan_trigger(kobj_t obj, void *data, int go)
}
ch->run = (go == PCMTRIG_START) ? 1 : 0;
emu_vtrigger(sc, ch->master, ch->run);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -912,9 +912,9 @@ emupchan_getptr(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
int r;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
r = emu_vpos(sc, ch->master);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return r;
}
@@ -984,10 +984,10 @@ emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
return NULL;
else {
- snd_mtxlock(sc->lock);
- emu_wrptr(sc, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
+ mtx_lock(&sc->lock);
+ emu_wrptr(sc, 0, ch->basereg, ch->buffer->buf_addr);
emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ch;
}
}
@@ -1027,9 +1027,9 @@ emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
struct sc_info *sc = ch->parent;
ch->blksz = blocksize;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
emu_settimer(sc);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return blocksize;
}
@@ -1069,7 +1069,7 @@ emurchan_trigger(kobj_t obj, void *data, int go)
sz = EMU_RECBS_BUFSIZE_4096;
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch(go) {
case PCMTRIG_START:
ch->run = 1;
@@ -1111,7 +1111,7 @@ emurchan_trigger(kobj_t obj, void *data, int go)
default:
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -1123,9 +1123,9 @@ emurchan_getptr(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
int r;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return r;
}
@@ -1171,9 +1171,9 @@ emu_muninit(struct mpu401 *arg, void *cookie)
{
struct sc_info *sc = cookie;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->mpu_intr = NULL;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -1216,7 +1216,7 @@ emu_intr(void *data)
struct sc_info *sc = data;
u_int32_t stat, ack, i, x;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
while (1) {
stat = emu_rd(sc, EMU_IPR, 4);
if (stat == 0)
@@ -1262,7 +1262,7 @@ emu_intr(void *data)
emu_wr(sc, EMU_IPR, stat, 4);
if (ack) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
if (ack & EMU_IPR_INTERVALTIMER) {
x = 0;
@@ -1289,10 +1289,10 @@ emu_intr(void *data)
chn_intr(sc->rch[2].channel);
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
/* -------------------------------------------------------------------- */
@@ -2071,7 +2071,8 @@ emu_pci_attach(device_t dev)
char status[SND_STATUSLEN];
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_emu10k1 softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_emu10k1 softc",
+ MTX_DEF);
sc->dev = dev;
sc->type = pci_get_devid(dev);
sc->rev = pci_get_revid(dev);
@@ -2147,7 +2148,7 @@ bad:
if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
if (sc->parent_dmat) bus_dma_tag_destroy(sc->parent_dmat);
- if (sc->lock) snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
return ENXIO;
}
@@ -2170,7 +2171,7 @@ emu_pci_detach(device_t dev)
bus_teardown_intr(dev, sc->irq, sc->ih);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
bus_dma_tag_destroy(sc->parent_dmat);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
return 0;
diff --git a/sys/dev/sound/pci/emu10kx-pcm.c b/sys/dev/sound/pci/emu10kx-pcm.c
index c280b64892f6..25b0006e4122 100644
--- a/sys/dev/sound/pci/emu10kx-pcm.c
+++ b/sys/dev/sound/pci/emu10kx-pcm.c
@@ -90,7 +90,7 @@ struct emu_pcm_rchinfo {
#endif
struct emu_pcm_info {
- struct mtx *lock;
+ struct mtx lock;
device_t dev; /* device information */
struct emu_sc_info *card;
struct emu_pcm_pchinfo pch[MAX_CHANNELS]; /* hardware channels */
@@ -771,10 +771,10 @@ emupchan_setblocksize(kobj_t obj __unused, void *c_devinfo, uint32_t blocksize)
if (blocksize > ch->pcm->bufsz)
blocksize = ch->pcm->bufsz;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ch->blksz = blocksize;
- emu_timer_set(sc->card, ch->timer, ch->blksz / sndbuf_getalign(ch->buffer));
- snd_mtxunlock(sc->lock);
+ emu_timer_set(sc->card, ch->timer, ch->blksz / ch->buffer->align);
+ mtx_unlock(&sc->lock);
return (ch->blksz);
}
@@ -787,7 +787,7 @@ emupchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
if (!PCMTRIG_COMMON(go))
return (0);
- snd_mtxlock(sc->lock); /* XXX can we trigger on parallel threads ? */
+ mtx_lock(&sc->lock); /* XXX can we trigger on parallel threads ? */
if (go == PCMTRIG_START) {
emu_vsetup(ch->master, ch->fmt, ch->spd);
if (AFMT_CHANNEL(ch->fmt) > 1)
@@ -795,13 +795,14 @@ emupchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
else
emu_vroute(sc->card, &(sc->rt_mono), ch->master);
emu_vwrite(sc->card, ch->master);
- emu_timer_set(sc->card, ch->timer, ch->blksz / sndbuf_getalign(ch->buffer));
+ emu_timer_set(sc->card, ch->timer, ch->blksz /
+ ch->buffer->align);
emu_timer_enable(sc->card, ch->timer, 1);
}
/* PCM interrupt handler will handle PCMTRIG_STOP event */
ch->run = (go == PCMTRIG_START) ? 1 : 0;
emu_vtrigger(sc->card, ch->master, ch->run);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -878,7 +879,7 @@ emurchan_init(kobj_t obj __unused, void *devinfo, struct snd_dbuf *b, struct pcm
return (NULL);
else {
ch->timer = emu_timer_create(sc->card);
- emu_wrptr(sc->card, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
+ emu_wrptr(sc->card, 0, ch->basereg, ch->buffer->buf_addr);
emu_wrptr(sc->card, 0, ch->sizereg, 0); /* off */
return (ch);
}
@@ -930,7 +931,8 @@ emurchan_setblocksize(kobj_t obj __unused, void *c_devinfo, uint32_t blocksize)
* (and use) timer interrupts. Otherwise channel will be marked dead.
*/
if (ch->blksz < (ch->pcm->bufsz / 2)) {
- emu_timer_set(sc->card, ch->timer, ch->blksz / sndbuf_getalign(ch->buffer));
+ emu_timer_set(sc->card, ch->timer, ch->blksz /
+ ch->buffer->align);
emu_timer_enable(sc->card, ch->timer, 1);
} else {
emu_timer_enable(sc->card, ch->timer, 0);
@@ -968,7 +970,7 @@ emurchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
sz = EMU_RECBS_BUFSIZE_4096;
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch (go) {
case PCMTRIG_START:
ch->run = 1;
@@ -997,7 +999,7 @@ emurchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
default:
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -1059,7 +1061,7 @@ emufxrchan_init(kobj_t obj __unused, void *devinfo, struct snd_dbuf *b, struct p
if (sndbuf_alloc(ch->buffer, emu_gettag(sc->card), 0, sc->bufsz) != 0)
return (NULL);
else {
- emu_wrptr(sc->card, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
+ emu_wrptr(sc->card, 0, ch->basereg, ch->buffer->buf_addr);
emu_wrptr(sc->card, 0, ch->sizereg, 0); /* off */
return (ch);
}
@@ -1128,7 +1130,7 @@ emufxrchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
sz = EMU_RECBS_BUFSIZE_4096;
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch (go) {
case PCMTRIG_START:
ch->run = 1;
@@ -1167,7 +1169,7 @@ emufxrchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
default:
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -1232,24 +1234,24 @@ emu_pcm_intr(void *pcm, uint32_t stat)
ack = 0;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (stat & EMU_IPR_INTERVALTIMER) {
ack |= EMU_IPR_INTERVALTIMER;
for (i = 0; i < MAX_CHANNELS; i++)
if (sc->pch[i].channel) {
if (sc->pch[i].run == 1) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(sc->pch[i].channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
} else
emu_timer_enable(sc->card, sc->pch[i].timer, 0);
}
/* ADC may install timer to get low-latency interrupts */
if ((sc->rch_adc.channel) && (sc->rch_adc.run)) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(sc->rch_adc.channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
/*
* EFX does not use timer, because it will fill
@@ -1260,21 +1262,21 @@ emu_pcm_intr(void *pcm, uint32_t stat)
if (stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL)) {
ack |= stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL);
if (sc->rch_adc.channel) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(sc->rch_adc.channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
if (stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL)) {
ack |= stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL);
if (sc->rch_efx.channel) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(sc->rch_efx.channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (ack);
}
@@ -1347,7 +1349,8 @@ emu_pcm_attach(device_t dev)
return (ENXIO);
}
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_emu10kx pcm softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_emu10kx pcm softc",
+ MTX_DEF);
sc->dev = dev;
BUS_READ_IVAR(device_get_parent(dev), dev, EMU_VAR_ISEMU10K1, &ivar);
@@ -1481,8 +1484,7 @@ emu_pcm_attach(device_t dev)
bad:
if (sc->codec)
ac97_destroy(sc->codec);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
return (ENXIO);
}
@@ -1501,8 +1503,7 @@ emu_pcm_detach(device_t dev)
emu_pcm_uninit(sc);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
return (0);
diff --git a/sys/dev/sound/pci/envy24.c b/sys/dev/sound/pci/envy24.c
index 51842bfdb480..3adb22254b72 100644
--- a/sys/dev/sound/pci/envy24.c
+++ b/sys/dev/sound/pci/envy24.c
@@ -116,7 +116,7 @@ struct cfg_info {
/* device private data */
struct sc_info {
device_t dev;
- struct mtx *lock;
+ struct mtx lock;
/* Control/Status registor */
struct resource *cs;
@@ -1567,10 +1567,10 @@ envy24chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channe
#if(0)
device_printf(sc->dev, "envy24chan_init(obj, devinfo, b, c, %d)\n", dir);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if ((sc->chnum > ENVY24_CHAN_PLAY_SPDIF && dir != PCMDIR_REC) ||
(sc->chnum < ENVY24_CHAN_REC_ADC1 && dir != PCMDIR_PLAY)) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return NULL;
}
num = sc->chnum;
@@ -1589,14 +1589,14 @@ envy24chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channe
ch->dir = dir;
/* set channel map */
ch->num = envy24_chanmap[num];
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
sndbuf_setup(ch->buffer, ch->data, ch->size);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
/* these 2 values are dummy */
ch->unit = 4;
ch->blk = 10240;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ch;
}
@@ -1610,12 +1610,12 @@ envy24chan_free(kobj_t obj, void *data)
#if(0)
device_printf(sc->dev, "envy24chan_free()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->data != NULL) {
free(ch->data, M_ENVY24);
ch->data = NULL;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -1632,21 +1632,21 @@ envy24chan_setformat(kobj_t obj, void *data, u_int32_t format)
#if(0)
device_printf(sc->dev, "envy24chan_setformat(obj, data, 0x%08x)\n", format);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
/* check and get format related information */
if (ch->dir == PCMDIR_PLAY)
emltab = envy24_pemltab;
else
emltab = envy24_remltab;
if (emltab == NULL) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return -1;
}
for (i = 0; emltab[i].format != 0; i++)
if (emltab[i].format == format)
break;
if (emltab[i].format == 0) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return -1;
}
@@ -1670,7 +1670,7 @@ envy24chan_setformat(kobj_t obj, void *data, u_int32_t format)
bcnt = ch->size / bsize;
sndbuf_resize(ch->buffer, bcnt, bsize);
#endif
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
#if(0)
device_printf(sc->dev, "envy24chan_setformat(): return 0x%08x\n", 0);
@@ -1723,7 +1723,7 @@ envy24chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
device_printf(sc->dev, "envy24chan_setblocksize(obj, data, %d)\n", blocksize);
#endif
prev = 0x7fffffff;
- /* snd_mtxlock(sc->lock); */
+ /* mtx_lock(&sc->lock); */
for (size = ch->size / 2; size > 0; size /= 2) {
if (abs(size - blocksize) < abs(prev - blocksize))
prev = size;
@@ -1745,7 +1745,7 @@ envy24chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
bsize *= ch->unit;
bcnt = ch->size / bsize;
sndbuf_resize(ch->buffer, bcnt, bsize);
- /* snd_mtxunlock(sc->lock); */
+ /* mtx_unlock(&sc->lock); */
#if(0)
device_printf(sc->dev, "envy24chan_setblocksize(): return %d\n", prev);
@@ -1767,7 +1767,7 @@ envy24chan_trigger(kobj_t obj, void *data, int go)
device_printf(sc->dev, "envy24chan_trigger(obj, data, %d)\n", go);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY)
slot = 0;
else
@@ -1862,7 +1862,7 @@ envy24chan_trigger(kobj_t obj, void *data, int go)
break;
}
fail:
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (error);
}
@@ -1876,10 +1876,10 @@ envy24chan_getptr(kobj_t obj, void *data)
#if(0)
device_printf(sc->dev, "envy24chan_getptr()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ptr = envy24_gethwptr(sc, ch->dir);
rtn = ptr * ch->unit;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
#if(0)
device_printf(sc->dev, "envy24chan_getptr(): return %d\n",
@@ -1898,7 +1898,7 @@ envy24chan_getcaps(kobj_t obj, void *data)
#if(0)
device_printf(sc->dev, "envy24chan_getcaps()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
if (sc->run[0] == 0)
rtn = &envy24_playcaps;
@@ -1911,7 +1911,7 @@ envy24chan_getcaps(kobj_t obj, void *data)
else
rtn = &sc->caps[1];
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return rtn;
}
@@ -1945,12 +1945,12 @@ envy24mixer_init(struct snd_mixer *m)
return -1;
/* set volume control rate */
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
envy24_wrmt(sc, ENVY24_MT_VOLRATE, 0x30, 1); /* 0x30 is default value */
mix_setdevs(m, ENVY24_MIX_MASK);
mix_setrecdevs(m, ENVY24_MIX_REC_MASK);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -2003,7 +2003,7 @@ envy24mixer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right
dev, left, right);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (dev == 0) {
for (i = 0; i < sc->dacn; i++) {
sc->cfg->codec->setvolume(sc->dac[i], PCMDIR_PLAY, left, right);
@@ -2020,7 +2020,7 @@ envy24mixer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right
if (hwch > ENVY24_CHAN_PLAY_SPDIF || sc->chan[ch].run)
envy24_setvolume(sc, hwch);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return right << 8 | left;
}
@@ -2063,7 +2063,7 @@ envy24_intr(void *p)
#if(0)
device_printf(sc->dev, "envy24_intr()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (envy24_checkintr(sc, PCMDIR_PLAY)) {
#if(0)
device_printf(sc->dev, "envy24_intr(): play\n");
@@ -2085,9 +2085,9 @@ envy24_intr(void *p)
device_printf(sc->dev, "envy24_intr(): chan[%d].blk = %d\n", i, ch->blk);
#endif
if (ch->run && ch->blk <= feed) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
sc->intr[0] = ptr;
@@ -2104,15 +2104,15 @@ envy24_intr(void *p)
for (i = ENVY24_CHAN_REC_ADC1; i <= ENVY24_CHAN_REC_SPDIF; i++) {
ch = &sc->chan[i];
if (ch->run && ch->blk <= feed) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
sc->intr[1] = ptr;
envy24_updintr(sc, PCMDIR_REC);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return;
}
@@ -2551,7 +2551,8 @@ envy24_pci_attach(device_t dev)
}
bzero(sc, sizeof(*sc));
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_envy24 softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_envy24 softc",
+ MTX_DEF);
sc->dev = dev;
/* initialize PCI interface */
@@ -2627,8 +2628,7 @@ bad:
bus_release_resource(dev, SYS_RES_IOPORT, sc->dsid, sc->ds);
if (sc->mt)
bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_ENVY24);
return err;
}
@@ -2665,7 +2665,7 @@ envy24_pci_detach(device_t dev)
bus_release_resource(dev, SYS_RES_IOPORT, sc->ddmaid, sc->ddma);
bus_release_resource(dev, SYS_RES_IOPORT, sc->dsid, sc->ds);
bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_ENVY24);
return 0;
}
diff --git a/sys/dev/sound/pci/envy24ht.c b/sys/dev/sound/pci/envy24ht.c
index b8202a9fa7cd..2396a340cd84 100644
--- a/sys/dev/sound/pci/envy24ht.c
+++ b/sys/dev/sound/pci/envy24ht.c
@@ -125,7 +125,7 @@ struct cfg_info {
/* device private data */
struct sc_info {
device_t dev;
- struct mtx *lock;
+ struct mtx lock;
/* Control/Status registor */
struct resource *cs;
@@ -1476,11 +1476,11 @@ envy24htchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_chan
#if(0)
device_printf(sc->dev, "envy24htchan_init(obj, devinfo, b, c, %d)\n", dir);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
#if 0
if ((sc->chnum > ENVY24HT_CHAN_PLAY_SPDIF && dir != PCMDIR_REC) ||
(sc->chnum < ENVY24HT_CHAN_REC_ADC1 && dir != PCMDIR_PLAY)) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return NULL;
}
#endif
@@ -1500,14 +1500,14 @@ envy24htchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_chan
ch->dir = dir;
/* set channel map */
ch->num = envy24ht_chanmap[num];
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
sndbuf_setup(ch->buffer, ch->data, ch->size);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
/* these 2 values are dummy */
ch->unit = 4;
ch->blk = 10240;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return ch;
}
@@ -1521,12 +1521,12 @@ envy24htchan_free(kobj_t obj, void *data)
#if(0)
device_printf(sc->dev, "envy24htchan_free()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->data != NULL) {
free(ch->data, M_ENVY24HT);
ch->data = NULL;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -1543,21 +1543,21 @@ envy24htchan_setformat(kobj_t obj, void *data, u_int32_t format)
#if(0)
device_printf(sc->dev, "envy24htchan_setformat(obj, data, 0x%08x)\n", format);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
/* check and get format related information */
if (ch->dir == PCMDIR_PLAY)
emltab = envy24ht_pemltab;
else
emltab = envy24ht_remltab;
if (emltab == NULL) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return -1;
}
for (i = 0; emltab[i].format != 0; i++)
if (emltab[i].format == format)
break;
if (emltab[i].format == 0) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return -1;
}
@@ -1581,7 +1581,7 @@ envy24htchan_setformat(kobj_t obj, void *data, u_int32_t format)
bcnt = ch->size / bsize;
sndbuf_resize(ch->buffer, bcnt, bsize);
#endif
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
#if(0)
device_printf(sc->dev, "envy24htchan_setformat(): return 0x%08x\n", 0);
@@ -1634,7 +1634,7 @@ envy24htchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
device_printf(sc->dev, "envy24htchan_setblocksize(obj, data, %d)\n", blocksize);
#endif
prev = 0x7fffffff;
- /* snd_mtxlock(sc->lock); */
+ /* mtx_lock(&sc->lock); */
for (size = ch->size / 2; size > 0; size /= 2) {
if (abs(size - blocksize) < abs(prev - blocksize))
prev = size;
@@ -1656,7 +1656,7 @@ envy24htchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
bsize *= ch->unit;
bcnt = ch->size / bsize;
sndbuf_resize(ch->buffer, bcnt, bsize);
- /* snd_mtxunlock(sc->lock); */
+ /* mtx_unlock(&sc->lock); */
#if(0)
device_printf(sc->dev, "envy24htchan_setblocksize(): return %d\n", prev);
@@ -1678,7 +1678,7 @@ envy24htchan_trigger(kobj_t obj, void *data, int go)
device_printf(sc->dev, "envy24htchan_trigger(obj, data, %d)\n", go);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY)
slot = 0;
else
@@ -1771,7 +1771,7 @@ envy24htchan_trigger(kobj_t obj, void *data, int go)
break;
}
fail:
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (error);
}
@@ -1785,10 +1785,10 @@ envy24htchan_getptr(kobj_t obj, void *data)
#if(0)
device_printf(sc->dev, "envy24htchan_getptr()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ptr = envy24ht_gethwptr(sc, ch->dir);
rtn = ptr * ch->unit;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
#if(0)
device_printf(sc->dev, "envy24htchan_getptr(): return %d\n",
@@ -1807,7 +1807,7 @@ envy24htchan_getcaps(kobj_t obj, void *data)
#if(0)
device_printf(sc->dev, "envy24htchan_getcaps()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->dir == PCMDIR_PLAY) {
if (sc->run[0] == 0)
rtn = &envy24ht_playcaps;
@@ -1820,7 +1820,7 @@ envy24htchan_getcaps(kobj_t obj, void *data)
else
rtn = &sc->caps[1];
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return rtn;
}
@@ -1854,7 +1854,7 @@ envy24htmixer_init(struct snd_mixer *m)
return -1;
/* set volume control rate */
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
#if 0
envy24ht_wrmt(sc, ENVY24HT_MT_VOLRATE, 0x30, 1); /* 0x30 is default value */
#endif
@@ -1864,7 +1864,7 @@ envy24htmixer_init(struct snd_mixer *m)
mix_setdevs(m, ENVY24HT_MIX_MASK);
mix_setrecdevs(m, ENVY24HT_MIX_REC_MASK);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return 0;
}
@@ -1917,7 +1917,7 @@ envy24htmixer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned rig
dev, left, right);
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (dev == 0) {
for (i = 0; i < sc->dacn; i++) {
sc->cfg->codec->setvolume(sc->dac[i], PCMDIR_PLAY, left, right);
@@ -1934,7 +1934,7 @@ envy24htmixer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned rig
if (hwch > ENVY24HT_CHAN_PLAY_SPDIF || sc->chan[ch].run)
envy24ht_setvolume(sc, hwch);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return right << 8 | left;
}
@@ -1977,7 +1977,7 @@ envy24ht_intr(void *p)
#if(0)
device_printf(sc->dev, "envy24ht_intr()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (envy24ht_checkintr(sc, PCMDIR_PLAY)) {
#if(0)
device_printf(sc->dev, "envy24ht_intr(): play\n");
@@ -1999,9 +1999,9 @@ envy24ht_intr(void *p)
device_printf(sc->dev, "envy24ht_intr(): chan[%d].blk = %d\n", i, ch->blk);
#endif
if (ch->run && ch->blk <= feed) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
sc->intr[0] = ptr;
@@ -2018,15 +2018,15 @@ envy24ht_intr(void *p)
for (i = ENVY24HT_CHAN_REC_ADC1; i <= ENVY24HT_CHAN_REC_SPDIF; i++) {
ch = &sc->chan[i];
if (ch->run && ch->blk <= feed) {
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
}
sc->intr[1] = ptr;
envy24ht_updintr(sc, PCMDIR_REC);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return;
}
@@ -2455,8 +2455,8 @@ envy24ht_pci_attach(device_t dev)
}
bzero(sc, sizeof(*sc));
- sc->lock = snd_mtxcreate(device_get_nameunit(dev),
- "snd_envy24ht softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_eny24ht softc",
+ MTX_DEF);
sc->dev = dev;
/* initialize PCI interface */
@@ -2524,8 +2524,7 @@ bad:
bus_release_resource(dev, SYS_RES_IOPORT, sc->csid, sc->cs);
if (sc->mt)
bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_ENVY24HT);
return err;
}
@@ -2560,7 +2559,7 @@ envy24ht_pci_detach(device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
bus_release_resource(dev, SYS_RES_IOPORT, sc->csid, sc->cs);
bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
free(sc, M_ENVY24HT);
return 0;
}
diff --git a/sys/dev/sound/pci/es137x.c b/sys/dev/sound/pci/es137x.c
index 3c1bea09b5d1..cc51005309b0 100644
--- a/sys/dev/sound/pci/es137x.c
+++ b/sys/dev/sound/pci/es137x.c
@@ -224,14 +224,14 @@ struct es_info {
uint32_t sctrl;
uint32_t escfg;
struct es_chinfo ch[ES_NCHANS];
- struct mtx *lock;
+ struct mtx lock;
struct callout poll_timer;
int poll_ticks, polling;
};
-#define ES_LOCK(sc) snd_mtxlock((sc)->lock)
-#define ES_UNLOCK(sc) snd_mtxunlock((sc)->lock)
-#define ES_LOCK_ASSERT(sc) snd_mtxassert((sc)->lock)
+#define ES_LOCK(sc) mtx_lock(&(sc)->lock)
+#define ES_UNLOCK(sc) mtx_unlock(&(sc)->lock)
+#define ES_LOCK_ASSERT(sc) mtx_assert(&(sc)->lock, MA_OWNED)
/* prototypes */
static void es_intr(void *);
@@ -508,21 +508,21 @@ eschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
es_wr(es, ES1370_REG_MEMPAGE,
ES1370_REG_DAC1_FRAMEADR >> 8, 1);
es_wr(es, ES1370_REG_DAC1_FRAMEADR & 0xff,
- sndbuf_getbufaddr(ch->buffer), 4);
+ ch->buffer->buf_addr, 4);
es_wr(es, ES1370_REG_DAC1_FRAMECNT & 0xff,
(ch->bufsz >> 2) - 1, 4);
} else {
es_wr(es, ES1370_REG_MEMPAGE,
ES1370_REG_DAC2_FRAMEADR >> 8, 1);
es_wr(es, ES1370_REG_DAC2_FRAMEADR & 0xff,
- sndbuf_getbufaddr(ch->buffer), 4);
+ ch->buffer->buf_addr, 4);
es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff,
(ch->bufsz >> 2) - 1, 4);
}
} else {
es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMEADR >> 8, 1);
es_wr(es, ES1370_REG_ADC_FRAMEADR & 0xff,
- sndbuf_getbufaddr(ch->buffer), 4);
+ ch->buffer->buf_addr, 4);
es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff,
(ch->bufsz >> 2) - 1, 4);
}
@@ -637,8 +637,8 @@ eschan_setfragments(kobj_t obj, void *data, uint32_t blksz, uint32_t blkcnt)
blksz &= ES_BLK_ALIGN;
- if (blksz > (sndbuf_getmaxsize(ch->buffer) / ES_DMA_SEGS_MIN))
- blksz = sndbuf_getmaxsize(ch->buffer) / ES_DMA_SEGS_MIN;
+ if (blksz > (ch->buffer->maxsize / ES_DMA_SEGS_MIN))
+ blksz = ch->buffer->maxsize / ES_DMA_SEGS_MIN;
if (blksz < ES_BLK_MIN)
blksz = ES_BLK_MIN;
if (blkcnt > ES_DMA_SEGS_MAX)
@@ -646,7 +646,7 @@ eschan_setfragments(kobj_t obj, void *data, uint32_t blksz, uint32_t blkcnt)
if (blkcnt < ES_DMA_SEGS_MIN)
blkcnt = ES_DMA_SEGS_MIN;
- while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->buffer)) {
+ while ((blksz * blkcnt) > ch->buffer->maxsize) {
if ((blkcnt >> 1) >= ES_DMA_SEGS_MIN)
blkcnt >>= 1;
else if ((blksz >> 1) >= ES_BLK_MIN)
@@ -655,15 +655,15 @@ eschan_setfragments(kobj_t obj, void *data, uint32_t blksz, uint32_t blkcnt)
break;
}
- if ((sndbuf_getblksz(ch->buffer) != blksz ||
- sndbuf_getblkcnt(ch->buffer) != blkcnt) &&
+ if ((ch->buffer->blksz != blksz ||
+ ch->buffer->blkcnt != blkcnt) &&
sndbuf_resize(ch->buffer, blkcnt, blksz) != 0)
device_printf(es->dev, "%s: failed blksz=%u blkcnt=%u\n",
__func__, blksz, blkcnt);
- ch->bufsz = sndbuf_getsize(ch->buffer);
- ch->blksz = sndbuf_getblksz(ch->buffer);
- ch->blkcnt = sndbuf_getblkcnt(ch->buffer);
+ ch->bufsz = ch->buffer->bufsize;
+ ch->blksz = ch->buffer->blksz;
+ ch->blkcnt = ch->buffer->blkcnt;
return (0);
}
@@ -762,7 +762,7 @@ eschan_trigger(kobj_t obj, void *data, int go)
return 0;
ES_LOCK(es);
- cnt = (ch->blksz / sndbuf_getalign(ch->buffer)) - 1;
+ cnt = (ch->blksz / ch->buffer->align) - 1;
if (ch->fmt & AFMT_16BIT)
b |= 0x02;
if (AFMT_CHANNEL(ch->fmt) > 1)
@@ -987,7 +987,7 @@ es1370_init(struct es_info *es)
es->escfg = ES_SET_FIXED_RATE(es->escfg, fixed_rate);
else {
es->escfg = ES_SET_FIXED_RATE(es->escfg, 0);
- fixed_rate = DSP_DEFAULT_SPEED;
+ fixed_rate = 8000;
}
if (single_pcm)
es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1);
@@ -1712,7 +1712,8 @@ es_pci_attach(device_t dev)
uint32_t devid;
es = malloc(sizeof *es, M_DEVBUF, M_WAITOK | M_ZERO);
- es->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_es137x softc");
+ mtx_init(&es->lock, device_get_nameunit(dev), "snd_es137x softc",
+ MTX_DEF);
es->dev = dev;
es->escfg = 0;
mapped = 0;
@@ -1888,8 +1889,7 @@ bad:
ac97_destroy(codec);
if (es->reg)
bus_release_resource(dev, es->regtype, es->regid, es->reg);
- if (es->lock)
- snd_mtxfree(es->lock);
+ mtx_destroy(&es->lock);
if (es)
free(es, M_DEVBUF);
return (ENXIO);
@@ -1919,7 +1919,7 @@ es_pci_detach(device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, es->irqid, es->irq);
bus_release_resource(dev, es->regtype, es->regid, es->reg);
bus_dma_tag_destroy(es->parent_dmat);
- snd_mtxfree(es->lock);
+ mtx_destroy(&es->lock);
free(es, M_DEVBUF);
return (0);
diff --git a/sys/dev/sound/pci/fm801.c b/sys/dev/sound/pci/fm801.c
index 3537c7807ded..39d12f8505d1 100644
--- a/sys/dev/sound/pci/fm801.c
+++ b/sys/dev/sound/pci/fm801.c
@@ -440,7 +440,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 = sndbuf_getbufaddr(ch->buffer);
+ u_int32_t baseaddr = ch->buffer->buf_addr;
u_int32_t k1;
DPRINT("fm801ch_trigger go %d , ", go);
diff --git a/sys/dev/sound/pci/hda/hdaa.c b/sys/dev/sound/pci/hda/hdaa.c
index 1e486b01b168..7dec437de944 100644
--- a/sys/dev/sound/pci/hda/hdaa.c
+++ b/sys/dev/sound/pci/hda/hdaa.c
@@ -47,9 +47,9 @@
#include "mixer_if.h"
-#define hdaa_lock(devinfo) snd_mtxlock((devinfo)->lock)
-#define hdaa_unlock(devinfo) snd_mtxunlock((devinfo)->lock)
-#define hdaa_lockassert(devinfo) snd_mtxassert((devinfo)->lock)
+#define hdaa_lock(devinfo) mtx_lock((devinfo)->lock)
+#define hdaa_unlock(devinfo) mtx_unlock((devinfo)->lock)
+#define hdaa_lockassert(devinfo) mtx_assert((devinfo)->lock, MA_OWNED)
static const struct {
const char *key;
@@ -532,9 +532,11 @@ static void
hdaa_presence_handler(struct hdaa_widget *w)
{
struct hdaa_devinfo *devinfo = w->devinfo;
- struct hdaa_audio_as *as;
+ struct hdaa_audio_as *as, *asp;
+ char buf[32];
uint32_t res;
- int connected, old;
+ int connected, old, i;
+ bool active;
if (w->enable == 0 || w->type !=
HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
@@ -552,13 +554,6 @@ hdaa_presence_handler(struct hdaa_widget *w)
if (connected == old)
return;
w->wclass.pin.connected = connected;
- HDA_BOOTVERBOSE(
- if (connected || old != 2) {
- device_printf(devinfo->dev,
- "Pin sense: nid=%d sense=0x%08x (%sconnected)\n",
- w->nid, res, !connected ? "dis" : "");
- }
- );
as = &devinfo->as[w->bindas];
if (as->hpredir >= 0 && as->pins[15] == w->nid)
@@ -567,6 +562,38 @@ hdaa_presence_handler(struct hdaa_widget *w)
hdaa_autorecsrc_handler(as, w);
if (old != 2)
hdaa_channels_handler(as);
+
+ if (connected || old != 2) {
+ HDA_BOOTVERBOSE(
+ device_printf(devinfo->dev,
+ "Pin sense: nid=%d sense=0x%08x (%sconnected)\n",
+ w->nid, res, !connected ? "dis" : "");
+ );
+ if (as->hpredir >= 0)
+ return;
+ for (i = 0, active = false; i < devinfo->num_devs; i++) {
+ if (device_get_unit(devinfo->devs[i].dev) == snd_unit) {
+ active = true;
+ break;
+ }
+ }
+ /* Proceed only if we are currently using this codec. */
+ if (!active)
+ return;
+ for (i = 0; i < devinfo->ascnt; i++) {
+ asp = &devinfo->as[i];
+ if (!asp->enable)
+ continue;
+ if ((connected && asp->index == as->index) ||
+ (!connected && asp->dir == as->dir)) {
+ snprintf(buf, sizeof(buf), "cdev=dsp%d",
+ device_get_unit(asp->pdevinfo->dev));
+ devctl_notify("SND", "CONN",
+ asp->dir == HDAA_CTL_IN ? "IN" : "OUT", buf);
+ break;
+ }
+ }
+ }
}
/*
@@ -2054,10 +2081,10 @@ hdaa_channel_setfragments(kobj_t obj, void *data,
{
struct hdaa_chan *ch = data;
- blksz -= blksz % lcm(HDA_DMA_ALIGNMENT, sndbuf_getalign(ch->b));
+ blksz -= blksz % lcm(HDA_DMA_ALIGNMENT, ch->b->align);
- if (blksz > (sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN))
- blksz = sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN;
+ if (blksz > (ch->b->maxsize / HDA_BDL_MIN))
+ blksz = ch->b->maxsize / HDA_BDL_MIN;
if (blksz < HDA_BLK_MIN)
blksz = HDA_BLK_MIN;
if (blkcnt > HDA_BDL_MAX)
@@ -2065,7 +2092,7 @@ hdaa_channel_setfragments(kobj_t obj, void *data,
if (blkcnt < HDA_BDL_MIN)
blkcnt = HDA_BDL_MIN;
- while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->b)) {
+ while ((blksz * blkcnt) > ch->b->maxsize) {
if ((blkcnt >> 1) >= HDA_BDL_MIN)
blkcnt >>= 1;
else if ((blksz >> 1) >= HDA_BLK_MIN)
@@ -2074,14 +2101,14 @@ hdaa_channel_setfragments(kobj_t obj, void *data,
break;
}
- if ((sndbuf_getblksz(ch->b) != blksz ||
- sndbuf_getblkcnt(ch->b) != blkcnt) &&
+ if ((ch->b->blksz != blksz ||
+ ch->b->blkcnt != blkcnt) &&
sndbuf_resize(ch->b, blkcnt, blksz) != 0)
device_printf(ch->devinfo->dev, "%s: failed blksz=%u blkcnt=%u\n",
__func__, blksz, blkcnt);
- ch->blksz = sndbuf_getblksz(ch->b);
- ch->blkcnt = sndbuf_getblkcnt(ch->b);
+ ch->blksz = ch->b->blksz;
+ ch->blkcnt = ch->b->blkcnt;
return (0);
}
@@ -2142,7 +2169,7 @@ hdaa_channel_start(struct hdaa_chan *ch)
ch->dir == PCMDIR_PLAY ? 1 : 0, ch->sid);
HDAC_STREAM_START(device_get_parent(devinfo->dev), devinfo->dev,
ch->dir == PCMDIR_PLAY ? 1 : 0, ch->sid,
- sndbuf_getbufaddr(ch->b), ch->blksz, ch->blkcnt);
+ ch->b->buf_addr, ch->blksz, ch->blkcnt);
ch->flags |= HDAA_CHN_RUNNING;
return (0);
}
@@ -6194,15 +6221,15 @@ hdaa_configure(device_t dev)
);
hdaa_patch_direct(devinfo);
HDA_BOOTHVERBOSE(
- device_printf(dev, "Pin sense init...\n");
- );
- hdaa_sense_init(devinfo);
- HDA_BOOTHVERBOSE(
device_printf(dev, "Creating PCM devices...\n");
);
hdaa_unlock(devinfo);
hdaa_create_pcms(devinfo);
hdaa_lock(devinfo);
+ HDA_BOOTHVERBOSE(
+ device_printf(dev, "Pin sense init...\n");
+ );
+ hdaa_sense_init(devinfo);
HDA_BOOTVERBOSE(
if (devinfo->quirks != 0) {
diff --git a/sys/dev/sound/pci/hda/hdaa_patches.c b/sys/dev/sound/pci/hda/hdaa_patches.c
index 8967cb49125c..d4267aae80f8 100644
--- a/sys/dev/sound/pci/hda/hdaa_patches.c
+++ b/sys/dev/sound/pci/hda/hdaa_patches.c
@@ -341,7 +341,8 @@ hdac_pin_patch(struct hdaa_widget *w)
} else if (id == HDA_CODEC_ALC257 &&
(subid == LENOVO_L5AMD_SUBVENDOR ||
subid == LENOVO_L5INTEL_SUBVENDOR ||
- subid == LENOVO_IDEAPAD3_SUBVENDOR)) {
+ subid == LENOVO_IDEAPAD3_SUBVENDOR ||
+ subid == LENOVO_V15_SUBVENDOR)) {
switch (nid) {
case 20:
patch_str = "as=1 seq=0";
@@ -362,8 +363,10 @@ hdac_pin_patch(struct hdaa_widget *w)
patch_str = "as=3 seq=15 color=Black loc=Left";
break;
}
- } else if (id == HDA_CODEC_ALC295 &&
- subid == FRAMEWORK_LAPTOP_0005_SUBVENDOR) {
+ } else if ((id == HDA_CODEC_ALC295 &&
+ subid == FRAMEWORK_LAPTOP_0005_SUBVENDOR) ||
+ (id == HDA_CODEC_ALC285 &&
+ subid == FRAMEWORK_LAPTOP_000D_SUBVENDOR)) {
switch (nid) {
case 20:
/*
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index 900578b73de4..d1de81e7ba29 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -51,9 +51,9 @@
#define HDA_DRV_TEST_REV "20120126_0002"
-#define hdac_lock(sc) snd_mtxlock((sc)->lock)
-#define hdac_unlock(sc) snd_mtxunlock((sc)->lock)
-#define hdac_lockassert(sc) snd_mtxassert((sc)->lock)
+#define hdac_lock(sc) mtx_lock(&(sc)->lock)
+#define hdac_unlock(sc) mtx_unlock(&(sc)->lock)
+#define hdac_lockassert(sc) mtx_assert(&(sc)->lock, MA_OWNED)
#define HDAC_QUIRK_64BIT (1 << 0)
#define HDAC_QUIRK_DMAPOS (1 << 1)
@@ -133,6 +133,7 @@ static const struct {
{ HDA_INTEL_PCH, "Intel Ibex Peak", 0, 0 },
{ HDA_INTEL_PCH2, "Intel Ibex Peak", 0, 0 },
{ HDA_INTEL_ELLK, "Intel Elkhart Lake", 0, 0 },
+ { HDA_INTEL_ELLK2, "Intel Elkhart Lake", 0, 0 },
{ HDA_INTEL_JLK2, "Intel Jasper Lake", 0, 0 },
{ HDA_INTEL_BXTNP, "Intel Broxton-P", 0, 0 },
{ HDA_INTEL_SCH, "Intel SCH", 0, 0 },
@@ -169,6 +170,7 @@ static const struct {
{ HDA_NVIDIA_GF119, "NVIDIA GF119", 0, 0 },
{ HDA_NVIDIA_GF110_1, "NVIDIA GF110", 0, HDAC_QUIRK_MSI },
{ HDA_NVIDIA_GF110_2, "NVIDIA GF110", 0, HDAC_QUIRK_MSI },
+ { HDA_ATI_RAVEN, "ATI Raven", 0, 0 },
{ HDA_ATI_SB450, "ATI SB450", 0, 0 },
{ HDA_ATI_SB600, "ATI SB600", 0, 0 },
{ HDA_ATI_RS600, "ATI RS600", 0, 0 },
@@ -1169,7 +1171,8 @@ hdac_attach(device_t dev)
}
}
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "HDA driver mutex");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "HDA driver mutex",
+ MTX_DEF);
sc->dev = dev;
TASK_INIT(&sc->unsolq_task, 0, hdac_unsolq_task, sc);
callout_init(&sc->poll_callout, 1);
@@ -1372,7 +1375,7 @@ hdac_attach_fail:
hdac_dma_free(sc, &sc->rirb_dma);
hdac_dma_free(sc, &sc->corb_dma);
hdac_mem_free(sc);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
return (ENXIO);
}
@@ -1773,17 +1776,17 @@ hdac_detach(device_t dev)
struct hdac_softc *sc = device_get_softc(dev);
int i, error;
+ callout_drain(&sc->poll_callout);
+ hdac_irq_free(sc);
+ taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
+
error = bus_generic_detach(dev);
if (error != 0)
return (error);
hdac_lock(sc);
- callout_stop(&sc->poll_callout);
hdac_reset(sc, false);
hdac_unlock(sc);
- callout_drain(&sc->poll_callout);
- taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
- hdac_irq_free(sc);
for (i = 0; i < sc->num_ss; i++)
hdac_dma_free(sc, &sc->streams[i].bdl);
@@ -1796,7 +1799,7 @@ hdac_detach(device_t dev)
sc->chan_dmat = NULL;
}
hdac_mem_free(sc);
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
return (0);
}
@@ -1886,7 +1889,7 @@ hdac_get_mtx(device_t dev, device_t child)
{
struct hdac_softc *sc = device_get_softc(dev);
- return (sc->lock);
+ return (&sc->lock);
}
static uint32_t
@@ -2206,4 +2209,4 @@ static driver_t hdac_driver = {
sizeof(struct hdac_softc),
};
-DRIVER_MODULE(snd_hda, pci, hdac_driver, NULL, NULL);
+DRIVER_MODULE_ORDERED(snd_hda, pci, hdac_driver, NULL, NULL, SI_ORDER_ANY);
diff --git a/sys/dev/sound/pci/hda/hdac.h b/sys/dev/sound/pci/hda/hdac.h
index 223434a214b1..bc0ae651a3b6 100644
--- a/sys/dev/sound/pci/hda/hdac.h
+++ b/sys/dev/sound/pci/hda/hdac.h
@@ -66,6 +66,7 @@
#define HDA_INTEL_PCH HDA_MODEL_CONSTRUCT(INTEL, 0x3b56)
#define HDA_INTEL_PCH2 HDA_MODEL_CONSTRUCT(INTEL, 0x3b57)
#define HDA_INTEL_ELLK HDA_MODEL_CONSTRUCT(INTEL, 0x4b55)
+#define HDA_INTEL_ELLK2 HDA_MODEL_CONSTRUCT(INTEL, 0x4b58)
#define HDA_INTEL_JLK2 HDA_MODEL_CONSTRUCT(INTEL, 0x4dc8)
#define HDA_INTEL_BXTNP HDA_MODEL_CONSTRUCT(INTEL, 0x5a98)
#define HDA_INTEL_MACBOOKPRO92 HDA_MODEL_CONSTRUCT(INTEL, 0x7270)
@@ -153,6 +154,7 @@
/* ATI */
#define ATI_VENDORID 0x1002
+#define HDA_ATI_RAVEN HDA_MODEL_CONSTRUCT(ATI, 0x15de)
#define HDA_ATI_SB450 HDA_MODEL_CONSTRUCT(ATI, 0x437b)
#define HDA_ATI_SB600 HDA_MODEL_CONSTRUCT(ATI, 0x4383)
#define HDA_ATI_RS600 HDA_MODEL_CONSTRUCT(ATI, 0x793b)
@@ -388,6 +390,7 @@
#define LENOVO_3000_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x384e)
#define LENOVO_IDEAPAD330_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x3808)
#define LENOVO_IDEAPAD3_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x3881)
+#define LENOVO_V15_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x3886)
#define LENOVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0xffff)
/* Samsung */
@@ -535,6 +538,7 @@
#define FRAMEWORK_LAPTOP_0003_SUBVENDOR HDA_MODEL_CONSTRUCT(FRAMEWORK, 0x0003)
#define FRAMEWORK_LAPTOP_0005_SUBVENDOR HDA_MODEL_CONSTRUCT(FRAMEWORK, 0x0005)
#define FRAMEWORK_LAPTOP_0006_SUBVENDOR HDA_MODEL_CONSTRUCT(FRAMEWORK, 0x0006)
+#define FRAMEWORK_LAPTOP_000D_SUBVENDOR HDA_MODEL_CONSTRUCT(FRAMEWORK, 0x000d)
/* All codecs you can eat... */
#define HDA_CODEC_CONSTRUCT(vendor, id) \
diff --git a/sys/dev/sound/pci/hda/hdac_private.h b/sys/dev/sound/pci/hda/hdac_private.h
index c434bface240..0c6fe41fd5de 100644
--- a/sys/dev/sound/pci/hda/hdac_private.h
+++ b/sys/dev/sound/pci/hda/hdac_private.h
@@ -162,7 +162,7 @@ struct hdac_stream {
struct hdac_softc {
device_t dev;
- struct mtx *lock;
+ struct mtx lock;
struct intr_config_hook intrhook;
diff --git a/sys/dev/sound/pci/hda/hdacc.c b/sys/dev/sound/pci/hda/hdacc.c
index 4198982c9c2a..b001daa549b1 100644
--- a/sys/dev/sound/pci/hda/hdacc.c
+++ b/sys/dev/sound/pci/hda/hdacc.c
@@ -60,9 +60,9 @@ struct hdacc_softc {
struct hdacc_fg *fgs;
};
-#define hdacc_lock(codec) snd_mtxlock((codec)->lock)
-#define hdacc_unlock(codec) snd_mtxunlock((codec)->lock)
-#define hdacc_lockassert(codec) snd_mtxassert((codec)->lock)
+#define hdacc_lock(codec) mtx_lock((codec)->lock)
+#define hdacc_unlock(codec) mtx_unlock((codec)->lock)
+#define hdacc_lockassert(codec) mtx_assert((codec)->lock, MA_OWNED)
MALLOC_DEFINE(M_HDACC, "hdacc", "HDA CODEC");
diff --git a/sys/dev/sound/pci/hdsp-pcm.c b/sys/dev/sound/pci/hdsp-pcm.c
index 5ac571e64fde..b64cec281388 100644
--- a/sys/dev/sound/pci/hdsp-pcm.c
+++ b/sys/dev/sound/pci/hdsp-pcm.c
@@ -321,10 +321,10 @@ hdspmixer_init(struct snd_mixer *m)
if (hdsp_channel_rec_ports(scp->hc))
mask |= SOUND_MASK_RECLEV;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
mix_setdevs(m, mask);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -676,7 +676,7 @@ hdspchan_free(kobj_t obj, void *data)
device_printf(scp->dev, "hdspchan_free()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->data != NULL) {
free(ch->data, M_HDSP);
ch->data = NULL;
@@ -685,7 +685,7 @@ hdspchan_free(kobj_t obj, void *data)
free(ch->caps, M_HDSP);
ch->caps = NULL;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -702,7 +702,7 @@ hdspchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
scp = devinfo;
sc = scp->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
num = scp->chnum;
ch = &scp->chan[num];
@@ -745,7 +745,7 @@ hdspchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->dir = dir;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
if (sndbuf_setup(ch->buffer, ch->data, ch->size) != 0) {
device_printf(scp->dev, "Can't setup sndbuf.\n");
@@ -767,7 +767,7 @@ hdspchan_trigger(kobj_t obj, void *data, int go)
scp = ch->parent;
sc = scp->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch (go) {
case PCMTRIG_START:
#if 0
@@ -795,7 +795,7 @@ hdspchan_trigger(kobj_t obj, void *data, int go)
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -812,9 +812,9 @@ hdspchan_getptr(kobj_t obj, void *data)
scp = ch->parent;
sc = scp->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ret = hdsp_read_2(sc, HDSP_STATUS_REG);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
pos = ret & HDSP_BUF_POSITION_MASK;
pos %= (2 * sc->period * sizeof(uint32_t)); /* Double buffer. */
@@ -951,12 +951,12 @@ hdspchan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
}
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->ctrl_register &= ~HDSP_LAT_MASK;
sc->ctrl_register |= hdsp_encode_latency(hl->n);
hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
sc->period = hl->period;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
#if 0
device_printf(scp->dev, "New period=%d\n", sc->period);
@@ -971,7 +971,7 @@ hdspchan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
hdsp_write_4(sc, HDSP_FREQ_REG, hdsp_freq_reg_value(sc->speed));
end:
- return (sndbuf_getblksz(ch->buffer));
+ return (ch->buffer->blksz);
}
static uint32_t hdsp_bkp_fmt[] = {
@@ -1034,9 +1034,9 @@ hdsp_pcm_intr(struct sc_pcminfo *scp)
for (i = 0; i < scp->chnum; i++) {
ch = &scp->chan[i];
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
return (0);
diff --git a/sys/dev/sound/pci/hdsp.c b/sys/dev/sound/pci/hdsp.c
index 4ba23d22ebce..aefbb71807b6 100644
--- a/sys/dev/sound/pci/hdsp.c
+++ b/sys/dev/sound/pci/hdsp.c
@@ -109,7 +109,7 @@ hdsp_intr(void *p)
sc = (struct sc_info *)p;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
status = hdsp_read_1(sc, HDSP_STATUS_REG);
if (status & HDSP_AUDIO_IRQ_PENDING) {
@@ -126,7 +126,7 @@ hdsp_intr(void *p)
free(devlist, M_TEMP);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
static void
@@ -286,11 +286,11 @@ hdsp_sysctl_input_level(SYSCTL_HANDLER_ARGS)
/* Set input level in control register. */
control &= HDSP_INPUT_LEVEL_MASK;
if (control != (sc->ctrl_register & HDSP_INPUT_LEVEL_MASK)) {
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->ctrl_register &= ~HDSP_INPUT_LEVEL_MASK;
sc->ctrl_register |= control;
hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -350,11 +350,11 @@ hdsp_sysctl_output_level(SYSCTL_HANDLER_ARGS)
/* Set output level in control register. */
control &= HDSP_OUTPUT_LEVEL_MASK;
if (control != (sc->ctrl_register & HDSP_OUTPUT_LEVEL_MASK)) {
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->ctrl_register &= ~HDSP_OUTPUT_LEVEL_MASK;
sc->ctrl_register |= control;
hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -414,11 +414,11 @@ hdsp_sysctl_phones_level(SYSCTL_HANDLER_ARGS)
/* Set phones level in control register. */
control &= HDSP_PHONES_LEVEL_MASK;
if (control != (sc->ctrl_register & HDSP_PHONES_LEVEL_MASK)) {
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->ctrl_register &= ~HDSP_PHONES_LEVEL_MASK;
sc->ctrl_register |= control;
hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -549,11 +549,11 @@ hdsp_sysctl_clock_preference(SYSCTL_HANDLER_ARGS)
if (clock->name != NULL) {
control = hdsp_control_clock_preference(clock->type);
control &= HDSP_CONTROL_CLOCK_MASK;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->ctrl_register &= ~HDSP_CONTROL_CLOCK_MASK;
sc->ctrl_register |= control;
hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -600,10 +600,10 @@ hdsp_sysctl_clock_source(SYSCTL_HANDLER_ARGS)
return (ENXIO);
/* Read current (autosync) clock source from status2 register. */
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
status2 = hdsp_read_4(sc, HDSP_STATUS2_REG);
status2 &= HDSP_STATUS2_CLOCK_MASK;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
/* Translate status2 register value to clock source. */
for (clock = clock_table; clock->name != NULL; ++clock) {
@@ -720,10 +720,10 @@ hdsp_sysctl_sync_status(SYSCTL_HANDLER_ARGS)
return (ENXIO);
/* Read current lock and sync bits from status registers. */
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
status = hdsp_read_4(sc, HDSP_STATUS_REG);
status2 = hdsp_read_4(sc, HDSP_STATUS2_REG);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
/* List clock sources with lock and sync state. */
for (clock = clock_table; clock->name != NULL; ++clock) {
@@ -857,8 +857,8 @@ hdsp_attach(device_t dev)
#endif
sc = device_get_softc(dev);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev),
- "snd_hdsp softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_hdsp softc",
+ MTX_DEF);
sc->dev = dev;
pci_enable_busmaster(dev);
@@ -999,8 +999,7 @@ hdsp_detach(device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
if (sc->cs)
bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(0), sc->cs);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
return (0);
}
diff --git a/sys/dev/sound/pci/hdsp.h b/sys/dev/sound/pci/hdsp.h
index 8ac438cd79f9..18737709ec3f 100644
--- a/sys/dev/sound/pci/hdsp.h
+++ b/sys/dev/sound/pci/hdsp.h
@@ -223,7 +223,7 @@ struct sc_pcminfo {
/* HDSP device private data */
struct sc_info {
device_t dev;
- struct mtx *lock;
+ struct mtx lock;
uint32_t ctrl_register;
uint32_t type;
diff --git a/sys/dev/sound/pci/hdspe-pcm.c b/sys/dev/sound/pci/hdspe-pcm.c
index 09bbbe22dacf..d78820732639 100644
--- a/sys/dev/sound/pci/hdspe-pcm.c
+++ b/sys/dev/sound/pci/hdspe-pcm.c
@@ -305,10 +305,10 @@ hdspemixer_init(struct snd_mixer *m)
if (hdspe_channel_rec_ports(scp->hc))
mask |= SOUND_MASK_RECLEV;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
mix_setdevs(m, mask);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -667,7 +667,7 @@ hdspechan_free(kobj_t obj, void *data)
device_printf(scp->dev, "hdspechan_free()\n");
#endif
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
if (ch->data != NULL) {
free(ch->data, M_HDSPE);
ch->data = NULL;
@@ -676,7 +676,7 @@ hdspechan_free(kobj_t obj, void *data)
free(ch->caps, M_HDSPE);
ch->caps = NULL;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -693,7 +693,7 @@ hdspechan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
scp = devinfo;
sc = scp->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
num = scp->chnum;
ch = &scp->chan[num];
@@ -729,7 +729,7 @@ hdspechan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->dir = dir;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
if (sndbuf_setup(ch->buffer, ch->data, ch->size) != 0) {
device_printf(scp->dev, "Can't setup sndbuf.\n");
@@ -751,7 +751,7 @@ hdspechan_trigger(kobj_t obj, void *data, int go)
scp = ch->parent;
sc = scp->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
switch (go) {
case PCMTRIG_START:
#if 0
@@ -779,7 +779,7 @@ hdspechan_trigger(kobj_t obj, void *data, int go)
break;
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
return (0);
}
@@ -796,9 +796,9 @@ hdspechan_getptr(kobj_t obj, void *data)
scp = ch->parent;
sc = scp->sc;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
ret = hdspe_read_2(sc, HDSPE_STATUS_REG);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
pos = ret & HDSPE_BUF_POSITION_MASK;
pos *= AFMT_CHANNEL(ch->format); /* Hardbuf with multiple channels. */
@@ -946,12 +946,12 @@ hdspechan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
}
}
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->ctrl_register &= ~HDSPE_LAT_MASK;
sc->ctrl_register |= hdspe_encode_latency(hl->n);
hdspe_write_4(sc, HDSPE_CONTROL_REG, sc->ctrl_register);
sc->period = hl->period;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
#if 0
device_printf(scp->dev, "New period=%d\n", sc->period);
@@ -962,7 +962,7 @@ hdspechan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
(sc->period * 4));
end:
- return (sndbuf_getblksz(ch->buffer));
+ return (ch->buffer->blksz);
}
static uint32_t hdspe_bkp_fmt[] = {
@@ -1025,9 +1025,9 @@ hdspe_pcm_intr(struct sc_pcminfo *scp)
for (i = 0; i < scp->chnum; i++) {
ch = &scp->chan[i];
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
chn_intr(ch->channel);
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
}
return (0);
diff --git a/sys/dev/sound/pci/hdspe.c b/sys/dev/sound/pci/hdspe.c
index c292b2ddef56..f468111cb16e 100644
--- a/sys/dev/sound/pci/hdspe.c
+++ b/sys/dev/sound/pci/hdspe.c
@@ -119,7 +119,7 @@ hdspe_intr(void *p)
sc = (struct sc_info *)p;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
status = hdspe_read_1(sc, HDSPE_STATUS_REG);
if (status & HDSPE_AUDIO_IRQ_PENDING) {
@@ -136,7 +136,7 @@ hdspe_intr(void *p)
free(devlist, M_TEMP);
}
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
static void
@@ -301,11 +301,11 @@ hdspe_sysctl_input_level(SYSCTL_HANDLER_ARGS)
/* Set input level in settings register. */
settings &= HDSPE_INPUT_LEVEL_MASK;
if (settings != (sc->settings_register & HDSPE_INPUT_LEVEL_MASK)) {
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->settings_register &= ~HDSPE_INPUT_LEVEL_MASK;
sc->settings_register |= settings;
hdspe_write_4(sc, HDSPE_SETTINGS_REG, sc->settings_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -365,11 +365,11 @@ hdspe_sysctl_output_level(SYSCTL_HANDLER_ARGS)
/* Set output level in settings register. */
settings &= HDSPE_OUTPUT_LEVEL_MASK;
if (settings != (sc->settings_register & HDSPE_OUTPUT_LEVEL_MASK)) {
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->settings_register &= ~HDSPE_OUTPUT_LEVEL_MASK;
sc->settings_register |= settings;
hdspe_write_4(sc, HDSPE_SETTINGS_REG, sc->settings_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -429,11 +429,11 @@ hdspe_sysctl_phones_level(SYSCTL_HANDLER_ARGS)
/* Set phones level in settings register. */
settings &= HDSPE_PHONES_LEVEL_MASK;
if (settings != (sc->settings_register & HDSPE_PHONES_LEVEL_MASK)) {
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->settings_register &= ~HDSPE_PHONES_LEVEL_MASK;
sc->settings_register |= settings;
hdspe_write_4(sc, HDSPE_SETTINGS_REG, sc->settings_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -540,11 +540,11 @@ hdspe_sysctl_clock_preference(SYSCTL_HANDLER_ARGS)
/* Set preferred clock source in settings register. */
if (clock->name != NULL) {
setting = clock->setting & HDSPE_SETTING_CLOCK_MASK;
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
sc->settings_register &= ~HDSPE_SETTING_CLOCK_MASK;
sc->settings_register |= setting;
hdspe_write_4(sc, HDSPE_SETTINGS_REG, sc->settings_register);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
}
return (0);
}
@@ -568,10 +568,10 @@ hdspe_sysctl_clock_source(SYSCTL_HANDLER_ARGS)
return (ENXIO);
/* Read current (autosync) clock source from status register. */
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
status = hdspe_read_4(sc, HDSPE_STATUS1_REG);
status &= HDSPE_STATUS1_CLOCK_MASK;
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
/* Translate status register value to clock source. */
for (clock = clock_table; clock->name != NULL; ++clock) {
@@ -640,9 +640,9 @@ hdspe_sysctl_sync_status(SYSCTL_HANDLER_ARGS)
return (ENXIO);
/* Read current lock and sync bits from status register. */
- snd_mtxlock(sc->lock);
+ mtx_lock(&sc->lock);
status = hdspe_read_4(sc, HDSPE_STATUS1_REG);
- snd_mtxunlock(sc->lock);
+ mtx_unlock(&sc->lock);
/* List clock sources with lock and sync state. */
for (clock = clock_table; clock->name != NULL; ++clock) {
@@ -749,8 +749,8 @@ hdspe_attach(device_t dev)
#endif
sc = device_get_softc(dev);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev),
- "snd_hdspe softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_hdspe softc",
+ MTX_DEF);
sc->dev = dev;
pci_enable_busmaster(dev);
@@ -891,8 +891,7 @@ hdspe_detach(device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
if (sc->cs)
bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(0), sc->cs);
- if (sc->lock)
- snd_mtxfree(sc->lock);
+ mtx_destroy(&sc->lock);
return (0);
}
diff --git a/sys/dev/sound/pci/hdspe.h b/sys/dev/sound/pci/hdspe.h
index bced78758068..85acbe9f7374 100644
--- a/sys/dev/sound/pci/hdspe.h
+++ b/sys/dev/sound/pci/hdspe.h
@@ -214,7 +214,7 @@ struct sc_pcminfo {
/* HDSPe device private data */
struct sc_info {
device_t dev;
- struct mtx *lock;
+ struct mtx lock;
uint32_t ctrl_register;
uint32_t settings_register;
diff --git a/sys/dev/sound/pci/ich.c b/sys/dev/sound/pci/ich.c
index 500d6d95daac..7e7fe95dac8c 100644
--- a/sys/dev/sound/pci/ich.c
+++ b/sys/dev/sound/pci/ich.c
@@ -77,9 +77,9 @@
#define AMD_768 0x7445
#define AMD_8111 0x746d
-#define ICH_LOCK(sc) snd_mtxlock((sc)->ich_lock)
-#define ICH_UNLOCK(sc) snd_mtxunlock((sc)->ich_lock)
-#define ICH_LOCK_ASSERT(sc) snd_mtxassert((sc)->ich_lock)
+#define ICH_LOCK(sc) mtx_lock(&(sc)->ich_lock)
+#define ICH_UNLOCK(sc) mtx_unlock(&(sc)->ich_lock)
+#define ICH_LOCK_ASSERT(sc) mtx_assert(&(sc)->ich_lock, MA_OWNED)
#if 0
#define ICH_DEBUG(stmt) do { \
@@ -196,7 +196,7 @@ struct sc_info {
uint16_t vendor;
uint16_t devid;
uint32_t flags;
- struct mtx *ich_lock;
+ struct mtx ich_lock;
};
/* -------------------------------------------------------------------- */
@@ -301,15 +301,15 @@ ich_filldtbl(struct sc_chinfo *ch)
uint32_t base;
int i;
- base = sndbuf_getbufaddr(ch->buffer);
- if ((ch->blksz * ch->blkcnt) > sndbuf_getmaxsize(ch->buffer))
- ch->blksz = sndbuf_getmaxsize(ch->buffer) / ch->blkcnt;
- if ((sndbuf_getblksz(ch->buffer) != ch->blksz ||
- sndbuf_getblkcnt(ch->buffer) != ch->blkcnt) &&
+ base = ch->buffer->buf_addr;
+ if ((ch->blksz * ch->blkcnt) > ch->buffer->maxsize)
+ ch->blksz = ch->buffer->maxsize / ch->blkcnt;
+ if ((ch->buffer->blksz != ch->blksz ||
+ ch->buffer->blkcnt != ch->blkcnt) &&
sndbuf_resize(ch->buffer, ch->blkcnt, ch->blksz) != 0)
device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n",
__func__, ch->blksz, ch->blkcnt);
- ch->blksz = sndbuf_getblksz(ch->buffer);
+ ch->blksz = ch->buffer->blksz;
for (i = 0; i < ICH_DTBL_LENGTH; i++) {
ch->dtbl[i].buffer = base + (ch->blksz * (i % ch->blkcnt));
@@ -491,7 +491,7 @@ ichchan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
);
if (sc->flags & ICH_HIGH_LATENCY)
- blocksize = sndbuf_getmaxsize(ch->buffer) / ch->blkcnt;
+ blocksize = ch->buffer->maxsize / ch->blkcnt;
if (blocksize < ICH_MIN_BLKSZ)
blocksize = ICH_MIN_BLKSZ;
@@ -734,7 +734,7 @@ ich_calibrate(void *arg)
ch->blkcnt = 2;
sc->flags |= ICH_CALIBRATE_DONE;
ICH_UNLOCK(sc);
- ichchan_setblocksize(0, ch, sndbuf_getmaxsize(ch->buffer) >> 1);
+ ichchan_setblocksize(0, ch, ch->buffer->maxsize >> 1);
ICH_LOCK(sc);
sc->flags &= ~ICH_CALIBRATE_DONE;
@@ -888,7 +888,8 @@ ich_pci_attach(device_t dev)
int i;
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
- sc->ich_lock = snd_mtxcreate(device_get_nameunit(dev), "snd_ich softc");
+ mtx_init(&sc->ich_lock, device_get_nameunit(dev), "snd_ich softc",
+ MTX_DEF);
sc->dev = dev;
vendor = sc->vendor = pci_get_vendor(dev);
@@ -1111,8 +1112,7 @@ bad:
bus_dma_tag_destroy(sc->chan_dmat);
if (sc->dmat)
bus_dma_tag_destroy(sc->dmat);
- if (sc->ich_lock)
- snd_mtxfree(sc->ich_lock);
+ mtx_destroy(&sc->ich_lock);
free(sc, M_DEVBUF);
return (ENXIO);
}
@@ -1136,7 +1136,7 @@ ich_pci_detach(device_t dev)
bus_dmamem_free(sc->dmat, sc->dtbl, sc->dtmap);
bus_dma_tag_destroy(sc->chan_dmat);
bus_dma_tag_destroy(sc->dmat);
- snd_mtxfree(sc->ich_lock);
+ mtx_destroy(&sc->ich_lock);
free(sc, M_DEVBUF);
return (0);
}
diff --git a/sys/dev/sound/pci/maestro3.c b/sys/dev/sound/pci/maestro3.c
index 2d102fcd6dbe..a8a52601d1a2 100644
--- a/sys/dev/sound/pci/maestro3.c
+++ b/sys/dev/sound/pci/maestro3.c
@@ -156,12 +156,12 @@ struct sc_info {
unsigned int bufsz;
u_int16_t *savemem;
- struct mtx *sc_lock;
+ struct mtx sc_lock;
};
-#define M3_LOCK(_sc) snd_mtxlock((_sc)->sc_lock)
-#define M3_UNLOCK(_sc) snd_mtxunlock((_sc)->sc_lock)
-#define M3_LOCK_ASSERT(_sc) snd_mtxassert((_sc)->sc_lock)
+#define M3_LOCK(_sc) mtx_lock(&(_sc)->sc_lock)
+#define M3_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_lock)
+#define M3_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_lock, MA_OWNED)
/* -------------------------------------------------------------------- */
@@ -437,17 +437,17 @@ m3_pchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->parent = sc;
ch->channel = c;
ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
- ch->spd = DSP_DEFAULT_SPEED;
+ ch->spd = 8000;
M3_UNLOCK(sc); /* XXX */
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0) {
device_printf(sc->dev, "m3_pchan_init chn_allocbuf failed\n");
return (NULL);
}
M3_LOCK(sc);
- ch->bufsize = sndbuf_getsize(ch->buffer);
+ ch->bufsize = ch->buffer->bufsize;
/* host dma buffer pointers */
- bus_addr = sndbuf_getbufaddr(ch->buffer);
+ bus_addr = ch->buffer->buf_addr;
if (bus_addr & 3) {
device_printf(sc->dev, "m3_pchan_init unaligned bus_addr\n");
bus_addr = (bus_addr + 4) & ~3;
@@ -595,7 +595,7 @@ m3_pchan_setblocksize(kobj_t kobj, void *chdata, u_int32_t blocksize)
M3_DEBUG(CHANGE, ("m3_pchan_setblocksize(dac=%d, blocksize=%d)\n",
ch->dac_idx, blocksize));
- return (sndbuf_getblksz(ch->buffer));
+ return (ch->buffer->blksz);
}
static int
@@ -709,7 +709,7 @@ m3_pchan_getptr_internal(struct sc_pchinfo *ch)
struct sc_info *sc = ch->parent;
u_int32_t hi, lo, bus_base, bus_crnt;
- bus_base = sndbuf_getbufaddr(ch->buffer);
+ bus_base = ch->buffer->buf_addr;
hi = m3_rd_assp_data(sc, ch->dac_data + CDATA_HOST_SRC_CURRENTH);
lo = m3_rd_assp_data(sc, ch->dac_data + CDATA_HOST_SRC_CURRENTL);
bus_crnt = lo | (hi << 16);
@@ -816,17 +816,17 @@ m3_rchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->parent = sc;
ch->channel = c;
ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
- ch->spd = DSP_DEFAULT_SPEED;
+ ch->spd = 8000;
M3_UNLOCK(sc); /* XXX */
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0) {
device_printf(sc->dev, "m3_rchan_init chn_allocbuf failed\n");
return (NULL);
}
M3_LOCK(sc);
- ch->bufsize = sndbuf_getsize(ch->buffer);
+ ch->bufsize = ch->buffer->bufsize;
/* host dma buffer pointers */
- bus_addr = sndbuf_getbufaddr(ch->buffer);
+ bus_addr = ch->buffer->buf_addr;
if (bus_addr & 3) {
device_printf(sc->dev, "m3_rchan_init unaligned bus_addr\n");
bus_addr = (bus_addr + 4) & ~3;
@@ -968,7 +968,7 @@ m3_rchan_setblocksize(kobj_t kobj, void *chdata, u_int32_t blocksize)
M3_DEBUG(CHANGE, ("m3_rchan_setblocksize(adc=%d, blocksize=%d)\n",
ch->adc_idx, blocksize));
- return (sndbuf_getblksz(ch->buffer));
+ return (ch->buffer->blksz);
}
static int
@@ -1061,7 +1061,7 @@ m3_rchan_getptr_internal(struct sc_rchinfo *ch)
struct sc_info *sc = ch->parent;
u_int32_t hi, lo, bus_base, bus_crnt;
- bus_base = sndbuf_getbufaddr(ch->buffer);
+ bus_base = ch->buffer->buf_addr;
hi = m3_rd_assp_data(sc, ch->adc_data + CDATA_HOST_SRC_CURRENTH);
lo = m3_rd_assp_data(sc, ch->adc_data + CDATA_HOST_SRC_CURRENTL);
bus_crnt = lo | (hi << 16);
@@ -1162,7 +1162,7 @@ m3_handle_channel_intr:
pch->ptr = m3_pchan_getptr_internal(pch);
delta = pch->bufsize + pch->ptr - pch->prevptr;
delta %= pch->bufsize;
- if (delta < sndbuf_getblksz(pch->buffer))
+ if (delta < pch->buffer->blksz)
continue;
pch->prevptr = pch->ptr;
M3_UNLOCK(sc);
@@ -1176,7 +1176,7 @@ m3_handle_channel_intr:
rch->ptr = m3_rchan_getptr_internal(rch);
delta = rch->bufsize + rch->ptr - rch->prevptr;
delta %= rch->bufsize;
- if (delta < sndbuf_getblksz(rch->buffer))
+ if (delta < rch->buffer->blksz)
continue;
rch->prevptr = rch->ptr;
M3_UNLOCK(sc);
@@ -1325,8 +1325,8 @@ m3_pci_attach(device_t dev)
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
sc->dev = dev;
sc->type = pci_get_devid(dev);
- sc->sc_lock = snd_mtxcreate(device_get_nameunit(dev),
- "snd_maestro3 softc");
+ mtx_init(&sc->sc_lock, device_get_nameunit(dev), "snd_maestro3 softc",
+ MTX_DEF);
for (card = m3_card_types ; card->pci_id ; card++) {
if (sc->type == card->pci_id) {
sc->which = card->which;
@@ -1465,8 +1465,7 @@ m3_pci_attach(device_t dev)
bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
if (sc->parent_dmat)
bus_dma_tag_destroy(sc->parent_dmat);
- if (sc->sc_lock)
- snd_mtxfree(sc->sc_lock);
+ mtx_destroy(&sc->sc_lock);
free(sc, M_DEVBUF);
return ENXIO;
}
@@ -1494,7 +1493,7 @@ m3_pci_detach(device_t dev)
bus_dma_tag_destroy(sc->parent_dmat);
free(sc->savemem, M_DEVBUF);
- snd_mtxfree(sc->sc_lock);
+ mtx_destroy(&sc->sc_lock);
free(sc, M_DEVBUF);
return 0;
}
diff --git a/sys/dev/sound/pci/neomagic.c b/sys/dev/sound/pci/neomagic.c
index d7824c990a52..1fee943d9364 100644
--- a/sys/dev/sound/pci/neomagic.c
+++ b/sys/dev/sound/pci/neomagic.c
@@ -362,7 +362,7 @@ nmchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c
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", sndbuf_getbuf(ch->buffer));
+ "play" : "rec", ch->buffer->buf);
ch->parent = sc;
ch->channel = c;
ch->dir = dir;
diff --git a/sys/dev/sound/pci/solo.c b/sys/dev/sound/pci/solo.c
index 90dd2e26ad41..2b61b594a8f3 100644
--- a/sys/dev/sound/pci/solo.c
+++ b/sys/dev/sound/pci/solo.c
@@ -97,12 +97,12 @@ struct ess_info {
unsigned int bufsz;
struct ess_chinfo pch, rch;
- struct mtx *lock;
+ struct mtx lock;
};
-#define ess_lock(_ess) snd_mtxlock((_ess)->lock)
-#define ess_unlock(_ess) snd_mtxunlock((_ess)->lock)
-#define ess_lock_assert(_ess) snd_mtxassert((_ess)->lock)
+#define ess_lock(_ess) mtx_lock(&(_ess)->lock)
+#define ess_unlock(_ess) mtx_unlock(&(_ess)->lock)
+#define ess_lock_assert(_ess) mtx_assert(&(_ess)->lock, MA_OWNED)
static int ess_rd(struct ess_info *sc, int reg);
static void ess_wr(struct ess_info *sc, int reg, u_int8_t val);
@@ -584,7 +584,8 @@ esschan_trigger(kobj_t obj, void *data, int go)
ess_lock(sc);
switch (go) {
case PCMTRIG_START:
- ess_dmasetup(sc, ch->hwch, sndbuf_getbufaddr(ch->buffer), sndbuf_getsize(ch->buffer), ch->dir);
+ ess_dmasetup(sc, ch->hwch, ch->buffer->buf_addr,
+ ch->buffer->bufsize, ch->dir);
ess_dmatrigger(sc, ch->hwch, 1);
ess_start(ch);
break;
@@ -854,10 +855,7 @@ ess_release_resources(struct ess_info *sc, device_t dev)
sc->parent_dmat = 0;
}
- if (sc->lock) {
- snd_mtxfree(sc->lock);
- sc->lock = NULL;
- }
+ mtx_destroy(&sc->lock);
free(sc, M_DEVBUF);
}
@@ -886,10 +884,11 @@ ess_alloc_resources(struct ess_info *sc, device_t dev)
sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_ACTIVE | RF_SHAREABLE);
- sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_solo softc");
+ mtx_init(&sc->lock, device_get_nameunit(dev), "snd_solo softc",
+ MTX_DEF);
return (sc->irq && sc->io && sc->sb && sc->vc &&
- sc->mpu && sc->gp && sc->lock)? 0 : ENXIO;
+ sc->mpu && sc->gp)? 0 : ENXIO;
}
static int
diff --git a/sys/dev/sound/pci/spicds.c b/sys/dev/sound/pci/spicds.c
index da0e8d9da6d5..350034d8bafb 100644
--- a/sys/dev/sound/pci/spicds.c
+++ b/sys/dev/sound/pci/spicds.c
@@ -49,7 +49,7 @@ struct spicds_info {
unsigned int dvc; /* De-emphasis and Volume Control */
unsigned int left, right;
char name[SPICDS_NAMELEN];
- struct mtx *lock;
+ struct mtx lock;
};
static void
@@ -149,7 +149,7 @@ spicds_create(device_t dev, void *devinfo, int num, spicds_ctrl ctrl)
return NULL;
snprintf(codec->name, SPICDS_NAMELEN, "%s:spicds%d", device_get_nameunit(dev), num);
- codec->lock = snd_mtxcreate(codec->name, codec->name);
+ mtx_init(&codec->lock, codec->name, codec->name, MTX_DEF);
codec->dev = dev;
codec->ctrl = ctrl;
codec->devinfo = devinfo;
@@ -165,40 +165,40 @@ spicds_create(device_t dev, void *devinfo, int num, spicds_ctrl ctrl)
void
spicds_destroy(struct spicds_info *codec)
{
- snd_mtxfree(codec->lock);
+ mtx_destroy(&codec->lock);
free(codec, M_SPICDS);
}
void
spicds_settype(struct spicds_info *codec, unsigned int type)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
codec->type = type;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
void
spicds_setcif(struct spicds_info *codec, unsigned int cif)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
codec->cif = cif;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
void
spicds_setformat(struct spicds_info *codec, unsigned int format)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
codec->format = format;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
void
spicds_setdvc(struct spicds_info *codec, unsigned int dvc)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
codec->dvc = dvc;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
void
@@ -207,7 +207,7 @@ spicds_init(struct spicds_info *codec)
#if(0)
device_printf(codec->dev, "spicds_init(codec)\n");
#endif
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
if (codec->type == SPICDS_TYPE_AK4524 ||\
codec->type == SPICDS_TYPE_AK4528) {
/* power off */
@@ -244,13 +244,13 @@ spicds_init(struct spicds_info *codec)
spicds_wrcd(codec, 0x00, 0x8f); /* I2S, 24bit, power-up */
if (codec->type == SPICDS_TYPE_AK4396)
spicds_wrcd(codec, 0x00, 0x07); /* I2S, 24bit, power-up */
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
void
spicds_reinit(struct spicds_info *codec)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
if (codec->type != SPICDS_TYPE_WM8770) {
/* reset */
spicds_wrcd(codec, AK4524_RESET, 0);
@@ -265,7 +265,7 @@ spicds_reinit(struct spicds_info *codec)
/* AK4358 reinit */
/* AK4381 reinit */
}
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
void
@@ -274,7 +274,7 @@ spicds_set(struct spicds_info *codec, int dir, unsigned int left, unsigned int r
#if(0)
device_printf(codec->dev, "spicds_set(codec, %d, %d, %d)\n", dir, left, right);
#endif
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
if (left >= 100)
if ((codec->type == SPICDS_TYPE_AK4381) || \
(codec->type == SPICDS_TYPE_AK4396))
@@ -362,7 +362,7 @@ spicds_set(struct spicds_info *codec, int dir, unsigned int left, unsigned int r
spicds_wrcd(codec, AK4396_ROATT, right);
}
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
MODULE_DEPEND(snd_spicds, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c
index 07b9e1004573..1b659118b840 100644
--- a/sys/dev/sound/pci/t4dwave.c
+++ b/sys/dev/sound/pci/t4dwave.c
@@ -99,7 +99,7 @@ struct tr_info {
int regtype, regid, irqid;
void *ih;
- struct mtx *lock;
+ struct mtx lock;
u_int32_t hwchns;
u_int32_t playchns;
@@ -209,7 +209,7 @@ tr_rdcd(kobj_t obj, void *devinfo, int regno)
i = j = 0;
regno &= 0x7f;
- snd_mtxlock(tr->lock);
+ mtx_lock(&tr->lock);
if (tr->type == ALI_PCI_ID) {
u_int32_t chk1, chk2;
j = trw;
@@ -229,7 +229,7 @@ tr_rdcd(kobj_t obj, void *devinfo, int regno)
for (i=TR_TIMEOUT_CDC; (i > 0) && (j & trw); i--)
j=tr_rd(tr, treg, 4);
}
- snd_mtxunlock(tr->lock);
+ mtx_unlock(&tr->lock);
if (i == 0) printf("codec timeout during read of register %x\n", regno);
return (j >> TR_CDC_DATA) & 0xffff;
}
@@ -266,7 +266,7 @@ tr_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
printf("tr_wrcd: reg %x was %x", regno, tr_rdcd(devinfo, regno));
#endif
j=trw;
- snd_mtxlock(tr->lock);
+ mtx_lock(&tr->lock);
if (tr->type == ALI_PCI_ID) {
j = trw;
for (i = TR_TIMEOUT_CDC; (i > 0) && (j & trw); i--)
@@ -290,7 +290,7 @@ tr_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
#if 0
printf(" - wrote %x, now %x\n", data, tr_rdcd(devinfo, regno));
#endif
- snd_mtxunlock(tr->lock);
+ mtx_unlock(&tr->lock);
if (i==0) printf("codec timeout writing %x, data %x\n", regno, data);
return (i > 0)? 0 : -1;
}
@@ -336,7 +336,7 @@ tr_enaint(struct tr_chinfo *ch, int enable)
u_int32_t i, reg;
int bank, chan;
- snd_mtxlock(tr->lock);
+ mtx_lock(&tr->lock);
bank = (ch->index & 0x20) ? 1 : 0;
chan = ch->index & 0x1f;
reg = bank? TR_REG_INTENB : TR_REG_INTENA;
@@ -347,7 +347,7 @@ tr_enaint(struct tr_chinfo *ch, int enable)
tr_clrint(ch);
tr_wr(tr, reg, i, 4);
- snd_mtxunlock(tr->lock);
+ mtx_unlock(&tr->lock);
}
/* playback channels */
@@ -429,11 +429,11 @@ tr_wrch(struct tr_chinfo *ch)
cr[3]|=(ch->alpha<<20) | (ch->fms<<16) | (ch->fmc<<14);
break;
}
- snd_mtxlock(tr->lock);
+ mtx_lock(&tr->lock);
tr_selch(ch);
for (i=0; i<TR_CHN_REGS; i++)
tr_wr(tr, TR_REG_CHNBASE+(i<<2), cr[i], 4);
- snd_mtxunlock(tr->lock);
+ mtx_unlock(&tr->lock);
}
static void
@@ -442,11 +442,11 @@ tr_rdch(struct tr_chinfo *ch)
struct tr_info *tr = ch->parent;
u_int32_t cr[5], i;
- snd_mtxlock(tr->lock);
+ mtx_lock(&tr->lock);
tr_selch(ch);
for (i=0; i<5; i++)
cr[i]=tr_rd(tr, TR_REG_CHNBASE+(i<<2), 4);
- snd_mtxunlock(tr->lock);
+ mtx_unlock(&tr->lock);
if (tr->type == ALI_PCI_ID)
ch->lba=(cr[1] & ALI_MAXADDR);
@@ -555,9 +555,9 @@ trpchan_trigger(kobj_t obj, void *data, int go)
ch->fms = 0;
ch->ec = 0;
ch->alpha = 0;
- ch->lba = sndbuf_getbufaddr(ch->buffer);
+ ch->lba = ch->buffer->buf_addr;
ch->cso = 0;
- ch->eso = (sndbuf_getsize(ch->buffer) / sndbuf_getalign(ch->buffer)) - 1;
+ ch->eso = (ch->buffer->bufsize / ch->buffer->align) - 1;
ch->rvol = ch->cvol = 0x7f;
ch->gvsel = 0;
ch->pan = 0;
@@ -581,7 +581,7 @@ trpchan_getptr(kobj_t obj, void *data)
struct tr_chinfo *ch = data;
tr_rdch(ch);
- return ch->cso * sndbuf_getalign(ch->buffer);
+ return ch->cso * ch->buffer->align;
}
static struct pcmchan_caps *
@@ -680,7 +680,7 @@ trrchan_trigger(kobj_t obj, void *data, int go)
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, sndbuf_getbufaddr(ch->buffer), 4);
+ tr_wr(tr, TR_REG_DMAR0, ch->buffer->buf_addr, 4);
/* set up buffer size */
i = tr_rd(tr, TR_REG_DMAR4, 4) & ~0x00ffffff;
tr_wr(tr, TR_REG_DMAR4, i | (sndbuf_runsz(ch->buffer) - 1), 4);
@@ -703,7 +703,7 @@ trrchan_getptr(kobj_t obj, void *data)
struct tr_info *tr = ch->parent;
/* return current byte offset of channel */
- return tr_rd(tr, TR_REG_DMAR0, 4) - sndbuf_getbufaddr(ch->buffer);
+ return tr_rd(tr, TR_REG_DMAR0, 4) - ch->buffer->buf_addr;
}
static struct pcmchan_caps *
@@ -830,7 +830,8 @@ tr_pci_attach(device_t dev)
tr = malloc(sizeof(*tr), M_DEVBUF, M_WAITOK | M_ZERO);
tr->type = pci_get_devid(dev);
tr->rev = pci_get_revid(dev);
- tr->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_t4dwave softc");
+ mtx_init(&tr->lock, device_get_nameunit(dev), "snd_t4dwave softc",
+ MTX_DEF);
if (resource_int_value(device_get_name(dev), device_get_unit(dev),
"dac", &i) == 0) {
@@ -936,7 +937,7 @@ bad:
if (tr->ih) bus_teardown_intr(dev, tr->irq, tr->ih);
if (tr->irq) bus_release_resource(dev, SYS_RES_IRQ, tr->irqid, tr->irq);
if (tr->parent_dmat) bus_dma_tag_destroy(tr->parent_dmat);
- if (tr->lock) snd_mtxfree(tr->lock);
+ mtx_destroy(&tr->lock);
free(tr, M_DEVBUF);
return ENXIO;
}
@@ -956,7 +957,7 @@ tr_pci_detach(device_t dev)
bus_teardown_intr(dev, tr->irq, tr->ih);
bus_release_resource(dev, SYS_RES_IRQ, tr->irqid, tr->irq);
bus_dma_tag_destroy(tr->parent_dmat);
- snd_mtxfree(tr->lock);
+ mtx_destroy(&tr->lock);
free(tr, M_DEVBUF);
return 0;
diff --git a/sys/dev/sound/pci/via8233.c b/sys/dev/sound/pci/via8233.c
index 243353805b94..6c59397756e0 100644
--- a/sys/dev/sound/pci/via8233.c
+++ b/sys/dev/sound/pci/via8233.c
@@ -121,7 +121,7 @@ struct via_info {
uint16_t codec_caps;
uint16_t n_dxs_registered;
int play_num, rec_num;
- struct mtx *lock;
+ struct mtx lock;
struct callout poll_timer;
int poll_ticks, polling;
};
@@ -164,9 +164,9 @@ sysctl_via8233_spdif_enable(SYSCTL_HANDLER_ARGS)
dev = oidp->oid_arg1;
via = pcm_getdevinfo(dev);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
r = pci_read_config(dev, VIA_PCI_SPDIF, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
new_en = (r & VIA_SPDIF_EN) ? 1 : 0;
err = sysctl_handle_int(oidp, &new_en, 0, req);
@@ -179,9 +179,9 @@ sysctl_via8233_spdif_enable(SYSCTL_HANDLER_ARGS)
r |= VIA_SPDIF_EN;
else
r &= ~VIA_SPDIF_EN;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
pci_write_config(dev, VIA_PCI_SPDIF, r, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (0);
}
@@ -195,9 +195,9 @@ sysctl_via8233_dxs_src(SYSCTL_HANDLER_ARGS)
dev = oidp->oid_arg1;
via = pcm_getdevinfo(dev);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
val = via->dxs_src;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
err = sysctl_handle_int(oidp, &val, 0, req);
if (err || req->newptr == NULL)
@@ -205,9 +205,9 @@ sysctl_via8233_dxs_src(SYSCTL_HANDLER_ARGS)
if (val < 0 || val > 1)
return (EINVAL);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via->dxs_src = val;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (0);
}
@@ -223,9 +223,9 @@ sysctl_via_polling(SYSCTL_HANDLER_ARGS)
via = pcm_getdevinfo(dev);
if (via == NULL)
return (EINVAL);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
val = via->polling;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
err = sysctl_handle_int(oidp, &val, 0, req);
if (err || req->newptr == NULL)
@@ -233,7 +233,7 @@ sysctl_via_polling(SYSCTL_HANDLER_ARGS)
if (val < 0 || val > 1)
return (EINVAL);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (val != via->polling) {
if (via_chan_active(via) != 0)
err = EBUSY;
@@ -242,7 +242,7 @@ sysctl_via_polling(SYSCTL_HANDLER_ARGS)
else
via->polling = 1;
}
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (err);
}
@@ -385,7 +385,7 @@ via_buildsgdt(struct via_chinfo *ch)
uint32_t phys_addr, flag;
int i;
- phys_addr = sndbuf_getbufaddr(ch->buffer);
+ phys_addr = ch->buffer->buf_addr;
for (i = 0; i < ch->blkcnt; i++) {
flag = (i == ch->blkcnt - 1) ? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
@@ -411,9 +411,9 @@ via8233wr_setformat(kobj_t obj, void *data, uint32_t format)
f |= WR_FORMAT_STEREO;
if (format & AFMT_S16_LE)
f |= WR_FORMAT_16BIT;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via_wr(via, VIA_WR0_FORMAT, f, 4);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (0);
}
@@ -426,7 +426,7 @@ via8233dxs_setformat(kobj_t obj, void *data, uint32_t format)
uint32_t r, v;
r = ch->rbase + VIA8233_RP_DXS_RATEFMT;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
v = via_rd(via, r, 4);
v &= ~(VIA8233_DXS_RATEFMT_STEREO | VIA8233_DXS_RATEFMT_16BIT);
@@ -435,7 +435,7 @@ via8233dxs_setformat(kobj_t obj, void *data, uint32_t format)
if (format & AFMT_16BIT)
v |= VIA8233_DXS_RATEFMT_16BIT;
via_wr(via, r, v, 4);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (0);
}
@@ -457,10 +457,10 @@ via8233msgd_setformat(kobj_t obj, void *data, uint32_t format)
s |= SLOT3(1) | SLOT4(1);
}
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via_wr(via, VIA_MC_SLOT_SELECT, s, 4);
via_wr(via, VIA_MC_SGD_FORMAT, v, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (0);
}
@@ -488,14 +488,14 @@ via8233dxs_setspeed(kobj_t obj, void *data, uint32_t speed)
uint32_t r, v;
r = ch->rbase + VIA8233_RP_DXS_RATEFMT;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
v = via_rd(via, r, 4) & ~VIA8233_DXS_RATEFMT_48K;
/* Careful to avoid overflow (divide by 48 per vt8233c docs) */
v |= VIA8233_DXS_RATEFMT_48K * (speed / 48) / (48000 / 48);
via_wr(via, r, v, 4);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (speed);
}
@@ -568,8 +568,8 @@ via8233chan_setfragments(kobj_t obj, void *data,
blksz &= VIA_BLK_ALIGN;
- if (blksz > (sndbuf_getmaxsize(ch->buffer) / VIA_SEGS_MIN))
- blksz = sndbuf_getmaxsize(ch->buffer) / VIA_SEGS_MIN;
+ if (blksz > (ch->buffer->maxsize / VIA_SEGS_MIN))
+ blksz = ch->buffer->maxsize / VIA_SEGS_MIN;
if (blksz < VIA_BLK_MIN)
blksz = VIA_BLK_MIN;
if (blkcnt > VIA_SEGS_MAX)
@@ -577,7 +577,7 @@ via8233chan_setfragments(kobj_t obj, void *data,
if (blkcnt < VIA_SEGS_MIN)
blkcnt = VIA_SEGS_MIN;
- while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->buffer)) {
+ while ((blksz * blkcnt) > ch->buffer->maxsize) {
if ((blkcnt >> 1) >= VIA_SEGS_MIN)
blkcnt >>= 1;
else if ((blksz >> 1) >= VIA_BLK_MIN)
@@ -586,14 +586,14 @@ via8233chan_setfragments(kobj_t obj, void *data,
break;
}
- if ((sndbuf_getblksz(ch->buffer) != blksz ||
- sndbuf_getblkcnt(ch->buffer) != blkcnt) &&
+ if ((ch->buffer->blksz != blksz ||
+ ch->buffer->blkcnt != blkcnt) &&
sndbuf_resize(ch->buffer, blkcnt, blksz) != 0)
device_printf(via->dev, "%s: failed blksz=%u blkcnt=%u\n",
__func__, blksz, blkcnt);
- ch->blksz = sndbuf_getblksz(ch->buffer);
- ch->blkcnt = sndbuf_getblkcnt(ch->buffer);
+ ch->blksz = ch->buffer->blksz;
+ ch->blkcnt = ch->buffer->blkcnt;
return (0);
}
@@ -616,13 +616,13 @@ via8233chan_getptr(kobj_t obj, void *data)
struct via_info *via = ch->parent;
uint32_t v, index, count, ptr;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (via->polling != 0) {
ptr = ch->ptr;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
} else {
v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
index = v >> 24; /* Last completed buffer */
count = v & 0x00ffffff; /* Bytes remaining */
ptr = (index + 1) * ch->blksz - count;
@@ -660,7 +660,7 @@ via8233wr_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
struct via_chinfo *ch;
int num;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
num = via->rec_num++;
ch = &via->rch[num];
ch->parent = via;
@@ -670,15 +670,15 @@ via8233wr_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->blkcnt = via->blkcnt;
ch->rbase = VIA_WR_BASE(num);
via_wr(via, ch->rbase + VIA_WR_RP_SGD_FORMAT, WR_FIFO_ENABLE, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
return (NULL);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via8233chan_sgdinit(via, ch, num);
via8233chan_reset(via, ch);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (ch);
}
@@ -691,7 +691,7 @@ via8233dxs_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
struct via_chinfo *ch;
int num;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
num = via->play_num++;
ch = &via->pch[num];
ch->parent = via;
@@ -707,15 +707,15 @@ via8233dxs_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
*/
ch->rbase = VIA_DXS_BASE(NDXSCHANS - 1 - via->n_dxs_registered);
via->n_dxs_registered++;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
return (NULL);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via8233chan_sgdinit(via, ch, NWRCHANS + num);
via8233chan_reset(via, ch);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (ch);
}
@@ -728,7 +728,7 @@ via8233msgd_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
struct via_chinfo *ch;
int num;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
num = via->play_num++;
ch = &via->pch[num];
ch->parent = via;
@@ -737,15 +737,15 @@ via8233msgd_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->dir = dir;
ch->rbase = VIA_MC_SGD_STATUS;
ch->blkcnt = via->blkcnt;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
return (NULL);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via8233chan_sgdinit(via, ch, NWRCHANS + num);
via8233chan_reset(via, ch);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (ch);
}
@@ -807,9 +807,9 @@ via_poll_callback(void *arg)
if (via == NULL)
return;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (via->polling == 0 || via_chan_active(via) == 0) {
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return;
}
@@ -825,7 +825,7 @@ via_poll_callback(void *arg)
callout_reset(&via->poll_timer, 1/*via->poll_ticks*/,
via_poll_callback, via);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
for (i = 0; i < NDXSCHANS + NMSGDCHANS; i++) {
if (ptrigger & (1 << i))
@@ -850,8 +850,7 @@ via_poll_ticks(struct via_info *via)
if (ch->channel == NULL || ch->active == 0)
continue;
pollticks = ((uint64_t)hz * ch->blksz) /
- ((uint64_t)sndbuf_getalign(ch->buffer) *
- sndbuf_getspd(ch->buffer));
+ ((uint64_t)ch->buffer->align * ch->buffer->spd);
pollticks >>= 2;
if (pollticks > hz)
pollticks = hz;
@@ -866,8 +865,7 @@ via_poll_ticks(struct via_info *via)
if (ch->channel == NULL || ch->active == 0)
continue;
pollticks = ((uint64_t)hz * ch->blksz) /
- ((uint64_t)sndbuf_getalign(ch->buffer) *
- sndbuf_getspd(ch->buffer));
+ ((uint64_t)ch->buffer->align * ch->buffer->spd);
pollticks >>= 2;
if (pollticks > hz)
pollticks = hz;
@@ -890,7 +888,7 @@ via8233chan_trigger(kobj_t obj, void* data, int go)
if (!PCMTRIG_COMMON(go))
return (0);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
switch(go) {
case PCMTRIG_START:
via_buildsgdt(ch);
@@ -900,8 +898,8 @@ via8233chan_trigger(kobj_t obj, void* data, int go)
ch->ptr = 0;
ch->prevptr = 0;
pollticks = ((uint64_t)hz * ch->blksz) /
- ((uint64_t)sndbuf_getalign(ch->buffer) *
- sndbuf_getspd(ch->buffer));
+ ((uint64_t)ch->buffer->align *
+ ch->buffer->spd);
pollticks >>= 2;
if (pollticks > hz)
pollticks = hz;
@@ -959,7 +957,7 @@ via8233chan_trigger(kobj_t obj, void* data, int go)
default:
break;
}
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return (0);
}
@@ -1011,9 +1009,9 @@ via_intr(void *p)
uint32_t ptrigger = 0, rtrigger = 0;
int i, reg, stat;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (via->polling != 0) {
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return;
}
/* Poll playback channels */
@@ -1048,7 +1046,7 @@ via_intr(void *p)
rtrigger |= 1 << i;
}
}
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
for (i = 0; i < NDXSCHANS + NMSGDCHANS; i++) {
if (ptrigger & (1 << i))
@@ -1170,8 +1168,8 @@ via_attach(device_t dev)
uint32_t revid;
via = malloc(sizeof *via, M_DEVBUF, M_WAITOK | M_ZERO);
- via->lock = snd_mtxcreate(device_get_nameunit(dev),
- "snd_via8233 softc");
+ mtx_init(&via->lock, device_get_nameunit(dev), "snd_via8233 softc",
+ MTX_DEF);
via->dev = dev;
callout_init(&via->poll_timer, 1);
@@ -1386,8 +1384,7 @@ bad:
bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
if (via->sgd_dmat)
bus_dma_tag_destroy(via->sgd_dmat);
- if (via->lock)
- snd_mtxfree(via->lock);
+ mtx_destroy(&via->lock);
if (via)
free(via, M_DEVBUF);
return (ENXIO);
@@ -1406,10 +1403,10 @@ via_detach(device_t dev)
via = pcm_getdevinfo(dev);
if (via != NULL && (via->play_num != 0 || via->rec_num != 0)) {
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
via->polling = 0;
callout_stop(&via->poll_timer);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
callout_drain(&via->poll_timer);
}
@@ -1420,7 +1417,7 @@ via_detach(device_t dev)
bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
bus_dma_tag_destroy(via->sgd_dmat);
- snd_mtxfree(via->lock);
+ mtx_destroy(&via->lock);
free(via, M_DEVBUF);
return (0);
}
diff --git a/sys/dev/sound/pci/via82c686.c b/sys/dev/sound/pci/via82c686.c
index 40f3521a57a2..fe34583b1a25 100644
--- a/sys/dev/sound/pci/via82c686.c
+++ b/sys/dev/sound/pci/via82c686.c
@@ -90,7 +90,7 @@ struct via_info {
struct via_chinfo pch, rch;
struct via_dma_op *sgd_table;
u_int16_t codec_caps;
- struct mtx *lock;
+ struct mtx lock;
};
static u_int32_t via_fmt[] = {
@@ -226,8 +226,8 @@ via_buildsgdt(struct via_chinfo *ch)
* is feeding.
*/
seg_size = ch->blksz;
- segs = sndbuf_getsize(ch->buffer) / seg_size;
- phys_addr = sndbuf_getbufaddr(ch->buffer);
+ segs = ch->buffer->bufsize / seg_size;
+ phys_addr = ch->buffer->buf_addr;
for (i = 0; i < segs; i++) {
flag = (i == segs - 1)? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
@@ -245,7 +245,7 @@ viachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
struct via_info *via = devinfo;
struct via_chinfo *ch;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (dir == PCMDIR_PLAY) {
ch = &via->pch;
ch->base = VIA_PLAY_DMAOPS_BASE;
@@ -268,7 +268,7 @@ viachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
return NULL;
@@ -290,12 +290,12 @@ viachan_setformat(kobj_t obj, void *data, u_int32_t format)
mode_set |= VIA_RPMODE_16BIT;
DEB(printf("set format: dir = %d, format=%x\n", ch->dir, format));
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
mode = via_rd(via, ch->mode, 1);
mode &= ~(VIA_RPMODE_16BIT | VIA_RPMODE_STEREO);
mode |= mode_set;
via_wr(via, ch->mode, mode, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
return 0;
}
@@ -346,14 +346,14 @@ viachan_trigger(kobj_t obj, void *data, int go)
DEB(printf("ado located at va=%p pa=%x\n", ch->sgd_table, sgd_addr));
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (go == PCMTRIG_START) {
via_buildsgdt(ch);
via_wr(via, ch->base, sgd_addr, 4);
via_wr(via, ch->ctrl, VIA_RPCTRL_START, 1);
} else
via_wr(via, ch->ctrl, VIA_RPCTRL_TERMINATE, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
DEB(printf("viachan_trigger: go=%d\n", go));
return 0;
@@ -367,13 +367,13 @@ viachan_getptr(kobj_t obj, void *data)
bus_addr_t sgd_addr = ch->sgd_addr;
u_int32_t ptr, base, base1, len, seg;
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
base1 = via_rd(via, ch->base, 4);
len = via_rd(via, ch->count, 4);
base = via_rd(via, ch->base, 4);
if (base != base1) /* Avoid race hazard */
len = via_rd(via, ch->count, 4);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
DEB(printf("viachan_getptr: len / base = %x / %x\n", len, base));
@@ -385,7 +385,7 @@ viachan_getptr(kobj_t obj, void *data)
seg = SEGS_PER_CHAN;
/* Now work out offset: seg less count */
- ptr = (seg * sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN) - len;
+ ptr = (seg * ch->buffer->bufsize / SEGS_PER_CHAN) - len;
if (ch->dir == PCMDIR_REC) {
/* DMA appears to operate on memory 'lines' of 32 bytes */
/* so don't return any part line - it isn't in RAM yet */
@@ -426,22 +426,22 @@ via_intr(void *p)
/* DEB(printf("viachan_intr\n")); */
/* Read channel */
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
if (via_rd(via, VIA_PLAY_STAT, 1) & VIA_RPSTAT_INTR) {
via_wr(via, VIA_PLAY_STAT, VIA_RPSTAT_INTR, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
chn_intr(via->pch.channel);
- snd_mtxlock(via->lock);
+ mtx_lock(&via->lock);
}
/* Write channel */
if (via_rd(via, VIA_RECORD_STAT, 1) & VIA_RPSTAT_INTR) {
via_wr(via, VIA_RECORD_STAT, VIA_RPSTAT_INTR, 1);
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
chn_intr(via->rch.channel);
return;
}
- snd_mtxunlock(via->lock);
+ mtx_unlock(&via->lock);
}
/*
@@ -472,8 +472,8 @@ via_attach(device_t dev)
u_int32_t data, cnt;
via = malloc(sizeof(*via), M_DEVBUF, M_WAITOK | M_ZERO);
- via->lock = snd_mtxcreate(device_get_nameunit(dev),
- "snd_via82c686 softc");
+ mtx_init(&via->lock, device_get_nameunit(dev), "snd_via82c686 softc",
+ MTX_DEF);
pci_enable_busmaster(dev);
@@ -600,7 +600,7 @@ bad:
if (via->sgd_addr) bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
if (via->sgd_table) bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
if (via->sgd_dmat) bus_dma_tag_destroy(via->sgd_dmat);
- if (via->lock) snd_mtxfree(via->lock);
+ mtx_destroy(&via->lock);
if (via) free(via, M_DEVBUF);
return ENXIO;
}
@@ -623,7 +623,7 @@ via_detach(device_t dev)
bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
bus_dma_tag_destroy(via->sgd_dmat);
- snd_mtxfree(via->lock);
+ mtx_destroy(&via->lock);
free(via, M_DEVBUF);
return 0;
}
diff --git a/sys/dev/sound/pci/vibes.c b/sys/dev/sound/pci/vibes.c
index 7e908f188614..1b7353464503 100644
--- a/sys/dev/sound/pci/vibes.c
+++ b/sys/dev/sound/pci/vibes.c
@@ -204,7 +204,7 @@ svchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c
}
ch->buffer = b;
ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
- ch->spd = DSP_DEFAULT_SPEED;
+ ch->spd = 8000;
ch->dma_active = ch->dma_was_active = 0;
return ch;
@@ -328,9 +328,9 @@ svrchan_trigger(kobj_t obj, void *data, int go)
sv_indirect_set(sc, SV_REG_FORMAT, v);
/* Program DMA */
- count = sndbuf_getsize(ch->buffer) / 2; /* DMAC uses words */
+ count = ch->buffer->bufsize / 2; /* DMAC uses words */
sv_dma_set_config(sc->dmac_st, sc->dmac_sh,
- sndbuf_getbufaddr(ch->buffer),
+ ch->buffer->buf_addr,
count - 1,
SV_DMA_MODE_AUTO | SV_DMA_MODE_RD);
count = count / SV_INTR_PER_BUFFER - 1;
@@ -360,7 +360,7 @@ svrchan_getptr(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
u_int32_t sz, remain;
- sz = sndbuf_getsize(ch->buffer);
+ sz = ch->buffer->bufsize;
/* DMAC uses words */
remain = (sv_dma_get_count(sc->dmac_st, sc->dmac_sh) + 1) * 2;
return sz - remain;
@@ -404,9 +404,9 @@ svpchan_trigger(kobj_t obj, void *data, int go)
sv_indirect_set(sc, SV_REG_FORMAT, v);
/* Program DMA */
- count = sndbuf_getsize(ch->buffer);
+ count = ch->buffer->bufsize;
sv_dma_set_config(sc->dmaa_st, sc->dmaa_sh,
- sndbuf_getbufaddr(ch->buffer),
+ ch->buffer->buf_addr,
count - 1,
SV_DMA_MODE_AUTO | SV_DMA_MODE_WR);
count = count / SV_INTR_PER_BUFFER - 1;
@@ -437,7 +437,7 @@ svpchan_getptr(kobj_t obj, void *data)
struct sc_info *sc = ch->parent;
u_int32_t sz, remain;
- sz = sndbuf_getsize(ch->buffer);
+ sz = ch->buffer->bufsize;
/* DMAA uses bytes */
remain = sv_dma_get_count(sc->dmaa_st, sc->dmaa_sh) + 1;
return (sz - remain);
diff --git a/sys/dev/sound/pcm/ac97.c b/sys/dev/sound/pcm/ac97.c
index f5ca06cd3942..14ff2f6a62ab 100644
--- a/sys/dev/sound/pcm/ac97.c
+++ b/sys/dev/sound/pcm/ac97.c
@@ -65,7 +65,7 @@ struct ac97_info {
u_int32_t flags;
struct ac97mixtable_entry mix[AC97_MIXER_SIZE];
char name[16];
- struct mtx *lock;
+ struct mtx lock;
};
struct ac97_vendorid {
@@ -364,7 +364,7 @@ ac97_setrate(struct ac97_info *codec, int which, int rate)
return -1;
}
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
if (rate != 0) {
v = rate;
if (codec->extstat & AC97_EXTCAP_DRA)
@@ -374,7 +374,7 @@ ac97_setrate(struct ac97_info *codec, int which, int rate)
v = ac97_rdcd(codec, which);
if (codec->extstat & AC97_EXTCAP_DRA)
v <<= 1;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return v;
}
@@ -387,10 +387,10 @@ ac97_setextmode(struct ac97_info *codec, u_int16_t mode)
mode);
return -1;
}
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
ac97_wrcd(codec, AC97_REGEXT_STAT, mode);
codec->extstat = ac97_rdcd(codec, AC97_REGEXT_STAT) & AC97_EXTCAPS;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return (mode == codec->extstat)? 0 : -1;
}
@@ -426,9 +426,9 @@ ac97_setrecsrc(struct ac97_info *codec, int channel)
if (e->recidx > 0) {
int val = e->recidx - 1;
val |= val << 8;
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
ac97_wrcd(codec, AC97_REG_RECSEL, val);
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return 0;
} else
return -1;
@@ -497,13 +497,13 @@ ac97_setmixer(struct ac97_info *codec, unsigned channel, unsigned left, unsigned
/*
* If the mask bit is set, do not alter the other bits.
*/
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
if (e->mask) {
int cur = ac97_rdcd(codec, reg);
val |= cur & ~(mask);
}
ac97_wrcd(codec, reg, val);
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return left | (right << 8);
} else {
return -1;
@@ -603,11 +603,11 @@ ac97_initmixer(struct ac97_info *codec)
u_int32_t id;
int reg;
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
codec->count = AC97_INIT(codec->methods, codec->devinfo);
if (codec->count == 0) {
device_printf(codec->dev, "ac97 codec init failed\n");
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return ENODEV;
}
@@ -633,7 +633,7 @@ ac97_initmixer(struct ac97_info *codec)
id = (ac97_rdcd(codec, AC97_REG_ID1) << 16) | ac97_rdcd(codec, AC97_REG_ID2);
if (id == 0 || id == 0xffffffff) {
device_printf(codec->dev, "ac97 codec invalid or not present (id == %x)\n", id);
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return ENODEV;
}
@@ -780,18 +780,18 @@ ac97_initmixer(struct ac97_info *codec)
}
if (bootverbose)
device_printf(codec->dev, "ac97 codec dac ready count: %d\n", i);
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return 0;
}
static unsigned
ac97_reinitmixer(struct ac97_info *codec)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
codec->count = AC97_INIT(codec->methods, codec->devinfo);
if (codec->count == 0) {
device_printf(codec->dev, "ac97 codec init failed\n");
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return ENODEV;
}
@@ -811,7 +811,7 @@ ac97_reinitmixer(struct ac97_info *codec)
if ((ac97_rdcd(codec, AC97_REG_POWER) & 2) == 0)
device_printf(codec->dev, "ac97 codec reports dac not ready\n");
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
return 0;
}
@@ -824,7 +824,7 @@ ac97_create(device_t dev, void *devinfo, kobj_class_t cls)
codec = malloc(sizeof(*codec), M_AC97, M_WAITOK | M_ZERO);
snprintf(codec->name, sizeof(codec->name), "%s:ac97",
device_get_nameunit(dev));
- codec->lock = snd_mtxcreate(codec->name, "ac97 codec");
+ mtx_init(&codec->lock, codec->name, "ac97 codec", MTX_DEF);
codec->methods = kobj_create(cls, M_AC97, M_WAITOK | M_ZERO);
codec->dev = dev;
codec->devinfo = devinfo;
@@ -844,10 +844,10 @@ ac97_create(device_t dev, void *devinfo, kobj_class_t cls)
void
ac97_destroy(struct ac97_info *codec)
{
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
if (codec->methods != NULL)
kobj_delete(codec->methods, M_AC97);
- snd_mtxfree(codec->lock);
+ mtx_destroy(&codec->lock);
free(codec, M_AC97);
}
@@ -960,21 +960,21 @@ sysctl_hw_snd_ac97_eapd(SYSCTL_HANDLER_ARGS)
u_int16_t val;
codec = oidp->oid_arg1;
- if (codec == NULL || codec->id == 0 || codec->lock == NULL)
+ if (codec == NULL || codec->id == 0)
return EINVAL;
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
val = ac97_rdcd(codec, AC97_REG_POWER);
inv = (codec->flags & AC97_F_EAPD_INV) ? 0 : 1;
ea = (val >> 15) ^ inv;
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
err = sysctl_handle_int(oidp, &ea, 0, req);
if (err == 0 && req->newptr != NULL) {
if (ea != 0 && ea != 1)
return EINVAL;
if (ea != ((val >> 15) ^ inv)) {
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
ac97_wrcd(codec, AC97_REG_POWER, val ^ 0x8000);
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
}
}
return err;
@@ -987,12 +987,12 @@ ac97_init_sysctl(struct ac97_info *codec)
if (codec == NULL || codec->dev == NULL)
return;
- snd_mtxlock(codec->lock);
+ mtx_lock(&codec->lock);
orig = ac97_rdcd(codec, AC97_REG_POWER);
ac97_wrcd(codec, AC97_REG_POWER, orig ^ 0x8000);
val = ac97_rdcd(codec, AC97_REG_POWER);
ac97_wrcd(codec, AC97_REG_POWER, orig);
- snd_mtxunlock(codec->lock);
+ mtx_unlock(&codec->lock);
if ((val & 0x8000) == (orig & 0x8000))
return;
SYSCTL_ADD_PROC(device_get_sysctl_ctx(codec->dev),
diff --git a/sys/dev/sound/pcm/buffer.c b/sys/dev/sound/pcm/buffer.c
index de535ec2dcba..eb2cbe667bf3 100644
--- a/sys/dev/sound/pcm/buffer.c
+++ b/sys/dev/sound/pcm/buffer.c
@@ -5,6 +5,10 @@
* Portions Copyright (c) Ryan Beasley <ryan.beasley@gmail.com> - GSoC 2006
* Copyright (c) 1999 Cameron Grant <cg@FreeBSD.org>
* All rights reserved.
+ * Copyright (c) 2025 The FreeBSD Foundation
+ *
+ * Portions of this software were developed by Christos Margiolis
+ * <christos@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -41,13 +45,12 @@
#include "snd_fxdiv_gen.h"
struct snd_dbuf *
-sndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel)
+sndbuf_create(struct pcm_channel *channel, const char *desc)
{
struct snd_dbuf *b;
b = malloc(sizeof(*b), M_DEVBUF, M_WAITOK | M_ZERO);
- snprintf(b->name, SNDBUF_NAMELEN, "%s:%s", drv, desc);
- b->dev = dev;
+ snprintf(b->name, SNDBUF_NAMELEN, "%s:%s", channel->name, desc);
b->channel = channel;
return b;
@@ -60,19 +63,13 @@ sndbuf_destroy(struct snd_dbuf *b)
free(b, M_DEVBUF);
}
-bus_addr_t
-sndbuf_getbufaddr(struct snd_dbuf *buf)
-{
- return (buf->buf_addr);
-}
-
static void
sndbuf_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
{
struct snd_dbuf *b = (struct snd_dbuf *)arg;
if (snd_verbose > 3) {
- device_printf(b->dev, "sndbuf_setmap %lx, %lx; ",
+ printf("sndbuf_setmap %lx, %lx; ",
(u_long)segs[0].ds_addr, (u_long)segs[0].ds_len);
printf("%p -> %lx\n", b->buf, (u_long)segs[0].ds_addr);
}
@@ -147,7 +144,7 @@ sndbuf_free(struct snd_dbuf *b)
} else
free(b->buf, M_DEVBUF);
}
- seldrain(sndbuf_getsel(b));
+ seldrain(&b->sel);
b->tmpbuf = NULL;
b->shadbuf = NULL;
@@ -277,16 +274,10 @@ sndbuf_clear(struct snd_dbuf *b, unsigned int length)
length = b->bufsize;
data = sndbuf_zerodata(b->fmt);
-
i = sndbuf_getfreeptr(b);
- p = sndbuf_getbuf(b);
- while (length > 0) {
- p[i] = data;
- length--;
- i++;
- if (i >= b->bufsize)
- i = 0;
- }
+ p = b->buf;
+ for (; length > 0; length--, i++)
+ p[i % b->bufsize] = data;
}
/**
@@ -298,7 +289,7 @@ void
sndbuf_fillsilence(struct snd_dbuf *b)
{
if (b->bufsize > 0)
- memset(sndbuf_getbuf(b), sndbuf_zerodata(b->fmt), b->bufsize);
+ memset(b->buf, sndbuf_zerodata(b->fmt), b->bufsize);
b->rp = 0;
b->rl = b->bufsize;
}
@@ -307,7 +298,7 @@ void
sndbuf_fillsilence_rl(struct snd_dbuf *b, u_int rl)
{
if (b->bufsize > 0)
- memset(sndbuf_getbuf(b), sndbuf_zerodata(b->fmt), b->bufsize);
+ memset(b->buf, sndbuf_zerodata(b->fmt), b->bufsize);
b->rp = 0;
b->rl = min(b->bufsize, rl);
}
@@ -344,12 +335,6 @@ sndbuf_reset(struct snd_dbuf *b)
sndbuf_clearshadow(b);
}
-u_int32_t
-sndbuf_getfmt(struct snd_dbuf *b)
-{
- return b->fmt;
-}
-
int
sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt)
{
@@ -359,60 +344,12 @@ sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt)
return 0;
}
-unsigned int
-sndbuf_getspd(struct snd_dbuf *b)
-{
- return b->spd;
-}
-
void
sndbuf_setspd(struct snd_dbuf *b, unsigned int spd)
{
b->spd = spd;
}
-unsigned int
-sndbuf_getalign(struct snd_dbuf *b)
-{
- return (b->align);
-}
-
-unsigned int
-sndbuf_getblkcnt(struct snd_dbuf *b)
-{
- return b->blkcnt;
-}
-
-void
-sndbuf_setblkcnt(struct snd_dbuf *b, unsigned int blkcnt)
-{
- b->blkcnt = blkcnt;
-}
-
-unsigned int
-sndbuf_getblksz(struct snd_dbuf *b)
-{
- return b->blksz;
-}
-
-void
-sndbuf_setblksz(struct snd_dbuf *b, unsigned int blksz)
-{
- b->blksz = blksz;
-}
-
-unsigned int
-sndbuf_getbps(struct snd_dbuf *b)
-{
- return b->bps;
-}
-
-void *
-sndbuf_getbuf(struct snd_dbuf *b)
-{
- return b->buf;
-}
-
void *
sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs)
{
@@ -422,24 +359,6 @@ sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs)
}
unsigned int
-sndbuf_getsize(struct snd_dbuf *b)
-{
- return b->bufsize;
-}
-
-unsigned int
-sndbuf_getmaxsize(struct snd_dbuf *b)
-{
- return b->maxsize;
-}
-
-unsigned int
-sndbuf_getallocsize(struct snd_dbuf *b)
-{
- return b->allocsize;
-}
-
-unsigned int
sndbuf_runsz(struct snd_dbuf *b)
{
return b->dl;
@@ -451,19 +370,6 @@ sndbuf_setrun(struct snd_dbuf *b, int go)
b->dl = go? b->blksz : 0;
}
-struct selinfo *
-sndbuf_getsel(struct snd_dbuf *b)
-{
- return &b->sel;
-}
-
-/************************************************************/
-unsigned int
-sndbuf_getxrun(struct snd_dbuf *b)
-{
- return b->xrun;
-}
-
void
sndbuf_setxrun(struct snd_dbuf *b, unsigned int xrun)
{
@@ -471,18 +377,6 @@ sndbuf_setxrun(struct snd_dbuf *b, unsigned int xrun)
}
unsigned int
-sndbuf_gethwptr(struct snd_dbuf *b)
-{
- return b->hp;
-}
-
-void
-sndbuf_sethwptr(struct snd_dbuf *b, unsigned int ptr)
-{
- b->hp = ptr;
-}
-
-unsigned int
sndbuf_getready(struct snd_dbuf *b)
{
KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
@@ -521,38 +415,13 @@ sndbuf_getblocks(struct snd_dbuf *b)
return b->total / b->blksz;
}
-u_int64_t
-sndbuf_getprevblocks(struct snd_dbuf *b)
-{
- return b->prev_total / b->blksz;
-}
-
-u_int64_t
-sndbuf_gettotal(struct snd_dbuf *b)
-{
- return b->total;
-}
-
-u_int64_t
-sndbuf_getprevtotal(struct snd_dbuf *b)
-{
- return b->prev_total;
-}
-
-void
-sndbuf_updateprevtotal(struct snd_dbuf *b)
-{
- b->prev_total = b->total;
-}
-
unsigned int
sndbuf_xbytes(unsigned int v, struct snd_dbuf *from, struct snd_dbuf *to)
{
if (from == NULL || to == NULL || v == 0)
return 0;
- return snd_xbytes(v, sndbuf_getalign(from) * sndbuf_getspd(from),
- sndbuf_getalign(to) * sndbuf_getspd(to));
+ return snd_xbytes(v, from->align * from->spd, to->align * to->spd);
}
u_int8_t
@@ -592,7 +461,7 @@ sndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count)
b->total += count;
if (from != NULL) {
while (count > 0) {
- l = min(count, sndbuf_getsize(b) - sndbuf_getfreeptr(b));
+ l = min(count, b->bufsize - sndbuf_getfreeptr(b));
bcopy(from, sndbuf_getbufofs(b, sndbuf_getfreeptr(b)), l);
from += l;
b->rl += l;
@@ -628,7 +497,7 @@ sndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count)
KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
if (to != NULL) {
while (count > 0) {
- l = min(count, sndbuf_getsize(b) - sndbuf_getreadyptr(b));
+ l = min(count, b->bufsize - sndbuf_getreadyptr(b));
bcopy(sndbuf_getbufofs(b, sndbuf_getreadyptr(b)), to, l);
to += l;
b->rl -= l;
@@ -673,7 +542,7 @@ sndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *chan
if (sndbuf_getfree(to) < count)
return (EINVAL);
- maxfeed = SND_FXROUND(SND_FXDIV_MAX, sndbuf_getalign(to));
+ maxfeed = SND_FXROUND(SND_FXDIV_MAX, to->align);
do {
cnt = FEEDER_FEED(feeder, channel, to->tmpbuf,
@@ -695,40 +564,6 @@ sndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *chan
return (0);
}
-/************************************************************/
-
-void
-sndbuf_dump(struct snd_dbuf *b, char *s, u_int32_t what)
-{
- printf("%s: [", s);
- if (what & 0x01)
- printf(" bufsize: %d, maxsize: %d", b->bufsize, b->maxsize);
- if (what & 0x02)
- printf(" dl: %d, rp: %d, rl: %d, hp: %d", b->dl, b->rp, b->rl, b->hp);
- if (what & 0x04)
- printf(" total: %ju, prev_total: %ju, xrun: %d", (uintmax_t)b->total, (uintmax_t)b->prev_total, b->xrun);
- if (what & 0x08)
- printf(" fmt: 0x%x, spd: %d", b->fmt, b->spd);
- if (what & 0x10)
- printf(" blksz: %d, blkcnt: %d, flags: 0x%x", b->blksz, b->blkcnt, b->flags);
- printf(" ]\n");
-}
-
-/************************************************************/
-u_int32_t
-sndbuf_getflags(struct snd_dbuf *b)
-{
- return b->flags;
-}
-
-void
-sndbuf_setflags(struct snd_dbuf *b, u_int32_t flags, int on)
-{
- b->flags &= ~flags;
- if (on)
- b->flags |= flags;
-}
-
/**
* @brief Clear the shadow buffer by filling with samples equal to zero.
*
diff --git a/sys/dev/sound/pcm/buffer.h b/sys/dev/sound/pcm/buffer.h
index ddf4083ec19f..371ba2dd94ce 100644
--- a/sys/dev/sound/pcm/buffer.h
+++ b/sys/dev/sound/pcm/buffer.h
@@ -3,6 +3,10 @@
*
* Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
* All rights reserved.
+ * Copyright (c) 2025 The FreeBSD Foundation
+ *
+ * Portions of this software were developed by Christos Margiolis
+ * <christos@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,12 +30,11 @@
* SUCH DAMAGE.
*/
-#define SNDBUF_F_MANAGED 0x00000008
+#define SNDBUF_F_MANAGED 0x00000001
#define SNDBUF_NAMELEN 48
struct snd_dbuf {
- device_t dev;
u_int8_t *buf, *tmpbuf;
u_int8_t *shadbuf; /**< shadow buffer used w/ S_D_SILENCE/SKIP */
volatile int sl; /**< shadbuf ready length in # of bytes */
@@ -41,7 +44,7 @@ struct snd_dbuf {
volatile int rl; /* length of ready area */
volatile int hp;
volatile u_int64_t total, prev_total;
- int dmachan, dir; /* dma channel */
+ int dmachan; /* dma channel */
u_int32_t fmt, spd, bps, align;
unsigned int blksz, blkcnt;
int xrun;
@@ -55,11 +58,9 @@ struct snd_dbuf {
char name[SNDBUF_NAMELEN];
};
-struct snd_dbuf *sndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel);
+struct snd_dbuf *sndbuf_create(struct pcm_channel *channel, const char *desc);
void sndbuf_destroy(struct snd_dbuf *b);
-void sndbuf_dump(struct snd_dbuf *b, char *s, u_int32_t what);
-
int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size);
int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size);
void sndbuf_free(struct snd_dbuf *b);
@@ -72,51 +73,26 @@ void sndbuf_fillsilence_rl(struct snd_dbuf *b, u_int rl);
void sndbuf_softreset(struct snd_dbuf *b);
void sndbuf_clearshadow(struct snd_dbuf *b);
-u_int32_t sndbuf_getfmt(struct snd_dbuf *b);
int sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt);
-unsigned int sndbuf_getspd(struct snd_dbuf *b);
void sndbuf_setspd(struct snd_dbuf *b, unsigned int spd);
-unsigned int sndbuf_getbps(struct snd_dbuf *b);
-bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf);
-
-void *sndbuf_getbuf(struct snd_dbuf *b);
void *sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs);
-unsigned int sndbuf_getsize(struct snd_dbuf *b);
-unsigned int sndbuf_getmaxsize(struct snd_dbuf *b);
-unsigned int sndbuf_getallocsize(struct snd_dbuf *b);
-unsigned int sndbuf_getalign(struct snd_dbuf *b);
-unsigned int sndbuf_getblkcnt(struct snd_dbuf *b);
-void sndbuf_setblkcnt(struct snd_dbuf *b, unsigned int blkcnt);
-unsigned int sndbuf_getblksz(struct snd_dbuf *b);
-void sndbuf_setblksz(struct snd_dbuf *b, unsigned int blksz);
unsigned int sndbuf_runsz(struct snd_dbuf *b);
void sndbuf_setrun(struct snd_dbuf *b, int go);
-struct selinfo *sndbuf_getsel(struct snd_dbuf *b);
-unsigned int sndbuf_getxrun(struct snd_dbuf *b);
void sndbuf_setxrun(struct snd_dbuf *b, unsigned int xrun);
-unsigned int sndbuf_gethwptr(struct snd_dbuf *b);
-void sndbuf_sethwptr(struct snd_dbuf *b, unsigned int ptr);
unsigned int sndbuf_getfree(struct snd_dbuf *b);
unsigned int sndbuf_getfreeptr(struct snd_dbuf *b);
unsigned int sndbuf_getready(struct snd_dbuf *b);
unsigned int sndbuf_getreadyptr(struct snd_dbuf *b);
u_int64_t sndbuf_getblocks(struct snd_dbuf *b);
-u_int64_t sndbuf_getprevblocks(struct snd_dbuf *b);
-u_int64_t sndbuf_gettotal(struct snd_dbuf *b);
-u_int64_t sndbuf_getprevtotal(struct snd_dbuf *b);
unsigned int sndbuf_xbytes(unsigned int v, struct snd_dbuf *from, struct snd_dbuf *to);
u_int8_t sndbuf_zerodata(u_int32_t fmt);
-void sndbuf_updateprevtotal(struct snd_dbuf *b);
int sndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count);
int sndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count);
int sndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *channel, struct pcm_feeder *feeder, unsigned int count);
-u_int32_t sndbuf_getflags(struct snd_dbuf *b);
-void sndbuf_setflags(struct snd_dbuf *b, u_int32_t flags, int on);
-
#ifdef OSSV4_EXPERIMENT
void sndbuf_getpeaks(struct snd_dbuf *b, int *lp, int *rp);
#endif
diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c
index 4d13f20a5262..011dc1427c2e 100644
--- a/sys/dev/sound/pcm/channel.c
+++ b/sys/dev/sound/pcm/channel.c
@@ -228,19 +228,21 @@ chn_lockinit(struct pcm_channel *c, int dir)
{
switch (dir) {
case PCMDIR_PLAY:
- c->lock = snd_mtxcreate(c->name, "pcm play channel");
+ mtx_init(&c->lock, c->name, "pcm play channel", MTX_DEF);
cv_init(&c->intr_cv, "pcmwr");
break;
case PCMDIR_PLAY_VIRTUAL:
- c->lock = snd_mtxcreate(c->name, "pcm virtual play channel");
+ mtx_init(&c->lock, c->name, "pcm virtual play channel",
+ MTX_DEF);
cv_init(&c->intr_cv, "pcmwrv");
break;
case PCMDIR_REC:
- c->lock = snd_mtxcreate(c->name, "pcm record channel");
+ mtx_init(&c->lock, c->name, "pcm record channel", MTX_DEF);
cv_init(&c->intr_cv, "pcmrd");
break;
case PCMDIR_REC_VIRTUAL:
- c->lock = snd_mtxcreate(c->name, "pcm virtual record channel");
+ mtx_init(&c->lock, c->name, "pcm virtual record channel",
+ MTX_DEF);
cv_init(&c->intr_cv, "pcmrdv");
break;
default:
@@ -262,7 +264,7 @@ chn_lockdestroy(struct pcm_channel *c)
cv_destroy(&c->cv);
cv_destroy(&c->intr_cv);
- snd_mtxfree(c->lock);
+ mtx_destroy(&c->lock);
}
/**
@@ -271,7 +273,7 @@ chn_lockdestroy(struct pcm_channel *c)
* @retval 1 = ready for I/O
* @retval 0 = not ready for I/O
*/
-static int
+int
chn_polltrigger(struct pcm_channel *c)
{
struct snd_dbuf *bs = c->bufsoft;
@@ -280,10 +282,10 @@ chn_polltrigger(struct pcm_channel *c)
CHN_LOCKASSERT(c);
if (c->flags & CHN_F_MMAP) {
- if (sndbuf_getprevtotal(bs) < c->lw)
+ if (bs->prev_total < c->lw)
delta = c->lw;
else
- delta = sndbuf_gettotal(bs) - sndbuf_getprevtotal(bs);
+ delta = bs->total - bs->prev_total;
} else {
if (c->direction == PCMDIR_PLAY)
delta = sndbuf_getfree(bs);
@@ -299,7 +301,7 @@ chn_pollreset(struct pcm_channel *c)
{
CHN_LOCKASSERT(c);
- sndbuf_updateprevtotal(c->bufsoft);
+ c->bufsoft->prev_total = c->bufsoft->total;
}
static void
@@ -313,8 +315,9 @@ chn_wakeup(struct pcm_channel *c)
bs = c->bufsoft;
if (CHN_EMPTY(c, children.busy)) {
- if (SEL_WAITING(sndbuf_getsel(bs)) && chn_polltrigger(c))
- selwakeuppri(sndbuf_getsel(bs), PRIBIO);
+ KNOTE_LOCKED(&bs->sel.si_note, 0);
+ if (SEL_WAITING(&bs->sel) && chn_polltrigger(c))
+ selwakeuppri(&bs->sel, PRIBIO);
CHN_BROADCAST(&c->intr_cv);
} else {
CHN_FOREACH(ch, c, children.busy) {
@@ -336,7 +339,7 @@ chn_sleep(struct pcm_channel *c, int timeout)
return (EINVAL);
c->sleeping++;
- ret = cv_timedwait_sig(&c->intr_cv, c->lock, timeout);
+ ret = cv_timedwait_sig(&c->intr_cv, &c->lock, timeout);
c->sleeping--;
return ((c->flags & CHN_F_DEAD) ? EINVAL : ret);
@@ -353,22 +356,22 @@ chn_dmaupdate(struct pcm_channel *c)
struct snd_dbuf *b = c->bufhard;
unsigned int delta, old, hwptr, amt;
- KASSERT(sndbuf_getsize(b) > 0, ("bufsize == 0"));
+ KASSERT(b->bufsize > 0, ("bufsize == 0"));
CHN_LOCKASSERT(c);
- old = sndbuf_gethwptr(b);
+ old = b->hp;
hwptr = chn_getptr(c);
- delta = (sndbuf_getsize(b) + hwptr - old) % sndbuf_getsize(b);
- sndbuf_sethwptr(b, hwptr);
+ delta = (b->bufsize + hwptr - old) % b->bufsize;
+ b->hp = hwptr;
if (c->direction == PCMDIR_PLAY) {
amt = min(delta, sndbuf_getready(b));
- amt -= amt % sndbuf_getalign(b);
+ amt -= amt % b->align;
if (amt > 0)
sndbuf_dispose(b, NULL, amt);
} else {
amt = min(delta, sndbuf_getfree(b));
- amt -= amt % sndbuf_getalign(b);
+ amt -= amt % b->align;
if (amt > 0)
sndbuf_acquire(b, NULL, amt);
}
@@ -396,8 +399,7 @@ chn_wrfeed(struct pcm_channel *c)
sndbuf_acquire(bs, NULL, sndbuf_getfree(bs));
wasfree = sndbuf_getfree(b);
- want = min(sndbuf_getsize(b),
- imax(0, sndbuf_xbytes(sndbuf_getsize(bs), bs, b) -
+ want = min(b->bufsize, imax(0, sndbuf_xbytes(bs->bufsize, bs, b) -
sndbuf_getready(b)));
amt = min(wasfree, want);
if (amt > 0)
@@ -438,7 +440,7 @@ chn_write(struct pcm_channel *c, struct uio *buf)
{
struct snd_dbuf *bs = c->bufsoft;
void *off;
- int ret, timeout, sz, t, p;
+ int ret, timeout, sz, p;
CHN_LOCKASSERT(c);
@@ -446,24 +448,17 @@ chn_write(struct pcm_channel *c, struct uio *buf)
timeout = chn_timeout * hz;
while (ret == 0 && buf->uio_resid > 0) {
+ p = sndbuf_getfreeptr(bs);
sz = min(buf->uio_resid, sndbuf_getfree(bs));
+ sz = min(sz, bs->bufsize - p);
if (sz > 0) {
- /*
- * The following assumes that the free space in
- * the buffer can never be less around the
- * unlock-uiomove-lock sequence.
- */
- while (ret == 0 && sz > 0) {
- p = sndbuf_getfreeptr(bs);
- t = min(sz, sndbuf_getsize(bs) - p);
- off = sndbuf_getbufofs(bs, p);
- CHN_UNLOCK(c);
- ret = uiomove(off, t, buf);
- CHN_LOCK(c);
- sz -= t;
- sndbuf_acquire(bs, NULL, t);
- }
- ret = 0;
+ off = sndbuf_getbufofs(bs, p);
+ sndbuf_acquire(bs, NULL, sz);
+ CHN_UNLOCK(c);
+ ret = uiomove(off, sz, buf);
+ CHN_LOCK(c);
+ if (ret != 0)
+ break;
if (CHN_STOPPED(c) && !(c->flags & CHN_F_NOTRIGGER)) {
ret = chn_start(c, 0);
if (ret != 0)
@@ -483,13 +478,7 @@ chn_write(struct pcm_channel *c, struct uio *buf)
ret = EAGAIN;
} else {
ret = chn_sleep(c, timeout);
- if (ret == EAGAIN) {
- ret = EINVAL;
- c->flags |= CHN_F_DEAD;
- device_printf(c->dev, "%s(): %s: "
- "play interrupt timeout, channel dead\n",
- __func__, c->name);
- } else if (ret == ERESTART || ret == EINTR)
+ if (ret == ERESTART || ret == EINTR)
c->flags |= CHN_F_ABORTING;
}
}
@@ -552,7 +541,7 @@ chn_read(struct pcm_channel *c, struct uio *buf)
{
struct snd_dbuf *bs = c->bufsoft;
void *off;
- int ret, timeout, sz, t, p;
+ int ret, timeout, sz, p;
CHN_LOCKASSERT(c);
@@ -568,35 +557,22 @@ chn_read(struct pcm_channel *c, struct uio *buf)
timeout = chn_timeout * hz;
while (ret == 0 && buf->uio_resid > 0) {
+ p = sndbuf_getreadyptr(bs);
sz = min(buf->uio_resid, sndbuf_getready(bs));
+ sz = min(sz, bs->bufsize - p);
if (sz > 0) {
- /*
- * The following assumes that the free space in
- * the buffer can never be less around the
- * unlock-uiomove-lock sequence.
- */
- while (ret == 0 && sz > 0) {
- p = sndbuf_getreadyptr(bs);
- t = min(sz, sndbuf_getsize(bs) - p);
- off = sndbuf_getbufofs(bs, p);
- CHN_UNLOCK(c);
- ret = uiomove(off, t, buf);
- CHN_LOCK(c);
- sz -= t;
- sndbuf_dispose(bs, NULL, t);
- }
- ret = 0;
+ off = sndbuf_getbufofs(bs, p);
+ sndbuf_dispose(bs, NULL, sz);
+ CHN_UNLOCK(c);
+ ret = uiomove(off, sz, buf);
+ CHN_LOCK(c);
+ if (ret != 0)
+ break;
} else if (c->flags & (CHN_F_NBIO | CHN_F_NOTRIGGER))
ret = EAGAIN;
else {
ret = chn_sleep(c, timeout);
- if (ret == EAGAIN) {
- ret = EINVAL;
- c->flags |= CHN_F_DEAD;
- device_printf(c->dev, "%s(): %s: "
- "record interrupt timeout, channel dead\n",
- __func__, c->name);
- } else if (ret == ERESTART || ret == EINTR)
+ if (ret == ERESTART || ret == EINTR)
c->flags |= CHN_F_ABORTING;
}
}
@@ -605,30 +581,14 @@ chn_read(struct pcm_channel *c, struct uio *buf)
}
void
-chn_intr_locked(struct pcm_channel *c)
+chn_intr(struct pcm_channel *c)
{
-
- CHN_LOCKASSERT(c);
-
+ CHN_LOCK(c);
c->interrupts++;
-
if (c->direction == PCMDIR_PLAY)
chn_wrintr(c);
else
chn_rdintr(c);
-}
-
-void
-chn_intr(struct pcm_channel *c)
-{
-
- if (CHN_LOCKOWNED(c)) {
- chn_intr_locked(c);
- return;
- }
-
- CHN_LOCK(c);
- chn_intr_locked(c);
CHN_UNLOCK(c);
}
@@ -663,7 +623,7 @@ chn_start(struct pcm_channel *c, int force)
pb = CHN_BUF_PARENT(c, b);
i = sndbuf_xbytes(sndbuf_getready(bs), bs, pb);
- j = sndbuf_getalign(pb);
+ j = pb->align;
}
}
if (snd_verbose > 3 && CHN_EMPTY(c, children))
@@ -686,7 +646,7 @@ chn_start(struct pcm_channel *c, int force)
if (c->parentchannel == NULL) {
if (c->direction == PCMDIR_PLAY)
sndbuf_fillsilence_rl(b,
- sndbuf_xbytes(sndbuf_getsize(bs), bs, b));
+ sndbuf_xbytes(bs->bufsize, bs, b));
if (snd_verbose > 3)
device_printf(c->dev,
"%s(): %s starting! (%s/%s) "
@@ -699,8 +659,8 @@ chn_start(struct pcm_channel *c, int force)
"running",
sndbuf_getready(b),
force, i, j, c->timeout,
- (sndbuf_getsize(b) * 1000) /
- (sndbuf_getalign(b) * sndbuf_getspd(b)));
+ (b->bufsize * 1000) /
+ (b->align * b->spd));
}
err = chn_trigger(c, PCMTRIG_START);
}
@@ -759,7 +719,7 @@ chn_sync(struct pcm_channel *c, int threshold)
syncdelay = chn_syncdelay;
if (syncdelay < 0 && (threshold > 0 || sndbuf_getready(bs) > 0))
- minflush += sndbuf_xbytes(sndbuf_getsize(b), b, bs);
+ minflush += sndbuf_xbytes(b->bufsize, b, bs);
/*
* Append (0-1000) millisecond trailing buffer (if needed)
@@ -767,10 +727,10 @@ chn_sync(struct pcm_channel *c, int threshold)
* to avoid audible truncation.
*/
if (syncdelay > 0)
- minflush += (sndbuf_getalign(bs) * sndbuf_getspd(bs) *
+ minflush += (bs->align * bs->spd *
((syncdelay > 1000) ? 1000 : syncdelay)) / 1000;
- minflush -= minflush % sndbuf_getalign(bs);
+ minflush -= minflush % bs->align;
if (minflush > 0) {
threshold = min(minflush, sndbuf_getfree(bs));
@@ -781,14 +741,14 @@ chn_sync(struct pcm_channel *c, int threshold)
resid = sndbuf_getready(bs);
residp = resid;
- blksz = sndbuf_getblksz(b);
+ blksz = b->blksz;
if (blksz < 1) {
device_printf(c->dev,
"%s(): WARNING: blksz < 1 ! maxsize=%d [%d/%d/%d]\n",
- __func__, sndbuf_getmaxsize(b), sndbuf_getsize(b),
- sndbuf_getblksz(b), sndbuf_getblkcnt(b));
- if (sndbuf_getblkcnt(b) > 0)
- blksz = sndbuf_getsize(b) / sndbuf_getblkcnt(b);
+ __func__, b->maxsize, b->bufsize,
+ b->blksz, b->blkcnt);
+ if (b->blkcnt > 0)
+ blksz = b->bufsize / b->blkcnt;
if (blksz < 1)
blksz = 1;
}
@@ -874,7 +834,7 @@ chn_poll(struct pcm_channel *c, int ev, struct thread *td)
chn_pollreset(c);
ret = ev;
} else
- selrecord(td, sndbuf_getsel(bs));
+ selrecord(td, &bs->sel);
return (ret);
}
@@ -1257,7 +1217,7 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
chn_vpc_reset(c, SND_VOL_C_PCM, 1);
CHN_UNLOCK(c);
- fc = feeder_getclass(NULL);
+ fc = feeder_getclass(FEEDER_ROOT);
if (fc == NULL) {
device_printf(d->dev, "%s(): failed to get feeder class\n",
__func__);
@@ -1268,8 +1228,8 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
goto fail;
}
- b = sndbuf_create(c->dev, c->name, "primary", c);
- bs = sndbuf_create(c->dev, c->name, "secondary", c);
+ b = sndbuf_create(c, "primary");
+ bs = sndbuf_create(c, "secondary");
if (b == NULL || bs == NULL) {
device_printf(d->dev, "%s(): failed to create %s buffer\n",
__func__, b == NULL ? "hardware" : "software");
@@ -1277,6 +1237,7 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
}
c->bufhard = b;
c->bufsoft = bs;
+ knlist_init_mtx(&bs->sel.si_note, &c->lock);
c->devinfo = CHANNEL_INIT(c->methods, devinfo, b, c, direction);
if (c->devinfo == NULL) {
@@ -1284,7 +1245,7 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
goto fail;
}
- if ((sndbuf_getsize(b) == 0) && ((c->flags & CHN_F_VIRTUAL) == 0)) {
+ if (b->bufsize == 0 && ((c->flags & CHN_F_VIRTUAL) == 0)) {
device_printf(d->dev, "%s(): hardware buffer's size is 0\n",
__func__);
goto fail;
@@ -1302,7 +1263,7 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
* seems to only come into existence in sndbuf_resize().
*/
if (c->direction == PCMDIR_PLAY) {
- bs->sl = sndbuf_getmaxsize(bs);
+ bs->sl = bs->maxsize;
bs->shadbuf = malloc(bs->sl, M_DEVBUF, M_WAITOK);
}
@@ -1319,8 +1280,8 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
if ((c->flags & CHN_F_VIRTUAL) == 0) {
CHN_INSERT_SORT_ASCEND(d, c, channels.pcm.primary);
/* Initialize the *vchanrate/vchanformat parameters. */
- *vchanrate = sndbuf_getspd(c->bufsoft);
- *vchanformat = sndbuf_getfmt(c->bufsoft);
+ *vchanrate = c->bufsoft->spd;
+ *vchanformat = c->bufsoft->fmt;
}
return (c);
@@ -1371,10 +1332,13 @@ chn_kill(struct pcm_channel *c)
}
free_unr(chn_getunr(d, c->type), c->unit);
feeder_remove(c);
- if (c->devinfo && CHANNEL_FREE(c->methods, c->devinfo))
- sndbuf_free(b);
- if (bs)
+ if (c->devinfo)
+ CHANNEL_FREE(c->methods, c->devinfo);
+ if (bs) {
+ knlist_clear(&bs->sel.si_note, 0);
+ knlist_destroy(&bs->sel.si_note);
sndbuf_destroy(bs);
+ }
if (b)
sndbuf_destroy(b);
CHN_LOCK(c);
@@ -1895,20 +1859,20 @@ chn_resizebuf(struct pcm_channel *c, int latency,
b = c->bufhard;
if (!(blksz == 0 || blkcnt == -1) &&
- (blksz < 16 || blksz < sndbuf_getalign(bs) || blkcnt < 2 ||
+ (blksz < 16 || blksz < bs->align || blkcnt < 2 ||
(blksz * blkcnt) > CHN_2NDBUFMAXSIZE))
return EINVAL;
- chn_calclatency(c->direction, latency, sndbuf_getalign(bs),
- sndbuf_getalign(bs) * sndbuf_getspd(bs), CHN_2NDBUFMAXSIZE,
+ chn_calclatency(c->direction, latency, bs->align,
+ bs->align * bs->spd, CHN_2NDBUFMAXSIZE,
&sblksz, &sblkcnt);
if (blksz == 0 || blkcnt == -1) {
if (blkcnt == -1)
c->flags &= ~CHN_F_HAS_SIZE;
if (c->flags & CHN_F_HAS_SIZE) {
- blksz = sndbuf_getblksz(bs);
- blkcnt = sndbuf_getblkcnt(bs);
+ blksz = bs->blksz;
+ blkcnt = bs->blkcnt;
}
} else
c->flags |= CHN_F_HAS_SIZE;
@@ -1921,7 +1885,7 @@ chn_resizebuf(struct pcm_channel *c, int latency,
* defeat the purpose of having custom control. The least
* we can do is round it to the nearest ^2 and align it.
*/
- sblksz = round_blksz(blksz, sndbuf_getalign(bs));
+ sblksz = round_blksz(blksz, bs->align);
sblkcnt = round_pow2(blkcnt);
}
@@ -1934,49 +1898,46 @@ chn_resizebuf(struct pcm_channel *c, int latency,
CHN_LOCK(c);
if (c->direction == PCMDIR_PLAY) {
limit = (pb != NULL) ?
- sndbuf_xbytes(sndbuf_getsize(pb), pb, bs) : 0;
+ sndbuf_xbytes(pb->bufsize, pb, bs) : 0;
} else {
limit = (pb != NULL) ?
- sndbuf_xbytes(sndbuf_getblksz(pb), pb, bs) * 2 : 0;
+ sndbuf_xbytes(pb->blksz, pb, bs) * 2 : 0;
}
} else {
hblkcnt = 2;
if (c->flags & CHN_F_HAS_SIZE) {
hblksz = round_blksz(sndbuf_xbytes(sblksz, bs, b),
- sndbuf_getalign(b));
- hblkcnt = round_pow2(sndbuf_getblkcnt(bs));
+ b->align);
+ hblkcnt = round_pow2(bs->blkcnt);
} else
chn_calclatency(c->direction, latency,
- sndbuf_getalign(b),
- sndbuf_getalign(b) * sndbuf_getspd(b),
+ b->align, b->align * b->spd,
CHN_2NDBUFMAXSIZE, &hblksz, &hblkcnt);
- if ((hblksz << 1) > sndbuf_getmaxsize(b))
- hblksz = round_blksz(sndbuf_getmaxsize(b) >> 1,
- sndbuf_getalign(b));
+ if ((hblksz << 1) > b->maxsize)
+ hblksz = round_blksz(b->maxsize >> 1, b->align);
- while ((hblksz * hblkcnt) > sndbuf_getmaxsize(b)) {
+ while ((hblksz * hblkcnt) > b->maxsize) {
if (hblkcnt < 4)
hblksz >>= 1;
else
hblkcnt >>= 1;
}
- hblksz -= hblksz % sndbuf_getalign(b);
+ hblksz -= hblksz % b->align;
CHN_UNLOCK(c);
if (chn_usefrags == 0 ||
CHANNEL_SETFRAGMENTS(c->methods, c->devinfo,
hblksz, hblkcnt) != 0)
- sndbuf_setblksz(b, CHANNEL_SETBLOCKSIZE(c->methods,
- c->devinfo, hblksz));
+ b->blksz = CHANNEL_SETBLOCKSIZE(c->methods,
+ c->devinfo, hblksz);
CHN_LOCK(c);
if (!CHN_EMPTY(c, children)) {
nsblksz = round_blksz(
- sndbuf_xbytes(sndbuf_getblksz(b), b, bs),
- sndbuf_getalign(bs));
- nsblkcnt = sndbuf_getblkcnt(b);
+ sndbuf_xbytes(b->blksz, b, bs), bs->align);
+ nsblkcnt = b->blkcnt;
if (c->direction == PCMDIR_PLAY) {
do {
nsblkcnt--;
@@ -1988,7 +1949,7 @@ chn_resizebuf(struct pcm_channel *c, int latency,
sblkcnt = nsblkcnt;
limit = 0;
} else
- limit = sndbuf_xbytes(sndbuf_getblksz(b), b, bs) * 2;
+ limit = sndbuf_xbytes(b->blksz, b, bs) * 2;
}
if (limit > CHN_2NDBUFMAXSIZE)
@@ -2004,10 +1965,10 @@ chn_resizebuf(struct pcm_channel *c, int latency,
sblkcnt >>= 1;
}
- sblksz -= sblksz % sndbuf_getalign(bs);
+ sblksz -= sblksz % bs->align;
- if (sndbuf_getblkcnt(bs) != sblkcnt || sndbuf_getblksz(bs) != sblksz ||
- sndbuf_getsize(bs) != (sblkcnt * sblksz)) {
+ if (bs->blkcnt != sblkcnt || bs->blksz != sblksz ||
+ bs->bufsize != (sblkcnt * sblksz)) {
ret = sndbuf_remalloc(bs, sblkcnt, sblksz);
if (ret != 0) {
device_printf(c->dev, "%s(): Failed: %d %d\n",
@@ -2019,8 +1980,8 @@ chn_resizebuf(struct pcm_channel *c, int latency,
/*
* Interrupt timeout
*/
- c->timeout = ((u_int64_t)hz * sndbuf_getsize(bs)) /
- ((u_int64_t)sndbuf_getspd(bs) * sndbuf_getalign(bs));
+ c->timeout = ((u_int64_t)hz * bs->bufsize) /
+ ((u_int64_t)bs->spd * bs->align);
if (c->parentchannel != NULL)
c->timeout = min(c->timeout, c->parentchannel->timeout);
if (c->timeout < 1)
@@ -2030,7 +1991,7 @@ chn_resizebuf(struct pcm_channel *c, int latency,
* OSSv4 docs: "By default OSS will set the low water level equal
* to the fragment size which is optimal in most cases."
*/
- c->lw = sndbuf_getblksz(bs);
+ c->lw = bs->blksz;
chn_resetbuf(c);
if (snd_verbose > 3)
@@ -2039,10 +2000,10 @@ chn_resizebuf(struct pcm_channel *c, int latency,
__func__, CHN_DIRSTR(c),
(c->flags & CHN_F_VIRTUAL) ? "virtual" : "hardware",
c->timeout,
- sndbuf_getsize(b), sndbuf_getblksz(b),
- sndbuf_getblkcnt(b),
- sndbuf_getsize(bs), sndbuf_getblksz(bs),
- sndbuf_getblkcnt(bs), limit);
+ b->bufsize, b->blksz,
+ b->blkcnt,
+ bs->bufsize, bs->blksz,
+ bs->blkcnt, limit);
return 0;
}
@@ -2085,7 +2046,7 @@ chn_setparam(struct pcm_channel *c, uint32_t format, uint32_t speed)
sndbuf_setspd(c->bufhard, CHANNEL_SETSPEED(c->methods, c->devinfo,
hwspeed));
- hwspeed = sndbuf_getspd(c->bufhard);
+ hwspeed = c->bufhard->spd;
delta = (hwspeed > speed) ? (hwspeed - speed) : (speed - hwspeed);
@@ -2095,8 +2056,7 @@ chn_setparam(struct pcm_channel *c, uint32_t format, uint32_t speed)
ret = feeder_chain(c);
if (ret == 0)
- ret = CHANNEL_SETFORMAT(c->methods, c->devinfo,
- sndbuf_getfmt(c->bufhard));
+ ret = CHANNEL_SETFORMAT(c->methods, c->devinfo, c->bufhard->fmt);
if (ret == 0)
ret = chn_resizebuf(c, -2, 0, 0);
@@ -2339,7 +2299,7 @@ chn_getptr(struct pcm_channel *c)
CHN_LOCKASSERT(c);
hwptr = (CHN_STARTED(c)) ? CHANNEL_GETPTR(c->methods, c->devinfo) : 0;
- return (hwptr - (hwptr % sndbuf_getalign(c->bufhard)));
+ return (hwptr - (hwptr % c->bufhard->align));
}
struct pcmchan_caps *
diff --git a/sys/dev/sound/pcm/channel.h b/sys/dev/sound/pcm/channel.h
index fab182b22774..6415f5c88984 100644
--- a/sys/dev/sound/pcm/channel.h
+++ b/sys/dev/sound/pcm/channel.h
@@ -110,7 +110,7 @@ struct pcm_channel {
int type;
char name[CHN_NAMELEN];
char comm[MAXCOMLEN + 1];
- struct mtx *lock;
+ struct mtx lock;
int trigger;
/**
* For interrupt manipulations.
@@ -261,6 +261,7 @@ int chn_read(struct pcm_channel *c, struct uio *buf);
u_int32_t chn_start(struct pcm_channel *c, int force);
int chn_sync(struct pcm_channel *c, int threshold);
int chn_flush(struct pcm_channel *c);
+int chn_polltrigger(struct pcm_channel *c);
int chn_poll(struct pcm_channel *c, int ev, struct thread *td);
char *chn_mkname(char *buf, size_t len, struct pcm_channel *c);
@@ -297,7 +298,6 @@ int chn_oss_setorder(struct pcm_channel *, unsigned long long *);
int chn_oss_getmask(struct pcm_channel *, uint32_t *);
void chn_resetbuf(struct pcm_channel *c);
-void chn_intr_locked(struct pcm_channel *c);
void chn_intr(struct pcm_channel *c);
int chn_abort(struct pcm_channel *c);
@@ -319,12 +319,12 @@ int chn_syncdestroy(struct pcm_channel *c);
int chn_getpeaks(struct pcm_channel *c, int *lpeak, int *rpeak);
#endif
-#define CHN_LOCKOWNED(c) mtx_owned((c)->lock)
-#define CHN_LOCK(c) mtx_lock((c)->lock)
-#define CHN_UNLOCK(c) mtx_unlock((c)->lock)
-#define CHN_TRYLOCK(c) mtx_trylock((c)->lock)
-#define CHN_LOCKASSERT(c) mtx_assert((c)->lock, MA_OWNED)
-#define CHN_UNLOCKASSERT(c) mtx_assert((c)->lock, MA_NOTOWNED)
+#define CHN_LOCKOWNED(c) mtx_owned(&(c)->lock)
+#define CHN_LOCK(c) mtx_lock(&(c)->lock)
+#define CHN_UNLOCK(c) mtx_unlock(&(c)->lock)
+#define CHN_TRYLOCK(c) mtx_trylock(&(c)->lock)
+#define CHN_LOCKASSERT(c) mtx_assert(&(c)->lock, MA_OWNED)
+#define CHN_UNLOCKASSERT(c) mtx_assert(&(c)->lock, MA_NOTOWNED)
#define CHN_BROADCAST(x) cv_broadcastpri(x, PRIBIO)
@@ -408,7 +408,7 @@ enum {
#define CHN_F_RESET (CHN_F_BUSY | CHN_F_DEAD | \
CHN_F_VIRTUAL | CHN_F_HAS_VCHAN | \
- CHN_F_VCHAN_DYNAMIC | \
+ CHN_F_VCHAN_DYNAMIC | CHN_F_NBIO | \
CHN_F_PASSTHROUGH | CHN_F_EXCLUSIVE)
#define CHN_F_MMAP_INVALID (CHN_F_DEAD | CHN_F_RUNNING)
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index aa6ad4a59778..62db4592f206 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -72,8 +72,6 @@ SYSCTL_INT(_hw_snd, OID_AUTO, basename_clone, CTLFLAG_RWTUN,
#define DSP_F_READ(x) ((x) & FREAD)
#define DSP_F_WRITE(x) ((x) & FWRITE)
-#define OLDPCM_IOCTL
-
static d_open_t dsp_open;
static d_read_t dsp_read;
static d_write_t dsp_write;
@@ -81,17 +79,19 @@ static d_ioctl_t dsp_ioctl;
static d_poll_t dsp_poll;
static d_mmap_t dsp_mmap;
static d_mmap_single_t dsp_mmap_single;
+static d_kqfilter_t dsp_kqfilter;
struct cdevsw dsp_cdevsw = {
- .d_version = D_VERSION,
- .d_open = dsp_open,
- .d_read = dsp_read,
- .d_write = dsp_write,
- .d_ioctl = dsp_ioctl,
- .d_poll = dsp_poll,
- .d_mmap = dsp_mmap,
- .d_mmap_single = dsp_mmap_single,
- .d_name = "dsp",
+ .d_version = D_VERSION,
+ .d_open = dsp_open,
+ .d_read = dsp_read,
+ .d_write = dsp_write,
+ .d_ioctl = dsp_ioctl,
+ .d_poll = dsp_poll,
+ .d_kqfilter = dsp_kqfilter,
+ .d_mmap = dsp_mmap,
+ .d_mmap_single = dsp_mmap_single,
+ .d_name = "dsp",
};
static eventhandler_tag dsp_ehtag = NULL;
@@ -299,7 +299,7 @@ dsp_close(void *data)
CHN_LOCK(rdch);
chn_abort(rdch); /* won't sleep */
rdch->flags &= ~(CHN_F_RUNNING | CHN_F_MMAP |
- CHN_F_DEAD | CHN_F_EXCLUSIVE);
+ CHN_F_DEAD | CHN_F_EXCLUSIVE | CHN_F_NBIO);
chn_reset(rdch, 0, 0);
chn_release(rdch);
if (rdch->flags & CHN_F_VIRTUAL) {
@@ -323,7 +323,7 @@ dsp_close(void *data)
CHN_LOCK(wrch);
chn_flush(wrch); /* may sleep */
wrch->flags &= ~(CHN_F_RUNNING | CHN_F_MMAP |
- CHN_F_DEAD | CHN_F_EXCLUSIVE);
+ CHN_F_DEAD | CHN_F_EXCLUSIVE | CHN_F_NBIO);
chn_reset(wrch, 0, 0);
chn_release(wrch);
if (wrch->flags & CHN_F_VIRTUAL) {
@@ -462,14 +462,9 @@ static __inline int
dsp_io_ops(struct dsp_cdevpriv *priv, struct uio *buf)
{
struct snddev_info *d;
- struct pcm_channel **ch;
+ struct pcm_channel *ch;
int (*chn_io)(struct pcm_channel *, struct uio *);
- int prio, ret;
- pid_t runpid;
-
- KASSERT(buf != NULL &&
- (buf->uio_rw == UIO_READ || buf->uio_rw == UIO_WRITE),
- ("%s(): io train wreck!", __func__));
+ int ret;
d = priv->sc;
if (!DSP_REGISTERED(d))
@@ -479,53 +474,39 @@ dsp_io_ops(struct dsp_cdevpriv *priv, struct uio *buf)
switch (buf->uio_rw) {
case UIO_READ:
- prio = FREAD;
- ch = &priv->rdch;
+ ch = priv->rdch;
chn_io = chn_read;
break;
case UIO_WRITE:
- prio = FWRITE;
- ch = &priv->wrch;
+ ch = priv->wrch;
chn_io = chn_write;
break;
- default:
- panic("invalid/corrupted uio direction: %d", buf->uio_rw);
- break;
}
-
- runpid = buf->uio_td->td_proc->p_pid;
-
- dsp_lock_chans(priv, prio);
-
- if (*ch == NULL || !((*ch)->flags & CHN_F_BUSY)) {
- if (priv->rdch != NULL || priv->wrch != NULL)
- dsp_unlock_chans(priv, prio);
+ if (ch == NULL) {
PCM_GIANT_EXIT(d);
- return (EBADF);
+ return (ENXIO);
}
+ CHN_LOCK(ch);
- if (((*ch)->flags & (CHN_F_MMAP | CHN_F_DEAD)) ||
- (((*ch)->flags & CHN_F_RUNNING) && (*ch)->pid != runpid)) {
- dsp_unlock_chans(priv, prio);
+ if (!(ch->flags & CHN_F_BUSY) ||
+ (ch->flags & (CHN_F_MMAP | CHN_F_DEAD))) {
+ CHN_UNLOCK(ch);
PCM_GIANT_EXIT(d);
- return (EINVAL);
- } else if (!((*ch)->flags & CHN_F_RUNNING)) {
- (*ch)->flags |= CHN_F_RUNNING;
- (*ch)->pid = runpid;
- }
+ return (ENXIO);
+ } else if (!(ch->flags & CHN_F_RUNNING))
+ ch->flags |= CHN_F_RUNNING;
/*
* chn_read/write must give up channel lock in order to copy bytes
* from/to userland, so up the "in progress" counter to make sure
* someone else doesn't come along and muss up the buffer.
*/
- ++(*ch)->inprog;
- ret = chn_io(*ch, buf);
- --(*ch)->inprog;
-
- CHN_BROADCAST(&(*ch)->cv);
+ ch->inprog++;
+ ret = chn_io(ch, buf);
+ ch->inprog--;
- dsp_unlock_chans(priv, prio);
+ CHN_BROADCAST(&ch->cv);
+ CHN_UNLOCK(ch);
PCM_GIANT_LEAVE(d);
@@ -671,6 +652,43 @@ dsp_ioctl_channel(struct dsp_cdevpriv *priv, struct pcm_channel *ch,
return (0);
}
+#ifdef COMPAT_FREEBSD32
+typedef struct _snd_chan_param32 {
+ uint32_t play_rate;
+ uint32_t rec_rate;
+ uint32_t play_format;
+ uint32_t rec_format;
+} snd_chan_param32;
+#define AIOGFMT32 _IOC_NEWTYPE(AIOGFMT, snd_chan_param32)
+#define AIOSFMT32 _IOC_NEWTYPE(AIOSFMT, snd_chan_param32)
+
+typedef struct _snd_capabilities32 {
+ uint32_t rate_min, rate_max;
+ uint32_t formats;
+ uint32_t bufsize;
+ uint32_t mixers;
+ uint32_t inputs;
+ uint16_t left, right;
+} snd_capabilities32;
+#define AIOGCAP32 _IOC_NEWTYPE(AIOGCAP, snd_capabilities32)
+
+typedef struct audio_errinfo32
+{
+ int32_t play_underruns;
+ int32_t rec_overruns;
+ uint32_t play_ptradjust;
+ uint32_t rec_ptradjust;
+ int32_t play_errorcount;
+ int32_t rec_errorcount;
+ int32_t play_lasterror;
+ int32_t rec_lasterror;
+ int32_t play_errorparm;
+ int32_t rec_errorparm;
+ int32_t filler[16];
+} audio_errinfo32;
+#define SNDCTL_DSP_GETERROR32 _IOC_NEWTYPE(SNDCTL_DSP_GETERROR, audio_errinfo32)
+#endif
+
static int
dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct thread *td)
@@ -769,10 +787,6 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
}
switch(cmd) {
-#ifdef OLDPCM_IOCTL
- /*
- * we start with the new ioctl interface.
- */
case AIONWRITE: /* how many bytes can write ? */
if (wrch) {
CHN_LOCK(wrch);
@@ -798,13 +812,13 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
if (wrch) {
CHN_LOCK(wrch);
chn_setblocksize(wrch, 2, p->play_size);
- p->play_size = sndbuf_getblksz(wrch->bufsoft);
+ p->play_size = wrch->bufsoft->blksz;
CHN_UNLOCK(wrch);
}
if (rdch) {
CHN_LOCK(rdch);
chn_setblocksize(rdch, 2, p->rec_size);
- p->rec_size = sndbuf_getblksz(rdch->bufsoft);
+ p->rec_size = rdch->bufsoft->blksz;
CHN_UNLOCK(rdch);
}
PCM_RELEASE_QUICK(d);
@@ -816,12 +830,12 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
if (wrch) {
CHN_LOCK(wrch);
- p->play_size = sndbuf_getblksz(wrch->bufsoft);
+ p->play_size = wrch->bufsoft->blksz;
CHN_UNLOCK(wrch);
}
if (rdch) {
CHN_LOCK(rdch);
- p->rec_size = sndbuf_getblksz(rdch->bufsoft);
+ p->rec_size = rdch->bufsoft->blksz;
CHN_UNLOCK(rdch);
}
}
@@ -829,9 +843,25 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
case AIOSFMT:
case AIOGFMT:
+#ifdef COMPAT_FREEBSD32
+ case AIOSFMT32:
+ case AIOGFMT32:
+#endif
{
snd_chan_param *p = (snd_chan_param *)arg;
+#ifdef COMPAT_FREEBSD32
+ snd_chan_param32 *p32 = (snd_chan_param32 *)arg;
+ snd_chan_param param;
+
+ if (cmd == AIOSFMT32) {
+ p = &param;
+ p->play_rate = p32->play_rate;
+ p->rec_rate = p32->rec_rate;
+ p->play_format = p32->play_format;
+ p->rec_format = p32->rec_format;
+ }
+#endif
if (cmd == AIOSFMT &&
((p->play_format != 0 && p->play_rate == 0) ||
(p->rec_format != 0 && p->rec_rate == 0))) {
@@ -872,15 +902,41 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
p->rec_format = 0;
}
PCM_RELEASE_QUICK(d);
+#ifdef COMPAT_FREEBSD32
+ if (cmd == AIOSFMT32 || cmd == AIOGFMT32) {
+ p32->play_rate = p->play_rate;
+ p32->rec_rate = p->rec_rate;
+ p32->play_format = p->play_format;
+ p32->rec_format = p->rec_format;
+ }
+#endif
}
break;
case AIOGCAP: /* get capabilities */
+#ifdef COMPAT_FREEBSD32
+ case AIOGCAP32:
+#endif
{
snd_capabilities *p = (snd_capabilities *)arg;
struct pcmchan_caps *pcaps = NULL, *rcaps = NULL;
struct cdev *pdev;
-
+#ifdef COMPAT_FREEBSD32
+ snd_capabilities32 *p32 = (snd_capabilities32 *)arg;
+ snd_capabilities capabilities;
+
+ if (cmd == AIOGCAP32) {
+ p = &capabilities;
+ p->rate_min = p32->rate_min;
+ p->rate_max = p32->rate_max;
+ p->formats = p32->formats;
+ p->bufsize = p32->bufsize;
+ p->mixers = p32->mixers;
+ p->inputs = p32->inputs;
+ p->left = p32->left;
+ p->right = p32->right;
+ }
+#endif
PCM_LOCK(d);
if (rdch) {
CHN_LOCK(rdch);
@@ -894,8 +950,8 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
pcaps? pcaps->minspeed : 0);
p->rate_max = min(rcaps? rcaps->maxspeed : 1000000,
pcaps? pcaps->maxspeed : 1000000);
- p->bufsize = min(rdch? sndbuf_getsize(rdch->bufsoft) : 1000000,
- wrch? sndbuf_getsize(wrch->bufsoft) : 1000000);
+ p->bufsize = min(rdch? rdch->bufsoft->bufsize : 1000000,
+ wrch? wrch->bufsoft->bufsize : 1000000);
/* XXX bad on sb16 */
p->formats = (rdch? chn_getformats(rdch) : 0xffffffff) &
(wrch? chn_getformats(wrch) : 0xffffffff);
@@ -913,6 +969,18 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
if (rdch)
CHN_UNLOCK(rdch);
PCM_UNLOCK(d);
+#ifdef COMPAT_FREEBSD32
+ if (cmd == AIOGCAP32) {
+ p32->rate_min = p->rate_min;
+ p32->rate_max = p->rate_max;
+ p32->formats = p->formats;
+ p32->bufsize = p->bufsize;
+ p32->mixers = p->mixers;
+ p32->inputs = p->inputs;
+ p32->left = p->left;
+ p32->right = p->right;
+ }
+#endif
}
break;
@@ -935,10 +1003,6 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
printf("AIOSYNC chan 0x%03lx pos %lu unimplemented\n",
((snd_sync_parm *)arg)->chan, ((snd_sync_parm *)arg)->pos);
break;
-#endif
- /*
- * here follow the standard ioctls (filio.h etc.)
- */
case FIONREAD: /* get # bytes to read */
if (rdch) {
CHN_LOCK(rdch);
@@ -977,16 +1041,11 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
}
break;
- /*
- * Finally, here is the linux-compatible ioctl interface
- */
-#define THE_REAL_SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int)
- case THE_REAL_SNDCTL_DSP_GETBLKSIZE:
case SNDCTL_DSP_GETBLKSIZE:
chn = wrch ? wrch : rdch;
if (chn) {
CHN_LOCK(chn);
- *arg_i = sndbuf_getblksz(chn->bufsoft);
+ *arg_i = chn->bufsoft->blksz;
CHN_UNLOCK(chn);
} else {
*arg_i = 0;
@@ -1224,8 +1283,8 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
if (rdch) {
CHN_LOCK(rdch);
ret = chn_setblocksize(rdch, maxfrags, fragsz);
- r_maxfrags = sndbuf_getblkcnt(rdch->bufsoft);
- r_fragsz = sndbuf_getblksz(rdch->bufsoft);
+ r_maxfrags = rdch->bufsoft->blkcnt;
+ r_fragsz = rdch->bufsoft->blksz;
CHN_UNLOCK(rdch);
} else {
r_maxfrags = maxfrags;
@@ -1234,8 +1293,8 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
if (wrch && ret == 0) {
CHN_LOCK(wrch);
ret = chn_setblocksize(wrch, maxfrags, fragsz);
- maxfrags = sndbuf_getblkcnt(wrch->bufsoft);
- fragsz = sndbuf_getblksz(wrch->bufsoft);
+ maxfrags = wrch->bufsoft->blkcnt;
+ fragsz = wrch->bufsoft->blksz;
CHN_UNLOCK(wrch);
} else { /* use whatever came from the read channel */
maxfrags = r_maxfrags;
@@ -1261,9 +1320,9 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
CHN_LOCK(rdch);
a->bytes = sndbuf_getready(bs);
- a->fragments = a->bytes / sndbuf_getblksz(bs);
- a->fragstotal = sndbuf_getblkcnt(bs);
- a->fragsize = sndbuf_getblksz(bs);
+ a->fragments = a->bytes / bs->blksz;
+ a->fragstotal = bs->blkcnt;
+ a->fragsize = bs->blksz;
CHN_UNLOCK(rdch);
} else
ret = EINVAL;
@@ -1279,9 +1338,9 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
CHN_LOCK(wrch);
a->bytes = sndbuf_getfree(bs);
- a->fragments = a->bytes / sndbuf_getblksz(bs);
- a->fragstotal = sndbuf_getblkcnt(bs);
- a->fragsize = sndbuf_getblksz(bs);
+ a->fragments = a->bytes / bs->blksz;
+ a->fragstotal = bs->blkcnt;
+ a->fragsize = bs->blksz;
CHN_UNLOCK(wrch);
} else
ret = EINVAL;
@@ -1295,7 +1354,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct snd_dbuf *bs = rdch->bufsoft;
CHN_LOCK(rdch);
- a->bytes = sndbuf_gettotal(bs);
+ a->bytes = bs->total;
a->blocks = sndbuf_getblocks(bs) - rdch->blocks;
a->ptr = sndbuf_getfreeptr(bs);
rdch->blocks = sndbuf_getblocks(bs);
@@ -1312,7 +1371,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct snd_dbuf *bs = wrch->bufsoft;
CHN_LOCK(wrch);
- a->bytes = sndbuf_gettotal(bs);
+ a->bytes = bs->total;
a->blocks = sndbuf_getblocks(bs) - wrch->blocks;
a->ptr = sndbuf_getreadyptr(bs);
wrch->blocks = sndbuf_getblocks(bs);
@@ -1538,7 +1597,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct snd_dbuf *bs;
CHN_LOCK(wrch);
while (wrch->inprog != 0)
- cv_wait(&wrch->cv, wrch->lock);
+ cv_wait(&wrch->cv, &wrch->lock);
bs = wrch->bufsoft;
if ((bs->shadbuf != NULL) && (sndbuf_getready(bs) > 0)) {
bs->sl = sndbuf_getready(bs);
@@ -1562,7 +1621,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct snd_dbuf *bs;
CHN_LOCK(wrch);
while (wrch->inprog != 0)
- cv_wait(&wrch->cv, wrch->lock);
+ cv_wait(&wrch->cv, &wrch->lock);
bs = wrch->bufsoft;
if ((bs->shadbuf != NULL) && (bs->sl > 0)) {
sndbuf_softreset(bs);
@@ -1599,8 +1658,8 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
CHN_LOCK(chn);
bs = chn->bufsoft;
- oc->samples = sndbuf_gettotal(bs) / sndbuf_getalign(bs);
- oc->fifo_samples = sndbuf_getready(bs) / sndbuf_getalign(bs);
+ oc->samples = bs->total / bs->align;
+ oc->fifo_samples = sndbuf_getready(bs) / bs->align;
CHN_UNLOCK(chn);
}
break;
@@ -1635,6 +1694,9 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
break;
case SNDCTL_DSP_GETERROR:
+#ifdef COMPAT_FREEBSD32
+ case SNDCTL_DSP_GETERROR32:
+#endif
/*
* OSSv4 docs: "All errors and counters will automatically be
* cleared to zeroes after the call so each call will return only
@@ -1644,6 +1706,14 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
*/
{
audio_errinfo *ei = (audio_errinfo *)arg;
+#ifdef COMPAT_FREEBSD32
+ audio_errinfo errinfo;
+ audio_errinfo32 *ei32 = (audio_errinfo32 *)arg;
+
+ if (cmd == SNDCTL_DSP_GETERROR32) {
+ ei = &errinfo;
+ }
+#endif
bzero((void *)ei, sizeof(*ei));
@@ -1659,6 +1729,21 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
rdch->xruns = 0;
CHN_UNLOCK(rdch);
}
+#ifdef COMPAT_FREEBSD32
+ if (cmd == SNDCTL_DSP_GETERROR32) {
+ bzero((void *)ei32, sizeof(*ei32));
+ ei32->play_underruns = ei->play_underruns;
+ ei32->rec_overruns = ei->rec_overruns;
+ ei32->play_ptradjust = ei->play_ptradjust;
+ ei32->rec_ptradjust = ei->rec_ptradjust;
+ ei32->play_errorcount = ei->play_errorcount;
+ ei32->rec_errorcount = ei->rec_errorcount;
+ ei32->play_lasterror = ei->play_lasterror;
+ ei32->rec_lasterror = ei->rec_lasterror;
+ ei32->play_errorparm = ei->play_errorparm;
+ ei32->rec_errorparm = ei->rec_errorparm;
+ }
+#endif
}
break;
@@ -1875,7 +1960,7 @@ dsp_mmap_single(struct cdev *i_dev, vm_ooffset_t *offset,
c = ((nprot & PROT_WRITE) != 0) ? wrch : rdch;
if (c == NULL || (c->flags & CHN_F_MMAP_INVALID) ||
- (*offset + size) > sndbuf_getallocsize(c->bufsoft) ||
+ (*offset + size) > c->bufsoft->allocsize ||
(wrch != NULL && (wrch->flags & CHN_F_MMAP_INVALID)) ||
(rdch != NULL && (rdch->flags & CHN_F_MMAP_INVALID))) {
dsp_unlock_chans(priv, FREAD | FWRITE);
@@ -2845,6 +2930,86 @@ dsp_oss_getchannelmask(struct pcm_channel *wrch, struct pcm_channel *rdch,
return (ret);
}
+static void
+dsp_kqdetach(struct knote *kn)
+{
+ struct pcm_channel *ch = kn->kn_hook;
+
+ if (ch == NULL)
+ return;
+ CHN_LOCK(ch);
+ knlist_remove(&ch->bufsoft->sel.si_note, kn, 1);
+ CHN_UNLOCK(ch);
+}
+
+static int
+dsp_kqevent(struct knote *kn, long hint)
+{
+ struct pcm_channel *ch = kn->kn_hook;
+
+ CHN_LOCKASSERT(ch);
+ if (ch->flags & CHN_F_DEAD) {
+ kn->kn_flags |= EV_EOF;
+ return (1);
+ }
+ kn->kn_data = 0;
+ if (chn_polltrigger(ch)) {
+ if (kn->kn_filter == EVFILT_READ)
+ kn->kn_data = sndbuf_getready(ch->bufsoft);
+ else
+ kn->kn_data = sndbuf_getfree(ch->bufsoft);
+ }
+
+ return (kn->kn_data > 0);
+}
+
+static const struct filterops dsp_filtops = {
+ .f_isfd = 1,
+ .f_detach = dsp_kqdetach,
+ .f_event = dsp_kqevent,
+};
+
+static int
+dsp_kqfilter(struct cdev *dev, struct knote *kn)
+{
+ struct dsp_cdevpriv *priv;
+ struct snddev_info *d;
+ struct pcm_channel *ch;
+ int err = 0;
+
+ if ((err = devfs_get_cdevpriv((void **)&priv)) != 0)
+ return (err);
+
+ d = priv->sc;
+ if (!DSP_REGISTERED(d))
+ return (EBADF);
+ PCM_GIANT_ENTER(d);
+ switch (kn->kn_filter) {
+ case EVFILT_READ:
+ ch = priv->rdch;
+ break;
+ case EVFILT_WRITE:
+ ch = priv->wrch;
+ break;
+ default:
+ kn->kn_hook = NULL;
+ err = EINVAL;
+ ch = NULL;
+ break;
+ }
+ if (ch != NULL) {
+ kn->kn_fop = &dsp_filtops;
+ CHN_LOCK(ch);
+ knlist_add(&ch->bufsoft->sel.si_note, kn, 1);
+ CHN_UNLOCK(ch);
+ kn->kn_hook = ch;
+ } else
+ err = EINVAL;
+ PCM_GIANT_LEAVE(d);
+
+ return (err);
+}
+
#ifdef OSSV4_EXPERIMENT
/**
* @brief Retrieve an audio device's label
diff --git a/sys/dev/sound/pcm/feeder.c b/sys/dev/sound/pcm/feeder.c
index af3ada441e48..fa4e4e16a133 100644
--- a/sys/dev/sound/pcm/feeder.c
+++ b/sys/dev/sound/pcm/feeder.c
@@ -36,94 +36,25 @@
#endif
#include <dev/sound/pcm/sound.h>
-#include <dev/sound/pcm/vchan.h>
#include "feeder_if.h"
static MALLOC_DEFINE(M_FEEDER, "feeder", "pcm feeder");
-#define MAXFEEDERS 256
-
-struct feedertab_entry {
- SLIST_ENTRY(feedertab_entry) link;
- struct feeder_class *feederclass;
- struct pcm_feederdesc *desc;
-
- int idx;
-};
-static SLIST_HEAD(, feedertab_entry) feedertab;
-static int feedercnt = 0;
-
-/*****************************************************************************/
-
-static void
-feeder_register_root(void *p)
-{
- struct feeder_class *fc = p;
- struct feedertab_entry *fte;
-
- MPASS(feedercnt == 0);
- KASSERT(fc->desc == NULL, ("first feeder not root: %s", fc->name));
-
- SLIST_INIT(&feedertab);
- fte = malloc(sizeof(*fte), M_FEEDER, M_WAITOK | M_ZERO);
- fte->feederclass = fc;
- fte->desc = NULL;
- fte->idx = feedercnt;
- SLIST_INSERT_HEAD(&feedertab, fte, link);
- feedercnt++;
-}
+static SLIST_HEAD(, feeder_class) feedertab = SLIST_HEAD_INITIALIZER(feedertab);
void
feeder_register(void *p)
{
struct feeder_class *fc = p;
- struct feedertab_entry *fte;
- int i;
- KASSERT(fc->desc != NULL, ("feeder '%s' has no descriptor", fc->name));
-
- /*
- * beyond this point failure is non-fatal but may result in some
- * translations being unavailable
- */
- i = 0;
- while ((feedercnt < MAXFEEDERS) && (fc->desc[i].type > 0)) {
- fte = malloc(sizeof(*fte), M_FEEDER, M_WAITOK | M_ZERO);
- fte->feederclass = fc;
- fte->desc = &fc->desc[i];
- fte->idx = feedercnt;
- fte->desc->idx = feedercnt;
- SLIST_INSERT_HEAD(&feedertab, fte, link);
- i++;
- }
- feedercnt++;
- if (feedercnt >= MAXFEEDERS) {
- printf("MAXFEEDERS (%d >= %d) exceeded\n",
- feedercnt, MAXFEEDERS);
- }
+ SLIST_INSERT_HEAD(&feedertab, fc, link);
}
static void
-feeder_unregisterall(void *p)
+feeder_unregisterall(void *p __unused)
{
- struct feedertab_entry *fte, *next;
-
- next = SLIST_FIRST(&feedertab);
- while (next != NULL) {
- fte = next;
- next = SLIST_NEXT(fte, link);
- free(fte, M_FEEDER);
- }
-}
-
-static int
-cmpdesc(struct pcm_feederdesc *n, struct pcm_feederdesc *m)
-{
- return ((n->type == m->type) &&
- ((n->in == 0) || (n->in == m->in)) &&
- ((n->out == 0) || (n->out == m->out)) &&
- (n->flags == m->flags));
+ SLIST_INIT(&feedertab);
}
static void
@@ -143,21 +74,10 @@ feeder_create(struct feeder_class *fc, struct pcm_feederdesc *desc)
if (f == NULL)
return NULL;
- f->data = fc->data;
- f->source = NULL;
- f->parent = NULL;
f->class = fc;
f->desc = &(f->desc_static);
-
- if (desc) {
+ if (desc != NULL)
*(f->desc) = *desc;
- } else {
- f->desc->type = FEEDER_ROOT;
- f->desc->in = 0;
- f->desc->out = 0;
- f->desc->flags = 0;
- f->desc->idx = 0;
- }
err = FEEDER_INIT(f);
if (err) {
@@ -171,17 +91,15 @@ feeder_create(struct feeder_class *fc, struct pcm_feederdesc *desc)
}
struct feeder_class *
-feeder_getclass(struct pcm_feederdesc *desc)
+feeder_getclass(u_int32_t type)
{
- struct feedertab_entry *fte;
+ struct feeder_class *fc;
- SLIST_FOREACH(fte, &feedertab, link) {
- if ((desc == NULL) && (fte->desc == NULL))
- return fte->feederclass;
- if ((fte->desc != NULL) && (desc != NULL) && cmpdesc(desc, fte->desc))
- return fte->feederclass;
+ SLIST_FOREACH(fc, &feedertab, link) {
+ if (fc->type == type)
+ return (fc);
}
- return NULL;
+ return (NULL);
}
int
@@ -221,7 +139,7 @@ feeder_find(struct pcm_channel *c, u_int32_t type)
f = c->feeder;
while (f != NULL) {
- if (f->desc->type == type)
+ if (f->class->type == type)
return f;
f = f->source;
}
@@ -386,22 +304,6 @@ snd_fmtbest(u_int32_t fmt, u_int32_t *fmts)
return best2;
}
-void
-feeder_printchain(struct pcm_feeder *head)
-{
- struct pcm_feeder *f;
-
- printf("feeder chain (head @%p)\n", head);
- f = head;
- while (f != NULL) {
- printf("%s/%d @ %p\n", f->class->name, f->desc->idx, f);
- f = f->source;
- }
- printf("[end]\n\n");
-}
-
-/*****************************************************************************/
-
static int
feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u_int32_t count, void *source)
{
@@ -433,9 +335,7 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u
offset, count, l, ch->feedcount);
if (ch->feedcount == 1) {
- memset(buffer,
- sndbuf_zerodata(sndbuf_getfmt(src)),
- offset);
+ memset(buffer, sndbuf_zerodata(src->fmt), offset);
if (l > 0)
sndbuf_dispose(src, buffer + offset, l);
else
@@ -443,9 +343,7 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u
} else {
if (l > 0)
sndbuf_dispose(src, buffer, l);
- memset(buffer + l,
- sndbuf_zerodata(sndbuf_getfmt(src)),
- offset);
+ memset(buffer + l, sndbuf_zerodata(src->fmt), offset);
if (!(ch->flags & CHN_F_CLOSING))
ch->xruns++;
}
@@ -463,13 +361,12 @@ static struct feeder_class feeder_root_class = {
.name = "feeder_root",
.methods = feeder_root_methods,
.size = sizeof(struct pcm_feeder),
- .desc = NULL,
- .data = NULL,
+ .type = FEEDER_ROOT,
};
/*
* Register the root feeder first so that pcm_addchan() and subsequent
* functions can use it.
*/
-SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register_root,
+SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register,
&feeder_root_class);
SYSUNINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_unregisterall, NULL);
diff --git a/sys/dev/sound/pcm/feeder.h b/sys/dev/sound/pcm/feeder.h
index 60b8280e59ef..f1c96d86fda0 100644
--- a/sys/dev/sound/pcm/feeder.h
+++ b/sys/dev/sound/pcm/feeder.h
@@ -27,17 +27,25 @@
* SUCH DAMAGE.
*/
+enum feeder_type {
+ FEEDER_ROOT,
+ FEEDER_FORMAT,
+ FEEDER_MIXER,
+ FEEDER_RATE,
+ FEEDER_EQ,
+ FEEDER_VOLUME,
+ FEEDER_MATRIX,
+ FEEDER_LAST,
+};
+
struct pcm_feederdesc {
- u_int32_t type;
u_int32_t in, out;
- u_int32_t flags;
- int idx;
};
struct feeder_class {
KOBJ_CLASS_FIELDS;
- struct pcm_feederdesc *desc;
- void *data;
+ enum feeder_type type;
+ SLIST_ENTRY(feeder_class) link;
};
struct pcm_feeder {
@@ -51,7 +59,7 @@ struct pcm_feeder {
};
void feeder_register(void *p);
-struct feeder_class *feeder_getclass(struct pcm_feederdesc *desc);
+struct feeder_class *feeder_getclass(u_int32_t type);
u_int32_t snd_fmtscore(u_int32_t fmt);
u_int32_t snd_fmtbestbit(u_int32_t fmt, u_int32_t *fmts);
@@ -62,31 +70,18 @@ int feeder_add(struct pcm_channel *c, struct feeder_class *fc,
struct pcm_feederdesc *desc);
void feeder_remove(struct pcm_channel *c);
struct pcm_feeder *feeder_find(struct pcm_channel *c, u_int32_t type);
-void feeder_printchain(struct pcm_feeder *head);
int feeder_chain(struct pcm_channel *);
-#define FEEDER_DECLARE(feeder, pdata) \
+#define FEEDER_DECLARE(feeder, ctype) \
static struct feeder_class feeder ## _class = { \
.name = #feeder, \
.methods = feeder ## _methods, \
.size = sizeof(struct pcm_feeder), \
- .desc = feeder ## _desc, \
- .data = pdata, \
+ .type = ctype, \
}; \
SYSINIT(feeder, SI_SUB_DRIVERS, SI_ORDER_ANY, feeder_register, \
&feeder ## _class)
-enum {
- FEEDER_ROOT,
- FEEDER_FORMAT,
- FEEDER_MIXER,
- FEEDER_RATE,
- FEEDER_EQ,
- FEEDER_VOLUME,
- FEEDER_MATRIX,
- FEEDER_LAST,
-};
-
/* feeder_format */
enum {
FEEDFORMAT_CHANNELS
diff --git a/sys/dev/sound/pcm/feeder_chain.c b/sys/dev/sound/pcm/feeder_chain.c
index 56de32441de7..32dd4ca14faf 100644
--- a/sys/dev/sound/pcm/feeder_chain.c
+++ b/sys/dev/sound/pcm/feeder_chain.c
@@ -144,12 +144,10 @@ feeder_build_format(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
int ret;
desc = &(cdesc->desc);
- desc->type = FEEDER_FORMAT;
desc->in = 0;
desc->out = 0;
- desc->flags = 0;
- fc = feeder_getclass(desc);
+ fc = feeder_getclass(FEEDER_FORMAT);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_format\n", __func__);
@@ -217,12 +215,10 @@ feeder_build_rate(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
return (ret);
desc = &(cdesc->desc);
- desc->type = FEEDER_RATE;
desc->in = 0;
desc->out = 0;
- desc->flags = 0;
- fc = feeder_getclass(desc);
+ fc = feeder_getclass(FEEDER_RATE);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_rate\n", __func__);
@@ -295,12 +291,10 @@ feeder_build_matrix(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
return (ret);
desc = &(cdesc->desc);
- desc->type = FEEDER_MATRIX;
desc->in = 0;
desc->out = 0;
- desc->flags = 0;
- fc = feeder_getclass(desc);
+ fc = feeder_getclass(FEEDER_MATRIX);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_matrix\n", __func__);
@@ -352,12 +346,10 @@ feeder_build_volume(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
return (ret);
desc = &(cdesc->desc);
- desc->type = FEEDER_VOLUME;
desc->in = 0;
desc->out = 0;
- desc->flags = 0;
- fc = feeder_getclass(desc);
+ fc = feeder_getclass(FEEDER_VOLUME);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_volume\n", __func__);
@@ -420,12 +412,10 @@ feeder_build_eq(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
return (ret);
desc = &(cdesc->desc);
- desc->type = FEEDER_EQ;
desc->in = 0;
desc->out = 0;
- desc->flags = 0;
- fc = feeder_getclass(desc);
+ fc = feeder_getclass(FEEDER_EQ);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_eq\n", __func__);
@@ -467,7 +457,7 @@ feeder_build_root(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
struct feeder_class *fc;
int ret;
- fc = feeder_getclass(NULL);
+ fc = feeder_getclass(FEEDER_ROOT);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_root\n", __func__);
@@ -500,12 +490,10 @@ feeder_build_mixer(struct pcm_channel *c, struct feeder_chain_desc *cdesc)
int ret;
desc = &(cdesc->desc);
- desc->type = FEEDER_MIXER;
desc->in = 0;
desc->out = 0;
- desc->flags = 0;
- fc = feeder_getclass(desc);
+ fc = feeder_getclass(FEEDER_MIXER);
if (fc == NULL) {
device_printf(c->dev,
"%s(): can't find feeder_mixer\n", __func__);
@@ -695,11 +683,11 @@ feeder_chain(struct pcm_channel *c)
cdesc.origin.rate = c->speed;
cdesc.target.afmt = hwfmt;
cdesc.target.matrix = hwmatrix;
- cdesc.target.rate = sndbuf_getspd(c->bufhard);
+ cdesc.target.rate = c->bufhard->spd;
} else {
cdesc.origin.afmt = hwfmt;
cdesc.origin.matrix = hwmatrix;
- cdesc.origin.rate = sndbuf_getspd(c->bufhard);
+ cdesc.origin.rate = c->bufhard->spd;
cdesc.target.afmt = softfmt;
cdesc.target.matrix = softmatrix;
cdesc.target.rate = c->speed;
diff --git a/sys/dev/sound/pcm/feeder_eq.c b/sys/dev/sound/pcm/feeder_eq.c
index 23e27b922486..3838328fb0bb 100644
--- a/sys/dev/sound/pcm/feeder_eq.c
+++ b/sys/dev/sound/pcm/feeder_eq.c
@@ -419,11 +419,6 @@ feed_eq_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
return (dst - b);
}
-static struct pcm_feederdesc feeder_eq_desc[] = {
- { FEEDER_EQ, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 }
-};
-
static kobj_method_t feeder_eq_methods[] = {
KOBJMETHOD(feeder_init, feed_eq_init),
KOBJMETHOD(feeder_free, feed_eq_free),
@@ -432,7 +427,7 @@ static kobj_method_t feeder_eq_methods[] = {
KOBJMETHOD_END
};
-FEEDER_DECLARE(feeder_eq, NULL);
+FEEDER_DECLARE(feeder_eq, FEEDER_EQ);
static int32_t
feed_eq_scan_preamp_arg(const char *s)
diff --git a/sys/dev/sound/pcm/feeder_format.c b/sys/dev/sound/pcm/feeder_format.c
index 0feac43374b8..d2c4d7618ab4 100644
--- a/sys/dev/sound/pcm/feeder_format.c
+++ b/sys/dev/sound/pcm/feeder_format.c
@@ -172,11 +172,6 @@ feed_format_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
return (dst - b);
}
-static struct pcm_feederdesc feeder_format_desc[] = {
- { FEEDER_FORMAT, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 }
-};
-
static kobj_method_t feeder_format_methods[] = {
KOBJMETHOD(feeder_init, feed_format_init),
KOBJMETHOD(feeder_free, feed_format_free),
@@ -185,4 +180,4 @@ static kobj_method_t feeder_format_methods[] = {
KOBJMETHOD_END
};
-FEEDER_DECLARE(feeder_format, NULL);
+FEEDER_DECLARE(feeder_format, FEEDER_FORMAT);
diff --git a/sys/dev/sound/pcm/feeder_matrix.c b/sys/dev/sound/pcm/feeder_matrix.c
index 43258a311d82..2c7a3e04690d 100644
--- a/sys/dev/sound/pcm/feeder_matrix.c
+++ b/sys/dev/sound/pcm/feeder_matrix.c
@@ -398,11 +398,6 @@ feed_matrix_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
return (dst - b);
}
-static struct pcm_feederdesc feeder_matrix_desc[] = {
- { FEEDER_MATRIX, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 }
-};
-
static kobj_method_t feeder_matrix_methods[] = {
KOBJMETHOD(feeder_init, feed_matrix_init),
KOBJMETHOD(feeder_free, feed_matrix_free),
@@ -410,7 +405,7 @@ static kobj_method_t feeder_matrix_methods[] = {
KOBJMETHOD_END
};
-FEEDER_DECLARE(feeder_matrix, NULL);
+FEEDER_DECLARE(feeder_matrix, FEEDER_MATRIX);
/* External */
int
@@ -418,7 +413,7 @@ feeder_matrix_setup(struct pcm_feeder *f, struct pcmchan_matrix *m_in,
struct pcmchan_matrix *m_out)
{
- if (f == NULL || f->desc == NULL || f->desc->type != FEEDER_MATRIX ||
+ if (f == NULL || f->desc == NULL || f->class->type != FEEDER_MATRIX ||
f->data == NULL)
return (EINVAL);
diff --git a/sys/dev/sound/pcm/feeder_mixer.c b/sys/dev/sound/pcm/feeder_mixer.c
index b6b81ad9a51c..10de42ba727a 100644
--- a/sys/dev/sound/pcm/feeder_mixer.c
+++ b/sys/dev/sound/pcm/feeder_mixer.c
@@ -145,8 +145,8 @@ feed_mixer_rec(struct pcm_channel *c)
b = c->bufsoft;
b->rp = 0;
b->rl = 0;
- cnt = sndbuf_getsize(b);
- maxfeed = SND_FXROUND(SND_FXDIV_MAX, sndbuf_getalign(b));
+ cnt = b->bufsize;
+ maxfeed = SND_FXROUND(SND_FXDIV_MAX, b->align);
do {
cnt = FEEDER_FEED(c->feeder->source, c, b->tmpbuf,
@@ -158,7 +158,7 @@ feed_mixer_rec(struct pcm_channel *c)
} while (cnt != 0);
/* Not enough data */
- if (b->rl < sndbuf_getalign(b)) {
+ if (b->rl < b->align) {
b->rl = 0;
return (0);
}
@@ -187,11 +187,11 @@ feed_mixer_rec(struct pcm_channel *c)
if (ch->flags & CHN_F_MMAP)
sndbuf_dispose(bs, NULL, sndbuf_getready(bs));
cnt = sndbuf_getfree(bs);
- if (cnt < sndbuf_getalign(bs)) {
+ if (cnt < bs->align) {
CHN_UNLOCK(ch);
continue;
}
- maxfeed = SND_FXROUND(SND_FXDIV_MAX, sndbuf_getalign(bs));
+ maxfeed = SND_FXROUND(SND_FXDIV_MAX, bs->align);
do {
cnt = FEEDER_FEED(ch->feeder, ch, bs->tmpbuf,
min(cnt, maxfeed), b);
@@ -244,7 +244,7 @@ feed_mixer_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
if (c->direction == PCMDIR_REC)
return (feed_mixer_rec(c));
- sz = sndbuf_getsize(src);
+ sz = src->bufsize;
if (sz < count)
count = sz;
@@ -260,7 +260,7 @@ feed_mixer_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
* list of children and calling mixer function to mix count bytes from
* each into our destination buffer, b.
*/
- tmp = sndbuf_getbuf(src);
+ tmp = src->buf;
rcnt = 0;
mcnt = 0;
passthrough = 0; /* 'passthrough' / 'exclusive' marker */
@@ -358,11 +358,6 @@ feed_mixer_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
return (rcnt);
}
-static struct pcm_feederdesc feeder_mixer_desc[] = {
- { FEEDER_MIXER, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 }
-};
-
static kobj_method_t feeder_mixer_methods[] = {
KOBJMETHOD(feeder_init, feed_mixer_init),
KOBJMETHOD(feeder_free, feed_mixer_free),
@@ -371,4 +366,4 @@ static kobj_method_t feeder_mixer_methods[] = {
KOBJMETHOD_END
};
-FEEDER_DECLARE(feeder_mixer, NULL);
+FEEDER_DECLARE(feeder_mixer, FEEDER_MIXER);
diff --git a/sys/dev/sound/pcm/feeder_rate.c b/sys/dev/sound/pcm/feeder_rate.c
index 9c29142b9d6b..c2c232a97177 100644
--- a/sys/dev/sound/pcm/feeder_rate.c
+++ b/sys/dev/sound/pcm/feeder_rate.c
@@ -1705,11 +1705,6 @@ z_resampler_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
return (count - left);
}
-static struct pcm_feederdesc feeder_rate_desc[] = {
- { FEEDER_RATE, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
-};
-
static kobj_method_t feeder_rate_methods[] = {
KOBJMETHOD(feeder_init, z_resampler_init),
KOBJMETHOD(feeder_free, z_resampler_free),
@@ -1719,4 +1714,4 @@ static kobj_method_t feeder_rate_methods[] = {
KOBJMETHOD_END
};
-FEEDER_DECLARE(feeder_rate, NULL);
+FEEDER_DECLARE(feeder_rate, FEEDER_RATE);
diff --git a/sys/dev/sound/pcm/feeder_volume.c b/sys/dev/sound/pcm/feeder_volume.c
index ddcbf29804f3..101cc7ba003b 100644
--- a/sys/dev/sound/pcm/feeder_volume.c
+++ b/sys/dev/sound/pcm/feeder_volume.c
@@ -306,11 +306,6 @@ feed_volume_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
return (dst - b);
}
-static struct pcm_feederdesc feeder_volume_desc[] = {
- { FEEDER_VOLUME, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 }
-};
-
static kobj_method_t feeder_volume_methods[] = {
KOBJMETHOD(feeder_init, feed_volume_init),
KOBJMETHOD(feeder_free, feed_volume_free),
@@ -319,7 +314,7 @@ static kobj_method_t feeder_volume_methods[] = {
KOBJMETHOD_END
};
-FEEDER_DECLARE(feeder_volume, NULL);
+FEEDER_DECLARE(feeder_volume, FEEDER_VOLUME);
/* Extern */
@@ -337,7 +332,7 @@ feeder_volume_apply_matrix(struct pcm_feeder *f, struct pcmchan_matrix *m)
struct feed_volume_info *info;
uint32_t i;
- if (f == NULL || f->desc == NULL || f->desc->type != FEEDER_VOLUME ||
+ if (f == NULL || f->desc == NULL || f->class->type != FEEDER_VOLUME ||
f->data == NULL || m == NULL || m->channels < SND_CHN_MIN ||
m->channels > SND_CHN_MAX)
return (EINVAL);
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
index f281dff36248..55ce9596dde9 100644
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -63,13 +63,8 @@ struct snd_mixer {
u_int32_t child[32];
u_int8_t realdev[32];
char name[MIXER_NAMELEN];
- struct mtx *lock;
+ struct mtx lock;
oss_mixer_enuminfo enuminfo;
- /**
- * Counter is incremented when applications change any of this
- * mixer's controls. A change in value indicates that persistent
- * mixer applications should update their displays.
- */
int modify_counter;
};
@@ -131,12 +126,12 @@ mixer_lookup(char *devname)
#define MIXER_SET_UNLOCK(x, y) do { \
if ((y) != 0) \
- snd_mtxunlock((x)->lock); \
+ mtx_unlock(&(x)->lock); \
} while (0)
#define MIXER_SET_LOCK(x, y) do { \
if ((y) != 0) \
- snd_mtxlock((x)->lock); \
+ mtx_lock(&(x)->lock); \
} while (0)
static int
@@ -149,12 +144,12 @@ mixer_set_softpcmvol(struct snd_mixer *m, struct snddev_info *d,
if (!PCM_REGISTERED(d))
return (EINVAL);
- if (mtx_owned(m->lock))
+ if (mtx_owned(&m->lock))
dropmtx = 1;
else
dropmtx = 0;
- if (!(d->flags & SD_F_MPSAFE) || mtx_owned(d->lock) != 0)
+ if (!(d->flags & SD_F_MPSAFE) || mtx_owned(&d->lock) != 0)
acquiremtx = 0;
else
acquiremtx = 1;
@@ -202,12 +197,12 @@ mixer_set_eq(struct snd_mixer *m, struct snddev_info *d,
if (!PCM_REGISTERED(d))
return (EINVAL);
- if (mtx_owned(m->lock))
+ if (mtx_owned(&m->lock))
dropmtx = 1;
else
dropmtx = 0;
- if (!(d->flags & SD_F_MPSAFE) || mtx_owned(d->lock) != 0)
+ if (!(d->flags & SD_F_MPSAFE) || mtx_owned(&d->lock) != 0)
acquiremtx = 0;
else
acquiremtx = 1;
@@ -258,7 +253,7 @@ mixer_set(struct snd_mixer *m, u_int dev, u_int32_t muted, u_int lev)
return (-1);
/* It is safe to drop this mutex due to Giant. */
- if (!(d->flags & SD_F_MPSAFE) && mtx_owned(m->lock) != 0)
+ if (!(d->flags & SD_F_MPSAFE) && mtx_owned(&m->lock) != 0)
dropmtx = 1;
else
dropmtx = 0;
@@ -372,7 +367,7 @@ mixer_setrecsrc(struct snd_mixer *mixer, u_int32_t src)
d = device_get_softc(mixer->dev);
if (d == NULL)
return -1;
- if (!(d->flags & SD_F_MPSAFE) && mtx_owned(mixer->lock) != 0)
+ if (!(d->flags & SD_F_MPSAFE) && mtx_owned(&mixer->lock) != 0)
dropmtx = 1;
else
dropmtx = 0;
@@ -609,14 +604,6 @@ mix_getparent(struct snd_mixer *m, u_int32_t dev)
}
u_int32_t
-mix_getchild(struct snd_mixer *m, u_int32_t dev)
-{
- if (m == NULL || dev >= SOUND_MIXER_NRDEVICES)
- return 0;
- return m->child[dev];
-}
-
-u_int32_t
mix_getdevs(struct snd_mixer *m)
{
return m->devs;
@@ -660,8 +647,8 @@ mixer_obj_create(device_t dev, kobj_class_t cls, void *devinfo,
strlcat(m->name, ":", sizeof(m->name));
strlcat(m->name, desc, sizeof(m->name));
}
- m->lock = snd_mtxcreate(m->name, (type == MIXER_TYPE_PRIMARY) ?
- "primary pcm mixer" : "secondary pcm mixer");
+ mtx_init(&m->lock, m->name, (type == MIXER_TYPE_PRIMARY) ?
+ "primary pcm mixer" : "secondary pcm mixer", MTX_DEF);
m->type = type;
m->devinfo = devinfo;
m->busy = 0;
@@ -673,8 +660,8 @@ mixer_obj_create(device_t dev, kobj_class_t cls, void *devinfo,
}
if (MIXER_INIT(m)) {
- snd_mtxlock(m->lock);
- snd_mtxfree(m->lock);
+ mtx_lock(&m->lock);
+ mtx_destroy(&m->lock);
kobj_delete((kobj_t)m, M_MIXER);
return (NULL);
}
@@ -693,7 +680,7 @@ mixer_delete(struct snd_mixer *m)
MIXER_UNINIT(m);
- snd_mtxfree(m->lock);
+ mtx_destroy(&m->lock);
kobj_delete((kobj_t)m, M_MIXER);
return (0);
@@ -805,20 +792,20 @@ mixer_uninit(device_t dev)
pdev->si_drv1 = NULL;
destroy_dev(pdev);
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
mixer_set(m, i, 0, 0);
mixer_setrecsrc(m, SOUND_MASK_MIC);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
/* mixer uninit can sleep --hps */
MIXER_UNINIT(m);
- snd_mtxfree(m->lock);
+ mtx_destroy(&m->lock);
kobj_delete((kobj_t)m, M_MIXER);
d->mixer_dev = NULL;
@@ -835,11 +822,11 @@ mixer_reinit(device_t dev)
pdev = mixer_get_devt(dev);
m = pdev->si_drv1;
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
i = MIXER_REINIT(m);
if (i) {
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return i;
}
@@ -851,7 +838,7 @@ mixer_reinit(device_t dev)
}
mixer_setrecsrc(m, m->recsrc);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return 0;
}
@@ -864,21 +851,21 @@ sysctl_hw_snd_hwvol_mixer(SYSCTL_HANDLER_ARGS)
struct snd_mixer *m;
m = oidp->oid_arg1;
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
strlcpy(devname, snd_mixernames[m->hwvol_mixer], sizeof(devname));
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
error = sysctl_handle_string(oidp, &devname[0], sizeof(devname), req);
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
if (error == 0 && req->newptr != NULL) {
dev = mixer_lookup(devname);
if (dev == -1) {
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return EINVAL;
} else {
m->hwvol_mixer = dev;
}
}
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return error;
}
@@ -917,9 +904,9 @@ mixer_hwvol_mute(device_t dev)
pdev = mixer_get_devt(dev);
m = pdev->si_drv1;
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
mixer_hwvol_mute_locked(m);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
}
void
@@ -955,9 +942,9 @@ mixer_hwvol_step(device_t dev, int left_step, int right_step)
pdev = mixer_get_devt(dev);
m = pdev->si_drv1;
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
mixer_hwvol_step_locked(m, left_step, right_step);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
}
int
@@ -975,9 +962,9 @@ mix_set(struct snd_mixer *m, u_int dev, u_int left, u_int right)
KASSERT(m != NULL, ("NULL snd_mixer"));
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
ret = mixer_set(m, dev, m->mutedevs, left | (right << 8));
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return ((ret != 0) ? ENXIO : 0);
}
@@ -989,9 +976,9 @@ mix_get(struct snd_mixer *m, u_int dev)
KASSERT(m != NULL, ("NULL snd_mixer"));
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
ret = mixer_get(m, dev);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return (ret);
}
@@ -1003,9 +990,9 @@ mix_setrecsrc(struct snd_mixer *m, u_int32_t src)
KASSERT(m != NULL, ("NULL snd_mixer"));
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
ret = mixer_setrecsrc(m, src);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return ((ret != 0) ? ENXIO : 0);
}
@@ -1017,21 +1004,13 @@ mix_getrecsrc(struct snd_mixer *m)
KASSERT(m != NULL, ("NULL snd_mixer"));
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
ret = mixer_getrecsrc(m);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return (ret);
}
-int
-mix_get_type(struct snd_mixer *m)
-{
- KASSERT(m != NULL, ("NULL snd_mixer"));
-
- return (m->type);
-}
-
device_t
mix_get_dev(struct snd_mixer *m)
{
@@ -1058,9 +1037,9 @@ mixer_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
/* XXX Need Giant magic entry ??? */
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
m->busy = 1;
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return (0);
}
@@ -1082,10 +1061,10 @@ mixer_close(struct cdev *i_dev, int flags, int mode, struct thread *td)
/* XXX Need Giant magic entry ??? */
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
ret = (m->busy == 0) ? EBADF : 0;
m->busy = 0;
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return (ret);
}
@@ -1163,9 +1142,9 @@ mixer_ioctl_channel(struct cdev *dev, u_long cmd, caddr_t arg, int mode,
if ((j == SOUND_MIXER_DEVMASK || j == SOUND_MIXER_CAPS ||
j == SOUND_MIXER_STEREODEVS) &&
(cmd & ~0xff) == MIXER_READ(0)) {
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
*(int *)arg = mix_getdevs(m);
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
if (rdch != NULL)
*(int *)arg |= SOUND_MASK_RECLEV;
if (wrch != NULL)
@@ -1282,9 +1261,9 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
if (m == NULL)
return (EBADF);
- snd_mtxlock(m->lock);
+ mtx_lock(&m->lock);
if (from == MIXER_CMD_CDEV && !m->busy) {
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return (EBADF);
}
switch (cmd) {
@@ -1320,7 +1299,7 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
ret = mixer_set(m, j, m->mutedevs, *arg_i);
break;
}
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return ((ret == 0) ? 0 : ENXIO);
}
if ((cmd & ~0xff) == MIXER_READ(0)) {
@@ -1344,11 +1323,11 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
break;
}
*arg_i = v;
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return ((v != -1) ? 0 : ENXIO);
}
done:
- snd_mtxunlock(m->lock);
+ mtx_unlock(&m->lock);
return (ret);
}
@@ -1477,7 +1456,7 @@ mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi)
}
m = d->mixer_dev->si_drv1;
- mtx_lock(m->lock);
+ mtx_lock(&m->lock);
/*
* At this point, the following synchronization stuff
@@ -1490,6 +1469,11 @@ mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi)
mi->dev = i;
snprintf(mi->id, sizeof(mi->id), "mixer%d", i);
strlcpy(mi->name, m->name, sizeof(mi->name));
+ /**
+ * Counter is incremented when applications change any of this
+ * mixer's controls. A change in value indicates that
+ * persistent mixer applications should update their displays.
+ */
mi->modify_counter = m->modify_counter;
mi->card_number = i;
/*
@@ -1549,7 +1533,7 @@ mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi)
snprintf(mi->devnode, sizeof(mi->devnode), "/dev/mixer%d", i);
mi->legacy_device = i;
- mtx_unlock(m->lock);
+ mtx_unlock(&m->lock);
PCM_UNLOCK(d);
@@ -1568,35 +1552,5 @@ mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi)
struct mtx *
mixer_get_lock(struct snd_mixer *m)
{
- if (m->lock == NULL) {
- return (&Giant);
- }
- return (m->lock);
-}
-
-int
-mix_get_locked(struct snd_mixer *m, u_int dev, int *pleft, int *pright)
-{
- int level;
-
- level = mixer_get(m, dev);
- if (level < 0) {
- *pright = *pleft = -1;
- return (-1);
- }
-
- *pleft = level & 0xFF;
- *pright = (level >> 8) & 0xFF;
-
- return (0);
-}
-
-int
-mix_set_locked(struct snd_mixer *m, u_int dev, int left, int right)
-{
- int level;
-
- level = (left & 0xFF) | ((right & 0xFF) << 8);
-
- return (mixer_set(m, dev, m->mutedevs, level));
+ return (&m->lock);
}
diff --git a/sys/dev/sound/pcm/mixer.h b/sys/dev/sound/pcm/mixer.h
index 7139a766b392..c47247ab570d 100644
--- a/sys/dev/sound/pcm/mixer.h
+++ b/sys/dev/sound/pcm/mixer.h
@@ -47,13 +47,10 @@ void mixer_hwvol_step(device_t dev, int left_step, int right_step);
int mixer_busy(struct snd_mixer *m);
-int mix_get_locked(struct snd_mixer *m, u_int dev, int *pleft, int *pright);
-int mix_set_locked(struct snd_mixer *m, u_int dev, int left, int right);
int mix_set(struct snd_mixer *m, u_int dev, u_int left, u_int right);
int mix_get(struct snd_mixer *m, u_int dev);
int mix_setrecsrc(struct snd_mixer *m, u_int32_t src);
u_int32_t mix_getrecsrc(struct snd_mixer *m);
-int mix_get_type(struct snd_mixer *m);
device_t mix_get_dev(struct snd_mixer *m);
void mix_setdevs(struct snd_mixer *m, u_int32_t v);
@@ -65,7 +62,6 @@ u_int32_t mix_getmutedevs(struct snd_mixer *m);
void mix_setparentchild(struct snd_mixer *m, u_int32_t parent, u_int32_t childs);
void mix_setrealdev(struct snd_mixer *m, u_int32_t dev, u_int32_t realdev);
u_int32_t mix_getparent(struct snd_mixer *m, u_int32_t dev);
-u_int32_t mix_getchild(struct snd_mixer *m, u_int32_t dev);
void *mix_getdevinfo(struct snd_mixer *m);
struct mtx *mixer_get_lock(struct snd_mixer *m);
diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c
index 51d0fb3bb686..a7c53ac85eb8 100644
--- a/sys/dev/sound/pcm/sndstat.c
+++ b/sys/dev/sound/pcm/sndstat.c
@@ -491,29 +491,29 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_RIGHTVOL,
CHN_GETVOLUME(c, SND_VOL_C_PCM, SND_CHN_T_FR));
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_FORMAT,
- sndbuf_getfmt(c->bufhard));
+ c->bufhard->fmt);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_RATE,
- sndbuf_getspd(c->bufhard));
+ c->bufhard->spd);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_SIZE,
- sndbuf_getsize(c->bufhard));
+ c->bufhard->bufsize);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_BLKSZ,
- sndbuf_getblksz(c->bufhard));
+ c->bufhard->blksz);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_BLKCNT,
- sndbuf_getblkcnt(c->bufhard));
+ c->bufhard->blkcnt);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_FREE,
sndbuf_getfree(c->bufhard));
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_READY,
sndbuf_getready(c->bufhard));
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_FORMAT,
- sndbuf_getfmt(c->bufsoft));
+ c->bufsoft->fmt);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_RATE,
- sndbuf_getspd(c->bufsoft));
+ c->bufsoft->spd);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_SIZE,
- sndbuf_getsize(c->bufsoft));
+ c->bufsoft->bufsize);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_BLKSZ,
- sndbuf_getblksz(c->bufsoft));
+ c->bufsoft->blksz);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_BLKCNT,
- sndbuf_getblkcnt(c->bufsoft));
+ c->bufsoft->blkcnt);
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_FREE,
sndbuf_getfree(c->bufsoft));
nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_READY,
@@ -524,7 +524,8 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
c->parentchannel->name : "userland");
} else {
sbuf_printf(&sb, "[%s", (c->direction == PCMDIR_REC) ?
- "hardware" : "userland");
+ "hardware" :
+ ((d->flags & SD_F_PVCHANS) ? "vchans" : "userland"));
}
sbuf_printf(&sb, " -> ");
f = c->feeder;
@@ -532,12 +533,12 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
f = f->source;
while (f != NULL) {
sbuf_printf(&sb, "%s", f->class->name);
- if (f->desc->type == FEEDER_FORMAT) {
+ if (f->class->type == FEEDER_FORMAT) {
snd_afmt2str(f->desc->in, buf, sizeof(buf));
sbuf_printf(&sb, "(%s -> ", buf);
snd_afmt2str(f->desc->out, buf, sizeof(buf));
sbuf_printf(&sb, "%s)", buf);
- } else if (f->desc->type == FEEDER_MATRIX) {
+ } else if (f->class->type == FEEDER_MATRIX) {
sbuf_printf(&sb, "(%d.%dch -> %d.%dch)",
AFMT_CHANNEL(f->desc->in) -
AFMT_EXTCHANNEL(f->desc->in),
@@ -545,7 +546,7 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
AFMT_CHANNEL(f->desc->out) -
AFMT_EXTCHANNEL(f->desc->out),
AFMT_EXTCHANNEL(f->desc->out));
- } else if (f->desc->type == FEEDER_RATE) {
+ } else if (f->class->type == FEEDER_RATE) {
sbuf_printf(&sb, "(%d -> %d)",
FEEDER_GET(f, FEEDRATE_SRC),
FEEDER_GET(f, FEEDRATE_DST));
@@ -561,7 +562,8 @@ sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip)
"userland" : c->parentchannel->name);
} else {
sbuf_printf(&sb, "%s]", (c->direction == PCMDIR_REC) ?
- "userland" : "hardware");
+ ((d->flags & SD_F_RVCHANS) ? "vchans" : "userland") :
+ "hardware");
}
CHN_UNLOCK(c);
@@ -1265,14 +1267,11 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
(c->parentchannel != NULL) ?
c->parentchannel->name : "", c->name);
sbuf_printf(s, "spd %d", c->speed);
- if (c->speed != sndbuf_getspd(c->bufhard)) {
- sbuf_printf(s, "/%d",
- sndbuf_getspd(c->bufhard));
- }
+ if (c->speed != c->bufhard->spd)
+ sbuf_printf(s, "/%d", c->bufhard->spd);
sbuf_printf(s, ", fmt 0x%08x", c->format);
- if (c->format != sndbuf_getfmt(c->bufhard)) {
- sbuf_printf(s, "/0x%08x",
- sndbuf_getfmt(c->bufhard));
+ if (c->format != c->bufhard->fmt) {
+ sbuf_printf(s, "/0x%08x", c->bufhard->fmt);
}
sbuf_printf(s, ", flags 0x%08x, 0x%08x",
c->flags, c->feederflags);
@@ -1291,24 +1290,24 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
c->xruns, c->feedcount,
sndbuf_getfree(c->bufhard),
sndbuf_getfree(c->bufsoft),
- sndbuf_getsize(c->bufhard),
- sndbuf_getblksz(c->bufhard),
- sndbuf_getblkcnt(c->bufhard),
- sndbuf_getsize(c->bufsoft),
- sndbuf_getblksz(c->bufsoft),
- sndbuf_getblkcnt(c->bufsoft));
+ c->bufhard->bufsize,
+ c->bufhard->blksz,
+ c->bufhard->blkcnt,
+ c->bufsoft->bufsize,
+ c->bufsoft->blksz,
+ c->bufsoft->blkcnt);
} else {
sbuf_printf(s,
"underruns %d, feed %u, ready %d "
"\n\t\t[b:%d/%d/%d|bs:%d/%d/%d]",
c->xruns, c->feedcount,
sndbuf_getready(c->bufsoft),
- sndbuf_getsize(c->bufhard),
- sndbuf_getblksz(c->bufhard),
- sndbuf_getblkcnt(c->bufhard),
- sndbuf_getsize(c->bufsoft),
- sndbuf_getblksz(c->bufsoft),
- sndbuf_getblkcnt(c->bufsoft));
+ c->bufhard->bufsize,
+ c->bufhard->blksz,
+ c->bufhard->blkcnt,
+ c->bufsoft->bufsize,
+ c->bufsoft->blksz,
+ c->bufsoft->blkcnt);
}
sbuf_printf(s, "\n\t");
@@ -1320,7 +1319,8 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
c->parentchannel->name : "userland");
} else {
sbuf_printf(s, "\t{%s}", (c->direction == PCMDIR_REC) ?
- "hardware" : "userland");
+ "hardware" :
+ ((d->flags & SD_F_PVCHANS) ? "vchans" : "userland"));
}
sbuf_printf(s, " -> ");
f = c->feeder;
@@ -1328,10 +1328,10 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
f = f->source;
while (f != NULL) {
sbuf_printf(s, "%s", f->class->name);
- if (f->desc->type == FEEDER_FORMAT) {
+ if (f->class->type == FEEDER_FORMAT) {
sbuf_printf(s, "(0x%08x -> 0x%08x)",
f->desc->in, f->desc->out);
- } else if (f->desc->type == FEEDER_MATRIX) {
+ } else if (f->class->type == FEEDER_MATRIX) {
sbuf_printf(s, "(%d.%d -> %d.%d)",
AFMT_CHANNEL(f->desc->in) -
AFMT_EXTCHANNEL(f->desc->in),
@@ -1339,7 +1339,7 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
AFMT_CHANNEL(f->desc->out) -
AFMT_EXTCHANNEL(f->desc->out),
AFMT_EXTCHANNEL(f->desc->out));
- } else if (f->desc->type == FEEDER_RATE) {
+ } else if (f->class->type == FEEDER_RATE) {
sbuf_printf(s,
"(0x%08x q:%d %d -> %d)",
f->desc->out,
@@ -1358,7 +1358,8 @@ sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
"userland" : c->parentchannel->name);
} else {
sbuf_printf(s, "{%s}", (c->direction == PCMDIR_REC) ?
- "userland" : "hardware");
+ ((d->flags & SD_F_RVCHANS) ? "vchans" : "userland") :
+ "hardware");
}
CHN_UNLOCK(c);
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
index cb510d526fa8..29dac6b576ae 100644
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -62,35 +62,6 @@ SYSCTL_NODE(_hw, OID_AUTO, snd, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
*/
struct unrhdr *pcmsg_unrhdr = NULL;
-void *
-snd_mtxcreate(const char *desc, const char *type)
-{
- struct mtx *m;
-
- m = malloc(sizeof(*m), M_DEVBUF, M_WAITOK | M_ZERO);
- mtx_init(m, desc, type, MTX_DEF);
- return m;
-}
-
-void
-snd_mtxfree(void *m)
-{
- struct mtx *mtx = m;
-
- mtx_destroy(mtx);
- free(mtx, M_DEVBUF);
-}
-
-void
-snd_mtxassert(void *m)
-{
-#ifdef INVARIANTS
- struct mtx *mtx = m;
-
- mtx_assert(mtx, MA_OWNED);
-#endif
-}
-
int
snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
{
@@ -361,7 +332,7 @@ pcm_init(device_t dev, void *devinfo)
d = device_get_softc(dev);
d->dev = dev;
- d->lock = snd_mtxcreate(device_get_nameunit(dev), "sound cdev");
+ mtx_init(&d->lock, device_get_nameunit(dev), "sound cdev", MTX_DEF);
cv_init(&d->cv, device_get_nameunit(dev));
i = 0;
@@ -467,7 +438,7 @@ pcm_unregister(device_t dev)
d = device_get_softc(dev);
- if (!PCM_ALIVE(d)) {
+ if (!PCM_REGISTERED(d)) {
device_printf(dev, "unregister: device not configured\n");
return (0);
}
@@ -498,7 +469,7 @@ pcm_unregister(device_t dev)
dsp_destroy_dev(dev);
cv_destroy(&d->cv);
- snd_mtxfree(d->lock);
+ mtx_destroy(&d->lock);
if (snd_unit == device_get_unit(dev)) {
snd_unit = pcm_best_unit(-1);
diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h
index 6bd435d0ea25..3ba6eb3692ee 100644
--- a/sys/dev/sound/pcm/sound.h
+++ b/sys/dev/sound/pcm/sound.h
@@ -76,10 +76,6 @@
#include <sys/mutex.h>
#include <sys/condvar.h>
-#ifndef KOBJMETHOD_END
-#define KOBJMETHOD_END { NULL, NULL }
-#endif
-
struct pcm_channel;
struct pcm_feeder;
struct snd_dbuf;
@@ -137,8 +133,8 @@ struct snd_mixer;
"\015PVCHANS" \
"\016RVCHANS"
-#define PCM_ALIVE(x) ((x) != NULL && (x)->lock != NULL)
-#define PCM_REGISTERED(x) (PCM_ALIVE(x) && ((x)->flags & SD_F_REGISTERED))
+#define PCM_REGISTERED(x) \
+ ((x) != NULL && ((x)->flags & SD_F_REGISTERED))
#define PCM_MAXCHANS 10000
#define PCM_CHANCOUNT(d) \
@@ -148,8 +144,6 @@ struct snd_mixer;
#define RANGE(var, low, high) (var) = \
(((var)<(low))? (low) : ((var)>(high))? (high) : (var))
-#define DSP_DEFAULT_SPEED 8000
-
extern int snd_unit;
extern int snd_verbose;
extern devclass_t pcm_devclass;
@@ -173,12 +167,6 @@ void *pcm_getdevinfo(device_t dev);
int snd_setup_intr(device_t dev, struct resource *res, int flags,
driver_intr_t hand, void *param, void **cookiep);
-void *snd_mtxcreate(const char *desc, const char *type);
-void snd_mtxfree(void *m);
-void snd_mtxassert(void *m);
-#define snd_mtxlock(m) mtx_lock(m)
-#define snd_mtxunlock(m) mtx_unlock(m)
-
int sndstat_register(device_t dev, char *str);
int sndstat_unregister(device_t dev);
@@ -186,7 +174,6 @@ int sndstat_unregister(device_t dev);
enum {
SCF_PCM,
SCF_MIDI,
- SCF_SYNTH,
};
/*
@@ -225,7 +212,7 @@ struct snddev_info {
void *devinfo;
device_t dev;
char status[SND_STATUSLEN];
- struct mtx *lock;
+ struct mtx lock;
struct cdev *mixer_dev;
struct cdev *dsp_dev;
uint32_t pvchanrate, pvchanformat, pvchanmode;
@@ -247,123 +234,21 @@ int sound_oss_card_info(oss_card_info *);
#define PCM_MODE_PLAY 0x02
#define PCM_MODE_REC 0x04
-#define PCM_LOCKOWNED(d) mtx_owned((d)->lock)
-#define PCM_LOCK(d) mtx_lock((d)->lock)
-#define PCM_UNLOCK(d) mtx_unlock((d)->lock)
-#define PCM_TRYLOCK(d) mtx_trylock((d)->lock)
-#define PCM_LOCKASSERT(d) mtx_assert((d)->lock, MA_OWNED)
-#define PCM_UNLOCKASSERT(d) mtx_assert((d)->lock, MA_NOTOWNED)
+#define PCM_LOCKOWNED(d) mtx_owned(&(d)->lock)
+#define PCM_LOCK(d) mtx_lock(&(d)->lock)
+#define PCM_UNLOCK(d) mtx_unlock(&(d)->lock)
+#define PCM_TRYLOCK(d) mtx_trylock(&(d)->lock)
+#define PCM_LOCKASSERT(d) mtx_assert(&(d)->lock, MA_OWNED)
+#define PCM_UNLOCKASSERT(d) mtx_assert(&(d)->lock, MA_NOTOWNED)
/*
* For PCM_[WAIT | ACQUIRE | RELEASE], be sure to surround these
* with PCM_LOCK/UNLOCK() sequence, or I'll come to gnaw upon you!
*/
-#ifdef SND_DIAGNOSTIC
-#define PCM_WAIT(x) do { \
- if (!PCM_LOCKOWNED(x)) \
- panic("%s(%d): [PCM WAIT] Mutex not owned!", \
- __func__, __LINE__); \
- while ((x)->flags & SD_F_BUSY) { \
- if (snd_verbose > 3) \
- device_printf((x)->dev, \
- "%s(%d): [PCM WAIT] calling cv_wait().\n", \
- __func__, __LINE__); \
- cv_wait(&(x)->cv, (x)->lock); \
- } \
-} while (0)
-
-#define PCM_ACQUIRE(x) do { \
- if (!PCM_LOCKOWNED(x)) \
- panic("%s(%d): [PCM ACQUIRE] Mutex not owned!", \
- __func__, __LINE__); \
- if ((x)->flags & SD_F_BUSY) \
- panic("%s(%d): [PCM ACQUIRE] " \
- "Trying to acquire BUSY cv!", __func__, __LINE__); \
- (x)->flags |= SD_F_BUSY; \
-} while (0)
-
-#define PCM_RELEASE(x) do { \
- if (!PCM_LOCKOWNED(x)) \
- panic("%s(%d): [PCM RELEASE] Mutex not owned!", \
- __func__, __LINE__); \
- if ((x)->flags & SD_F_BUSY) { \
- (x)->flags &= ~SD_F_BUSY; \
- cv_broadcast(&(x)->cv); \
- } else \
- panic("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!", \
- __func__, __LINE__); \
-} while (0)
-
-/* Quick version, for shorter path. */
-#define PCM_ACQUIRE_QUICK(x) do { \
- if (PCM_LOCKOWNED(x)) \
- panic("%s(%d): [PCM ACQUIRE QUICK] Mutex owned!", \
- __func__, __LINE__); \
- PCM_LOCK(x); \
- PCM_WAIT(x); \
- PCM_ACQUIRE(x); \
- PCM_UNLOCK(x); \
-} while (0)
-
-#define PCM_RELEASE_QUICK(x) do { \
- if (PCM_LOCKOWNED(x)) \
- panic("%s(%d): [PCM RELEASE QUICK] Mutex owned!", \
- __func__, __LINE__); \
- PCM_LOCK(x); \
- PCM_RELEASE(x); \
- PCM_UNLOCK(x); \
-} while (0)
-
-#define PCM_BUSYASSERT(x) do { \
- if (!((x) != NULL && ((x)->flags & SD_F_BUSY))) \
- panic("%s(%d): [PCM BUSYASSERT] " \
- "Failed, snddev_info=%p", __func__, __LINE__, x); \
-} while (0)
-
-#define PCM_GIANT_ENTER(x) do { \
- int _pcm_giant = 0; \
- if (PCM_LOCKOWNED(x)) \
- panic("%s(%d): [GIANT ENTER] PCM lock owned!", \
- __func__, __LINE__); \
- if (mtx_owned(&Giant) != 0 && snd_verbose > 3) \
- device_printf((x)->dev, \
- "%s(%d): [GIANT ENTER] Giant owned!\n", \
- __func__, __LINE__); \
- if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0) \
- do { \
- mtx_lock(&Giant); \
- _pcm_giant = 1; \
- } while (0)
-
-#define PCM_GIANT_EXIT(x) do { \
- if (PCM_LOCKOWNED(x)) \
- panic("%s(%d): [GIANT EXIT] PCM lock owned!", \
- __func__, __LINE__); \
- if (!(_pcm_giant == 0 || _pcm_giant == 1)) \
- panic("%s(%d): [GIANT EXIT] _pcm_giant screwed!", \
- __func__, __LINE__); \
- if ((x)->flags & SD_F_MPSAFE) { \
- if (_pcm_giant == 1) \
- panic("%s(%d): [GIANT EXIT] MPSAFE Giant?", \
- __func__, __LINE__); \
- if (mtx_owned(&Giant) != 0 && snd_verbose > 3) \
- device_printf((x)->dev, \
- "%s(%d): [GIANT EXIT] Giant owned!\n", \
- __func__, __LINE__); \
- } \
- if (_pcm_giant != 0) { \
- if (mtx_owned(&Giant) == 0) \
- panic("%s(%d): [GIANT EXIT] Giant not owned!", \
- __func__, __LINE__); \
- _pcm_giant = 0; \
- mtx_unlock(&Giant); \
- } \
-} while (0)
-#else /* !SND_DIAGNOSTIC */
#define PCM_WAIT(x) do { \
PCM_LOCKASSERT(x); \
while ((x)->flags & SD_F_BUSY) \
- cv_wait(&(x)->cv, (x)->lock); \
+ cv_wait(&(x)->cv, &(x)->lock); \
} while (0)
#define PCM_ACQUIRE(x) do { \
@@ -429,7 +314,6 @@ int sound_oss_card_info(oss_card_info *);
mtx_unlock(&Giant); \
} \
} while (0)
-#endif /* SND_DIAGNOSTIC */
#define PCM_GIANT_LEAVE(x) \
PCM_GIANT_EXIT(x); \
diff --git a/sys/dev/sound/pcm/vchan.c b/sys/dev/sound/pcm/vchan.c
index 31a4f7db8d70..dcb49e3003d0 100644
--- a/sys/dev/sound/pcm/vchan.c
+++ b/sys/dev/sound/pcm/vchan.c
@@ -47,13 +47,6 @@
#define FMTLIST_OFFSET 4
#define DIGFMTS_MAX 2
-#ifdef SND_DEBUG
-static int snd_passthrough_verbose = 0;
-SYSCTL_INT(_hw_snd, OID_AUTO, passthrough_verbose, CTLFLAG_RWTUN,
- &snd_passthrough_verbose, 0, "passthrough verbosity");
-
-#endif
-
struct vchan_info {
struct pcm_channel *channel;
struct pcmchan_caps caps;
@@ -492,7 +485,7 @@ sysctl_dev_pcm_vchanrate(SYSCTL_HANDLER_ARGS)
}
}
}
- *vchanrate = sndbuf_getspd(c->bufsoft);
+ *vchanrate = c->bufsoft->spd;
CHN_UNLOCK(c);
}
@@ -591,7 +584,7 @@ sysctl_dev_pcm_vchanformat(SYSCTL_HANDLER_ARGS)
}
}
}
- *vchanformat = sndbuf_getfmt(c->bufsoft);
+ *vchanformat = c->bufsoft->fmt;
CHN_UNLOCK(c);
}
@@ -723,11 +716,7 @@ vchan_destroy(struct pcm_channel *c)
}
int
-#ifdef SND_DEBUG
-vchan_passthrough(struct pcm_channel *c, const char *caller)
-#else
vchan_sync(struct pcm_channel *c)
-#endif
{
int ret;
@@ -744,13 +733,6 @@ vchan_sync(struct pcm_channel *c)
if (ret != 0)
c->flags |= CHN_F_DIRTY;
-#ifdef SND_DEBUG
- if (snd_passthrough_verbose) {
- device_printf(c->dev, "%s(%s/%s) %s() -> re-sync err=%d\n",
- __func__, c->name, c->comm, caller, ret);
- }
-#endif
-
return (ret);
}
diff --git a/sys/dev/sound/pcm/vchan.h b/sys/dev/sound/pcm/vchan.h
index 8c1de9496ef3..5d8057cd4b7f 100644
--- a/sys/dev/sound/pcm/vchan.h
+++ b/sys/dev/sound/pcm/vchan.h
@@ -39,17 +39,12 @@ extern bool snd_vchans_enable;
int vchan_create(struct pcm_channel *, struct pcm_channel **);
int vchan_destroy(struct pcm_channel *);
-#ifdef SND_DEBUG
-int vchan_passthrough(struct pcm_channel *, const char *);
-#define vchan_sync(c) vchan_passthrough(c, __func__)
-#else
int vchan_sync(struct pcm_channel *);
-#endif
#define VCHAN_SYNC_REQUIRED(c) \
(((c)->flags & CHN_F_VIRTUAL) && (((c)->flags & CHN_F_DIRTY) || \
- sndbuf_getfmt((c)->bufhard) != (c)->parentchannel->format || \
- sndbuf_getspd((c)->bufhard) != (c)->parentchannel->speed))
+ (c)->bufhard->fmt != (c)->parentchannel->format || \
+ (c)->bufhard->spd != (c)->parentchannel->speed))
void vchan_initsys(device_t);
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index ff9f59fe42ab..65c1327ee0f2 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -2664,7 +2664,7 @@ uaudio_chan_init(struct uaudio_chan *ch, struct snd_dbuf *b,
/* store mutex and PCM channel */
ch->pcm_ch = c;
- ch->pcm_mtx = c->lock;
+ ch->pcm_mtx = &c->lock;
/* compute worst case buffer */