diff options
Diffstat (limited to 'sound/firewire/fireworks/fireworks_midi.c')
-rw-r--r-- | sound/firewire/fireworks/fireworks_midi.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/sound/firewire/fireworks/fireworks_midi.c b/sound/firewire/fireworks/fireworks_midi.c index cbf34e99237..4a600d235ec 100644 --- a/sound/firewire/fireworks/fireworks_midi.c +++ b/sound/firewire/fireworks/fireworks_midi.c @@ -11,17 +11,36 @@ static int midi_capture_open(struct snd_rawmidi_substream *substream) { struct snd_efw *efw = substream->rmidi->private_data; + int err; + + err = snd_efw_stream_lock_try(efw); + if (err < 0) + goto end; atomic_inc(&efw->capture_substreams); - return snd_efw_stream_start_duplex(efw, 0); + err = snd_efw_stream_start_duplex(efw, 0); + if (err < 0) + snd_efw_stream_lock_release(efw); + +end: + return err; } static int midi_playback_open(struct snd_rawmidi_substream *substream) { struct snd_efw *efw = substream->rmidi->private_data; + int err; + + err = snd_efw_stream_lock_try(efw); + if (err < 0) + goto end; atomic_inc(&efw->playback_substreams); - return snd_efw_stream_start_duplex(efw, 0); + err = snd_efw_stream_start_duplex(efw, 0); + if (err < 0) + snd_efw_stream_lock_release(efw); +end: + return err; } static int midi_capture_close(struct snd_rawmidi_substream *substream) @@ -31,6 +50,7 @@ static int midi_capture_close(struct snd_rawmidi_substream *substream) atomic_dec(&efw->capture_substreams); snd_efw_stream_stop_duplex(efw); + snd_efw_stream_lock_release(efw); return 0; } @@ -41,6 +61,7 @@ static int midi_playback_close(struct snd_rawmidi_substream *substream) atomic_dec(&efw->playback_substreams); snd_efw_stream_stop_duplex(efw); + snd_efw_stream_lock_release(efw); return 0; } |