2015-10-22 14:25:45 +00:00
|
|
|
function storageAvailable(type) {
|
|
|
|
try {
|
|
|
|
var storage = window[type],
|
|
|
|
x = '__storage_test__';
|
|
|
|
storage.setItem(x, x);
|
|
|
|
storage.removeItem(x);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch(e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-04 13:01:59 +00:00
|
|
|
class SoundController {
|
|
|
|
constructor () {
|
|
|
|
if (Howl === undefined) {
|
|
|
|
throw new Error("Howl.js required to created sound controller");
|
|
|
|
}
|
|
|
|
|
|
|
|
this.MINIMUM_PLAY_INTERVAL = 120000;
|
|
|
|
|
|
|
|
this.playGatherMusic = _.throttle(() => {
|
|
|
|
this.gather.music.play();
|
|
|
|
}, this.MINIMUM_PLAY_INTERVAL);
|
|
|
|
|
|
|
|
this.isMuted = Howler._muted;
|
|
|
|
|
2015-10-22 14:25:45 +00:00
|
|
|
if (storageAvailable("localStorage")) {
|
|
|
|
let volume = localStorage.getItem("gatherVolume");
|
|
|
|
if (volume !== undefined) Howler.volume(volume);
|
|
|
|
}
|
2015-10-04 13:01:59 +00:00
|
|
|
|
|
|
|
this.tunes = {
|
|
|
|
"classic": {
|
|
|
|
description: "Classic",
|
|
|
|
url: 'http://www.ensl.org/sounds/gather-1.mp3'
|
|
|
|
},
|
|
|
|
"eyeofthegorgie": {
|
|
|
|
description: "Eye of the Gorgie",
|
|
|
|
url: 'http://www.ensl.org/files/audio/eyeofthegorgie.mp3'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.setupGatherMusic("classic");
|
|
|
|
}
|
|
|
|
|
|
|
|
mute() {
|
|
|
|
this.isMuted = true;
|
|
|
|
return Howler.mute();
|
|
|
|
}
|
|
|
|
|
|
|
|
unMute() {
|
|
|
|
this.isMuted = false;
|
|
|
|
return Howler.unmute();
|
|
|
|
}
|
|
|
|
|
2015-10-22 14:25:45 +00:00
|
|
|
getVolume() {
|
|
|
|
return Howler.volume();
|
|
|
|
}
|
|
|
|
|
|
|
|
setVolume(val) {
|
|
|
|
if (val === undefined ||
|
|
|
|
typeof val !== 'number' ||
|
|
|
|
Math.abs(val) > 1) return;
|
|
|
|
if (storageAvailable("localStorage")) {
|
|
|
|
localStorage.setItem("gatherVolume", val);
|
|
|
|
}
|
|
|
|
return Howler.volume(val);
|
|
|
|
}
|
|
|
|
|
2015-10-04 13:01:59 +00:00
|
|
|
play(music) {
|
|
|
|
if (this.gather && this.gather.music) return this.gather.music.play();
|
|
|
|
}
|
|
|
|
|
|
|
|
stop(music) {
|
|
|
|
if (this.gather && this.gather.music) return this.gather.music.stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
setupGatherMusic (musicName) {
|
|
|
|
let self = this;
|
|
|
|
let gatherMusic = this.tunes[musicName];
|
|
|
|
|
|
|
|
if (!gatherMusic) return;
|
|
|
|
if (self.gather && self.gather.name === musicName) return;
|
|
|
|
|
|
|
|
// Stop if already playing
|
|
|
|
if (self.gather && self.gather.music) {
|
|
|
|
self.gather.music.stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
let tune = self.tunes[musicName];
|
|
|
|
self.gather = {
|
|
|
|
name: musicName,
|
|
|
|
description: tune.description,
|
|
|
|
url: tune.url,
|
|
|
|
music: new Howl({
|
|
|
|
urls: [tune.url]
|
|
|
|
})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-27 16:54:34 +00:00
|
|
|
var SoundPanel = React.createClass({
|
2015-10-22 14:25:45 +00:00
|
|
|
componentDidMount() {
|
|
|
|
let soundController = this.props.soundController;
|
|
|
|
let scale = 10;
|
|
|
|
$("#volume-slide").slider({
|
|
|
|
min: 0,
|
|
|
|
max: scale,
|
|
|
|
step: 1
|
|
|
|
}).on("slideStop", ({value}) => {
|
|
|
|
soundController.setVolume(value / scale);
|
|
|
|
}).slider('setValue', soundController.getVolume() * scale);
|
|
|
|
|
|
|
|
console.log(soundController.getVolume());
|
|
|
|
},
|
|
|
|
|
2015-08-27 16:54:34 +00:00
|
|
|
mute() {
|
2015-10-02 14:53:11 +00:00
|
|
|
this.props.soundController.mute();
|
2015-08-27 16:54:34 +00:00
|
|
|
this.forceUpdate();
|
|
|
|
},
|
|
|
|
|
|
|
|
unMute() {
|
2015-10-02 14:53:11 +00:00
|
|
|
this.props.soundController.unMute();
|
2015-08-27 16:54:34 +00:00
|
|
|
this.forceUpdate();
|
|
|
|
},
|
|
|
|
|
2015-10-22 14:25:45 +00:00
|
|
|
play() {
|
|
|
|
this.props.soundController.play();
|
|
|
|
},
|
|
|
|
|
|
|
|
stop() {
|
|
|
|
this.props.soundController.stop();
|
|
|
|
},
|
|
|
|
|
2015-08-27 16:54:34 +00:00
|
|
|
render() {
|
2015-10-02 14:53:11 +00:00
|
|
|
let soundController = this.props.soundController;
|
2015-10-22 14:25:45 +00:00
|
|
|
let mutedIcon, mutedButton;
|
2015-08-27 16:54:34 +00:00
|
|
|
if (soundController.isMuted) {
|
2015-10-22 14:25:45 +00:00
|
|
|
mutedIcon = <i className="fa fa-volume-off fa-fw"></i>;
|
|
|
|
mutedButton = <li>
|
|
|
|
<a href="#" onClick={this.unMute}>
|
|
|
|
{mutedIcon} Muted
|
|
|
|
</a>
|
|
|
|
</li>;
|
2015-08-27 16:54:34 +00:00
|
|
|
} else {
|
2015-10-22 14:25:45 +00:00
|
|
|
mutedIcon = <i className="fa fa-volume-up fa-fw"></i>;
|
|
|
|
mutedButton = <li>
|
|
|
|
<a href="#" onClick={this.mute}>
|
|
|
|
{mutedIcon} Unmuted
|
|
|
|
</a>
|
|
|
|
</li>;
|
2015-08-27 16:54:34 +00:00
|
|
|
}
|
2015-10-22 14:25:45 +00:00
|
|
|
return <ul className="nav navbar-top-links navbar-right">
|
|
|
|
<li className="dropdown">
|
|
|
|
<a className="dropdown-toggle" data-toggle="dropdown" href="#">
|
|
|
|
Sound {mutedIcon} <i className="fa fa-caret-down"></i>
|
|
|
|
</a>
|
|
|
|
<ul className="dropdown-menu">
|
|
|
|
{mutedButton}
|
|
|
|
<li>
|
|
|
|
<a href='#' onClick={this.play}>
|
|
|
|
<i className="fa fa-play"></i> Play
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li>
|
|
|
|
<a href='#' onClick={this.stop}>
|
|
|
|
<i className="fa fa-stop"></i> Stop
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li>
|
|
|
|
<div className="volume-slide">
|
|
|
|
<div id="volume-slide"></div>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
</ul>;
|
2015-08-27 16:54:34 +00:00
|
|
|
}
|
2015-10-02 14:53:11 +00:00
|
|
|
});
|