Skip to content

Linux下cpal回退到ALSA后端,PipeWire自适应采样率不生效(输出始终44100Hz) #225

Closed

Description

@scsfu

检查清单

  • 我已检索仓库中所有的 Issues,确保我没有重复提交问题;或有相似 Issue,但我觉得我的情况不包含在那个相似 Issue 之内
  • 我已经找到了可以复现这个问题的方法,并且写在了下面的「具体信息」中
  • 此问题可以在我的设备和当前环境中稳定复现
  • 此问题可以在最新版本 (Latest Release) 中复现
  • 此问题是在我更新到当前版本后才出现的

当前系统环境

Arch Linux,Kernel 7.1.11-zen1-1-zen,PipeWire 1.6.8,WirePlumber 0.5.15

当前版本

v1.0.0

具体信息

复现步骤

  1. 启动 SPlayer-Next
  2. 在设置里把输出设备选为 PipeWire
  3. 播放任意歌曲
  4. 用 pactl list sink-inputs 查看音频流信息

实际行为

所有歌曲输出固定 44100Hz,不随歌曲采样率变化。

预期行为

输出采样率应跟随歌曲原始采样率自适应切换(pipewire.conf 里已配好 clock.allowed-rates)。

排查过程

pactl list sink-inputs 的输出:

Sink Input #98
    Driver: PipeWire
    Sink: 53
    Sample Specification: float32le 2ch 44100Hz
    Resample method: PipeWire
    Properties:
        application.name = "PipeWire ALSA [SPlayer-Next]"
        node.name = "alsa_playback.SPlayer-Next"
        device.description = "ALSA Playback [SPlayer-Next]"
        media.name = "ALSA Playback"
        node.latency = "2048/44100"
        node.rate = "1/44100"

application.name 是 PipeWire ALSA [SPlayer-Next],节点名是 alsa_playback.SPlayer-Next——cpal 走的是 ALSA 后端,不是 PipeWire 原生后端。音频流经过的路径是 cpal(ALSA) → ALSA默认设备@44100Hz → pipewire-alsa插件 → PipeWire → DAC,clock.allowed-rates 没有被 cpal 读到。

看了下进程内存映射:

$ cat /proc/$(pgrep -f SPlayer-Next)/maps | grep -E "pipewire|pulse|alsa"

# libpipewire 加载了
/usr/lib/libpipewire-0.3.so.0.1608.0

# ALSA PipeWire 插件也加载了
/usr/lib/alsa-lib/libasound_module_pcm_pipewire.so

# libpulse 没有
(无输出)

libpipewire 在进程里,但 cpal 的 PipeWire host 初始化应该还是失败了。libpulse 完全没加载说明 PulseAudio host 也没连上。fallback 链应该是 PipeWire(失败) → PulseAudio(失败) → ALSA(成功)。

PipeWire 侧的配置是正常的:

$ pw-metadata -n settings | grep rate
update: id:0 key:'clock.rate' value:'48000' type:''
update: id:0 key:'clock.allowed-rates' value:'[ 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000 ]' type:''
$ pw-cli info 0 | grep allowed-rates
*        default.clock.allowed-rates = "[ 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000 ]"

DAC 是 BRZHIFI USB 声卡(alsa_output.usb-BRZHIFI_BRZHIFI_0-00.analog-stereo)。

另外试过 PIPEWIRE_LOG_LEVEL=2 SPlayer-Next,没有输出任何 PipeWire 相关日志,只有 Electron 的 ozone 警告:

[31010:0901/183550.785119:ERROR:ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc:249] '--ozone-platform=wayland' is not compatible with Vulkan. Consider switching to '--ozone-platform=x11' or disabling Vulkan

cpal host 初始化失败是完全静默的,没有任何错误输出,我是靠 pactl 反推出来的。

Activity

  1. github-actions commented on Sep 1, 2026

    @github-actions

    👋 您好 @scsfu,感谢提交 Issue!
    🚀 我们已经收到您的反馈,会尽快确认您的问题。

    👋 Hi @scsfu, thanks for opening this issue!
    🚀 We have received your report and will review it as soon as possible.

  2. PhantomPixel-0418 commented on Sep 1, 2026

    @PhantomPixel-0418
    Contributor
  3. scsfu commented on Sep 1, 2026

    @scsfu
    Author

    #106

    抱歉可能说得不够准确。我想表达的是我这边的症状和 #106 可能有所差异
    106 之后有 commit 8b9a91f 修复,改成选设备支持的最高采样率。但我这边跑 v1.0.0(应该包含了这个 fix)还是锁 44100。
    排查下来发现 cpal 走的是 ALSA 后端(pactl list sink-inputs 里 application.name = "PipeWire ALSA [SPlayer-Next]",/proc//maps 里 libpulse 没加载),所以不管怎么选采样率,ALSA 那边只有 44100 可选。
    不太确定 #106 那位的 cpal 是不是也走了 ALSA,如果是的话可能是同一个问题,那个 fix 只是在 ALSA 能看到的 config 里选最高的,但如果 ALSA 只报 44100 的话选了也没用。

  4. scsfu commented on Sep 1, 2026

    @scsfu
    Author

    检查发现后端回退问题似乎是误判。只要在原生PipeWire流中补全node.rate属性就能实现自适应采样率。

  5. MoYingJi commented on Sep 1, 2026

    @MoYingJi
    Collaborator

    最新 commit 已经使用原生 pipewire 了,不用经 pipewire-alsa 了(应该是自 16b1f34 起?没有包含在 1.0.0 内)

  6. scsfu commented on Sep 1, 2026

    @scsfu
    Author

    最新 commit 已经使用原生 pipewire 了,不用经 pipewire-alsa 了(应该是自 16b1f34 起?没有包含在 1.0.0 内)

    原来是这样,我就说为什么我把仓库Fork下来发现没遇到ALSA的问题了🤔

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions