diff --git a/public_html/js/Parser.js b/public_html/js/Parser.js index ef5a8e9..20dcbbb 100644 --- a/public_html/js/Parser.js +++ b/public_html/js/Parser.js @@ -298,9 +298,8 @@ Parser.prototype.hide = function() { Parser.prototype.play = function() { if (this.match(TokenType.MUSIC)) return this.playMusic(); if (this.match(TokenType.AMBIENCE)) return this.playAmbience(); - if (this.lookMatch(0, TokenType.SOUND) || this.lookMatch(0, TokenType.SOUNDLOOP)) { - return this.playSound(); - } + if (this.match(TokenType.SOUND)) return this.playSound(); + if (this.match(TokenType.SOUNDLOOP)) return this.playSoundLoop(); return false; }; @@ -312,13 +311,16 @@ Parser.prototype.playMusic = function() { }; Parser.prototype.playSound = function() { - var loop = false; - if (this.match(TokenType.SOUND)) loop = false; - else if (this.match(TokenType.SOUNDLOOP)) loop = true; - var name = this.consumeMusicName(); var fade = this.matchFade(); - ViewActivity.getInstance().sound(name, loop, fade); + ViewActivity.getInstance().sound(name, fade); + return false; +}; + +Parser.prototype.playSoundLoop = function() { + var name = this.consumeMusicName(); + var fade = this.matchFade(); + ViewActivity.getInstance().soundLoop(name, fade); return false; }; @@ -352,10 +354,14 @@ Parser.prototype.stop = function() { var fade = this.matchFade(); ViewActivity.getInstance().stopMusic(fade); } - if (this.match(TokenType.SOUND) || this.match(TokenType.SOUNDLOOP)) { + if (this.match(TokenType.SOUND)) { var fade = this.matchFade(); ViewActivity.getInstance().stopSound(fade); } + if (this.match(TokenType.SOUNDLOOP)) { + var fade = this.matchFade(); + ViewActivity.getInstance().stopSoundLoop(fade); + } if (this.match(TokenType.AMBIENCE)) { var fade = this.matchFade(); ViewActivity.getInstance().stopAmbience(fade); diff --git a/public_html/js/Views.js b/public_html/js/Views.js index e0f7c9e..8d42074 100644 --- a/public_html/js/Views.js +++ b/public_html/js/Views.js @@ -10,6 +10,7 @@ function Views(parser) { this.musicPlayerAudio = new Audio(); this.soundPlayerAudio = new Audio(); + this.soundLoopPlayerAudio = new Audio(); this.ambiencePlayerAudio = new Audio(); this.musicQueue = new Array(); this.soundQueue = new Array(); @@ -370,7 +371,7 @@ Views.prototype.addSoundToQueue = function (name) { if (!this.soundPlayerAudio.paused) { this.soundQueue.push(name); } else { - this.sound(name, false, this.NO_FADE); + this.sound(name, this.NO_FADE); } }; @@ -410,7 +411,7 @@ Views.prototype.stopMusic = function (fade) { } }; -Views.prototype.sound = function (name, loop, fade) { +Views.prototype.sound = function (name, fade) { try { this.stopSound(this.soundPlayerAudio.fade); this.soundPlayerAudio.src = PathResolver.sound(name); @@ -418,10 +419,7 @@ Views.prototype.sound = function (name, loop, fade) { var views = this; this.soundPlayerAudio.addEventListener('ended', function () { if (views.soundQueue.length > 0) { - views.sound(views.soundQueue.pop(), false, views.NO_FADE); - } else if (loop) { - this.currentTime = 0; - this.play(); + views.sound(views.soundQueue.pop(), views.NO_FADE); } }); this.soundPlayerAudio.play(); @@ -446,6 +444,38 @@ Views.prototype.stopSound = function (fade) { } }; +Views.prototype.soundLoop = function (name, fade) { + try { + this.stopSoundLoop(this.soundLoopPlayerAudio.fade); + this.soundLoopPlayerAudio.src = PathResolver.sound(name); + this.soundLoopPlayerAudio.fade = fade; + this.soundLoopPlayerAudio.addEventListener('ended', function () { + this.currentTime = 0; + this.play(); + }); + this.soundLoopPlayerAudio.play(); + if (fade.fadeIn) { + $(this.soundLoopPlayerAudio).prop("volume", 0.0); + $(this.soundLoopPlayerAudio).animate({volume: 1.0}, fade.duration * 1000); + } + } catch (e) { + console.log("soundloop: " + name + " " + e); + } +}; + + +Views.prototype.stopSoundLoop = function (fade) { + if (this.soundLoopPlayerAudio.paused) return; + + if (fade.fadeOut) { + $(this.soundLoopPlayerAudio).animate({volume: 0.0}, fade.duration * 1000, function() { + this.pause(); + }); + } else { + this.soundLoopPlayerAudio.pause(); + } +}; + Views.prototype.ambience = function (name, fade) { try { this.stopAmbience(this.ambiencePlayerAudio.fade);