mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
d5e77fca87
commit
ef965ad5a7
@ -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,
|
||||
struct snd_seq_event *ev);
|
||||
int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c, struct snd_seq_event *ev);
|
||||
bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char 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);
|
||||
|
@ -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;
|
||||
|
@ -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,19 +94,15 @@ 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) {
|
||||
ev.source.port = msynth->seq_port;
|
||||
ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
|
||||
snd_seq_kernel_client_dispatch(msynth->seq_client, &ev, 1, 0);
|
||||
/* clear event and reset header */
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
}
|
||||
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);
|
||||
/* clear event and reset header */
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
struct snd_seq_event *ev)
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user