diff options
author | Takashi Iwai <tiwai@suse.de> | 2015-01-27 16:42:14 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-01-28 07:22:57 +0100 |
commit | 247d95ee6dd22e5323ecf7a73ff64110ef2fa2da (patch) | |
tree | 854cfaf76c2069ef4eeaee444095eee526d30b95 /sound/usb | |
parent | ALSA: line6: Make common PCM pointer callback (diff) | |
download | linux-247d95ee6dd22e5323ecf7a73ff64110ef2fa2da.tar.xz linux-247d95ee6dd22e5323ecf7a73ff64110ef2fa2da.zip |
ALSA: line6: Handle error from line6_pcm_acquire()
Tested-by: Chris Rorvick <chris@rorvick.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/line6/pcm.c | 13 | ||||
-rw-r--r-- | sound/usb/line6/toneport.c | 13 |
2 files changed, 20 insertions, 6 deletions
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c index 73c87467d2e0..8461d6bf992f 100644 --- a/sound/usb/line6/pcm.c +++ b/sound/usb/line6/pcm.c @@ -45,15 +45,22 @@ static int snd_line6_impulse_volume_put(struct snd_kcontrol *kcontrol, { struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); int value = ucontrol->value.integer.value[0]; + int err; if (line6pcm->impulse_volume == value) return 0; line6pcm->impulse_volume = value; - if (value > 0) - line6_pcm_acquire(line6pcm, LINE6_STREAM_IMPULSE); - else + if (value > 0) { + err = line6_pcm_acquire(line6pcm, LINE6_STREAM_IMPULSE); + if (err < 0) { + line6pcm->impulse_volume = 0; + line6_pcm_release(line6pcm, LINE6_STREAM_IMPULSE); + return err; + } + } else { line6_pcm_release(line6pcm, LINE6_STREAM_IMPULSE); + } return 1; } diff --git a/sound/usb/line6/toneport.c b/sound/usb/line6/toneport.c index 61fa6256d7b0..819e06b3f3db 100644 --- a/sound/usb/line6/toneport.c +++ b/sound/usb/line6/toneport.c @@ -182,16 +182,23 @@ static int snd_toneport_monitor_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); + int err; if (ucontrol->value.integer.value[0] == line6pcm->volume_monitor) return 0; line6pcm->volume_monitor = ucontrol->value.integer.value[0]; - if (line6pcm->volume_monitor > 0) - line6_pcm_acquire(line6pcm, LINE6_STREAM_MONITOR); - else + if (line6pcm->volume_monitor > 0) { + err = line6_pcm_acquire(line6pcm, LINE6_STREAM_MONITOR); + if (err < 0) { + line6pcm->volume_monitor = 0; + line6_pcm_release(line6pcm, LINE6_STREAM_MONITOR); + return err; + } + } else { line6_pcm_release(line6pcm, LINE6_STREAM_MONITOR); + } return 1; } |