aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorMark Hills <mark@pogo.org.uk>2009-10-24 07:59:35 -0400
committerTakashi Iwai <tiwai@suse.de>2009-10-30 07:29:16 -0400
commit3702b082281929cf1bdf14f67eb0619aab58b496 (patch)
tree26eeb2395c960744c70eb3d5e31a4d9f16ec0c6a /sound/usb
parente8e0929d7290cab7c5b1a3e5f5f54f73daf38038 (diff)
ALSA: snd-usb-caiaq: Missing lock around use of buffer positions
Fix a race which causes snd_pcm_update_hw_ptr_pos() to report a bug. Signed-off-by: Mark Hills <mark@pogo.org.uk> Acked-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/caiaq/audio.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c
index 121af0644fd9..e76017cd5acf 100644
--- a/sound/usb/caiaq/audio.c
+++ b/sound/usb/caiaq/audio.c
@@ -269,16 +269,22 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)
269{ 269{
270 int index = sub->number; 270 int index = sub->number;
271 struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub); 271 struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
272 snd_pcm_uframes_t ptr;
273
274 spin_lock(&dev->spinlock);
272 275
273 if (dev->input_panic || dev->output_panic) 276 if (dev->input_panic || dev->output_panic)
274 return SNDRV_PCM_POS_XRUN; 277 ptr = SNDRV_PCM_POS_XRUN;
275 278
276 if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) 279 if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
277 return bytes_to_frames(sub->runtime, 280 ptr = bytes_to_frames(sub->runtime,
278 dev->audio_out_buf_pos[index]); 281 dev->audio_out_buf_pos[index]);
279 else 282 else
280 return bytes_to_frames(sub->runtime, 283 ptr = bytes_to_frames(sub->runtime,
281 dev->audio_in_buf_pos[index]); 284 dev->audio_in_buf_pos[index]);
285
286 spin_unlock(&dev->spinlock);
287 return ptr;
282} 288}
283 289
284/* operators for both playback and capture */ 290/* operators for both playback and capture */