Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: GitHub pull_request - opened <github@alsa-project.org>
To: alsa-devel@alsa-project.org
Subject: pcm_meter: let the s16 scope degrade instead of killing the caller
Date: Tue, 21 Jul 2026 23:56:16 +0200 (CEST)	[thread overview]
Message-ID: <18c46ccb67434b00-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 opened 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. Downstream, `libpeppyalsa` (the VU-meter scope used by moOde audio player) makes
a music player abort 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 zero, so a scope reads **silence** on a format
the s16 conversion cannot see. 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, moOde audio player with its VU meter
scope in the chain. Playing a DSD64 `.dsf` with `dop=no`:

- **before**: MPD aborts on the assertion, the UI reports "Socket open failed"
- **after**: the DAC receives `DSD_U32_BE @ 88200` bit-perfect, MPD stays up
  (`NRestarts: 0`), needles read zero, 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

       reply	other threads:[~2026-07-21 21:56 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 ` GitHub pull_request - opened [this message]
2026-07-27  7:42 ` pcm_meter: let the s16 scope degrade instead of killing the caller GitHub pull_request - edited

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=18c46ccb67434b00-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