From a845f23bddcb2b0e48e8158bb06b0990c4760e7e Mon Sep 17 00:00:00 2001 From: Giedrius Date: Fri, 16 Mar 2018 18:14:31 +0200 Subject: [PATCH 254/454] Fix for Pisound's MIDI Input getting blocked for a while in rare cases. There was a possible race condition which could lead to Input's FIFO queue to be underflown, causing high amount of processing in the worker thread for some period of time. Signed-off-by: Giedrius Trainavicius --- sound/soc/bcm/pisound.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) --- a/sound/soc/bcm/pisound.c +++ b/sound/soc/bcm/pisound.c @@ -56,6 +56,12 @@ static const char *pisnd_spi_get_version static int pisnd_midi_init(struct snd_card *card); static void pisnd_midi_uninit(void); +enum task_e { + TASK_PROCESS = 0, +}; + +static void pisnd_schedule_process(enum task_e task); + #define PISOUND_LOG_PREFIX "pisound: " #ifdef PISOUND_DEBUG @@ -129,7 +135,7 @@ static void pisnd_input_trigger(struct s { if (up) { pisnd_spi_set_callback(pisnd_midi_recv_callback, substream); - pisnd_midi_recv_callback(substream); + pisnd_schedule_process(TASK_PROCESS); } else { pisnd_spi_set_callback(NULL, NULL); } @@ -258,10 +264,6 @@ static bool pisnd_spi_has_more(void) return gpiod_get_value(data_available); } -enum task_e { - TASK_PROCESS = 0, -}; - static void pisnd_schedule_process(enum task_e task) { if (pisnd_spi_device != NULL &&