(v 2.0)调用 cc.audioEngine.stop 之后,所有的 setFinishCallback 回调都无法触发了

今天更新到 creator v 2.0 版本之后,发现 cc.audioEngine.stop 方法的一个很无语的 bug。
不废话,直接上代码:

@property({ type: cc.AudioClip })
clip1: cc.AudioClip = null;

@property({ type: cc.AudioClip })
clip2: cc.AudioClip = null;

@property({ type: cc.AudioClip })
clip3: cc.AudioClip = null;

onLoad() {

    let clip1ID= cc.audioEngine.play(this.clip1, false, 1);
    cc.audioEngine.setFinishCallback(clip1ID, () => {
        console.log('after clip1');
    });

   cc.audioEngine.stop(clip1ID); // 一旦调用了 stop 方法,下面音频的回调函数就都无法触发了

   let clip2ID= cc.audioEngine.play(this.clip2, false, 1);
   cc.audioEngine.setFinishCallback(clip2ID, () => {
            console.log('after clip2');
  });

   let clip3ID= cc.audioEngine.play(this.clip3, false, 1);
   cc.audioEngine.setFinishCallback(clip3ID, () => {
            console.log('after clip3');
   });
}

如上所示,如果调用了 cc.audioEngine.stop(clip1ID);,那么 clip2 和 clip3 设置的 setFinishCallback 回调函数,就都无法触发了,这个是何解??

经过反复试验发现,一旦调用了cc.audioEngine.stop(clip1ID);,那么所有的 setFinishCallback 回调都会无法触发。

之前的 v 1.9.3 都好好的…

(另外,在论坛的编辑器里编辑代码真的是好痛苦,根本无法格式化)

好像是故意这样设计的吧。

http://forum.cocos.com/t/topic/64636/7

故意这样设计?为啥咧?
当我们想播放新的音频,但是旧的音频还在播放,这时需要先将旧的音频停止,然后再播放新的音频,难道这个需求不合理?

你自己调用stop的, 不算播放 finish吧?所以没触发。
你自己调用的, 如果有需要, 自己再触发个事件,
如果自己stop也触发事件, 会不会导致无法区分是被stop还是finish?

playMusic 适用于播放背景音乐, playEffect 适用于播放较短的音效,这个可以理解。
但也不应该为了让人去使用 playMusic 和 playEffect ,而把 play 原本支持的功能给阉割了啊 T T
这是得修改多少代码啊,哎

抱歉, 刚没看清楚你的代码。
一旦调用了cc.audioEngine.stop(clip1ID);,那么所有的 setFinishCallback 回调都会无法触发。
这应该是个bug

我说的是 调用, cc.audioEngine.stop(clip1ID);, 不会触发setFinishCallback(clip1ID, callback)这个。

不知道play 这个方法是啥意思,跟playMusic 有啥关系

感谢反馈,会进行排查,如果是 bug 会进行修复


我这个是 web 平台, chrome 浏览器,是可以回调的

感谢回复:joy:

关于 setFinishCallback 的回调,刚又发现了一个比较揪心的问题:

我在 scene1 设置了一个 setFinishCallback 回调,第一次能正常回调,但是当我从 scene1 过渡到 scene2, 之后再回到 scene1,那么在 scene1 的 setFinishCallback 的回调就不能触发了。

经反复试验,确认是因为勾选了场景的 “自动释放资源” 的 bug,我把 “自动释放资源” 的勾去掉,就都是能触发回调,但是勾选了之后,再从其他场景回到 scene1 就不能触发 setFinishCallback 的回调了。。

附上代码:

场景1:

export default class Scene1 extends cc.Component {

    @property({ type: cc.AudioClip })
    clip1: cc.AudioClip = null;

    onLoad() {
        let clip1ID = cc.audioEngine.playEffect(this.clip1, false);
       // 场景1勾选了“自动释放资源”,然后从 场景2 回到 场景1,这个回调就不触发了
        cc.audioEngine.setFinishCallback(clip1ID, () => {
            console.log('after clip1');
        });
    }

    toScene() {
        cc.director.loadScene('scene2');
    }

}

场景2:

export default class Scene2 extends cc.Component {

    toScene() {
        cc.director.loadScene('scene1');
    }

}

游戏比较依赖音频的监听回调,所以这个问题很是揪心呐…难道让我都不勾选“自动释放资源”吗?估计这个问题也是由于引擎在“自动释放资源”的时候也调用了 stop 吧(我猜的 T T )

我之前就碰到这个问题了,你把stop换成pause吧,不过引起改一下最好了

好的,我进行排查修复,感谢反馈

恩,只能改用 pause;不过场景 “自动释放资源” 这个问题,没办法规避,所有场景都自己做资源管理的话,那使用引擎带来的效益就变低太多了,所以还是期待引擎能早日修复

这个需求下个版本的 2.0 就修复了

或者自己自定义 engine : https://github.com/cocos-creator/engine/pull/3119