summaryrefslogtreecommitdiff
path: root/sound/firewire/oxfw/oxfw-midi.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/firewire/oxfw/oxfw-midi.c')
-rw-r--r--sound/firewire/oxfw/oxfw-midi.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sound/firewire/oxfw/oxfw-midi.c b/sound/firewire/oxfw/oxfw-midi.c
index 334b11d1a422..540a30338516 100644
--- a/sound/firewire/oxfw/oxfw-midi.c
+++ b/sound/firewire/oxfw/oxfw-midi.c
@@ -13,6 +13,10 @@ static int midi_capture_open(struct snd_rawmidi_substream *substream)
struct snd_oxfw *oxfw = substream->rmidi->private_data;
int err;
+ err = snd_oxfw_stream_lock_try(oxfw);
+ if (err < 0)
+ return err;
+
mutex_lock(&oxfw->mutex);
oxfw->capture_substreams++;
@@ -20,6 +24,9 @@ static int midi_capture_open(struct snd_rawmidi_substream *substream)
mutex_unlock(&oxfw->mutex);
+ if (err < 0)
+ snd_oxfw_stream_lock_release(oxfw);
+
return err;
}
@@ -28,6 +35,10 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream)
struct snd_oxfw *oxfw = substream->rmidi->private_data;
int err;
+ err = snd_oxfw_stream_lock_try(oxfw);
+ if (err < 0)
+ return err;
+
mutex_lock(&oxfw->mutex);
oxfw->playback_substreams++;
@@ -35,6 +46,9 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream)
mutex_unlock(&oxfw->mutex);
+ if (err < 0)
+ snd_oxfw_stream_lock_release(oxfw);
+
return err;
}
@@ -49,6 +63,7 @@ static int midi_capture_close(struct snd_rawmidi_substream *substream)
mutex_unlock(&oxfw->mutex);
+ snd_oxfw_stream_lock_release(oxfw);
return 0;
}
@@ -63,6 +78,7 @@ static int midi_playback_close(struct snd_rawmidi_substream *substream)
mutex_unlock(&oxfw->mutex);
+ snd_oxfw_stream_lock_release(oxfw);
return 0;
}