[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