static int dump_to_midi(unsigned char midi_byte) { unsigned long flags; int ok = 0; output_used = 1; save_flags(flags); cli(); if (GUS_MIDI_STATUS() & MIDI_XMIT_EMPTY) { ok = 1; outb((midi_byte), u_MidiData); } else { /* * Enable Midi xmit interrupts (again) */ gus_midi_control |= MIDI_ENABLE_XMIT; outb((gus_midi_control), u_MidiControl); } restore_flags(flags); return ok; }
static int dump_to_midi (unsigned char midi_byte) { unsigned long flags; int ok = 0; output_used = 1; DISABLE_INTR (flags); if (GUS_MIDI_STATUS () & MIDI_XMIT_EMPTY) { ok = 1; OUTB (midi_byte, u_MidiData); } else { /* * Enable Midi xmit interrupts (again) */ gus_midi_control |= MIDI_ENABLE_XMIT; OUTB (gus_midi_control, u_MidiControl); } RESTORE_INTR (flags); return ok; }
static int gus_midi_buffer_status(int dev) { unsigned long flags; if (!output_used) return 0; save_flags(flags); cli(); if (qlen && dump_to_midi(tmp_queue[qhead])) { qlen--; qhead++; } restore_flags(flags); return (qlen > 0) | !(GUS_MIDI_STATUS() & MIDI_XMIT_EMPTY); }
void gus_midi_interrupt (int dummy) { unsigned char stat, data; unsigned long flags; DISABLE_INTR (flags); stat = GUS_MIDI_STATUS (); if (stat & MIDI_RCV_FULL) { data = INB (u_MidiData); if (input_opened) midi_input_intr (my_dev, data); } if (stat & MIDI_XMIT_EMPTY) { while (qlen && dump_to_midi (tmp_queue[qhead])) { qlen--; qhead++; } if (!qlen) { /* * Disable Midi output interrupts, since no data in the buffer */ gus_midi_control &= ~MIDI_ENABLE_XMIT; OUTB (gus_midi_control, u_MidiControl); } } #if 0 if (stat & MIDI_FRAME_ERR) printk ("GUS: Midi framing error\n"); if (stat & MIDI_OVERRUN && input_opened) printk ("GUS: Midi input overrun\n"); #endif RESTORE_INTR (flags); }
static int gus_midi_buffer_status (int dev) { unsigned long flags; if (!output_used) return 0; DISABLE_INTR (flags); if (qlen && dump_to_midi (tmp_queue[qhead])) { qlen--; qhead++; } RESTORE_INTR (flags); return (qlen > 0) | !(GUS_MIDI_STATUS () & MIDI_XMIT_EMPTY); }
void gus_midi_interrupt(int dummy) { volatile unsigned char stat, data; unsigned long flags; int timeout = 10; save_flags(flags); cli(); while (timeout-- > 0 && (stat = GUS_MIDI_STATUS()) & (MIDI_RCV_FULL | MIDI_XMIT_EMPTY)) { if (stat & MIDI_RCV_FULL) { data = inb(u_MidiData); if (input_opened) midi_input_intr(my_dev, data); } if (stat & MIDI_XMIT_EMPTY) { while (qlen && dump_to_midi(tmp_queue[qhead])) { qlen--; qhead++; } if (!qlen) { /* * Disable Midi output interrupts, since no data in the buffer */ gus_midi_control &= ~MIDI_ENABLE_XMIT; outb((gus_midi_control), u_MidiControl); outb((gus_midi_control), u_MidiControl); } } } restore_flags(flags); }