Repository navigation
Releases
BassMax 1.0.7
1.0.7 — 只更新 bassmax_decoder.ax(MPC-BE 专用)
本页只提供 1 个附件:bassmax_decoder.ax。其余组件本次一行未改,直接从 v1.0.6 Release 下载即可,不用重下、不用替换。
| 组件 | 本次状态 | 去哪下 |
|---|---|---|
bassmax_decoder.ax |
✅ 已更新(本页唯一附件) | 本页 |
bassmax_dshow.ax (1.0.6.0) |
❌ 未改动 | v1.0.6 直链 |
reg_helper.exe |
❌ 未改动 | v1.0.6 直链 |
bassmax_cli.exe |
❌ 未改动 | v1.0.6 直链 |
bassmax_chrome_v1.0.0.zip |
❌ 未改动 | v1.0.6 直链 |
BassMax-1.0.6-x64.zip |
❌ 未改动(整包内容仍是 1.0.6) | v1.0.6 直链 |
bassmax_dshow/version.h 保持 1.0.6 —— 那是 dshow 滤镜的版本唯一来源,本次没碰 dshow;改版本号只会让没变的二进制在托盘提示里谎报 1.0.7。
本次改了什么
- 进程内托盘:滤镜自己在播放器进程里挂图标,播放时出现、滤镜释放后自动消失。不用额外开任何程序,不存在 setting.exe 单独打开、关掉又把播放器带走的问题。
- 左键 / 右键单击都 = 开/关总开关,与
bassmax_dshow.ax的右键行为对齐。单击直接调本 DLL 的SetSettings(),s_gen立刻递增,音频线程下一拍Tick()重建系数;关闭是 Core 逐样本 bypass,不重建 graph、不切音轨、不爆音。 - 图标内嵌
bassmax.ico(开启,蓝色渐变柱)/bassmax_off.ico(关闭,纯灰)的全部尺寸;.ax同目录放同名 ico 可覆盖,换图标不用重编译。 - 修掉资源脚本把开启图标注册成字符串名、导致
LoadImageW(201)失败后静默回退到系统默认图标的问题。现在两枚都是真实 HICON。
托盘只是 Shell_NotifyIcon + 隐藏窗口 + 一个消息线程,不注册任何 CLSID、不实现 ISpecifyPropertyPages,与属性页 InprocServer32 抢注冲突零交集 —— 这是 1.0.6 里「做不了属性页」的正解法,不是绕路。
部署
把本页的 bassmax_decoder.ax 覆盖到 MyMPC\Codecs\,完全退出再打开 MPC-BE(播放器只在启动时读外部滤镜列表)。注册表 CLSID 指向的是安装目录那份,只换仓库里的没用。
HKCU\Software\BassMax\TrayIcon=0会隐藏托盘图标,别不小心设过 0。- 图标首次出现可能被 Windows 收进托盘溢出区,去任务栏设置里放出来。
已知
- 双击会翻转两次、回到原状(单击切换的固有行为,旧
.ax右键也一样)。 - 两张
.ax同时启用会出现两个托盘图标。
源码与完整文档见仓库 README「六·补」;仓库不含二进制,成品只在本页提供。
BassMax 1.0.6
1.0.6 — MPC-BE 终于接入 DSP,DirectShow 滤镜回归单管线
本次同时发布两个独立的 x64 滤镜,按播放器分工:
| 文件 | 适用 | 说明 |
|---|---|---|
bassmax_dshow.ax (1.0.6.0) |
MPC-HC / PotPlayer | 主滤镜,PCM→PCM 音频增强,回归单管线 |
bassmax_decoder.ax |
MPC-BE 1.9.x | 新增:伪装成「音频解码器」角色,内部驱动 LAV Audio Decoder,对解出的 PCM 做 DSP |
仓库不收录二进制,成品只在本页提供;源码与完整文档见仓库 README「三」「六·补」两章。
为什么 MPC-BE 要单独一个 .ax
查 Aleksoid1978/MPC-BE 源码确认:CFGManagerPlayer 会把内置 Audio Switcher 以 MERIT64_HIGHEST(1<<58) 无条件插入音频链,外部滤镜上限只有约 1<<48;连接协商在第三方 transform 的 ReceiveConnection 之前就已失败。因此 PCM→PCM 形态的外部 DSP 在 MPC-BE 里进不了链路 —— 补多少媒体类型、把 merit 调多高、用 CTransformFilter 还是 CTransInPlaceFilter 都一样。设置页里也没有禁用 Audio Switcher / 加载外部 DSP 的入口(SetAudioFilter1 只认 compand,裁剪版 libavfilter 只注册了 aresample / atempo / compand)。
但 MPC-BE 允许外部滤镜顶替解码器角色(LAV Audio Decoder 就是这么替换 MPC Audio Decoder 的),于是:
MPC-BE graph: [Source] --(压缩)--> [BMD.In] [BMD.Out] --(PCM)--> [Audio Switcher] --> [Renderer]
| ^
| 零拷贝转发 | Deliver
v |
私有 graph: [Feeder.Out] -> [LAV Audio Decoder] -> [Sink.In]
本次改动
- 新增
bassmax_decoder.ax(CLSID...C9B4):输入代理压缩音频零拷贝转给私有图里的 LAV;输出引脚用 LAV 解出的真实 PCM 协商,PCM 推给下游前做 BassMax DSP。Run/Pause/Stop、Flush、EndOfStream、NewSegment、时间戳 / 同步点 / discontinuity / preroll / 动态媒体类型全部双向转发;seeking 与切轨时先 Stop 再重建私有图,LAV 输出格式变化时给下一个 sample 挂新格式通知。 - 修复「无法渲染文件」:外部滤镜被配成
PREFERRED + Audio/NULL 通配时,所有音频流都会先塞给本滤镜。现在CheckMediaType先用QueryAccept问内部 LAV 认不认该类型,明确拒绝就当场让位给内置解码器,不再等私有图建失败把整张图拖崩。 - 可验证 DSP 是否真生效:日志打印
DSP 总开关 enabled=...与changed=(每块样本在Process()后逐字节比对前 64 字节)。总开关关闭或纯透传时changed恒为 0,杜绝「只有托盘图标 / 只有滤镜名」的假阳性。参数每 400ms 从HKCU\Software\BassMax回读,规避两个 DLL 各自独立的设置状态。 bassmax_dshow.ax回归单管线(1.0.6.0):移除从未生效的 C9B3CTransformFilter版;DllRegisterServer/DllUnregisterServer会自动清理旧机器上的 C9B3 注册表幽灵条目。保留位深缺失(wBitsPerSample=0)时用nBlockAlign/nChannels反推的修复,以及 CTIP 切音轨修复。DSP 与格式解析抽到bassmax_dsp.*,两个 .ax 静态复用、无 DLL 级冲突。- 构建/测试:新增自写注册工具(系统自带注册工具常被安全策略当 LOLBin 拦截)、x64 真实推流宿主(普通 / seek / 切轨);
.bat统一 GBK+CRLF,安装脚本改为幂等。
安装
- 播放器完全退出(滤镜列表只在启动时读取)。
- 把
.ax放到固定目录(例如MyMPC\Codecs\),路径变动后必须重新注册。 - 管理员身份运行对应
install.bat:MPC-HC / PotPlayer 用bassmax_dshow\install.bat;MPC-BE 用bassmax_decoder\install.bat(会额外写入外部滤镜配置并设为 PREFERRED)。整包BassMax-1.0.6-x64.zip已把脚本、注册工具与.ax按目录放好,解压即用。 - 重新打开播放器。MPC-HC / PotPlayer 的 CLSID 与 .ax 路径都没变,不需要重新添加滤镜;如果以前加过带
(MPC-BE)后缀的旧条目,请手动删掉。
依赖:MPC-BE 版要求系统已注册 LAV Audio Decoder({E8E73B6B-4CB3-44A4-BE99-4F7BCB96E491},MPC-BE 自带 LAVFilters64\LAVAudio.ax)。参数仍用原来的设置页 / 托盘修改,两个 .ax 共用同一份配置。
验证
| 场景 | 结果 |
|---|---|
| x64 真实推流(5 轮,2ch/6ch 交替) | RESULT: PASS |
| seeking 到 50% / 同格式切轨 | Flush → NewSegment → 继续出样本,无 EC_ERRORABORT |
| MPC-BE + VOB(AC3 5.1,含切换音轨) | LAV 输出 6ch/48k float32,changed 随样本增长 |
| MPC-BE + m4a / 24bit FLAC / 5.1 MKV | changed 随样本增长,DSP 确实改了数据 |
| LAV 解不了的 APE | QueryAccept=S_FALSE → 提前让位,不再拖崩整张图 |
判据:%TEMP%\bassmax_decoder.log 里 STAT ... changed=N ... enabled=1 且 changed 增长。光有滤镜名或托盘图标不算。
已知限制
部分 APE 是 LAV/ffmpeg 自身解不了(foobar2000 用 Monkey's Audio 官方解码器所以能放)。这类文件现在会提前让位给内置解码器,不会再报「无法渲染文件」,但自然也没有 BassMax 音效;若 DirectShow 侧压根没有能解它的解码器,播放器仍可能报无法渲染 —— 与本滤镜无关。
bassmax_cli.exe 与 bassmax_chrome_v1.0.0.zip 与 1.0.4 相同,本次未改动,一并提供方便一次性下载。
文件校验(SHA-256)
| 文件 | 大小 | SHA-256 |
|---|---|---|
bassmax_dshow.ax |
188928 bytes | 06303fcacefa2539227a9b70d0b65220c16ed409722315caf411144ab4ae0bcc |
bassmax_decoder.ax |
111616 bytes | a98079eed784eb757964dfd5a35ea2c31ffc2d1cac77a5118f65a248ccd707fc |
BassMax-1.0.6-x64.zip |
181685 bytes | 91292a7df010b259db2f538ff7864e585ee666dd25a1a248069ed96c83e6d38f |
reg_helper.exe |
11776 bytes | 4c4b4e0fb5d95591cbd5ddd649d01e457ebc89d8c1a32b4f6b570a9de5c6d0a3 |
bassmax_cli.exe |
289280 bytes | d6ee6ea54feb3a31971022096b7a9a7f0e12243727a9248cc0430d679aec4ab4 |
bassmax_chrome_v1.0.0.zip |
34407 bytes | d229c4cb5e73ff3b50089f653f122cefd98cbe035befec0c27ea0a3a16264f7b |
BassMax 1.0.4
1.0.4 — 修复多音轨切换导致整条流停摆
症状:多音轨文件在播放中切换音轨,画面和声音一起停住;把音效总开关关掉也没用;把滤镜从播放器移除 → 切好音轨 → 再把滤镜加回来,这个文件仍然播不了,必须彻底移除滤镜才能恢复。MPC-HC / PotPlayer 表现一致,解码器 LAV 全套。
根因不是缓存,是基类选错。 1.0.3 及之前用 CTransformFilter(拷贝式变换),输入/输出各有一套媒体类型,输出类型只能由 GetMediaType 静态生成。当输出引脚已连接、输入引脚又被塞进一个新格式时,基类会拿新输入类型去比对已经过期的输出类型,并要求 isFloat / 位深 / 声道 / 采样率全等。LAV 切音轨后只要其中一项变化,QueryAccept 必然返回 S_FALSE → 动态切换失败;万一硬连上更糟:输入已换新格式、输出还停在旧格式,下游按旧块长收新数据,播放器判定音频流坏死并把整个图停掉(所以画面也一起停)。
Enabled=0 只是把 DSP 参数归零,滤镜仍然留在图里参与格式协商,这就是「关音效也没用」的原因。
改了什么
- 基类换成
CTransInPlaceFilter(就地变换)。输入引脚的CheckMediaType直接转发下游QueryAccept,CompleteConnect发现上下游类型不一致会自动ReconnectPin把新类型推下去。删掉GetMediaType/CheckTransform/DecideBufferSize三个易错点,不再需要输出分配器与样本拷贝。 - 宽进透传:任何
MEDIATYPE_Audio+FORMAT_WaveFormatEx都接受;改不动的格式(AC3/DTS passthrough、>8 声道、怪位深)原样放过,Transform恒返回S_OK。音效滤镜不该成为图建不起来的原因。 - 运行中格式变更两条入口都处理:
SetMediaType(PINDIR_INPUT)与采样自带的AM_MEDIA_TYPE(IMediaSample::GetMediaType)。 nBlockAlign按nBlockAlign / ch处理 24-in-32 这类容器填充。- 托盘线程:删掉析构里的
WaitForSingleObject(2000)(它跑在播放器拆图线程上,等 2 秒 = 画面卡 2 秒),托盘线程改为每进程一个、活到进程结束。 - 新增
bassmax_dshow/test/test_host.cpp:WAV → BassMax → Null Renderer,2ch / 6ch 交替 5 轮。
bassmax_core.hpp 一行未改,DSP 输出与 1.0.3 逐位相同。
| 检查项 | 1.0.3 | 1.0.4 |
|---|---|---|
QueryAccept(6ch/48k/float) 运行中切换 |
S_FALSE |
S_OK |
| 滤镜拆除耗时(图释放) | 约 2000 ms | 0 ms |
三种形态,同一份 DSP 核心(bassmax_core.hpp)。
| 文件 | 用途 | 用法 |
|---|---|---|
bassmax_dshow.ax |
MPC-HC / PotPlayer 实时滤镜 | 管理员运行 regsvr32 "路径\bassmax_dshow.ax" |
bassmax_cli.exe |
离线批量转码 | 单文件免安装,不依赖 VC 运行库 |
bassmax_chrome_v1.0.0.zip |
Chrome / Edge 扩展 | 解压后在 chrome://extensions 开发者模式加载 |
快速开始
DirectShow 滤镜
- 把
bassmax_dshow.ax放到固定目录(移动后需重新注册) - 管理员身份执行
regsvr32 "完整路径\bassmax_dshow.ax" - MPC-HC:选项 → 外部滤镜 → 添加滤镜 → BassMax Audio Enhancer,勾选"优先"
- PotPlayer:F5 → 滤镜 → 音频滤镜 → 添加系统滤镜
升级前请完全退出播放器(DllCanUnloadNow 恒 S_FALSE,DLL 被加载时覆盖不了)。卸载:regsvr32 /u "完整路径\bassmax_dshow.ax"
命令行
bassmax_cli.exe music.wav --drive 8.5 --bass 3 --preset 爵士乐
Chrome 扩展
解压 zip → chrome://extensions → 打开开发者模式 → 加载已解压的扩展程序
已知限制
- 多声道(>2)建议先下混成 2.0,原因见 README
- Chrome 扩展只处理正在发声的标签页
- 仅在 Windows 验证,其他平台未测试
许可
MIT。bassmax_dshow/baseclasses/ 为 Microsoft DirectShow 基础类,不受 MIT 覆盖。
Full Changelog: v1.0.3...v1.0.4
BassMax 1.0.3
三种形态,同一份 DSP 核心(bassmax_core.hpp)。
| 文件 | 用途 | 用法 |
|---|---|---|
bassmax_dshow.ax |
MPC-HC / PotPlayer 实时滤镜 | 管理员运行 regsvr32 "路径\bassmax_dshow.ax" |
bassmax_cli.exe |
离线批量转码 | 单文件免安装,不依赖 VC 运行库 |
bassmax_chrome_v1.0.0.zip |
Chrome / Edge 扩展 | 解压后在 chrome://extensions 开发者模式加载 |
快速开始
DirectShow 滤镜
- 把
bassmax_dshow.ax放到固定目录(移动后需重新注册) - 管理员身份执行
regsvr32 "完整路径\bassmax_dshow.ax" - MPC-HC:选项 → 外部滤镜 → 添加滤镜 → BassMax Audio Enhancer,勾选"优先"
- PotPlayer:F5 → 滤镜 → 音频滤镜 → 添加系统滤镜
卸载:regsvr32 /u "完整路径\bassmax_dshow.ax"
命令行
bassmax_cli.exe music.wav --drive 8.5 --bass 3 --preset 爵士乐
Chrome 扩展
解压 zip → chrome://extensions → 打开开发者模式 → 加载已解压的扩展程序
已知限制
- 多声道(>2)建议先下混成 2.0,原因见 README
- Chrome 扩展只处理正在发声的标签页
- 仅在 Windows 验证,其他平台未测试
许可
MIT。bassmax_dshow/baseclasses/ 为 Microsoft DirectShow 基础类,不受 MIT 覆盖。
Full Changelog: https://github.com/louissgd/BassMax/commits/v1.0.3