示例#1
0
文件: gus_midi.c 项目: hugh712/Jollen
static int gus_midi_out(int dev, unsigned char midi_byte)
{
	unsigned long   flags;

	/*
	 * Drain the local queue first
	 */

	save_flags(flags);
	cli();

	while (qlen && dump_to_midi(tmp_queue[qhead]))
	{
		qlen--;
		qhead++;
	}
	restore_flags(flags);

	/*
	 *	Output the byte if the local queue is empty.
	 */

	if (!qlen)
		if (dump_to_midi(midi_byte))
			return 1;	/*
					 * OK
					 */

	/*
	 *	Put to the local queue
	 */

	if (qlen >= 256)
		return 0;	/*
				 * Local queue full
				 */
	save_flags(flags);
	cli();

	tmp_queue[qtail] = midi_byte;
	qlen++;
	qtail++;

	restore_flags(flags);
	return 1;
}
示例#2
0
文件: gus_midi.c 项目: hugh712/Jollen
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);
}
示例#3
0
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);
}
示例#4
0
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);
}
示例#5
0
文件: gus_midi.c 项目: hugh712/Jollen
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);
}