[alsa-devel] Difference between substream->dma_buffer and substream->runtime->dma_buffer_p?

Timur Tabi timur at freescale.com
Fri Jun 15 00:47:58 CEST 2007

The snd_pcm_substream structure has a snd_dma_buffer structure.  snd_dma_buffer looks like 

struct snd_dma_buffer {
	struct snd_dma_device dev;	/* device type */
	unsigned char *area;	/* virtual pointer */
	dma_addr_t addr;	/* physical address */
	size_t bytes;		/* buffer size in bytes */
	void *private_data;	/* private for allocator; don't touch */

snd_pcm_substream also has a snd_pcm_runtime structure, which looks like this:

struct snd_pcm_runtime {

	/* -- DMA -- */
	unsigned char *dma_area;	/* DMA area */
	dma_addr_t dma_addr;		/* physical bus address (not accessible from main CPU) */
	size_t dma_bytes;		/* size of DMA area */

	struct snd_dma_buffer *dma_buffer_p;	/* allocated buffer */

Why the redundancy?  Not only does snd_pcm_runtime have dma_area, dma_addr, and dma_bytes, 
but it also has a pointer to a dns_dma_buffer structure, which also has this information!

So given a snd_pcm_substream structure, you can obtain the physical address of the DMA 
buffer three ways:


When will these three variable contain different values?  If the answer is never, then why 
do they all exist?

Timur Tabi
Linux Kernel Developer @ Freescale

More information about the Alsa-devel mailing list