Почему не работает звук в Safari?

576
31 июля 2018, 15:40

Идет такой код, для вывода сообщения включить звук или выключить:

var soundManager = SoundManager.getInstance(); // в Safari всегда undefined
if(soundManager.isSupported())
{
    soundManager.setSounds(settings.soundsInfo);
    soundManager.addEventListener(SoundManager.SOUND_LOADED, onSoundLoaded, this);
    this._soundPopUp = new PopUp("Play Sounds?", "", "Yes", "No");
    this._soundPopUp.addEventListener(PopUp.BUTTON1_CLICK, onLoadSounds, this);
    this._soundPopUp.addEventListener(PopUp.BUTTON2_CLICK, onCancelSounds, this);
    this._soundPopUp.setButtonIds("SoundPopUpYesButton", "SoundPopUpNoButton");
}
if(this._soundPopUp)
{
    this._view.addChild(this._soundPopUp);
}

Это код из библиотеки:

EventDispatcher
(
    "SoundManager", 
    {
        SOUND_LOADED: "soundLoaded",
        _instance: null,
        getInstance: function() 
        {
            SoundManager._instance || (SoundManager._instance = new SoundManager);
            return SoundManager._instance
        }
    }, 
    function() 
    {
        function c(a) 
        {
            a.target.removeEventListener(LoaderEvent.COMPLETE, c, this);
            a.target.removeEventListener(LoaderEvent.ERROR, b, this);
            var d = a.target.index;
            console.log(this._soundSources[d] + " loaded!");
            this._soundBuffers[d] = a.data;
            this.dispatchEvent(new Event(SoundManager.SOUND_LOADED, {
                soundIndex: a.target.index
            }))
        }
        function b(a) 
        {
            a.target.removeEventListener(LoaderEvent.COMPLETE, c, this);
            a.target.removeEventListener(LoaderEvent.ERROR, b, this);
            console.log("Loading " + this._soundSources[index] + " failed!")
        }
        return 
        {
            init: function() 
            {
                this._masterGain = this._context = null;
                this._soundSources = [];
                this._sounds = {};
                this._soundBuffers = [];
                this._mute = !0;
                this._super();
                window.AudioContext = window.AudioContext || window.webkitAudioContext;
                if (window.AudioContext && !this._context) 
                {
                    this._context = new AudioContext;
                    this._context.createGainNode || (this._context.createGainNode = this._context.createGain);
                    var a = this._context.createBufferSource();
                    a.noteGrainOn || a.start || this._context.createGainNode || (this._context = null)
                }
                this._context && (this._masterGain = this._context.createGainNode(), this._masterGain.connect(this._context.destination), this._masterGain.gain.value = 1)
            },
            isSupported: function() 
            {
                return this._context ? !0 : !1
            },
            getContext: function() 
            {
                return this._context
            },
            playDummySound: function(a) 
            {
                if (this._context) {
                    var b = this._context.createBufferSource();
                    b.buffer = a;
                    b.connect(this._context.destination);
                    b.noteGrainOn || (b.noteGrainOn = b.start);
                    b.noteGrainOn(0, 0, 1)
                }
            },
            setSounds: function(a) 
            {
                if (!(0 == a.length || 0 < this._soundSources.length))
                    for (var b = a.length, c = 0; c < b; c++) {
                        this._soundSources[c] = a[c].src;
                        for (var e = a[c].sounds, h = e.length, f = 0; f < h; f++) {
                            var k = e[f];
                            this._sounds[k.name] = {
                                start: k.start,
                                duration: k.duration,
                                soundIndex: c
                            }
                        }
                    }
            },
            hasSound: function(a) 
            {
                return this._sounds[a] && this._soundBuffers[this._sounds[a].soundIndex] ? !0 : !1
            },
            load: function(a) 
            {
                if (this._context &&
                    void 0 == this._soundBuffers[a]) {
                    this._soundBuffers[a] = null;
                    var d = new SoundLoader(this._soundSources[a]);
                    d.index = a;
                    d.addEventListener(LoaderEvent.COMPLETE, c, this);
                    d.addEventListener(LoaderEvent.ERROR, b, this);
                    d.load()
                }
            },
            loadAll: function() 
            {
                for (var a = this._soundSources.length, b = 0; b < a; b++) this.load(b)
            },
            areSoundsLoaded: function() 
            {
                for (var a = this._soundSources.length, b = 0; b < a; b++)
                    if (!this._soundBuffers[b]) return !1;
                return !0
            },
            getSoundLength: function(a) 
            {
                return a && this._context && this._sounds[a] && this._soundBuffers[this._sounds[a].soundIndex] ?
                    (a = this._sounds[a]) && this._soundBuffers[a.soundIndex] ? a.duration : -1 : -1
            },
            play: function(a, b, c) 
            {
                if (!(a && this._context && this._sounds[a] && this._soundBuffers[this._sounds[a].soundIndex])) return c && !b && setTimeout(function() {
                    c()
                }, 0), null;
                var e = this._sounds[a];
                console.log("Play " + a);
                a = this._context.createBufferSource();
                a.buffer = this._soundBuffers[e.soundIndex];
                a.volume = this._context.createGainNode();
                a.connect(a.volume);
                a.volume.connect(this._masterGain);
                if (c && !b) {
                    var h = setTimeout(function() {
                        c()
                    }, 1E3 * e.duration);
                    a.soundEndTimer = h
                }
                b && (a.loop = b, a.loopStart = e.start, a.loopEnd = e.start + e.duration);
                a.noteGrainOn || (a.noteGrainOn = a.start);
                b && Device.isChrome && Device.isAndroid ? a.noteGrainOn(0, e.start) : a.noteGrainOn(0, e.start, e.duration);
                return a
            },
            stop: function(a) 
            {
                if (!a) return null;
                a.soundEndTimer && clearTimeout(a.soundEndTimer);
                try {
                    a.stop(0)
                } catch (b) {}
                return null
            },
            toggleMute: function() 
            {
                this._context && (this._mute = !this._mute, this._masterGain.gain.value = this._mute ? 0 : 1)
            },
            isMuted: function() 
            {
                return this._mute
            }
        }
    }
    ()
);

Ошибок в консоли нет, но сообщения тоже нет, подскажите почему в сафари скрипт не срабатывает.

UPD Народ разобраться самому не получается, подскажите...

READ ALSO
Как сохранить полученные данные из JSON

Как сохранить полученные данные из JSON

Имеется код, который получает json при помощи XMLHttpRequestПолученные данные сохраняются в переменную loadedData при вызове соответствующего слушателя

158
regExp js не работает

regExp js не работает

Почему не работает данное регулярное выражение в js скрипте ???

193
Отладка JS в браузере

Отладка JS в браузере

Есть у меня HTML страница, к которой подключен js-код как внутренний, так и внешний

179
Как найти первый символ массива? [закрыт]

Как найти первый символ массива? [закрыт]

Как найти первый символ массива?

178