[alsa-devel] [PATCH RFC 00/11] ALSA: pcm: introduce copy_frame operation and SND_PCM_PROXY_DRIVER_SUPPORT
Takashi Sakamoto
o-takashi at sakamocchi.jp
Wed May 24 16:19:06 CEST 2017
Hi,
On May 24 2017 15:29, Takashi Iwai wrote:
> OK, I now understand your idea. Actually the word "proxy" was
> misleading. "proxy" implies the action, but PCM core can't know the
> action the caller intended. From PCM core POV, it's merely an
> in-kernel buffer copy. We don't need to invent new terms here (who is
> the client?).
Currently, I have no idea for the better term.
Data transmission is a kind of communication, thus there's a originator.
I use the 'client' as the originator. Usually, userspace applications
are the client, however in addressed issue in-kernel OSS/UAC1 drivers
are the client. They perform as a proxy for their direct clients.
> Apart from that, basically your idea is:
> - Keep in-kernel buffer copy flag into substream->runtime.
> - The ops handles both copy and silence.
> - Move the whole transfer action to each driver instead of looping in
> PCM core.
>
> I find the first point is acceptable, from the current usage pattern,
> as there is little chance to mix up both user-space buffer and
> kernel-space buffer.
Practically, it's rarely for clients to request copy operation for
source or destination on several memory spaces.
> Though, another side of coin is that, by embedding in runtime, you can
> easily overlook the in-kernel copy case, in comparison with passing
> via the argument. So it's not always plus.
However, in current place, drivers with kernel/kernel copying is quite
rare. At least, they're not major ones. Features for them should be
selectable by configurations. In this point, such argument-oriented
implementation is exaggerated for the features. It's not worth to change
existent kernel APIs.
> The second point is as same as mine.
>
> The potential problem is the third point. It'd require a larger
> change, and it's error-prone, because you'll have to translate the
> passed pointer in each driver to morph it to different values, either
> the linear buffer pointer or the vector, in addition to the user-space
> and kernel-space check.
>
> In the PCM core code, we did that in that way, but it's OK since it's
> done only there thus it's manageable. However, forcing the complex
> cast in each driver implementation is better to avoid.
>
> How to make each driver implementing less error-prone codes -- that's
> what we need to reconsider further.
I have no objection for your view. It's natural idea for software
developers.
Essentially, it's not better idea to produce one callback function for
two types of buffer access. Type casting is enough dangerous and make it
hard to trace arguments, but current PCM core implementation heavily
utilizes it. I can assume to add two callback operations to driver
programming API; for interleaved buffer and non-interleaved buffer.
...but I'd like to postpone this discussion enough later (next week),
because we have several patches worth to be merged[1][2][3].
Furthermore, patch 03-05 in this patchset are valuable as a refactoring
(of course need to be revised), independent of the discussion. I suggest
to put our priority to merging/reviewing them in this week, if you don't
mind. After arranging code bases with better shape, we can continue the
discussion with a calm mind.
There's no need to jump.
[1] [alsa-devel] [PATCH 0/7] ALSA: Fix/improve PCM ack callback
http://mailman.alsa-project.org/pipermail/alsa-devel/2017-May/120886.html
[2] [alsa-devel] [PATCH] ALSA: gus: remove unused local flag
http://mailman.alsa-project.org/pipermail/alsa-devel/2017-May/120967.html
[3] [alsa-devel] [PATCH] ALSA: sb: remove needless evaluation in
implementation for copy callback
http://mailman.alsa-project.org/pipermail/alsa-devel/2017-May/120968.html
Thanks
Takashi Sakamoto
More information about the Alsa-devel
mailing list