[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 
this:

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:

substream->dma_buffer.addr
substream->runtime->dma_addr
substream->runtime->dma_buffer_p->addr

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