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: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user