diff options
author | Mark Hills <mark@pogo.org.uk> | 2012-02-21 21:26:31 +0000 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2012-02-22 08:34:58 +0100 |
commit | cb74eb15ac88d6aacf7e58db1d8f8dadee710fd9 (patch) | |
tree | 6dda03b32e0147b388020f0248b0343ebd418c20 | |
parent | fe879e2f6d65648b6398ac27f4c623ebd2e867f7 (diff) | |
download | linux-3.10-cb74eb15ac88d6aacf7e58db1d8f8dadee710fd9.tar.gz linux-3.10-cb74eb15ac88d6aacf7e58db1d8f8dadee710fd9.tar.bz2 linux-3.10-cb74eb15ac88d6aacf7e58db1d8f8dadee710fd9.zip |
ALSA: snd-usb-caiaq: Fix the return of XRUN
Commit 3702b08 added a lock, but did not account for the case of
SNDRV_PCM_POS_XRUN, which would get immediately overwritten.
This could be bundled into one if-else-if statement, but the goto
helps to clarify the 'exceptional' case.
Thanks to Andreas Pape for spotting this.
Signed-off-by: Mark Hills <mark@pogo.org.uk>
Acked-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | sound/usb/caiaq/audio.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c index 2cf87f5afed..fde9a7a29cb 100644 --- a/sound/usb/caiaq/audio.c +++ b/sound/usb/caiaq/audio.c @@ -311,8 +311,10 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) spin_lock(&dev->spinlock); - if (dev->input_panic || dev->output_panic) + if (dev->input_panic || dev->output_panic) { ptr = SNDRV_PCM_POS_XRUN; + goto unlock; + } if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) ptr = bytes_to_frames(sub->runtime, @@ -321,6 +323,7 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) ptr = bytes_to_frames(sub->runtime, dev->audio_in_buf_pos[index]); +unlock: spin_unlock(&dev->spinlock); return ptr; } |