src/provider/SoundProvider.js

goog.module('gep.provider.SoundProvider');

const {HowlerSoundProvider} = goog.require('nbsrc.provider.HowlerSoundProvider');

const {randomInt} = goog.require('goog.math');

/**
 * This provider (singleton) takes care of loading and controlling sounds
 * @extends {HowlerSoundProvider}
 */
class SoundProvider extends HowlerSoundProvider
{
    constructor()
    {
        super();

        /**
         * Timeout ID for the delayed playback of the generic platform sound.
         * @type {number}
         * @private
         */
        this.backgroundSoundTimeout_ = 0;

        /**
         * Is the playback of background sound enabled
         * @type {boolean}
         * @private
         */
        this.enableBackgroundSound_ = false;

        /**
         * Was started the first generic platform background sound
         * @type {boolean}
         * @private
         */
        this.firstBackgroundPlayback_ = true;
    }

    /**
     * Starts the random delayed playback of the generic platform background sound.
     * Sound is played the first time after 3 seconds and then again after a pause of 30 - 60 seconds
     * @private
     */
    playBackgroundSound_()
    {
        const delay = this.firstBackgroundPlayback_ === true ? 3000 : (randomInt(30)) + 30 * 1000;
        this.backgroundSoundTimeout_ = setTimeout(() => {
            this.playSound('background', .2).then(() => { this.playBackgroundSound_(); }, (error) => { console.warn(error); });
        }, delay);
    }

    /**
     * Setter
     * For playing a loop sound instead of a random delayed generic platform sound change the variable SOUND_MODE to loop in `app/views/index.php`
     * // var SOUND_MODE = 'loop';
     * @param {boolean} value
     */
    set enableBackgroundSound(value)
    {
        clearTimeout(this.backgroundSoundTimeout_);

        if(this.enableBackgroundSound_ != value)
        {
            if(value === true) {
                if(window['SOUND_MODE'] == 'generic-platform') this.playBackgroundSound_();
                else this.playSound('background', 1, true);
                this.firstBackgroundPlayback_ = false;
            }
            else {
                this.stopSound('background').catch((error) => { console.warn(error); });
            }
        }
        this.enableBackgroundSound_ = value;
    }

    /**
     * Getter
     * @return {boolean}
     */
    get enableBackgroundSound()
    {
        return this.enableBackgroundSound_;
    }
}

goog.addSingletonGetter(SoundProvider);

exports = SoundProvider;