At Thu, 26 Apr 2007 15:30:41 -0700 (PDT), Tim Harvey wrote:
Thanks to the help I've gotten on this list my alsa driver is working great. I got a little hung up not realizing that the alsa core basically provides everything you need to implement your own circular buffer if you need to use an intermediate buffer.
The only question I still have is that if alsa allocates your DMA buffer for you based on snd_pcm_hardware_t buffer_bytes_max what exactly does snd_pcm_lib_preallocate_pages_for_all allocate buffers for? Does this allocate the buffers that would be passed to the copy callback?
hardware.buffer_bytes_max can be really big. Many hardwares have no hardware limitation, i.e. can be 4GB or more in theory. The paramters passed to preallocator is the "reasonable" buffer sizes for normal uses.
Without preallocator, you'll have to allocate buffer at each open. Particularly in the case of contiguous pages, it gets always more difficult because the whole memory area gets more fragmented. Thus, you'd like to preallocate the buffer and keep that area for later use.
Currently, there is a constraint that the max buffer size is limited by the preallocated size (if any), so a buffer bigger than preallocated won't work. I don't know why this constraint exists, and I believe it's fine to remove it. (You can see FIXME comment there indeed)
Takashi