]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ALSA: seq: virmidi: Add a drain operation
authorStefan Sauer <st_kost@gmx.de>
Thu, 6 Jan 2022 12:41:45 +0000 (13:41 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 6 Jan 2022 15:08:07 +0000 (16:08 +0100)
If a driver does not supply a drain operation for outputs, a default code
path will execute msleep(50). Especially for a virtual midi device
this severely limmits the throughput.

This implementation for the virtual midi driver simply flushes the output
workqueue.

Signed-off-by: Stefan Sauer <st_kost@gmx.de>
Link: https://lore.kernel.org/r/20220106124145.17254-1-st_kost@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/seq/seq_virmidi.c

index 4abc38c70cae2b3f6016940f10454536249c6bf0..f5cae49500c81447d8bbabf8a800ebd483409d4a 100644 (file)
@@ -262,6 +262,16 @@ static int snd_virmidi_output_close(struct snd_rawmidi_substream *substream)
        return 0;
 }
 
+/*
+ * drain output work queue
+ */
+static void snd_virmidi_output_drain(struct snd_rawmidi_substream *substream)
+{
+       struct snd_virmidi *vmidi = substream->runtime->private_data;
+
+       flush_work(&vmidi->output_work);
+}
+
 /*
  * subscribe callback - allow output to rawmidi device
  */
@@ -336,6 +346,7 @@ static const struct snd_rawmidi_ops snd_virmidi_output_ops = {
        .open = snd_virmidi_output_open,
        .close = snd_virmidi_output_close,
        .trigger = snd_virmidi_output_trigger,
+       .drain = snd_virmidi_output_drain,
 };
 
 /*