#1417·Tone.js

在传输时间 0 时的同步播放器: 停止后的虚拟重放在启动周期后重复

作者: naomiaro创建于 2026年3月1日更新于 2026年4月19日

□ 总结

Player'通过player.sync (.).start(0),抵消,持续时间 ' 同步到Transport时,停止并重新启动非零相抵的Transport,导致片段在0时作为幻影音频源重放. 这创造了可听取的分层——时间0的分片与分片在正确的"运输"偏移处同时播放.

□ 根源

`Source.ts'中的两个问题共同创建了这个错误:

zz
这个.  syncedStart = (时间,偏移) {{
如果( GT( offset, 0) ) { / / {% 的片断, 以相抵 0 表示的片断从未在这里处理
const stateEvent = this.  state.get(已取消);
//.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
* ;

GT(offset, 0)'检查是指在运输时间0同步的片段从未通过`` syencedStart'处理器启动。 这使Transport.chedule ()'召回(问题2)成为这些片段的****起步路径。

  1. 无条件的`运输.时间表() ' 回调(230至231行)

[TypeScript] const sched = this.context.transport.chedule((t)) {(t){(t)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i)(i) 开始( t, 偏移, 持续时间); / / QQ 总是起火, 没有状态检查

  • 计算时间;

当“计算时间”为0时,当运输公司内部的计数器超过0时,就会发生这种回叫起火。 在停止/启动周期后, " Tick source " (~1e-16) 中的浮点漂移导致勾选 0 重新触发,要求无条件启动() 。 这样即使运输从后来的抵消(例如:`Transport.start(now (5))')开始,也会产生一个新的`Buffer source Node'。

□再现.

```2ZZ
从“ tone” 导入{ player, get Transport};

Const 播放器 = 新播放器( 缓冲);
player. to Destination () ; 游戏

// 同步播放器在运输时间 0 开始
player.sync (. sart (0, 0, 缓冲. duration) ;

c. 运输=获得运输();

// 第一部剧——作品正确.
运算. start(Tone.now()、0);

/ 播放后停止
设置时间出错( ()) {{{}
运算. stop( );

/ 从相抵后5秒开始—— 剪辑时间 0 不应播放
// BUG: 剪辑在时间 0 播放反正( 幽灵回放)
运算.start(Tone.now(),5);
• 2000年);

** 预期:** 从冲抵5开始运输不应触发在0时同步的剪辑。

** 实际:** Transport.chedule ()'因TickSource漂移而于0时起回叫起火,从而形成从一开始播放剪辑的幽灵BufferSourceNode'。

□ 影响

这影响到使用“player.sync (. start (0.)”和“Transport stop-start cycle”的任何应用程序——常见于使用播放/暂停/搜索控制功能的DAW类应用程序。 每个停止-启动周期都会产生额外的幽灵音频源,导致:

  • 音频分层(同时播放多份片段)
  • 累积 " 燃料源点 " 实例(记忆/资源泄漏)

运输-本地循环( " Transport.loop = true " )的问题更为突出,每一循环循环都是一个停止-启动周期。

□ 建议修补

`Transport.chedule ()'在第230行的回调时,在调用 QQstart () 之前,应先检查来源状态,类似于 . . . . . . .