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:
Родитель
e8e0929d72
Коммит
3702b08228
|
@ -269,16 +269,22 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)
|
|||
{
|
||||
int index = sub->number;
|
||||
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)
|
||||
return SNDRV_PCM_POS_XRUN;
|
||||
ptr = SNDRV_PCM_POS_XRUN;
|
||||
|
||||
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]);
|
||||
else
|
||||
return bytes_to_frames(sub->runtime,
|
||||
ptr = bytes_to_frames(sub->runtime,
|
||||
dev->audio_in_buf_pos[index]);
|
||||
|
||||
spin_unlock(&dev->spinlock);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/* operators for both playback and capture */
|
||||
|
|
Загрузка…
Ссылка в новой задаче