PERFORCE change 116029 for review
Alexander Leidinger
netchild at FreeBSD.org
Sat Mar 17 16:14:56 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=116029
Change 116029 by netchild at netchild_magellan on 2007/03/17 16:14:36
IFC
Affected files ...
.. //depot/projects/soundsystem/src/sys/dev/sound/isa/ad1816.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/isa/mss.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/isa/sbc.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/midi.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/midi.h#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/midiq.h#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/mpu401.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/mpu401.h#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/mpu_if.m#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/mpufoi_if.m#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/sequencer.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/sequencer.h#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/midi/synth_if.m#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/als4000.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/atiixp.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/cmi.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/ds1.c#5 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/emu10k1.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/emu10kx-pcm.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/envy24.c#5 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/envy24ht.c#5 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/es137x.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/hda/hdac.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/ich.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/maestro.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/maestro3.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/solo.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/t4dwave.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/via8233.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pci/via82c686.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/ac97.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/buffer.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/channel.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/channel_if.m#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/dsp.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/fake.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/feeder.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/feeder.h#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/feeder_fmt.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/feeder_rate.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/feeder_volume.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/sndstat.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/sound.c#4 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/sound.h#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/pcm/vchan.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/sbus/cs4231.c#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/usb/uaudio.c#3 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/usb/uaudio.h#2 integrate
.. //depot/projects/soundsystem/src/sys/dev/sound/usb/uaudio_pcm.c#3 integrate
Differences ...
==== //depot/projects/soundsystem/src/sys/dev/sound/isa/ad1816.c#4 (text+ko) ====
@@ -33,7 +33,7 @@
#include "mixer_if.h"
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/isa/ad1816.c,v 1.41 2007/02/23 13:47:33 netchild Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/isa/ad1816.c,v 1.42 2007/03/15 16:41:25 ariff Exp $");
struct ad1816_info;
@@ -601,7 +601,8 @@
ad1816 = (struct ad1816_info *)malloc(sizeof *ad1816, M_DEVBUF, M_NOWAIT | M_ZERO);
if (!ad1816) return ENXIO;
- ad1816->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc");
+ ad1816->lock = snd_mtxcreate(device_get_nameunit(dev),
+ "snd_ad1816 softc");
ad1816->io_rid = 2;
ad1816->irq_rid = 0;
ad1816->drq1_rid = 0;
==== //depot/projects/soundsystem/src/sys/dev/sound/isa/mss.c#4 (text+ko) ====
@@ -29,7 +29,7 @@
#include <dev/sound/pcm/sound.h>
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/isa/mss.c,v 1.107 2007/02/23 13:47:33 netchild Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/isa/mss.c,v 1.108 2007/03/15 16:41:25 ariff Exp $");
/* board-specific include files */
#include <dev/sound/isa/mss.h>
@@ -1696,7 +1696,7 @@
int pdma, rdma, flags = device_get_flags(dev);
char status[SND_STATUSLEN], status2[SND_STATUSLEN];
- mss->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc");
+ mss->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_mss softc");
mss->bufsize = pcm_getbuffersize(dev, 4096, MSS_DEFAULT_BUFSZ, 65536);
if (!mss_alloc_resources(mss, dev)) goto no;
mss_init(mss, dev);
==== //depot/projects/soundsystem/src/sys/dev/sound/isa/sbc.c#4 (text+ko) ====
@@ -30,7 +30,7 @@
#include <isa/isavar.h>
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/isa/sbc.c,v 1.47 2007/02/23 19:40:13 ariff Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/isa/sbc.c,v 1.48 2007/03/15 16:41:25 ariff Exp $");
#define IO_MAX 3
#define IRQ_MAX 1
@@ -120,7 +120,8 @@
static void
sbc_lockinit(struct sbc_softc *scp)
{
- scp->lock = snd_mtxcreate(device_get_nameunit(scp->dev), "sound softc");
+ scp->lock = snd_mtxcreate(device_get_nameunit(scp->dev),
+ "snd_sbc softc");
}
static void
==== //depot/projects/soundsystem/src/sys/dev/sound/midi/midi.c#3 (text) ====
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/sound/midi/midi.c,v 1.21 2007/01/28 20:38:07 joel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/sound/midi/midi.c,v 1.23 2007/03/15 14:57:54 ariff Exp $");
#include <sys/param.h>
#include <sys/queue.h>
@@ -99,37 +99,36 @@
#define MIDI_NAMELEN 16
struct snd_midi {
KOBJ_FIELDS;
- struct mtx lock; /* Protects all but queues */
- void *cookie;
+ struct mtx lock; /* Protects all but queues */
+ void *cookie;
- int unit; /* Should only be used in midistat */
- int channel;/* Should only be used in midistat */
+ int unit; /* Should only be used in midistat */
+ int channel; /* Should only be used in midistat */
- int busy;
- int flags; /* File flags */
- char name[MIDI_NAMELEN];
- struct mtx qlock; /* Protects inq, outq and flags */
- MIDIQ_HEAD(, char)inq, outq;
- int rchan, wchan;
- struct selinfo rsel, wsel;
- int hiwat; /* QLEN(outq)>High-water -> disable writes
- * from userland */
+ int busy;
+ int flags; /* File flags */
+ char name[MIDI_NAMELEN];
+ struct mtx qlock; /* Protects inq, outq and flags */
+ MIDIQ_HEAD(, char) inq, outq;
+ int rchan, wchan;
+ 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;
+ 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;
struct synth_midi *synth;
- int synth_flags;
+ int synth_flags;
TAILQ_ENTRY(snd_midi) link;
};
struct synth_midi {
- KOBJ_FIELDS;
- struct snd_midi *m;
+ KOBJ_FIELDS;
+ struct snd_midi *m;
};
static synth_open_t midisynth_open;
@@ -144,30 +143,30 @@
static kobj_method_t midisynth_methods[] = {
- KOBJMETHOD(synth_open,midisynth_open),
- KOBJMETHOD(synth_close,midisynth_close),
- KOBJMETHOD(synth_writeraw,midisynth_writeraw),
- KOBJMETHOD(synth_setinstr,midisynth_setinstr),
- KOBJMETHOD(synth_startnote,midisynth_startnote),
- KOBJMETHOD(synth_killnote,midisynth_killnote),
- KOBJMETHOD(synth_alloc, midisynth_alloc),
- KOBJMETHOD(synth_controller, midisynth_controller),
- KOBJMETHOD(synth_bender, midisynth_bender),
- { 0, 0 }
+ KOBJMETHOD(synth_open, midisynth_open),
+ KOBJMETHOD(synth_close, midisynth_close),
+ KOBJMETHOD(synth_writeraw, midisynth_writeraw),
+ KOBJMETHOD(synth_setinstr, midisynth_setinstr),
+ KOBJMETHOD(synth_startnote, midisynth_startnote),
+ KOBJMETHOD(synth_killnote, midisynth_killnote),
+ KOBJMETHOD(synth_alloc, midisynth_alloc),
+ KOBJMETHOD(synth_controller, midisynth_controller),
+ KOBJMETHOD(synth_bender, midisynth_bender),
+ {0, 0}
};
DEFINE_CLASS(midisynth, midisynth_methods, 0);
/*
* Module Exports & Interface
- *
+ *
* struct midi_chan *midi_init(MPU_CLASS cls, int unit, int chan) int
* midi_uninit(struct snd_midi *) 0 == no error EBUSY or other error int
* Midi_in(struct midi_chan *, char *buf, int count) int Midi_out(struct
* midi_chan *, char *buf, int count)
- *
+ *
* midi_{in,out} return actual size transfered
- *
+ *
*/
@@ -268,21 +267,21 @@
* cookie is passed back on MPU calls Typical device drivers will call with
* unit=0, channel=1..(number of channels) and cookie=soft_c and won't care
* what unit number is used.
- *
+ *
* It is an error to call midi_init with an already used unit/channel combo.
- *
+ *
* Returns NULL on error
- *
+ *
*/
struct snd_midi *
midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
{
struct snd_midi *m;
- int i;
- int inqsize, outqsize;
- MIDI_TYPE *buf;
+ int i;
+ int inqsize, outqsize;
+ MIDI_TYPE *buf;
- MIDI_DEBUG(1,printf("midiinit: unit %d/%d.\n", unit, channel));
+ MIDI_DEBUG(1, printf("midiinit: unit %d/%d.\n", unit, channel));
mtx_lock(&midistat_lock);
/*
* Protect against call with existing unit/channel or auto-allocate a
@@ -290,29 +289,29 @@
*/
i = -1;
TAILQ_FOREACH(m, &midi_devs, link) {
- mtx_lock(&m->lock);
- if (unit != 0) {
- if (m->unit == unit && m->channel == channel) {
- mtx_unlock(&m->lock);
- goto err0;
+ mtx_lock(&m->lock);
+ if (unit != 0) {
+ if (m->unit == unit && m->channel == channel) {
+ mtx_unlock(&m->lock);
+ goto err0;
+ }
+ } else {
+ /*
+ * Find a better unit number
+ */
+ if (m->unit > i)
+ i = m->unit;
}
- } else {
- /*
- * Find a better unit number
- */
- if (m->unit > i)
- i = m->unit;
- }
- mtx_unlock(&m->lock);
+ mtx_unlock(&m->lock);
}
if (unit == 0)
- unit = i + 1;
+ unit = i + 1;
MIDI_DEBUG(1, printf("midiinit #2: unit %d/%d.\n", unit, channel));
m = malloc(sizeof(*m), M_MIDI, M_NOWAIT | M_ZERO);
if (m == NULL)
- goto err0;
+ goto err0;
m->synth = malloc(sizeof(*m->synth), M_MIDI, M_NOWAIT | M_ZERO);
kobj_init((kobj_t)m->synth, &midisynth_class);
@@ -323,32 +322,32 @@
MIDI_DEBUG(1, printf("midiinit queues %d/%d.\n", inqsize, outqsize));
if (!inqsize && !outqsize)
- goto err1;
+ goto err1;
- mtx_init(&m->lock, "raw midi", 0, 0);
- mtx_init(&m->qlock, "q raw midi", 0, 0);
+ mtx_init(&m->lock, "raw midi", NULL, 0);
+ mtx_init(&m->qlock, "q raw midi", NULL, 0);
mtx_lock(&m->lock);
mtx_lock(&m->qlock);
if (inqsize)
- buf = malloc(sizeof(MIDI_TYPE) * inqsize, M_MIDI, M_NOWAIT);
+ buf = malloc(sizeof(MIDI_TYPE) * inqsize, M_MIDI, M_NOWAIT);
else
- buf = NULL;
+ buf = NULL;
MIDIQ_INIT(m->inq, buf, inqsize);
if (outqsize)
- buf = malloc(sizeof(MIDI_TYPE) * outqsize, M_MIDI, M_NOWAIT);
+ buf = malloc(sizeof(MIDI_TYPE) * outqsize, M_MIDI, M_NOWAIT);
else
- buf = NULL;
+ buf = NULL;
m->hiwat = outqsize / 2;
MIDIQ_INIT(m->outq, buf, outqsize);
if ((inqsize && !MIDIQ_BUF(m->inq)) ||
(outqsize && !MIDIQ_BUF(m->outq)))
- goto err2;
+ goto err2;
m->busy = 0;
@@ -358,7 +357,7 @@
m->cookie = cookie;
if (MPU_INIT(m, cookie))
- goto err2;
+ goto err2;
mtx_unlock(&m->lock);
mtx_unlock(&m->qlock);
@@ -368,8 +367,8 @@
mtx_unlock(&midistat_lock);
m->dev = make_dev(&midi_cdevsw,
- MIDIMKMINOR(unit, MIDI_DEV_RAW, channel),
- UID_ROOT, GID_WHEEL, 0666, "midi%d.%d", unit, channel);
+ MIDIMKMINOR(unit, MIDI_DEV_RAW, channel),
+ UID_ROOT, GID_WHEEL, 0666, "midi%d.%d", unit, channel);
m->dev->si_drv1 = m;
return m;
@@ -378,9 +377,9 @@
mtx_destroy(&m->lock);
if (MIDIQ_BUF(m->inq))
- free(MIDIQ_BUF(m->inq), M_MIDI);
+ free(MIDIQ_BUF(m->inq), M_MIDI);
if (MIDIQ_BUF(m->outq))
- free(MIDIQ_BUF(m->outq), M_MIDI);
+ free(MIDIQ_BUF(m->outq), M_MIDI);
err1: free(m, M_MIDI);
err0: mtx_unlock(&midistat_lock);
MIDI_DEBUG(1, printf("midi_init ended in error\n"));
@@ -391,32 +390,32 @@
* midi_uninit does not call MIDI_UNINIT, as since this is the implementors
* entry point. midi_unint if fact, does not send any methods. A call to
* midi_uninit is a defacto promise that you won't manipulate ch anymore
- *
+ *
*/
int
-midi_uninit(struct snd_midi * m)
+midi_uninit(struct snd_midi *m)
{
- int err;
+ int err;
err = ENXIO;
mtx_lock(&midistat_lock);
mtx_lock(&m->lock);
if (m->busy) {
- if (!(m->rchan || m->wchan))
- goto err;
+ if (!(m->rchan || m->wchan))
+ goto err;
- if (m->rchan) {
- wakeup(&m->rchan);
- m->rchan = 0;
- }
- if (m->wchan) {
- wakeup(&m->wchan);
- m->wchan = 0;
- }
+ if (m->rchan) {
+ wakeup(&m->rchan);
+ m->rchan = 0;
+ }
+ if (m->wchan) {
+ wakeup(&m->wchan);
+ m->wchan = 0;
+ }
}
err = midi_destroy(m, 0);
- if(!err)
+ if (!err)
goto exit;
err: mtx_unlock(&m->lock);
@@ -432,8 +431,9 @@
*/
#ifdef notdef
-static int midi_lengths[] = {2, 2, 2, 2, 1, 1, 2, 0};
-#endif /* notdef */
+static int midi_lengths[] = {2, 2, 2, 2, 1, 1, 2, 0};
+
+#endif /* notdef */
/* Number of bytes in a MIDI command */
#define MIDI_LENGTH(d) (midi_lengths[((d) >> 4) & 7])
#define MIDI_ACK 0xfe
@@ -445,10 +445,11 @@
int
-midi_in(struct snd_midi * m, MIDI_TYPE * buf, int size)
+midi_in(struct snd_midi *m, MIDI_TYPE *buf, int size)
{
/* int i, sig, enq; */
- int used;
+ int used;
+
/* MIDI_TYPE data; */
MIDI_DEBUG(5, printf("midi_in: m=%p size=%d\n", m, size));
@@ -456,7 +457,7 @@
* XXX: locking flub
*/
if (!(m->flags & M_RX))
- return size;
+ return size;
used = 0;
@@ -468,100 +469,102 @@
*/
if (!(m->flags & M_RX))
- return size;
+ return size;
for (i = sig = 0; i < size; i++) {
- data = buf[i];
- enq = 0;
- if (data == MIDI_ACK)
- continue;
+ 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;
+ 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;
- case 0xf1: /* MTC quarter frame */
- case 0xf3: /* Song select */
- m->inq_state = MIDI_IN_DATA;
+ /*
+ * End of case MIDI_IN_START:
+ */
+
+ case MIDI_IN_DATA:
enq = 1;
- m->inq_left = 1;
+ if (--m->inq_left <= 0)
+ sig = 1;/* deliver data */
break;
- case 0xf2: /* Song position pointer */
- m->inq_state = MIDI_IN_DATA;
- enq = 1;
- m->inq_left = 2;
+ case MIDI_IN_SYSEX:
+ if (data == MIDI_SYSEX_END)
+ m->inq_state = MIDI_IN_START;
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);
+ }
+
+ if (enq)
+ if (!MIDIQ_FULL(m->inq)) {
+ MIDIQ_ENQ(m->inq, &data, 1);
+ used++;
}
- 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"
- */
+ * End of the state machines main "for loop"
+ */
}
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);
- psignal(m->async, SIGIO);
- PROC_UNLOCK(m->async);
- }
+ 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);
+ psignal(m->async, SIGIO);
+ PROC_UNLOCK(m->async);
+ }
#if 0
}
#endif
@@ -573,9 +576,9 @@
* midi_out: The only clearer of the M_TXEN flag.
*/
int
-midi_out(struct snd_midi * m, MIDI_TYPE * buf, int size)
+midi_out(struct snd_midi *m, MIDI_TYPE *buf, int size)
{
- int used;
+ int used;
/*
* XXX: locking flub
@@ -583,23 +586,23 @@
if (!(m->flags & M_TXEN))
return 0;
- MIDI_DEBUG(2, printf("midi_out: %p\n", m));
+ MIDI_DEBUG(2, printf("midi_out: %p\n", m));
mtx_lock(&m->qlock);
used = MIN(size, MIDIQ_LEN(m->outq));
MIDI_DEBUG(3, printf("midi_out: used %d\n", used));
if (used)
- MIDIQ_DEQ(m->outq, buf, used);
+ MIDIQ_DEQ(m->outq, buf, used);
if (MIDIQ_EMPTY(m->outq)) {
- m->flags &= ~M_TXEN;
- MPU_CALLBACKP(m, m->cookie, m->flags);
+ m->flags &= ~M_TXEN;
+ MPU_CALLBACKP(m, m->cookie, m->flags);
}
- if (used && MIDIQ_AVAIL(m->outq) > m->hiwat ) {
+ if (used && MIDIQ_AVAIL(m->outq) > m->hiwat) {
if (m->wchan) {
wakeup(&m->wchan);
m->wchan = 0;
}
selwakeup(&m->wsel);
- if (m->async) {
+ if (m->async) {
PROC_LOCK(m->async);
psignal(m->async, SIGIO);
PROC_UNLOCK(m->async);
@@ -614,15 +617,15 @@
* /dev/rmidi#.# device access functions
*/
int
-midi_open(struct cdev *i_dev, int flags, int mode, struct thread * td)
+midi_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
{
struct snd_midi *m = i_dev->si_drv1;
- int retval;
+ int retval;
- MIDI_DEBUG(1,printf("midiopen %p %s %s\n", td,
- flags & FREAD?"M_RX":"", flags & FWRITE?"M_TX":""));
+ MIDI_DEBUG(1, printf("midiopen %p %s %s\n", td,
+ flags & FREAD ? "M_RX" : "", flags & FWRITE ? "M_TX" : ""));
if (m == NULL)
- return ENXIO;
+ return ENXIO;
mtx_lock(&m->lock);
mtx_lock(&m->qlock);
@@ -630,20 +633,20 @@
retval = 0;
if (flags & FREAD) {
- if (MIDIQ_SIZE(m->inq) == 0)
- retval = ENXIO;
- else if (m->flags & M_RX)
- retval = EBUSY;
- if (retval)
- goto err;
+ if (MIDIQ_SIZE(m->inq) == 0)
+ retval = ENXIO;
+ else if (m->flags & M_RX)
+ retval = EBUSY;
+ if (retval)
+ goto err;
}
if (flags & FWRITE) {
- if (MIDIQ_SIZE(m->outq) == 0)
- retval = ENXIO;
- else if (m->flags & M_TX)
- retval = EBUSY;
- if (retval)
- goto err;
+ if (MIDIQ_SIZE(m->outq) == 0)
+ retval = ENXIO;
+ else if (m->flags & M_TX)
+ retval = EBUSY;
+ if (retval)
+ goto err;
}
m->busy++;
@@ -652,16 +655,16 @@
m->async = 0;
if (flags & FREAD) {
- m->flags |= M_RX | M_RXEN;
- /*
- * Only clear the inq, the outq might still have data to drain from
- * a previous session
- */
- MIDIQ_CLEAR(m->inq);
+ m->flags |= M_RX | M_RXEN;
+ /*
+ * Only clear the inq, the outq might still have data to drain
+ * from a previous session
+ */
+ MIDIQ_CLEAR(m->inq);
};
if (flags & FWRITE)
- m->flags |= M_TX;
+ m->flags |= M_TX;
MPU_CALLBACK(m, m->cookie, m->flags);
@@ -673,37 +676,36 @@
}
int
-midi_close(struct cdev *i_dev, int flags, int mode, struct thread * td)
+midi_close(struct cdev *i_dev, int flags, int mode, struct thread *td)
{
struct snd_midi *m = i_dev->si_drv1;
- int retval;
- int oldflags;
+ int retval;
+ int oldflags;
MIDI_DEBUG(1, printf("midi_close %p %s %s\n", td,
- flags & FREAD?"M_RX":"", flags & FWRITE?"M_TX":""));
+ flags & FREAD ? "M_RX" : "", flags & FWRITE ? "M_TX" : ""));
if (m == NULL)
- return ENXIO;
+ return ENXIO;
mtx_lock(&m->lock);
mtx_lock(&m->qlock);
- if ( (flags & FREAD && !(m->flags & M_RX)) ||
- (flags & FWRITE && !(m->flags & M_TX)) ) {
- retval = ENXIO;
- goto err;
+ if ((flags & FREAD && !(m->flags & M_RX)) ||
+ (flags & FWRITE && !(m->flags & M_TX))) {
+ retval = ENXIO;
+ goto err;
}
-
m->busy--;
oldflags = m->flags;
if (flags & FREAD)
- m->flags &= ~(M_RX | M_RXEN);
+ m->flags &= ~(M_RX | M_RXEN);
if (flags & FWRITE)
- m->flags &= ~M_TX;
+ m->flags &= ~M_TX;
- if( (m->flags & (M_TXEN | M_RXEN)) != (oldflags & (M_RXEN | M_TXEN)) )
+ if ((m->flags & (M_TXEN | M_RXEN)) != (oldflags & (M_RXEN | M_TXEN)))
MPU_CALLBACK(m, m->cookie, m->flags);
MIDI_DEBUG(1, printf("midi_close: closed, busy = %d.\n", m->busy));
@@ -713,70 +715,73 @@
retval = 0;
err: return retval;
}
+
/*
- * TODO: midi_read, per oss programmer's guide pg. 42 should return as soon as data is available.
+ * TODO: midi_read, per oss programmer's guide pg. 42 should return as soon
+ * as data is available.
*/
int
-midi_read(struct cdev *i_dev, struct uio * uio, int ioflag)
+midi_read(struct cdev *i_dev, struct uio *uio, int ioflag)
{
#define MIDI_RSIZE 32
struct snd_midi *m = i_dev->si_drv1;
- int retval;
- int used;
- char buf[MIDI_RSIZE];
+ int retval;
+ int used;
+ char buf[MIDI_RSIZE];
- MIDI_DEBUG(5, printf("midiread: count=%lu\n", (unsigned long)uio->uio_resid));
+ MIDI_DEBUG(5, printf("midiread: count=%lu\n",
+ (unsigned long)uio->uio_resid));
retval = EIO;
if (m == NULL)
- goto err0;
+ goto err0;
mtx_lock(&m->lock);
mtx_lock(&m->qlock);
if (!(m->flags & M_RX))
- goto err1;
+ goto err1;
while (uio->uio_resid > 0) {
- while (MIDIQ_EMPTY(m->inq)) {
- retval = EWOULDBLOCK;
- if (ioflag & O_NONBLOCK)
- goto err1;
- mtx_unlock(&m->lock);
- m->rchan = 1;
- retval = msleep(&m->rchan, &m->qlock,
- PCATCH | PDROP, "midi RX", 0);
+ while (MIDIQ_EMPTY(m->inq)) {
+ retval = EWOULDBLOCK;
+ if (ioflag & O_NONBLOCK)
+ goto err1;
+ mtx_unlock(&m->lock);
+ m->rchan = 1;
+ retval = msleep(&m->rchan, &m->qlock,
+ PCATCH | PDROP, "midi RX", 0);
+ /*
+ * We slept, maybe things have changed since last
+ * dying check
+ */
+ if (retval == EINTR)
+ goto err0;
+ if (m != i_dev->si_drv1)
+ retval = ENXIO;
+ /* if (retval && retval != ERESTART) */
+ if (retval)
+ goto err0;
+ mtx_lock(&m->lock);
+ mtx_lock(&m->qlock);
+ m->rchan = 0;
+ if (!m->busy)
+ goto err1;
+ }
+ MIDI_DEBUG(6, printf("midi_read start\n"));
/*
- * We slept, maybe things have changed since last
- * dying check
- */
- if (retval == EINTR)
- goto err0;
- if (m != i_dev->si_drv1)
- retval = ENXIO;
- /* if (retval && retval != ERESTART) */
- if (retval)
- goto err0;
- mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
- m->rchan = 0;
- if (!m->busy)
- goto err1;
- }
- MIDI_DEBUG(6, printf("midi_read start\n"));
- /*
- * At this point, it is certain that m->inq has data
- */
+ * At this point, it is certain that m->inq has data
+ */
- used = MIN(MIDIQ_LEN(m->inq), uio->uio_resid);
- used = MIN(used, MIDI_RSIZE);
+ used = MIN(MIDIQ_LEN(m->inq), uio->uio_resid);
+ used = MIN(used, MIDI_RSIZE);
- MIDI_DEBUG(6,printf("midiread: uiomove cc=%d\n", used));
- MIDIQ_DEQ(m->inq, buf, used);
- retval = uiomove(buf, used, uio);
- if (retval)
- goto err1;
+ MIDI_DEBUG(6, printf("midiread: uiomove cc=%d\n", used));
+ MIDIQ_DEQ(m->inq, buf, used);
+ retval = uiomove(buf, used, uio);
+ if (retval)
+ goto err1;
}
/*
@@ -785,7 +790,7 @@
retval = 0;
err1: mtx_unlock(&m->qlock);
mtx_unlock(&m->lock);
-err0: MIDI_DEBUG(4, printf("midi_read: ret %d\n",retval));
+err0: MIDI_DEBUG(4, printf("midi_read: ret %d\n", retval));
return retval;
}
@@ -794,74 +799,76 @@
*/
int
-midi_write(struct cdev *i_dev, struct uio * uio, int ioflag)
+midi_write(struct cdev *i_dev, struct uio *uio, int ioflag)
{
#define MIDI_WSIZE 32
struct snd_midi *m = i_dev->si_drv1;
- int retval;
- int used;
- char buf[MIDI_WSIZE];
+ int retval;
+ int used;
+ char buf[MIDI_WSIZE];
- MIDI_DEBUG(4, printf("midi_write\n"));
+ MIDI_DEBUG(4, printf("midi_write\n"));
retval = 0;
if (m == NULL)
- goto err0;
+ goto err0;
mtx_lock(&m->lock);
mtx_lock(&m->qlock);
if (!(m->flags & M_TX))
- goto err1;
+ goto err1;
while (uio->uio_resid > 0) {
- while (MIDIQ_AVAIL(m->outq) == 0) {
- retval = EWOULDBLOCK;
- if (ioflag & O_NONBLOCK)
- goto err1;
- mtx_unlock(&m->lock);
- m->wchan = 1;
- MIDI_DEBUG(3,printf("midi_write msleep\n"));
- retval = msleep(&m->wchan, &m->qlock,
- PCATCH | PDROP, "midi TX", 0);
+ while (MIDIQ_AVAIL(m->outq) == 0) {
+ retval = EWOULDBLOCK;
+ if (ioflag & O_NONBLOCK)
+ goto err1;
+ mtx_unlock(&m->lock);
+ m->wchan = 1;
+ MIDI_DEBUG(3, printf("midi_write msleep\n"));
+ retval = msleep(&m->wchan, &m->qlock,
+ PCATCH | PDROP, "midi TX", 0);
+ /*
+ * We slept, maybe things have changed since last
+ * dying check
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list