At Wed, 8 Feb 2012 11:55:37 +0000, Liam Girdwood wrote:
The new ASoC dynamic PCM core needs to create PCMs and substreams that are for use by internal ASoC drivers only and not visible to userspace for direct IO. These new PCMs are similar to regular PCMs expect they have no device nodes or procfs entries. The ASoC component drivers use them in exactly the same way as regular PCMs for PCM and DAI operations.
The intention is that a dynamic PCM based driver will register both regular PCMs and dynamic PCMs. The regular PCMs will be used for all IO with userspace however the dynamic PCMs will be used by the driver to route digital audio through numerous back end DAI links (with potentially a DSP providing different hw_params, DAI formats based on the regular front end PCM params) to devices like CODECs, MODEMs, Bluetooth, FM, DMICs, etc
This patch adds a new snd_pcm_new_dynamic() API call to create the dynamic PCM without device nodes or procfs. It also adds snd_pcm_new_stream_dynamic() and snd_pcm_dev_register_dynamic() which are used to create the dynamic PCM.
I don't think you need to copy all functions just for stripping some features. Instead, add a new flag in snd_pcm indicating that it's only for internal-use (or non-exposure, whatever), and set it in snd_pcm_new(). Maybe make a static __snd_pcm_new() with an extra bool flag and let snd_pcm_new() and snd_pcm_new_dynamic() call the function with the appropriate flag value.
In snd_pcm_new_stream(), just skip unnecessary init parts when the pcm flag is set. Ditto for snd_pcm_dev_register().
thanks,
Takashi