From: GitHub pull_request - edited <github@alsa-project.org>
To: alsa-devel@alsa-project.org
Subject: pcm_meter: let the s16 scope degrade instead of killing the caller
Date: Mon, 27 Jul 2026 09:42:54 +0200 (CEST) [thread overview]
Message-ID: <18c615b5a865af00-webhooks-bot@alsa-project.org> (raw)
In-Reply-To: <alsa-project/alsa-lib/pr/516@alsa-project.org>
alsa-project/alsa-lib pull request #516 was edited from Gjuju:
## The bug
`s16_enable()` returns `-EINVAL` for any format it cannot convert to S16 — the DSD
formats, the 3-byte packed ones (`S24_3LE`/`S24_3BE`/`S20_3LE`), float.
`snd_pcm_scope_enable()` records that as "not enabled" and carries on:
```c
err = scope->ops->enable(scope);
scope->enabled = (err >= 0);
```
But every *other* scope stays enabled, and scopes reach the s16 buffer through
`snd_pcm_scope_s16_get_channel_buffer()`, which asserts on exactly the pointer
`s16_enable()` never allocated:
```
pcm_meter.c:1224: snd_pcm_scope_s16_get_channel_buffer: Assertion 's16->buf_areas' failed.
```
The application dies. This is not hypothetical and not third-party only: alsa-lib's own
`src/pcm/scopes/level.c` calls the accessor the same way, so the library aborts its own
caller. Any out-of-tree scope reaching the buffer through the same documented accessor
fails identically, and a music player aborts mid-playback the moment a DSD track starts.
Note the failure is *not* DSD-specific — any format outside the 17 the switch lists
triggers it, including `S24_3LE`, which plenty of USB DACs expose natively. A chain that
happens to have a `plug` in front of the meter is merely lucky.
## The fix
Allocate the buffer anyway and leave it zeroed, so the accessor always returns valid
memory and the s16 buffer carries silence for a format the conversion cannot express.
Callers need no change, and none can be made to abort — which matters, since returning
`NULL` instead would only move an unfixed caller from `SIGABRT` to `SIGSEGV`. The
condition is now reported once through `SNDERR()` instead of being swallowed.
## Testing
x86-64, Debian 13, USB DAC with a native DSD path, MPD playing a DSD64 `.dsf` with
`dop=no` through a `type meter` PCM with a scope attached:
- **before**: MPD aborts on the assertion and playback dies
- **after**: the DAC receives `DSD_U32_BE @ 88200` bit-perfect, MPD stays up and is
never restarted, the s16 buffer is exposed zero-filled, and the log carries
`s16 scope: no S16 conversion for format DSD_U32_BE, scopes will read silence`
## Left alone
The neighbouring `S16` + `MMAP_NONINTERLEAVED` branch assigns `s16->buf` and then also
returns `-EINVAL`, reaching the same dead end. It looks unfinished rather than
deliberate, so this patch does not touch it — happy to follow up if you can confirm the
intent.
Request URL : https://github.com/alsa-project/alsa-lib/pull/516
Patch URL : https://github.com/alsa-project/alsa-lib/pull/516.patch
Repository URL: https://github.com/alsa-project/alsa-lib
prev parent reply other threads:[~2026-07-27 7:43 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <alsa-project/alsa-lib/pr/516@alsa-project.org>
2026-07-21 21:56 ` pcm_meter: let the s16 scope degrade instead of killing the caller GitHub pull_request - opened
2026-07-27 7:42 ` GitHub pull_request - edited [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=18c615b5a865af00-webhooks-bot@alsa-project.org \
--to=github@alsa-project.org \
--cc=alsa-devel@alsa-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox