Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef965ad5 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: seq: Minor cleanup of MIDI event parser helpers



snd_midi_event_encode_byte() can never fail, and it can return rather
true/false.  Change the return type to bool, adjust the argument to
receive a MIDI byte as unsigned char, and adjust the comment
accordingly.  This allows callers to drop error checks, which
simplifies the code.

Meanwhile, snd_midi_event_encode() helper is used only in seq_midi.c,
and it can be better folded into it.  This will reduce the total
amount of lines in the end.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d5e77fca
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -43,10 +43,8 @@ void snd_midi_event_free(struct snd_midi_event *dev);
void snd_midi_event_reset_encode(struct snd_midi_event *dev);
void snd_midi_event_reset_decode(struct snd_midi_event *dev);
void snd_midi_event_no_status(struct snd_midi_event *dev, int on);
/* encode from byte stream - return number of written bytes if success */
long snd_midi_event_encode(struct snd_midi_event *dev, unsigned char *buf, long count,
bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char c,
				struct snd_seq_event *ev);
int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c, struct snd_seq_event *ev);
/* decode from event to bytes - return number of written bytes if success */
long snd_midi_event_decode(struct snd_midi_event *dev, unsigned char *buf, long count,
			   struct snd_seq_event *ev);
+1 −1
Original line number Diff line number Diff line
@@ -637,7 +637,7 @@ snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, stru

	if ((mdev = get_mididev(dp, dev)) == NULL)
		return -ENODEV;
	if (snd_midi_event_encode_byte(mdev->coder, c, ev) > 0) {
	if (snd_midi_event_encode_byte(mdev->coder, c, ev)) {
		snd_seq_oss_fill_addr(dp, ev, mdev->client, mdev->port);
		snd_use_lock_free(&mdev->use_lock);
		return 0;
+10 −14
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ static void snd_midi_input_event(struct snd_rawmidi_substream *substream)
	struct seq_midisynth *msynth;
	struct snd_seq_event ev;
	char buf[16], *pbuf;
	long res, count;
	long res;

	if (substream == NULL)
		return;
@@ -94,13 +94,10 @@ static void snd_midi_input_event(struct snd_rawmidi_substream *substream)
		if (msynth->parser == NULL)
			continue;
		pbuf = buf;
		while (res > 0) {
			count = snd_midi_event_encode(msynth->parser, pbuf, res, &ev);
			if (count < 0)
				break;
			pbuf += count;
			res -= count;
			if (ev.type != SNDRV_SEQ_EVENT_NONE) {
		while (res-- > 0) {
			if (!snd_midi_event_encode_byte(msynth->parser,
							*pbuf++, &ev))
				continue;
			ev.source.port = msynth->seq_port;
			ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
			snd_seq_kernel_client_dispatch(msynth->seq_client, &ev, 1, 0);
@@ -109,7 +106,6 @@ static void snd_midi_input_event(struct snd_rawmidi_substream *substream)
		}
	}
}
}

static int dump_midi(struct snd_rawmidi_substream *substream, const char *buf, int count)
{
+7 −35
Original line number Diff line number Diff line
@@ -214,45 +214,17 @@ int snd_midi_event_resize_buffer(struct snd_midi_event *dev, int bufsize)
}
#endif  /*  0  */

/*
 *  read bytes and encode to sequencer event if finished
 *  return the size of encoded bytes
 */
long snd_midi_event_encode(struct snd_midi_event *dev, unsigned char *buf, long count,
			   struct snd_seq_event *ev)
{
	long result = 0;
	int rc;

	ev->type = SNDRV_SEQ_EVENT_NONE;

	while (count-- > 0) {
		rc = snd_midi_event_encode_byte(dev, *buf++, ev);
		result++;
		if (rc < 0)
			return rc;
		else if (rc > 0)
			return result;
	}

	return result;
}
EXPORT_SYMBOL(snd_midi_event_encode);

/*
 *  read one byte and encode to sequencer event:
 *  return 1 if MIDI bytes are encoded to an event
 *         0 data is not finished
 *         negative for error
 *  return true if MIDI bytes are encoded to an event
 *         false data is not finished
 */
int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c,
bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char c,
				struct snd_seq_event *ev)
{
	int rc = 0;
	bool rc = false;
	unsigned long flags;

	c &= 0xff;

	if (c >= MIDI_CMD_COMMON_CLOCK) {
		/* real-time event */
		ev->type = status_event[ST_SPECIAL + c - 0xf0].event;
@@ -293,7 +265,7 @@ int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c,
			status_event[dev->type].encode(dev, ev);
		if (dev->type >= ST_SPECIAL)
			dev->type = ST_INVALID;
		rc = 1;
		rc = true;
	} else 	if (dev->type == ST_SYSEX) {
		if (c == MIDI_CMD_COMMON_SYSEX_END ||
		    dev->read >= dev->bufsize) {
@@ -306,7 +278,7 @@ int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c,
				dev->read = 0; /* continue to parse */
			else
				reset_encode(dev); /* all parsed */
			rc = 1;
			rc = true;
		}
	}

+2 −2
Original line number Diff line number Diff line
@@ -174,8 +174,8 @@ static void snd_vmidi_output_work(struct work_struct *work)
	while (READ_ONCE(vmidi->trigger)) {
		if (snd_rawmidi_transmit(substream, &input, 1) != 1)
			break;
		if (snd_midi_event_encode_byte(vmidi->parser, input,
					       &vmidi->event) <= 0)
		if (!snd_midi_event_encode_byte(vmidi->parser, input,
						&vmidi->event))
			continue;
		if (vmidi->event.type != SNDRV_SEQ_EVENT_NONE) {
			ret = snd_seq_kernel_client_dispatch(vmidi->client,