2.2-2.3版本 ios 手机浏览器 audioEngine 播放背景音乐重叠

版本 2.2-2.3
手机 iphone 6s, 8, X
浏览器 safari qq chrome
代码部分:
SoundManager 核心部分代码:
/**
* 播放背景音乐
*/
music(url: string) {
this._url = url;
this._playCurMusic();
}

        /**
         * 播放当前音乐
         */
        private _playCurMusic() {
            let url = this._url,
                audio: cc.AudioClip =
                    cc.loader.getRes(url);

            if (!audio) {
                cc.loader.loadRes(url, cc.AudioClip, (err, res: cc.AudioClip) => {
                    if (err) {
                        cc.error('load error');
                        this.scheduleOnce(
                            () => {
                                this._playCurMusic
                            }, 3
                        );

                        return;
                    }

                    cc.error('music loaded');
                    this._playMusic(res);
                });
            } else {
                this._playMusic(audio);
            }
        }

        /**
         * 播放音乐
         * @param audio 
         */
        private _playMusic(audio: cc.AudioClip) {
            cc.audioEngine.stopMusic();
            this.unscheduleAllCallbacks();
            this._musicID = cc.audioEngine.playMusic(
                audio, false);
            cc.error('play', this._musicID);

        }

场景逻辑
onLoad: 调用SoundManager播放背景音乐
场景按钮逻辑:
点击后调用SoundManager播放背景音乐

bug触发方法:
1.首先运行项目,由于以上浏览器都需要手势触发播放,先不触发
2.切到其他网页或者app看视频或者听音乐,触发音频播放
3.切回项目页面手势触发音乐播放
4.点击按钮再次触发音乐播放
5.此时之前的音乐调用stop已经无法停止,新的音乐同时播放。

PS: 附带android部分的bug:
部分安卓浏览器,尤其是UC浏览器,如果在onLoad中注册
cc.game.on(cc.game.EVENT_HIDE, this._onHide, this);
并在onHide中播放音乐,切换到后台后音乐仍然会播放

@kenshin

附上项目代码:
Script.zip (3.7 KB)

额,官方也没有回复,看来是不在解决范围内了。

通过查看引擎代码,问题已经找到:
CCAudio.js中:

if ((!audio.context.state || audio.context.state === "suspended") && 
            this._context.currentTime === 0) {
            let self = this;
            clearTimeout(this._currentTimer);
            this._currentTimer = setTimeout(function () {
                if (self._context.currentTime === 0) {
                    touchPlayList.push({
                        instance: self._audio,
                        offset: offset,
                        audio: self
                    });
                }
            }, 10);
        }

这段代码有两个问题:
1.再未触发手势之前,切换前后台这块代码会重复push背景音乐到touchPlayList, 所以调用stopMusic较老的audio就停不下来。
2.在safari中由于有interrupted状态,在未出发手势前同样要加到if的或判断中,不然会造成手势触发时,touchPlayList没有audio不播放音乐

大家可以自行修改引擎解决以上问题。

留个脚印,帮顶一下

mark

这个怎么改 直接修改引擎代码吗

mark!