[alsa-devel] [PATCH 2/2] ALSA: rawmidi: add a helper to set runtime error
Takashi Sakamoto
o-takashi at sakamocchi.jp
Sat Aug 13 14:39:17 CEST 2016
In previous commit, runtime of rawmidi substream can represent error state.
This allows drivers to break the runtime voluntarily.
This commit adds a helper function to help drivers.
Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
---
include/sound/rawmidi.h | 2 ++
sound/core/rawmidi.c | 25 +++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h
index da1e93f..0b9c0f6 100644
--- a/include/sound/rawmidi.h
+++ b/include/sound/rawmidi.h
@@ -191,4 +191,6 @@ long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
const unsigned char *buf, long count);
+void snd_rawmidi_substream_break(struct snd_rawmidi_substream *substream);
+
#endif /* __SOUND_RAWMIDI_H */
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c
index 1ca820e..c5da14a 100644
--- a/sound/core/rawmidi.c
+++ b/sound/core/rawmidi.c
@@ -134,6 +134,31 @@ static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
return 0;
}
+/**
+ * snd_rawmidi_substream_break - break rawmidi substream
+ * @substream: the rawmidi substream.
+ *
+ * When logical channel between system and device for MIDI transmitssion is
+ * under disorder, call this helper to notify it to userspace. Once broken,
+ * the substream should be closed in userspace, because there's no
+ * operation for userspace applications to recover from this state.
+ */
+void snd_rawmidi_substream_break(struct snd_rawmidi_substream *substream)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&substream->runtime->lock, flags);
+ substream->runtime->error = true;
+ spin_unlock_irqrestore(&substream->runtime->lock, flags);
+
+ /* Kick event listener. */
+ if (runtime->event)
+ schedule_work(&runtime->event_work);
+
+ wake_up(&runtime->sleep);
+}
+EXPORT_SYMBOL(snd_rawmidi_substream_break);
+
static int snd_rawmidi_runtime_free(struct snd_rawmidi_substream *substream)
{
struct snd_rawmidi_runtime *runtime = substream->runtime;
--
2.7.4
More information about the Alsa-devel
mailing list