[alsa-devel] mmap support in saa7134-alsa (was: Sample format coversion bug?)

Takashi Iwai tiwai at suse.de
Wed Oct 31 09:34:59 CET 2007


At Tue, 30 Oct 2007 21:24:44 +0500,
Alexander E. Patrakov wrote:
> 
> Trent Piepho wrote:
> > On Mon, 29 Oct 2007, Alexander E. Patrakov wrote:
> >   
> >> Even though mmap seems to be supported in the driver source (judging
> >> from .info = SNDRV_PCM_INFO_MMAP | other flags), I could not figure out
> >> the parameters that work. Moreover, the driver seems to accept the same
> >> hardware parameters without the mmap, and I could not find parameters
> >> that the driver accepts for mmap.
> >>     
> >
> > I do not think the saa7134-alsa driver supports mmap.  The cx88-alsa driver
> > also claimed to support mmap, but it never worked until I fixed it.  It's
> > pretty clear that the code in saa7134-alsa was based on the same code as
> > cx88-alsa, so it's likely it has the same bug.
> >   
> 
> You are right. The patch below (based on your cx88 patch, but I don't 
> really understand it) fixes mmap support in saa7134-alsa for me. 
> Recording via mmap (arecord -M -f S16_LE -c 2 -r 32000 -D hw:1) didn't 
> work at all before, works now, tested for at least 20 minutes (but, 
> unfortunately, with one overrun at least 0.719 ms long).
> 
> Signed-off-by: Alexander E. Patrakov <patrakov at ums.usu.ru>

Looks good to me.

Acked-by: Takashi Iwai <tiwai at suse.de>


Takashi


> --- saa7134-alsa.c	2007-10-12 22:43:44.000000000 +0600
> +++ saa7134-alsa.c	2007-10-30 21:01:10.000000000 +0500
> @@ -544,8 +544,10 @@
>  	   V4L functions, and force ALSA to use that as the DMA area */
>  
>  	substream->runtime->dma_area = dev->dmasound.dma.vmalloc;
> +	substream->runtime->dma_bytes = dev->dmasound.bufsize;
> +	substream->runtime->dma_addr = 0;
>  
> -	return 1;
> +	return 0;
>  
>  }
>  
> @@ -653,6 +655,17 @@
>  }
>  
>  /*
> + * page callback (needed for mmap)
> + */
> +
> +static struct page *snd_card_saa7134_page(struct snd_pcm_substream *substream,
> +					unsigned long offset)
> +{
> +	void *pageptr = substream->runtime->dma_area + offset;
> +	return vmalloc_to_page(pageptr);
> +}
> +
> +/*
>   * ALSA capture callbacks definition
>   */
>  
> @@ -665,6 +678,7 @@
>  	.prepare =		snd_card_saa7134_capture_prepare,
>  	.trigger =		snd_card_saa7134_capture_trigger,
>  	.pointer =		snd_card_saa7134_capture_pointer,
> +	.page =			snd_card_saa7134_page,
>  };
>  
>  /*
> 
> 
> 
> -- 
> Alexander E. Patrakov
> 


More information about the Alsa-devel mailing list