声音部分的bug

/**
     * !#en Play audio.
     * !#zh 播放音频
     * @method play
     * @param {String} filePath - The path of the audio file without filename extension.
     * @param {Boolean} loop - Whether the music loop or not.
     * @param {Number} volume - Volume size.
     * @return {Number} audioId
     * @example
     * //example
     * var audioID = cc.audioEngine.play(path, false, 0.5);
     */
    play: function (filePath, loop, volume/*, profile*/) {
        var audio = getAudioFromPath(filePath);
        var callback = function () {
            audio.setLoop(loop || false);
            audio.setVolume(volume || 1);
            audio.play();
        };
        audio.__callback = callback;
        audio.on('load', callback);
        audio.preload();

        return audio.instanceId;
    },
js.get(audioEngine, 'playEffect', function () {
		// cc.warn(INFO, 'audioEngine.playEffect', 'audioEngine.play');
		return function (url, loop, volume) {
			return audioEngine.play(url, loop, volume === undefined ? effectsVolume : volume);
		}
	});

以上是引擎js层的实现,我的代码是这样子的

var volume = 0;
var id = cc.audioEngine.playEffect(url, false, volume);

我本打算要将这个音效播放声音大小设置为0,但是实际效果是能听见声音,然后追代码,发现是||导致的

audio.setVolume(volume || 1);

这个判断有点蛋疼啊,如果想要设置静音播放,那么volume不能为0,得是0.0001,没错,你永远也不可能把声音大小设置为0,另外发现所有设置音量的都要走

audio.setVolume(volume || 1);

又发现bug一枚:设置音效的音量也会同时把背景音乐的音量也设置了

问题就出在for循环的id

for (var id in id2audio) {
    if (id === musicId) continue;
    audioEngine.setVolume(id, volume);
}

虽然从调试信息上看到id2audio看到key为数字,但是实际用for in 的时候, id为字符串,而下边判断的时候又使用了===,导致

结果就是把背景音乐的音量给更改了
音乐这块的bug怎么这么多???

顺便再问一下 cc.audioEngine这个是不是要废弃掉?

Sorry T.T
audioEngine 不会废弃。上面你说的全部都走 setVolume 确实是很蛋疼,如果能抛弃 jsb 的话,web 可以搞出更合适的架构。

现在的这套架构是和 c++ 的 audioEngine 一模一样的,为的就是不偏移太多,导致的就是看起来内部很多乱七八糟的 hack ~~

这些 bug 我们稍后就修复。谢谢反馈啦~~
用力吐槽说不定下次就能狠下心来放弃之前的重新弄一套啦啊哈哈

1赞

设置音效的音量也会同时把背景音乐的音量也设置了
这个bug在1.7中仍然存在!

判断音轨的时候,toString()之后比较,虽然会带来性能上的开销

1.8.2.。貌似也没有修复啊

我也遇到了

大神现在有解决方案吗?

有的,解决方案就是
1.如果设置声音为0,那么,音量请设置0.0001,就是很小很小
2.设置音效声音大小的时候,先设置音效,再重新设置下音乐大小,因为单纯的设置音效,会影响到音乐大小,所以需要重新设置下音乐大小

cc.audioEngine.setEffectsVolume(effectVolume);
cc.audioEngine.setMusicVolume(musicVolume);

:joy:

2赞

惊了,这么说静音要自己专门用变量记下?设置0音量就当做静音处理然后stop :joy:

额。。。。。这个貌似是被逼的 方案啊 :joy: