function storageAvailable(type) { try { var storage = window[type], x = '__storage_test__'; storage.setItem(x, x); storage.removeItem(x); return true; } catch(e) { return false; } } 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; if (storageAvailable("localStorage")) { let volume = localStorage.getItem("gatherVolume"); if (volume !== undefined) Howler.volume(volume); } 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(); } 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); } 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] }) }; } } var SoundPanel = React.createClass({ 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()); }, mute() { this.props.soundController.mute(); this.forceUpdate(); }, unMute() { this.props.soundController.unMute(); this.forceUpdate(); }, play() { this.props.soundController.play(); }, stop() { this.props.soundController.stop(); }, render() { let soundController = this.props.soundController; let mutedIcon, mutedButton; if (soundController.isMuted) { mutedIcon = ; mutedButton =
  • {mutedIcon} Muted
  • ; } else { mutedIcon = ; mutedButton =
  • {mutedIcon} Unmuted
  • ; } return ; } });