Skip to content

2.0 后续与推迟项跟踪 #141

Description

@LiuYunPlayer

跟踪 2.0 重构(数据/SDK 分层、老插件兼容、效果器、属性面板)之后有意推迟的事项。每项均已确认可安全后补(加性/非破坏);某项排期时可从本 issue 拆出独立 issue。

同步 2026-06-18:插件设置系统、effect 接口规范化(会话化)、manifest 入口统一 classes 数组、插件冲突消解矩阵(所有类型) 均已完成、移入末尾「已完成」。

同步 2026-07-17:颤音影响 effect 自动化参数effect 段内子区间增量(脏区间账本+局部重合成)PropertyArray 均已完成、移入末尾「已完成」;新增在案项:多声道音频面契约措辞随多声道立项时钉入(当前插件契约纯单声道)。

同步 2026-07-18:effect preset 设计已定稿、实现暂缓(用户定:待真实 effect 插件生态起来再做,2.0 不强求),设计要点记在下方条目防丢;移 🟢 低优先级。

🔴 高优先级

  • (暂无)

🟡 中优先级

  • (暂无)

🟢 低优先级

  • effect preset(设计已定稿 2026-07-18,实现暂缓待真实 effect 插件生态):分两种——①实例 preset(单 effect 参数值,.tleffectpreset,engine type 存文件内、列表按当前引擎过滤,不含 bypass/id)②链 preset(挂 part 的整链结构快照,含 type/enabled/参数/automation 默认值,专属后缀待定;应用=整链替换新发 id、颤音外键如实孤儿;bypass 入链)。共同口径承 part preset 判例:物化 dense 快照(默认值也是声音)、不含曲线/分段轨、单文件制平铺同一 Presets\ 文件夹(文件名=名字,同后缀全局命名空间;Save As 撞到其它引擎的同名文件时覆盖弹窗须带归属引擎名)。实现要点:TLP 的 effect 内联读写抽进 DataInfoJsonUtils(ToJson(EffectInfo)/ToEffectInfo)供链 preset 复用;存储管理层泛化 PresetConfigManager;UI=Effects 面板标题栏(链)+每卡片菜单(实例)。已定不做:part preset 不嵌 effect 链(声源域/处理域正交);旧链→新链颤音外键智能匹配(无可靠判据)。加性扩展后补:引擎出厂 preset(GetFactoryPresets DIM 默认空)。
  • 多声道音频面:实现随第一个真实消费者(effect 挂 audio part / 立体声 instrument)立项;立项时把三段契约措辞钉进音频面注释与插件文档——①寻址以帧计②span 按 ChannelCount 交织、整帧原子③恒单声道承诺(未声明能力的 effect 永远只收单声道段,多声道走 CreateAudioSegment 新重载加性选入)。当前插件契约纯单声道
  • 免重启卸载/更新扩展(加载器已 collectible-ready,切换 isCollectible:true 即可;当前走重启式安装器)
  • 原生 dll 子目录(runtimes/<rid>/native 等)探测兜底 —— 当前原生依赖只走 .deps.json,无目录探测兜底(托管 dll 有)
  • context 统一(并入合成 context)—— 原挂"待 voice API 整体改造";voice SDK 重设计已落地,可重估是否还需要
  • 主程序 .NET 升级(net8→net10,跳 net9 直上 LTS):SDK/Foundation 保持 net8 二进制地板、老插件 roll-forward;需一轮老插件加载回归,独立进行
  • CI 用 ApiCompat 对比黄金 dll 校验冻结契约(可选护栏)
  • 权威野外插件兼容清单(真机实测持续补全)
  • release/2.0.0 → master 合并、effect worktree 清理

🔵 未来大版本方向

  • 能力发现模式(IPlugin.GetExtension(id) 字符串能力面)
  • 跨大版本插件兼容(下一代 SDK 的 extern alias 桥接)

✅ 已完成(记录)

  • PropertyArray(有序可重复列表):值模型 PropertyValue 补数组臂;live-doc IDataPropertyArray/DataPropertyArray+多选 MultipleDataPropertyArray;多选容器三态合并(数组按 index、对象按 key 并集;容器键部分成员缺失按结构合并不塌 Multiple;缺位=默认值、编辑即补齐);SDK ArrayConfig/ListConfig+面板 Array/ListController(独立元素渲染器);AddableObjectConfig 变长键控容器+自动化联动(多说话人混音式);TLP JSON/CBOR 序列化;扩展设置持久化支持 list/array/嵌套 object;单测 PropertyArrayTests/MultiSelectMergeTests+夹具+手测用例 PROPERTY-ARRAY-TEST-CASES.md。提交 74b7c83/a692497/924b7e9/60ff5e1/937f9a7/fde9a0b/341c4ec。typed 叶子包装(Bool/Number/String)维持已划掉(零消费者、具体类型重载替代)。
  • 颤音影响 effect 自动化参数:Vibrato.AffectedEffectAutomations(键=槽位下标+轨 id,与 voice 影响表平行、命名空间互不相扰);标脏分源(EffectAmplitudesModifiedRangeModified 二分,改 effect 关联振幅只惊动 effect 链、不把 voice 标脏重合成);取值按 AutomationKey 路由,effect 轨终值=曲线+颤音偏移(与 voice 共享包络语义);拖拽关联/双击解除/叠加层对 voice/effect 统一;快照按槽位切片冻结;TLP JSON/CBOR 补 affectedEffectAutomations 嵌套表;链结构变更经 RemapEffectIndexes 同撤销单元重映射槽位外键(配套 effect 实例稳定 id,8eaaae1)。提交 1ff23db
  • effect 段内子区间增量(脏区间账本传导+局部重合成):IAudioSegment.Resize(内容延续的扩展/裁剪,段身份跨几何变更存活、下游节点与缓存不因 part 增长而全灭);账本改绝对采样坐标 RangeModified(long,int)(内容变更必经 Write 记账、几何变更按对称差记账,重算范围由下游自决);IEffectSynthesisProcessorIEffectSynthesisSession(持活视图+跨 Process 养缓存);回显独立信号 SynthesizedParametersChanged(长耗时引擎中途渐进发布);参考引擎 Slow Gain=局部重合成范式(账本收窄重算窗、耗时∝窗长、声称只罩窗口)。提交 72756cc;inpainting 形态测试插件 V1.Inpaint+手测用例 94d0b7e
  • 键值集合的集合表达式支持([CollectionBuilder]):Map/OrderedMap 及其可变/只读接口挂 [CollectionBuilder],解锁 [] 字面量——含 new() 无法表达的接口目标 = [](不能 new 接口);Map 由继承 Dictionary 改为组合、公有枚举统一产出 IReadOnlyKeyValuePair,使单个 builder 通吃具体类与接口;只读接口空 [] 复用 Empty 单例(零分配);OrderedMap 保留覆盖语义与 RemoveAt/KeyAt/ValueAt 索引 API。连带:DataMap 内部字段由 Map 改原生 Dictionary(对外 IDictionary 契约不变)、TLP/CBOR 读写辅助方法形参 Dictionary→Map/IReadOnlyMap。非空 KV 字面量收益有限(元素是接口、new(...) 与 BCL KeyValuePair 都不隐式汇入、须显式 new ReadOnlyKeyValuePair<,>(...)),主要价值在空 []。独立测试 MapCollectionExpressionTests(7 例)。提交 39e1a9c
  • 扩展冲突消解矩阵(所有插件类型,非仅 format):身份 id(format 扩展名 / voice·effect·agent 引擎 id)跨包可重名、非全局唯一键。四个 manager 从 id→单个(先到丢弃) 改为 id→多包并存(同包同 id 去重);ExtensionRouting 三合一——活实现解析(用户选择 / 内建优先 / packageId 序最小)+ 选择存 app Settings.jsonExtensionRouting 字典 + 冲突聚合;工程只引身份 id、不存包 id,选中包缺失按默认策略回退(工程跨机可移植);format import/export 各为可路由身份;ExtensionSettingsManager 改按 (packageId,id) 枚举;设置窗口「Extension Routing」页按类型分组(Voice/Effect/Agent Model/Format)、下拉显包名、专属图标;legacy 包 id 改用目录名(区分多包 + 反查包名,退役"legacy=空串");夹具 V1.RouteConflict.A/B(format)+V1.VoiceConflict.A/B(voice) + tests/EXTENSION-ROUTING-TEST-CASES.md。提交 1474ddb
  • 插件设置系统(opt-in IExtensionSettings;设置窗口「扩展」页;ExtensionSettingsStore 单文件;设置按包分桶 root[packageId][kind:extensionId] 根治不同包同 id 串味,内建用 (built-in)、legacy 用目录名、V1 包用反向域名 id;密钥 DPAPI/钥匙串;agent 复用存储层)
  • effect 接口规范化(会话化):厚 IEffectProcessor(每段一个)+ IEffectContext + IUpstreamAudioSegment;退役 IEffectInput/Output/Change;自订阅自管失效;EffectGraph 反应式 processor 图;回显轨端到端
  • manifest 入口统一 classes 数组:退役 class/import/export 具名槽,改 classes 候选类清单、宿主按 type 所需接口扫描认领;assembly 保持单数(一能力的入口类同住一 dll,多 dll 走多 extensions[] 条目共享一 per-package ALC)
  • 条件属性面板(§三.25,config=f(context) 提交时整树重算 + keyed-diff)
  • PropertyValue.Invalid 垫片清理(Invalid 正式化为长期哨兵)+ 装箱优化(标签+字段联合)
  • IDataObject.WillModify 改前事件(merge 对偶语义,对齐 C++ aboutToModify)
  • voice SDK 会话模型重设计(厚插件;插件面全秒轴)+ 合成分段 Segment SDK 形状(SynthesisSegment/IAudioSegment)
  • voice→effect 音频段化 + 按段增量重渲染(段握柄 / 按段独立过链 cache[segment][stage] / 波形 + 播放逐段;提交①②③,§三.28)
  • 插件多语言(i18n)适配(插件侧自译 + 静态全局 host context + manifest localizations)
  • 扩展侧边栏信息增强(icon / 作者 / 简介 tooltip / 真实类别徽标)
  • voice 插件实战开发文档(plugin-development.md §5:音素 I/O / 音高双通道采样 / 快照 / note·part 属性约定 / 原生依赖打包 + LLM 版同步)

🗑️ 不再跟踪(已决 / 无跟踪价值)

  • 传给插件的音符是否宿主侧先去重叠 —— 已决:SDK 直传可重叠序列、去重叠归插件(单声部按需截断 / 和弦原味消费),见 78096bb/caecc3e
  • assembly 单数 vs assemblies 复数 —— 已决:保持单数;classes 复数是因一个能力可有多入口类(如 format 导入+导出),但它们同属一身份、同住一 dll;多 dll 包用多 extensions[] 条目(共享一 per-package ALC)表达
  • 文档数据集合接口统一 / IDataObject DIM 重构(effect 那套 IReadOnlyDataCollection 统一)—— §三.20 已定"不纳入";§三.21/22/24 已重做数据/事件/导航模型(IDataObject.WillModify 已实装,见已完成)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions