On 12/4/2024 2:01 PM, Cezary Rojewski wrote:
On 2024-12-03 9:38 PM, Wesley Cheng wrote:
Hi Cezary,
On 12/3/2024 8:17 AM, Cezary Rojewski wrote:
UAOL is one of our priorities right now and some (e.g.: me) prefer to not pollute their mind with another approaches until what they have in mind is crystalized. In short, I'd vote for a approach where USB device has a ASoC representative in sound/soc/codecs/ just like it is the case for HDAudio. Either that or at least a ASoC-component representative, a dependency for UAOL-capable card to enumerate.
Just to clarify, "struct snd_soc_usb" does have some correlation with our "codec" entity within the QCOM ASoC design. This would be the q6usb driver.
Currently struct snd_soc_usb does not represent any component at all. Lack of codec representative, component representative and, given my current understanding, mixed dependency of sound/usb on sound/soc/soc-usb does lead to hard-to-understand ASoC solution.
IMO the dependency on USB SND is necessary, so that we can leverage all the pre-existing sequences used to identify USB audio devices, and have some ability to utilize USB HCD APIs as well within the offload driver.
So, while I do not have patches in shape good enough to be shared, what we have in mind is closer to existing HDAudio solution and how it is covered in both ALSA and ASoC.
A ASoC sound card is effectively a combination of instances of struct snd_soc_component. Think of it as an MFD device. Typically at least two components are needed:
- platform component, e.g.: for representing DSP-capable device
- codec component, e.g.: for representing the codec device
USB could be represented by such a component, listed as a dependency of a sound card. By component I literally mean it extending the base struct:
stuct snd_soc_usb {
struct snd_soc_component base;
(...)
};
In my opinion HDAudio is a good example of how to mesh existing ALSA-based implementation with ASoC. Full, well implemented behaviour of HDAudio codec device drivers is present at sound/pci/hda/patch_*.c and friends. That part of devoid of any ASoC members. At the same time, an ASoC wrapper is present at sound/soc/codecs/hda.c. It will represent each and every HDAudio codec device on the HDAudio bus as a ASoC-component. This follows the ASoC design and thus is easy understand for any daily ASoC user, at least in my opinion.
Next, the USB Audio Offload streams are a limited resource but I do not see a reason to not treat it as a pool. Again, HDAudio comes into picture. The HDAudio streams are assigned and released with help of HDAudio library, code found in sound/hda/hdac_stream.c. In essence, as long as UAOL-capable streaming is allowed, a pcm->open() could approach a UAOL-lib (? component perhaps?) and perform ->assign(). If no resources available, fallback to the non-offloaded case.
While I have not commented on the kcontrol part, the above means that our current design does go into a different direction. We'd like to avoid stream-assignment hardcoding i.e.: predefining who owns a UAOL-capable stream if possible.
Thanks for sharing the implementation for HDA. I did take a look to the best of my ability on how the HDAudio library was built, and I see the differences that are there with the current proposal. However, I think modifying the current design to something like that would also require the QCOM ASoC side to change a bit too. As mentioned by Pierre, I think its worthwhile to see if we can get the initial changes in, which is the major part of the challenge. For the most part, I think we could eventually refactor soc-usb to behave similarly to what hda_bind.c is doing. Both entities are the ones that handle linking (or creation in case of HDA) of ASoC components. The one major factor I can see is that within the HDA implementation vs USB SND is that, for USB, hot plugging is a common practice, and that's a scenario that will probably need more discussion if we do make that shift.
Anyway, I just wanted to acknowledge the technical details that are utilized by HDAudio, and that we could potentially get there with USB SoC as well.