linux/sound
Takashi Iwai 42f945970a ALSA: pcm: Add the explicit appl_ptr sync support
Currently x86 platforms use the PCM status/control mmaps for
transferring the PCM status and appl_ptr between kernel and
user-spaces.  The mmap is a most efficient way of communication, but
it has a drawback per its nature, namely, it can't notify the change
explicitly to kernel.

The lack of appl_ptr update notification is a problem on a few
existing drivers, but it's mostly a small issue and negligible.
However, a new type of driver that uses DSP for a deep buffer
management requires the exact position of appl_ptr for calculating the
buffer prefetch size, and the asynchronous appl_ptr update between
kernel and user-spaces becomes a significant problem for it.

How can we enforce user-space to report the appl_ptr update?  The way
is relatively simple.  Just by disabling the PCM control mmap, the
user-space is supposed to fall back to the mode using SYNC_PTR ioctl,
and the kernel gets control over that.  This fallback mode is used in
all non-x86 platforms as default, and also in the 32bit compatible
model on all platforms including x86.  It's been implemented already
over a decade, so we can say it's fairly safe and stably working.

With the help of the knowledge above, this patch introduces a new PCM
info flag SNDRV_PCM_INFO_SYNC_APPLPTR for achieving the appl_ptr sync
from user-space.  When a driver sets this flag at open, the PCM status
/ control mmap is disabled, which effectively switches to SYNC_PTR
mode in user-space side.

In this version, both PCM status and control mmaps are disabled
although only the latter, control mmap, is the target.  It's because
the current alsa-lib implementation supposes that both status and
control mmaps are always coupled, thus it handles a fatal error when
only one of them fails.

Of course, the disablement of the status/control mmaps may bring a
slight performance overhead.  Thus, as of now, this should be used
only for the dedicated devices that deserves.

Note that the disablement of mmap is a sort of workaround.  In the
later patch, we'll introduce the way to identify the protocol version
alsa-lib supports, and keep mmap working while the sync_ptr is
performed together.

Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2017-06-23 15:39:47 +02:00
..
aoa ALSA: declare snd_kcontrol_new structures as const 2017-05-30 10:29:25 +02:00
arm
atmel ALSA: atmel: Remove AVR32 bits from the driver 2017-05-15 17:07:00 +02:00
core ALSA: pcm: Add the explicit appl_ptr sync support 2017-06-23 15:39:47 +02:00
drivers ALSA: seq: Allow the modular sequencer registration 2017-06-12 08:43:33 +02:00
firewire Merge branch 'for-linus' into for-next 2017-06-20 07:53:07 +02:00
hda ALSA: hda: Fix potential race at unregistration and unsol events 2017-06-20 07:53:57 +02:00
i2c ALSA: ak411x: Use array instead of offsetof() 2017-05-17 07:13:03 +02:00
isa ALSA: seq: Allow the modular sequencer registration 2017-06-12 08:43:33 +02:00
mips ALSA: hal2: switch to dma_alloc_attrs 2017-06-16 11:10:05 +02:00
oss
parisc ALSA: parisc: Constify hw_constraints 2017-06-09 10:42:48 +02:00
pci ALSA: hda/realtek - Add default procedure for suspend and resume state 2017-06-21 11:13:46 +02:00
pcmcia ALSA: declare snd_kcontrol_new structures as const 2017-05-30 10:29:25 +02:00
ppc ALSA: declare snd_kcontrol_new structures as const 2017-05-30 10:29:25 +02:00
sh ALSA: sh: Convert to the new PCM ops 2017-06-02 19:38:03 +02:00
soc Merge branch 'for-linus' into for-next 2017-06-07 10:25:30 +02:00
sparc ALSA: sparc: Constify hw_constraints 2017-06-09 10:42:56 +02:00
spi
synth ALSA: synth: Select snd-emux-synth explicitly 2017-06-09 22:10:06 +02:00
usb ALSA: line6: remove unnecessary initialization to PODHD500X 2017-06-20 07:51:22 +02:00
x86 drm/i915: Fix runtime PM for LPE audio 2017-05-15 14:44:11 +03:00
ac97_bus.c
Kconfig ALSA: synth: Select snd-emux-synth explicitly 2017-06-09 22:10:06 +02:00
last.c
Makefile
sound_core.c