I think this like static and dynamic allocation of buffers.
if it allocated at device driver insertion time then it stored in substream entry.
And this can be used by both playback and capture
If it allocated at runtime then it is stored in runtime entry. And you can have different buffers for both playback and capture.
if no substream is open then runtime structure pointer will be NULL.
Nobin
On 6/15/07, Timur Tabi timur@freescale.com wrote:
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@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel