Skip to content

feat: 麦克风采样健壮性重构与三处设置分布 - #5

Closed
Starsky16 wants to merge 12 commits into
Yeson38:masterfrom
Starsky16:dev
Closed

Starsky16 wants to merge 12 commits into
Yeson38:masterfrom
Starsky16:dev

Conversation

@Starsky16

@Starsky16 Starsky16 commented Sep 6, 2026 •

Copy link
Copy Markdown

概述

将 dev 分支的开发成果合入 master,为 Decibel_Monitor 分贝监测插件带来以下改进(12 个提交):

1. 麦克风采样健壮性(f369b0d)

  • 多重回退采样(AudioMeterInformation -> WasapiCapture -> WaveInEvent),信号量并发保护与缓存。
  • 新增阈值提醒功能(组件提示 + ClassIsland 通知,带冷却防刷屏)。

2. 三处设置分布 + 提醒不触发修复(6b0e955)

  • 三处设置:组件显示侧 / 强调通知侧(提醒设置)/ 插件设置页侧。
  • 通知提供方改为泛型设置基类并注册通知渠道,通过 Channel 发送;修复组件构造时序导致提醒失效的问题。
  • 组件改用 AvaloniaProperty 驱动绑定;抽取 PeakSample 纯函数并补单元测试。

3. 常驻静默捕获流读取分贝(4938af1,取代 79a4766 中间方案)

  • 采用一条常驻 WASAPI 捕获流持续计算峰值:数值稳定、无周期性开/关录音造成的麦克风占用图标闪烁,也不依赖打开系统声音设置。
  • 默认设备变化/流异常自动重启(带退避);全局设置提供“持续监听麦克风”开关;校准等显式操作保留一次性采样。

4. 设置按作用域重排(d473909)

  • 测量/校准全局化:校准参考 dB、放大倍数上收为插件全局设置,校准入口移至插件设置页,同一麦克风各组件数值一致。
  • 组件设置仅保留显示偏好;提醒相关仍在通知侧;测量参数与诊断在插件设置页。

5. 组件显示增强(679e6b4、3d1902d)

  • 组件设置新增“组件内提示”开关:可关闭超阈值时的红色提示文字(通知仍照常发送)。
  • 组件数值支持“分贝:”前缀显示(可关闭),并提供可配置的更新频率(100–1000 ms,默认 200)。

6. 健壮性修复、测试补齐与采样服务拆分(2026-09-13:e6d0326、0198acd、2c75321、8a66bfd、5825d19)

  • 修正过时文案:设置页与 README 中“校准在组件设置里”的描述,更新为“校准在插件设置页(全局)”。
  • 全局设置改为整体反序列化:DecibelMonitorSettingsService 在构造时一次性反序列化整个 DecibelMonitorGlobalSettings,消除“新增设置项忘记同步读取”的隐患(旧配置文件缺字段时保留默认值、文件损坏时回退默认值)。
  • 提醒判定抽成纯函数:新增 DecibelAlertEvaluator.Evaluate(...)(仅依赖 BCL),DecibelNotificationProvider 改为调用它;补 9 条边界用例(等于阈值不触发、冷却期内不重复通知、冷却刚过可通知、冷却下限 1 分钟、未激活时不改动下次提醒时间等)。
  • 补充刻度换算边界用例:LinearToDisplayDb 上/下 clamp(含 ±Infinity)与 CalculateMagnification 自定义上限,共 5 条。
  • 采样服务拆分(纯搬移,行为不变):454 行的 AudioPeakMeter 拆为 AudioDeviceEnumerator(设备枚举与缓存)、ContinuousPeakCapture(常驻静默捕获流)、OneShotPeakCapture(一次性采样的三级回退)三个 internal sealed 类;AudioPeakMeter 保留为门面,全部 public 成员签名不变,调用方零改动,常量、锁粒度、回退顺序、提前返回条件均未变。
  • 本 PR 不含 .github/、.gitignore、本地规则等非功能文件改动。

测试

  • dotnet test:37/37 通过(原有 23 条 + 提醒判定 9 条 + 刻度换算边界 5 条)。
  • dotnet build -c Release:0 警告 0 错误。
  • 已通过本机 ClassIsland 实测:组件显示“分贝: 数值”、更新频率可调、麦克风占用图标常亮不闪烁、通知提供方与渠道注册正常、三处设置按新分布生效。
  • 2026-09-13 追加修复/测试/重构后,另以 ClassIsland 宿主(Debug 构建与官方 2.1.0.1 folder 包)加载验证:插件正常加载、无异常日志;日志确认 此次会话已加载插件:Decibel_Monitor(Decibel_Monitor,0.0.0.1)。

说明

本 PR 由 VS Code 中的 Cline(DeepSeek-V4-Flash 模型)辅助生成;2026-09-13 的修复 / 测试 / 重构提交同样由 VS Code 中的 Cline 辅助生成。

Starsky16 and others added 12 commits August 31, 2026 21:49
修改部分:
- Services 新增 AudioPeakMeter(麦克风峰值采样:实时计量优先 + 多重回退采样 + 结果缓存 + 信号量并发保护)、DecibelCalculator(分贝换算纯函数)、DecibelNotificationProvider(ClassIsland 超阈值提醒通知提供方);
- Plugin.cs 改为注册共享 AudioPeakMeter 单例与通知提供方,移除原设备枚举采样逻辑;
- 组件与设置控件去掉各自重复的 WaveIn/Wasapi 采样实现,统一复用共享采样服务,并修正 Avalonia INotifyPropertyChanged 事件转发;校准流程改用显示刻度参考;
- 设置模型新增阈值提醒配置(启用开关、阈值、提示文字、冷却分钟数);
- 新增单元测试工程(覆盖 DecibelCalculator 纯函数)与 ClassIsland 集成冒烟测试 workflow;调整 Build/Test workflow;.gitignore 忽略 cipx/ 打包产物;删除多余占位文件并更新 README。

修改逻辑:
- 原采样代码在组件与设置控件中重复且高频刷新会反复打开音频设备,易并发抢占、开销大、设备不提供实时计量时数值长期为 0;
- 现将采样收敛为单一共享服务:快速路径仅读 AudioMeterInformation,验证过支持实时计量的设备在静音时直接返回真实 0;不支持时才做短时录音回退采样,结果缓存、会话受信号量保护,避免 UI 高频刷新触发耗时操作;
- 补齐超阈值提醒:超过阈值时组件显示提示并经 ClassIsland 通知系统弹出提醒,冷却期内不重复触发;换算逻辑抽为与设备无关的纯函数便于测试。

由 VS Code 的 Cline 使用 DeepSeek V4 Flash 生成。
- 提醒(强调通知侧)设置:通知提供方改用泛型基类获得自动持久化设置,注册通知渠道并通过 Channel 发送,修复空渠道/时序导致的提醒不触发;新增通知设置控件

- 插件设置页侧:新增 SettingsPage(AddSettingsPage) 承载全局采样偏好与设备诊断,ReferenceDecibel 持久化到组件设置

- 组件(显示侧):仅保留校准设置;组件改用 AvaloniaProperty 驱动绑定,动态获取通知提供方实例

- 健壮性:抽取 PeakSample 纯函数并补单测,AudioPeakMeter 缓存加锁与采样参数可配置

- README 更新三处设置说明
- AudioPeakMeter 默认关闭录音回退:GetDefaultDevicePeakLinearAsync 只用 AudioMeterInformation,不再周期性打开 Wasapi/WaveIn 录音通道,解决 Windows 麦克风占用图标闪烁与读数不稳定

- 新增 CaptureSamplePeakAsync 供校准等显式操作一次性采样;校准改用它

- 全局设置新增 EnableFallbackSampling 开关(默认 false),设置页与 README 更新说明
- 新增常驻 WASAPI 捕获流:保持一条低开销捕获流持续计算峰值,数值稳定、无周期性开/关录音,解决之前 meter 需打开系统声音设置才有值的问题

- 设备变化/流异常自动重启(带退避),事件回调按对象身份校验避免新旧流串扰

- 全局设置以 EnableContinuousMonitoring 取代 EnableFallbackSampling(默认开启),设置页与 README 更新

- 校准等显式采样保留一次临时采样(CaptureSamplePeakAsync)
- DecibelComponentSettings 新增 ShowAlertTextOnComponent(默认 true)

- 组件超阈值时是否点亮提示文字由该开关控制;系统通知不受影响仍会发送

- 组件设置面板与 README 同步更新
- 校准参考 dB/放大倍数由组件设置上收为插件全局设置(DecibelMonitorGlobalSettings),校准入口移至插件设置页

- 组件设置仅保留显示偏好(ShowAlertTextOnComponent),组件显示统一使用全局放大倍数

- 插件设置页新增全局校准区(参考滑块/校准按钮/放大倍数显示);测量与提醒仍分属插件页与通知
- DecibelComponentSettings 新增 ShowDecibelPrefix(默认 true) 与 UpdateIntervalMs(默认 200ms)

- 组件文本按前缀显示为'分贝: 70.0',更新频率设置变化后下一拍即生效

- 组件设置面板与 README 同步更新
@Starsky16

Copy link
Copy Markdown
Author

本 PR 的内容已按主题拆分为 5 个可独立编译、单测全绿的小 PR(fork 侧 CI 含集成测试已全部通过),请以拆分后的 PR 为准,按依赖顺序合并:

因此关闭本 PR(源分支 dev 保留,未删除)。

@Starsky16 Starsky16 closed this Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant