news 2026/10/2 8:10:17

Vencord NotificationVolume 插件解析:为通知与 App 内提示音单独设置音量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vencord NotificationVolume 插件解析:为通知与 App 内提示音单独设置音量
  • 即时通讯
  • 桌面应用
  • 前端
  • 插件系统

【免费下载链接】Vencord

The cutest Discord modification

项目地址:https://gitcode.com/GitHub_Trending/ve/Vencord
点击查看免费下载

NotificationVolume 是 Vencord 内置的一款音频体验优化插件,核心能力是让用户为「通知提示音」和「应用内音效」(如消息提示、通话响铃、静音/取消静音提示)分别设置独立的音量,避免通知声音过大伤耳。本文将结合插件源码与 Vencord 的插件设置体系,从功能定位、底层实现原理、配置参数到源码结构,完整讲解这一插件的工作方式,读完即可理解它是如何在不修改 Discord 本体逻辑的前提下实现「独立音量」的。

插件定位:一套音量,两套用途

根据插件的官方 README(见 src/plugins/notificationVolume/README.md),该插件的用途一句话即可概括:

Set a separate volume for notifications and in-app sounds (e.g. messages, call sound, mute/unmute) helping your ears stay healthy for many years to come.

即:为通知音与应用内音效(消息、通话铃声、静音/取消静音等)设置一个独立的音量档位,与 Discord 的主音量解耦,从而保护听力。插件在插件列表中的描述为 "Save your ears and set a separate volume for notifications and in-app sounds",并带有Notifications与Voice两个标签,说明它归属于「通知」与「语音」两个功能域,作者为 Vencord 贡献者 philipbry(见 src/utils/constants.ts 中Devs.philipbry条目)。

核心实现:一行补丁改写音量计算公式

插件本体非常精简,全部逻辑集中在 src/plugins/notificationVolume/index.ts,核心是一个 Vencord 标准的 Patch(补丁)机制:

patches: [ { find: "ensureAudio(){", replacement: { match: /(?=Math\.min\(\i\.\i\.getOutputVolume\(\)\/100)/g, replace: "$self.settings.store.notificationVolume/100*" }, }, ],

其原理拆解如下:

  1. 定位(find):在 Discord 的 Webpack 模块中搜索包含字符串ensureAudio(){的模块。ensureAudio是 Discord 音频模块中负责「确保音频上下文可用」并计算实际输出音量的函数,插件用它作为锚点定位到目标模块。
  2. 匹配(match):正则(?=Math\.min\(\i\.\i\.getOutputVolume\(\)\/100)使用了零宽正向断言(lookahead),只匹配但不消耗字符。其中\i是 Vencord 补丁语法中的「任意合法标识符」占位符,会在编译期被规范化为(?:[A-Za-z_$][\w$]*)(见 src/utils/patches.ts 的canonicalizeMatch),因此能容忍 Discord 内部变量名的混淆变化。该断言匹配的位置是 Discord 计算最终音量的表达式Math.min(... .getOutputVolume()/100)之前。
  3. 替换(replace):在被断言命中的位置前插入$self.settings.store.notificationVolume/100*,使原始表达式变成:
Math.min(notificationVolume/100 * <某Store>.getOutputVolume()/100, ...)

其中$self是 Vencord 补丁系统的占位符,会被替换为该插件模块的实际导入路径(见 src/utils/patches.ts 中canonicalizeReplace:replace.replaceAll("$self", pluginPath))。这样,最终播放的音量就等于「用户设置的独立通知音量(0~1)」乘以「Discord 原有的输出音量系数」,实现音量缩放而不改动 Discord 原有计算逻辑。

从实现方式看,可以推断该插件依赖一个关键前提:Discord 通知音与部分应用内音效在播放时会经过getOutputVolume()这一统一的音量换算出口,插件正是抓住了这个出口做了一次乘法缩放,因而无需逐一拦截每个音效的播放调用。

配置参数详解:Slider 音量滑杆

插件通过 Vencord 的definePluginSettingsAPI 声明了一个名为notificationVolume的设置项:

const settings = definePluginSettings({ notificationVolume: { type: OptionType.SLIDER, description: "Notification volume", markers: [0, 25, 50, 75, 100], default: 100, stickToMarkers: false } });

对照 Vencord 设置类型定义(src/utils/types.ts 中OptionType.SLIDER与PluginSettingSliderDef接口),各字段含义与取值范围如下:

字段值含义
typeOptionType.SLIDER声明该设置以滑杆(Slider)形式渲染在设置面板中
description"Notification volume"设置项在 UI 上的说明文案
markers[0, 25, 50, 75, 100]滑杆上显示的刻度点(0%~100%,步进 25%),按类型定义要求至少两个值,这里提供了 5 个
default100默认音量 100%,即默认不改变 Discord 原有音量
stickToMarkersfalse是否「吸附刻度」。类型定义注释明确:为false时允许用户选中刻度之间的任意值,为true时只能停在刻度点上

需要特别说明的是,这里的音量值是百分比形式(0~100),而补丁公式中除以 100 后才参与乘法,因此设置 50 即表示以原音量的 50% 播放,设置 0 即完全静音。默认值 100 意味着插件启用后不做任何音量改动,必须由用户主动调低音量才生效,这保证了启用插件零副作用。

definePluginSettings返回的对象带有store访问器(见 src/api/Settings.ts 的definePluginSettings实现),补丁中使用的$self.settings.store.notificationVolume正是通过该store读取用户当前保存的实时值,因此无需重启客户端,拖动滑杆即可即时生效(该设置项未标记restartNeeded)。

使用方式

  1. 打开 Vencord 设置 → 插件(Plugins)页面,搜索并启用NotificationVolume。
  2. 展开插件的设置区域,找到 "Notification volume" 滑杆。
  3. 拖动滑杆到期望的音量百分比(0~100,支持 25 的整数倍刻度,也可停在任意中间值)。建议从 50~75 开始,若同时希望保留系统通知的提醒效果又降低刺耳感,可继续下调。
  4. 播放一条消息提示音或进行一次通话,即可听到独立音量立即生效。

若要恢复 Discord 原生音量行为,将滑杆拖回 100,或直接关闭该插件即可;关闭插件后所有补丁随之移除,行为完全还原。

源码结构小结

该插件属于「单文件补丁型」插件的典型代表,目录结构非常精简:

src/plugins/notificationVolume/ ├── README.md # 功能说明 └── index.ts # 设置定义 + 补丁逻辑(全部核心代码)

它没有独立的 CSS、组件或跨文件依赖,一次definePluginSettings声明设置、一次patches补丁即完成全部功能,非常适合作为理解 Vencord 补丁机制(find/match/replace/$self占位符)与滑块设置项(OptionType.SLIDER)的入门范例。如果你想进一步了解补丁替换中$self的规范化过程,可阅读 src/utils/patches.ts;想了解滑块设置项的类型约束(markers至少两个值、stickToMarkers语义),可阅读 src/utils/types.ts 的PluginSettingSliderDef定义。

  • 即时通讯
  • 桌面应用
  • 前端
  • 插件系统

【免费下载链接】Vencord

The cutest Discord modification

项目地址:https://gitcode.com/GitHub_Trending/ve/Vencord
点击查看免费下载

相关推荐

上一篇:终极Windows驱动管理指南:DriverStore Explorer 5个专业技巧深度解析
下一篇:Slidev 布局系统完全指南:内置布局、Layout 加载顺序与自定义布局实战

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 8:09:42

JMeter JSR223取样器核心解析:原理、实战与性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 8:06:30

【人工智能-03-06】20251227 人工智能第二学期课程 下载课件《教育设计中的信息化》中的“多人编辑文件” 的图片,然后合并PDF

背景需求马上人工智能课要考试了&#xff0c;我要下载课件我把所有的课件mp4下载&#xff08;IDM下载&#xff09;。但是《教育设计中的信息化》里面并不是课件&#xff0c;而是有文字、有视频、有音乐、有“在线多人编辑的ppt或docx”这种PPT右下角有下载按钮&#xff0c;可以…

作者头像 李华
网站建设 2026/10/2 8:05:38

多任务学习进阶:HoME层级多门专家架构原理与实战指南

多任务学习实战中&#xff0c;MMoE已经不够用了&#xff1f;聊聊HoME这套层级多门专家架构做推荐、做广告、做搜索的朋友&#xff0c;这几年对MMoE&#xff08;Multi-gate Mixture-of-Experts&#xff09;应该都不陌生。它通过多个专家网络和门控网络&#xff0c;把多个任务放在…

作者头像 李华
网站建设 2026/10/2 8:02:54

智能驾驶规划算法十年演变:从规则搜索到端到端大模型

这十年&#xff0c;智能驾驶规划算法从实验室里的"玩具"&#xff0c;变成了量产车上的"刚需"。2015年我刚入行时&#xff0c;提到路径规划&#xff0c;大家的第一反应还是扫地机器人或者游戏里的寻路逻辑&#xff1b;到了2025年&#xff0c;城市NOA、泊车代…

作者头像 李华