Loading drivers/media/video/em28xx/em28xx-audio.c +197 −176 Original line number Diff line number Diff line Loading @@ -46,8 +46,8 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; static int em28xx_cmd(struct em28xx *dev, int cmd, int arg); static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t size) static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t size) { struct snd_pcm_runtime *runtime = subs->runtime; if (runtime->dma_area) { Loading @@ -63,7 +63,9 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s } static struct snd_pcm_hardware snd_em28xx_hw_capture = { .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID, .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID, .formats = SNDRV_PCM_FMTBIT_S16_LE, .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_KNOT, .rate_min = 48000, Loading Loading @@ -101,7 +103,8 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) tuner.type = V4L2_TUNER_RADIO; /* enable GPIO for analog TV */ dev->em28xx_gpio_control(dev, EM28XX_MODE, (void*)mode); dev->em28xx_gpio_control(dev, EM28XX_MODE, (void *)mode); dev->mode = mode; /* upload firmware */ tuner_run_cmd(dev->tobj, TUNER_CMD_INIT, (void *)mode); Loading Loading @@ -131,7 +134,8 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) break; case TUNER_STUB_RADIO: /* check current mode and put a hard lock onto it */ printk("em28xx-audio: device is currently in analogue FM mode\n"); printk ("em28xx-audio: device is currently in analogue FM mode\n"); /* unmute by default here */ dev->em28xx_write_regs(dev, 0x0f, "\x87", 1); ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1); Loading Loading @@ -187,11 +191,14 @@ static int snd_em28xx_pcm_close(struct snd_pcm_substream *substream) return 0; } static int snd_em28xx_hw_capture_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) static int snd_em28xx_hw_capture_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) { unsigned int channels, rate, format; int ret; ret = snd_pcm_alloc_vmalloc_buffer(substream, params_buffer_bytes(hw_params)); ret = snd_pcm_alloc_vmalloc_buffer(substream, params_buffer_bytes(hw_params)); format = params_format(hw_params); rate = params_rate(hw_params); channels = params_channels(hw_params); Loading @@ -214,7 +221,8 @@ static int snd_em28xx_prepare(struct snd_pcm_substream *substream) return 0; } static int snd_em28xx_capture_trigger(struct snd_pcm_substream *substream, int cmd) static int snd_em28xx_capture_trigger(struct snd_pcm_substream *substream, int cmd) { struct em28xx *dev = snd_pcm_substream_chip(substream); switch (cmd) { Loading Loading @@ -247,8 +255,10 @@ static void em28xx_audio_isocirq(struct urb *urb) stride = runtime->frame_bits >> 3; for (i = 0; i < urb->number_of_packets; i++) { int length=urb->iso_frame_desc[i].actual_length/stride; cp=(unsigned char *) urb->transfer_buffer + urb->iso_frame_desc[i].offset; int length = urb->iso_frame_desc[i].actual_length / stride; cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset; if (!length) continue; Loading @@ -256,22 +266,30 @@ static void em28xx_audio_isocirq(struct urb *urb) spin_lock_irqsave(&dev->adev->slock, flags); oldptr = dev->adev->hwptr_done_capture; dev->adev->hwptr_done_capture += length; if(dev->adev->hwptr_done_capture >= runtime->buffer_size) dev->adev->hwptr_done_capture -= runtime->buffer_size; if (dev->adev->hwptr_done_capture >= runtime->buffer_size) dev->adev->hwptr_done_capture -= runtime->buffer_size; dev->adev->capture_transfer_done += length; if(dev->adev->capture_transfer_done >= runtime->period_size){ dev->adev->capture_transfer_done -= runtime->period_size; if (dev->adev->capture_transfer_done >= runtime->period_size) { dev->adev->capture_transfer_done -= runtime->period_size; period_elapsed = 1; } spin_unlock_irqrestore(&dev->adev->slock, flags); if (oldptr + length >= runtime->buffer_size) { unsigned int cnt = runtime->buffer_size-oldptr-1; memcpy(runtime->dma_area+oldptr*stride, cp , cnt*stride); memcpy(runtime->dma_area, cp + cnt, length*stride - cnt*stride); unsigned int cnt = runtime->buffer_size - oldptr - 1; memcpy(runtime->dma_area + oldptr * stride, cp, cnt * stride); memcpy(runtime->dma_area, cp + cnt, length * stride - cnt * stride); } else { memcpy(runtime->dma_area+oldptr*stride, cp, length*stride); memcpy(runtime->dma_area + oldptr * stride, cp, length * stride); } } if (period_elapsed) { Loading @@ -284,7 +302,8 @@ static void em28xx_audio_isocirq(struct urb *urb) return; if ((status = usb_submit_urb(urb, GFP_ATOMIC))) { em28xx_errdev("resubmit of audio urb failed (error=%i)\n", status); em28xx_errdev("resubmit of audio urb failed (error=%i)\n", status); } return; } Loading @@ -304,8 +323,8 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) { int i; int errCode; const int sb_size=EM28XX_NUM_AUDIO_PACKETS * EM28XX_AUDIO_MAX_PACKET_SIZE; const int sb_size = EM28XX_NUM_AUDIO_PACKETS * EM28XX_AUDIO_MAX_PACKET_SIZE; for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { struct urb *urb; Loading @@ -326,9 +345,11 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) urb->complete = em28xx_audio_isocirq; urb->number_of_packets = EM28XX_NUM_AUDIO_PACKETS; urb->transfer_buffer_length = sb_size; for(j=k=0; j<EM28XX_NUM_AUDIO_PACKETS;j++,k+=EM28XX_AUDIO_MAX_PACKET_SIZE){ for (j = k = 0; j < EM28XX_NUM_AUDIO_PACKETS; j++, k += EM28XX_AUDIO_MAX_PACKET_SIZE) { urb->iso_frame_desc[j].offset = k; urb->iso_frame_desc[j].length=EM28XX_AUDIO_MAX_PACKET_SIZE; urb->iso_frame_desc[j].length = EM28XX_AUDIO_MAX_PACKET_SIZE; } dev->adev->urb[i] = urb; } else { Loading @@ -345,7 +366,6 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) return 0; } static int em28xx_cmd(struct em28xx *dev, int cmd, int arg) { switch (cmd) { Loading @@ -357,7 +377,8 @@ static int em28xx_cmd(struct em28xx *dev, int cmd,int arg) dev->adev->capture_stream = STREAM_OFF; em28xx_isoc_audio_deinit(dev); } else { printk("An underrun occured very likely... ignoring it\n"); printk ("An underrun occured very likely... ignoring it\n"); } return 0; default: Loading @@ -365,7 +386,8 @@ static int em28xx_cmd(struct em28xx *dev, int cmd,int arg) } } static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream *substream) static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream *substream) { struct em28xx *dev; snd_pcm_uframes_t hwptr_done; Loading Loading @@ -393,7 +415,6 @@ static struct snd_pcm_ops snd_em28xx_pcm_capture = { .page = snd_pcm_get_vmalloc_page, }; static int em28xx_audio_init(struct em28xx *dev) { struct em28xx_audio *adev; Loading Loading
drivers/media/video/em28xx/em28xx-audio.c +197 −176 Original line number Diff line number Diff line Loading @@ -46,8 +46,8 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; static int em28xx_cmd(struct em28xx *dev, int cmd, int arg); static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t size) static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t size) { struct snd_pcm_runtime *runtime = subs->runtime; if (runtime->dma_area) { Loading @@ -63,7 +63,9 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s } static struct snd_pcm_hardware snd_em28xx_hw_capture = { .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID, .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID, .formats = SNDRV_PCM_FMTBIT_S16_LE, .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_KNOT, .rate_min = 48000, Loading Loading @@ -101,7 +103,8 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) tuner.type = V4L2_TUNER_RADIO; /* enable GPIO for analog TV */ dev->em28xx_gpio_control(dev, EM28XX_MODE, (void*)mode); dev->em28xx_gpio_control(dev, EM28XX_MODE, (void *)mode); dev->mode = mode; /* upload firmware */ tuner_run_cmd(dev->tobj, TUNER_CMD_INIT, (void *)mode); Loading Loading @@ -131,7 +134,8 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) break; case TUNER_STUB_RADIO: /* check current mode and put a hard lock onto it */ printk("em28xx-audio: device is currently in analogue FM mode\n"); printk ("em28xx-audio: device is currently in analogue FM mode\n"); /* unmute by default here */ dev->em28xx_write_regs(dev, 0x0f, "\x87", 1); ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1); Loading Loading @@ -187,11 +191,14 @@ static int snd_em28xx_pcm_close(struct snd_pcm_substream *substream) return 0; } static int snd_em28xx_hw_capture_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) static int snd_em28xx_hw_capture_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) { unsigned int channels, rate, format; int ret; ret = snd_pcm_alloc_vmalloc_buffer(substream, params_buffer_bytes(hw_params)); ret = snd_pcm_alloc_vmalloc_buffer(substream, params_buffer_bytes(hw_params)); format = params_format(hw_params); rate = params_rate(hw_params); channels = params_channels(hw_params); Loading @@ -214,7 +221,8 @@ static int snd_em28xx_prepare(struct snd_pcm_substream *substream) return 0; } static int snd_em28xx_capture_trigger(struct snd_pcm_substream *substream, int cmd) static int snd_em28xx_capture_trigger(struct snd_pcm_substream *substream, int cmd) { struct em28xx *dev = snd_pcm_substream_chip(substream); switch (cmd) { Loading Loading @@ -247,8 +255,10 @@ static void em28xx_audio_isocirq(struct urb *urb) stride = runtime->frame_bits >> 3; for (i = 0; i < urb->number_of_packets; i++) { int length=urb->iso_frame_desc[i].actual_length/stride; cp=(unsigned char *) urb->transfer_buffer + urb->iso_frame_desc[i].offset; int length = urb->iso_frame_desc[i].actual_length / stride; cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset; if (!length) continue; Loading @@ -256,22 +266,30 @@ static void em28xx_audio_isocirq(struct urb *urb) spin_lock_irqsave(&dev->adev->slock, flags); oldptr = dev->adev->hwptr_done_capture; dev->adev->hwptr_done_capture += length; if(dev->adev->hwptr_done_capture >= runtime->buffer_size) dev->adev->hwptr_done_capture -= runtime->buffer_size; if (dev->adev->hwptr_done_capture >= runtime->buffer_size) dev->adev->hwptr_done_capture -= runtime->buffer_size; dev->adev->capture_transfer_done += length; if(dev->adev->capture_transfer_done >= runtime->period_size){ dev->adev->capture_transfer_done -= runtime->period_size; if (dev->adev->capture_transfer_done >= runtime->period_size) { dev->adev->capture_transfer_done -= runtime->period_size; period_elapsed = 1; } spin_unlock_irqrestore(&dev->adev->slock, flags); if (oldptr + length >= runtime->buffer_size) { unsigned int cnt = runtime->buffer_size-oldptr-1; memcpy(runtime->dma_area+oldptr*stride, cp , cnt*stride); memcpy(runtime->dma_area, cp + cnt, length*stride - cnt*stride); unsigned int cnt = runtime->buffer_size - oldptr - 1; memcpy(runtime->dma_area + oldptr * stride, cp, cnt * stride); memcpy(runtime->dma_area, cp + cnt, length * stride - cnt * stride); } else { memcpy(runtime->dma_area+oldptr*stride, cp, length*stride); memcpy(runtime->dma_area + oldptr * stride, cp, length * stride); } } if (period_elapsed) { Loading @@ -284,7 +302,8 @@ static void em28xx_audio_isocirq(struct urb *urb) return; if ((status = usb_submit_urb(urb, GFP_ATOMIC))) { em28xx_errdev("resubmit of audio urb failed (error=%i)\n", status); em28xx_errdev("resubmit of audio urb failed (error=%i)\n", status); } return; } Loading @@ -304,8 +323,8 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) { int i; int errCode; const int sb_size=EM28XX_NUM_AUDIO_PACKETS * EM28XX_AUDIO_MAX_PACKET_SIZE; const int sb_size = EM28XX_NUM_AUDIO_PACKETS * EM28XX_AUDIO_MAX_PACKET_SIZE; for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { struct urb *urb; Loading @@ -326,9 +345,11 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) urb->complete = em28xx_audio_isocirq; urb->number_of_packets = EM28XX_NUM_AUDIO_PACKETS; urb->transfer_buffer_length = sb_size; for(j=k=0; j<EM28XX_NUM_AUDIO_PACKETS;j++,k+=EM28XX_AUDIO_MAX_PACKET_SIZE){ for (j = k = 0; j < EM28XX_NUM_AUDIO_PACKETS; j++, k += EM28XX_AUDIO_MAX_PACKET_SIZE) { urb->iso_frame_desc[j].offset = k; urb->iso_frame_desc[j].length=EM28XX_AUDIO_MAX_PACKET_SIZE; urb->iso_frame_desc[j].length = EM28XX_AUDIO_MAX_PACKET_SIZE; } dev->adev->urb[i] = urb; } else { Loading @@ -345,7 +366,6 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) return 0; } static int em28xx_cmd(struct em28xx *dev, int cmd, int arg) { switch (cmd) { Loading @@ -357,7 +377,8 @@ static int em28xx_cmd(struct em28xx *dev, int cmd,int arg) dev->adev->capture_stream = STREAM_OFF; em28xx_isoc_audio_deinit(dev); } else { printk("An underrun occured very likely... ignoring it\n"); printk ("An underrun occured very likely... ignoring it\n"); } return 0; default: Loading @@ -365,7 +386,8 @@ static int em28xx_cmd(struct em28xx *dev, int cmd,int arg) } } static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream *substream) static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream *substream) { struct em28xx *dev; snd_pcm_uframes_t hwptr_done; Loading Loading @@ -393,7 +415,6 @@ static struct snd_pcm_ops snd_em28xx_pcm_capture = { .page = snd_pcm_get_vmalloc_page, }; static int em28xx_audio_init(struct em28xx *dev) { struct em28xx_audio *adev; Loading