Skip to content

[Bug] macOS 下切换应用时音频概率性中断约 0.3–0.8 秒,音频输出流被过度重建 #302

Description

@rin259

检查清单

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

环境信息

SPlayer-Next 版本:1.1.0
系统:macOS 15.7.3(Build 24G419)
设备:MacBook Air(M2,Mac14,2,16GB)
输出设备:Sony WH-1000XM4(蓝牙 A2DP,44.1kHz)
设置:淡入淡出开启,音量 100,EQ 关闭,响度归一化关闭

具体信息

问题描述
在 macOS 上使用 SPlayer-Next 播放音乐时,切换应用或系统前台应用发生变动的瞬间,正在播放的音频会概率性中断,时长约 0.3–0.8 秒,然后自动恢复。旧版 SPlayer 在同一台设备、同样使用场景下没有这个问题。
从系统日志和 SPlayer-Next 自身日志看,每次中断的触发链完全一致:

  1. macOS CoreAudio 检测到 SPlayer-Next 的音频回调瞬时过载
    HALC_ProxyIOContext::IOWorkLoop: skipping cycle due to overload
  2. SPlayer-Next 捕获到:
    音频输出流失败 error=A buffer underrun or overrun occurred.
  3. SPlayer-Next 随即销毁并重建整个音频输出流:
    • 重新初始化音频输出设备
    • 打开音频输出配置 ...
    • 释放音频输出配置 generation=N
  4. 由于输出设备是蓝牙耳机,CoreAudio 会执行蓝牙 A2DP 的 StopIO → StartIO,产生约 0.3–0.8 秒的可听见静音。
    关键点
  • 问题只出现在 SPlayer-Next,旧版 SPlayer 没有此问题。
  • 中断不是播放器主动暂停,而是由瞬时 underrun 触发的音频流重建导致的。
  • 使用蓝牙 A2DP 输出时,StopIO → StartIO 的过程会产生明显静音。
  • 该问题在系统负载较高时更容易出现,但即使系统负载正常时也偶发。
  • 本机为 M2 / 16GB,硬件性能不构成根本瓶颈。
    复现步骤
  1. 使用蓝牙 A2DP 输出设备(实测为 Sony WH-1000XM4)。
  2. 在 SPlayer-Next 中播放音乐。
  3. 频繁切换应用或制造较高的窗口切换负载。
  4. 概率性出现音频中断约 0.3–0.8 秒后恢复。
    期望行为
    瞬时 underrun 不应导致整个音频输出流被销毁并重建。期望 SPlayer-Next 对可恢复的瞬时 underrun 进行容忍处理,例如短暂静音/继续缓冲,而不是触发 reinitOutput() 重建蓝牙音频链路。
    实际行为
    瞬时 underrun 被当作致命错误处理,触发音频输出流重建,导致蓝牙 A2DP 连接短暂中断,产生明显可听见的静音。
    环境信息
  • SPlayer-Next 版本:1.1.0
  • 系统:macOS 15.7.3(Build 24G419)
  • 设备:MacBook Air(M2,Mac14,2,16GB)
  • 输出设备:Sony WH-1000XM4(蓝牙 A2DP,44.1kHz)
  • 设置:淡入淡出开启,音量 100,EQ 关闭,响度归一化关闭
    相关日志摘录
    09:43:42.712 E SPlayer-Next CoreAudio HALC_ProxyIOContext::IOWorkLoop: skipping cycle due to overload
    09:43:42.736 E coreaudiod Overload possibly due to HAL client proc exceeding io cycle budget.

09:43:42.700 WARN audio_engine::audio_output: 音频输出流失败 error=A buffer underrun or overrun occurred.
09:43:43.007 INFO audio_engine::bindings::player: 重新初始化音频输出设备
09:43:43.030 INFO audio_engine::audio_output: 打开音频输出配置 id="coreaudio:80-99-E7-51-83-DF:output" name=WH-1000XM4 sample_rate=44100
09:43:43.093 DEBUG audio_engine::audio_output: 释放音频输出配置 generation=10
多次复现均为相同模式,例如:
09:50:31.959 SPlayer-Next skipping cycle due to overload
09:50:31.938 音频输出流失败 error=A buffer underrun or overrun occurred.
09:50:32.242 重新初始化音频输出设备

09:57:05.821 SPlayer-Next skipping cycle due to overload
09:57:05.798 音频输出流失败 error=A buffer underrun or overrun occurred.
09:57:06.104 重新初始化音频输出设备

10:12:46.728 SPlayer-Next skipping cycle due to overload
10:12:46.605 音频输出流失败 error=A buffer underrun or overrun occurred.
10:12:46.927 重新初始化音频输出设备
备注

  • 关联 issue:从 1.0.0 更新到 1.1.0,出现播放中断问题 #259「从 1.0.0 更新到 1.1.0,出现播放中断问题」,但本 issue 提供了更明确的触发链和 macOS CoreAudio 日志证据。
  • 建议关注 native/audio-engine/src/audio_output.rs 中错误回调触发 on_failure() 的处理逻辑,以及 native/audio-engine/src/source.rs 中 UNDERRUN_SILENCE_MS = 20 对瞬时 underrun 的容忍能力是否足够。

Activity

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

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions