提交 50f3beb5 编写于 作者: M Mauro Carvalho Chehab

V4L/DVB (9742): em28xx-alsa: implement another locking schema

Instead of using a spinlock, it is better to call the proper pcm stream
locking schema.
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 7a8f4ccf
...@@ -75,7 +75,9 @@ static void em28xx_audio_isocirq(struct urb *urb) ...@@ -75,7 +75,9 @@ static void em28xx_audio_isocirq(struct urb *urb)
struct em28xx *dev = urb->context; struct em28xx *dev = urb->context;
int i; int i;
unsigned int oldptr; unsigned int oldptr;
#ifdef NO_PCM_LOCK
unsigned long flags; unsigned long flags;
#endif
int period_elapsed = 0; int period_elapsed = 0;
int status; int status;
unsigned char *cp; unsigned char *cp;
...@@ -96,9 +98,26 @@ static void em28xx_audio_isocirq(struct urb *urb) ...@@ -96,9 +98,26 @@ static void em28xx_audio_isocirq(struct urb *urb)
if (!length) if (!length)
continue; continue;
#ifdef NO_PCM_LOCK
spin_lock_irqsave(&dev->adev->slock, flags); spin_lock_irqsave(&dev->adev->slock, flags);
#endif
oldptr = dev->adev->hwptr_done_capture; oldptr = dev->adev->hwptr_done_capture;
if (oldptr + length >= runtime->buffer_size) {
unsigned int cnt =
runtime->buffer_size - oldptr;
memcpy(runtime->dma_area + oldptr * stride, cp,
cnt * stride);
memcpy(runtime->dma_area, cp + cnt * stride,
length * stride - cnt * stride);
} else {
memcpy(runtime->dma_area + oldptr * stride, cp,
length * stride);
}
#ifndef NO_PCM_LOCK
snd_pcm_stream_lock(substream);
#endif
dev->adev->hwptr_done_capture += length; dev->adev->hwptr_done_capture += length;
if (dev->adev->hwptr_done_capture >= if (dev->adev->hwptr_done_capture >=
runtime->buffer_size) runtime->buffer_size)
...@@ -113,19 +132,11 @@ static void em28xx_audio_isocirq(struct urb *urb) ...@@ -113,19 +132,11 @@ static void em28xx_audio_isocirq(struct urb *urb)
period_elapsed = 1; period_elapsed = 1;
} }
#ifdef NO_PCM_LOCK
spin_unlock_irqrestore(&dev->adev->slock, flags); spin_unlock_irqrestore(&dev->adev->slock, flags);
#else
if (oldptr + length >= runtime->buffer_size) { snd_pcm_stream_unlock(substream);
unsigned int cnt = #endif
runtime->buffer_size - oldptr;
memcpy(runtime->dma_area + oldptr * stride, cp,
cnt * stride);
memcpy(runtime->dma_area, cp + cnt * stride,
length * stride - cnt * stride);
} else {
memcpy(runtime->dma_area + oldptr * stride, cp,
length * stride);
}
} }
if (period_elapsed) if (period_elapsed)
snd_pcm_period_elapsed(substream); snd_pcm_period_elapsed(substream);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册