summaryrefslogtreecommitdiff
path: root/sound/core/rawmidi_compat.c
diff options
context:
space:
mode:
authorDavid Henningsson <coding@diwic.se>2021-05-15 10:15:33 +0300
committerTakashi Iwai <tiwai@suse.de>2021-05-17 17:02:44 +0300
commit08fdced60ca08e34e316a3ab945636fcdfcbc973 (patch)
tree2ebf36f380c9bafbb78b43bb32de7118c8f4d529 /sound/core/rawmidi_compat.c
parentbac59054544ebdb89f05c5b9598ca9cb2dea72ce (diff)
downloadlinux-08fdced60ca08e34e316a3ab945636fcdfcbc973.tar.xz
ALSA: rawmidi: Add framing mode
This commit adds a new framing mode that frames all MIDI data into 32-byte frames with a timestamp. The main benefit is that we can get accurate timestamps even if userspace wakeup and processing is not immediate. Testing on a Celeron N3150 with this mode has a max jitter of 2.8 ms, compared to the in-kernel seq implementation which has a max jitter of 5 ms during idle and much worse when running scheduler stress tests in parallel. Signed-off-by: David Henningsson <coding@diwic.se> Reviewed-by: Jaroslav Kysela <perex@perex.cz> Link: https://lore.kernel.org/r/20210515071533.55332-1-coding@diwic.se Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/rawmidi_compat.c')
-rw-r--r--sound/core/rawmidi_compat.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sound/core/rawmidi_compat.c b/sound/core/rawmidi_compat.c
index 7397130976d0..68a93443583c 100644
--- a/sound/core/rawmidi_compat.c
+++ b/sound/core/rawmidi_compat.c
@@ -13,7 +13,8 @@ struct snd_rawmidi_params32 {
u32 buffer_size;
u32 avail_min;
unsigned int no_active_sensing; /* avoid bit-field */
- unsigned char reserved[16];
+ unsigned int mode;
+ unsigned char reserved[12];
} __attribute__((packed));
static int snd_rawmidi_ioctl_params_compat(struct snd_rawmidi_file *rfile,
@@ -25,6 +26,7 @@ static int snd_rawmidi_ioctl_params_compat(struct snd_rawmidi_file *rfile,
if (get_user(params.stream, &src->stream) ||
get_user(params.buffer_size, &src->buffer_size) ||
get_user(params.avail_min, &src->avail_min) ||
+ get_user(params.mode, &src->mode) ||
get_user(val, &src->no_active_sensing))
return -EFAULT;
params.no_active_sensing = val;