diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-06-05 19:21:34 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-08-02 14:05:56 -0300 |
commit | e8cbf0357eb7148b41eb2cd4bb37b0b9532042fc (patch) | |
tree | 35312ff58070138bbdd98885496502db98869e7f /drivers/staging | |
parent | 3f23a81a101889711e878240908a2b81b94a268a (diff) |
V4L/DVB: tm6000-alsa: Implement a routine to store data received from URB
Implements the fillbuf callback to store data received via URB
data transfers.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/tm6000/tm6000-alsa.c | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index 5839a27f30f..6df2dc8d390 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c @@ -158,16 +158,16 @@ static struct snd_pcm_hardware snd_tm6000_digital_hw = { SNDRV_PCM_INFO_MMAP_VALID, .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, - .rate_min = 44100, + .rates = SNDRV_PCM_RATE_48000, + .rate_min = 48000, .rate_max = 48000, .channels_min = 2, .channels_max = 2, - .period_bytes_min = DEFAULT_FIFO_SIZE/4, - .period_bytes_max = DEFAULT_FIFO_SIZE/4, + .period_bytes_min = 62720, + .period_bytes_max = 62720, .periods_min = 1, .periods_max = 1024, - .buffer_bytes_max = (1024*1024), + .buffer_bytes_max = 62720 * 8, }; /* @@ -204,15 +204,45 @@ static int snd_tm6000_close(struct snd_pcm_substream *substream) static int tm6000_fillbuf(struct tm6000_core *core, char *buf, int size) { - int i; - - /* Need to add a real code to copy audio buffer */ - printk("Audio (%i bytes): ", size); - for (i = 0; i < size - 3; i +=4) - printk("(0x%04x, 0x%04x), ", - *(u16 *)(buf + i), *(u16 *)(buf + i + 2)); + struct snd_tm6000_card *chip = core->adev; + struct snd_pcm_substream *substream = chip->substream; + struct snd_pcm_runtime *runtime; + int period_elapsed = 0; + unsigned int stride, buf_pos; + + if (!size || !substream) + return -EINVAL; + + runtime = substream->runtime; + if (!runtime || !runtime->dma_area) + return -EINVAL; + + buf_pos = chip->buf_pos; + stride = runtime->frame_bits >> 3; + + dprintk(1, "Copying %d bytes at %p[%d] - buf size=%d x %d\n", size, + runtime->dma_area, buf_pos, + (unsigned int)runtime->buffer_size, stride); + + if (buf_pos + size >= runtime->buffer_size * stride) { + unsigned int cnt = runtime->buffer_size * stride - buf_pos; + memcpy(runtime->dma_area + buf_pos, buf, cnt); + memcpy(runtime->dma_area, buf + cnt, size - cnt); + } else + memcpy(runtime->dma_area + buf_pos, buf, size); + + chip->buf_pos += size; + if (chip->buf_pos >= runtime->buffer_size * stride) + chip->buf_pos -= runtime->buffer_size * stride; + + chip->period_pos += size; + if (chip->period_pos >= runtime->period_size) { + chip->period_pos -= runtime->period_size; + period_elapsed = 1; + } - printk("\n"); + if (period_elapsed) + snd_pcm_period_elapsed(substream); return 0; } |