mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-18 21:14:28 +00:00
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>
This commit is contained in:
parent
e8e0929d72
commit
3702b08228
1 changed files with 9 additions and 3 deletions
|
@ -269,16 +269,22 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)
|
||||||
{
|
{
|
||||||
int index = sub->number;
|
int index = sub->number;
|
||||||
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
|
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
|
||||||
|
snd_pcm_uframes_t ptr;
|
||||||
|
|
||||||
|
spin_lock(&dev->spinlock);
|
||||||
|
|
||||||
if (dev->input_panic || dev->output_panic)
|
if (dev->input_panic || dev->output_panic)
|
||||||
return SNDRV_PCM_POS_XRUN;
|
ptr = SNDRV_PCM_POS_XRUN;
|
||||||
|
|
||||||
if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||||
return bytes_to_frames(sub->runtime,
|
ptr = bytes_to_frames(sub->runtime,
|
||||||
dev->audio_out_buf_pos[index]);
|
dev->audio_out_buf_pos[index]);
|
||||||
else
|
else
|
||||||
return bytes_to_frames(sub->runtime,
|
ptr = bytes_to_frames(sub->runtime,
|
||||||
dev->audio_in_buf_pos[index]);
|
dev->audio_in_buf_pos[index]);
|
||||||
|
|
||||||
|
spin_unlock(&dev->spinlock);
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* operators for both playback and capture */
|
/* operators for both playback and capture */
|
||||||
|
|
Loading…
Add table
Reference in a new issue