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 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel