2015-12-01 2 views
1

Я работаю над устаревшей кодовой базой, которая представляет собой приложение jquery, работающее с обложкой версии pacman. Фоновый звук работает отлично, но звуковые эффекты этого не делают. Я подозреваю, что есть специальное разрешение на использование в config.xml, но оно не было успешным.Html5 audio не воспроизводится в приложении Cordova

Может ли кто-нибудь указать, почему ios не будет воспроизводить звуковые эффекты, даже если аудиофайлы загружаются из одного каталога? Пожалуйста, дайте мне знать, какие другие части кода могут быть полезны.

спасибо.

Вот config.xml:

<?xml version='1.0' encoding='utf-8'?> 
<widget id="de.grammatidis.battle" version="1.0.2" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0"> 
    <name>Battle</name> 
    <description>Vorsicht, die rasenden Beißerchen haben es auf dich abgesehen! Flüchte so schnell du kannst mit dem Grammatidis-Männchen vor den wilden Zahngeistern und sammle dabei Punkte! 
    </description> 
    <author email="[email protected]" href="http://www.biloba-it.de"> 
     Biloba IT 
    </author> 
    <content src="index.html" /> 
    <plugin name="cordova-plugin-whitelist" spec="1" /> 
    <access origin="*" /> 
    <allow-intent href="http://*/*" /> 
    <allow-intent href="https://*/*" /> 
    <allow-intent href="tel:*" /> 
    <allow-intent href="sms:*" /> 
    <allow-intent href="mailto:*" /> 
    <allow-intent href="geo:*" /> 
    <platform name="android"> 
     <allow-intent href="market:*" /> 
    </platform> 
    <platform name="ios"> 
     <allow-intent href="itms:*" /> 
     <allow-intent href="itms-apps:*" /> 
    </platform> 
    <plugin name="cordova-plugin-device" spec="~1.1.0" /> 
    <plugin name="cordova-plugin-inappbrowser" spec="~1.1.0" /> 
    <plugin name="cordova-plugin-media" spec="~1.0.1" /> 
    <plugin name="cordova-plugin-network-information" spec="~1.1.0" /> 
</widget> 

Вот что audio.js

var Sound = function(game) { 
    this.files   = {}; 
    this.loaded   = {}; 
    this.paths   = {}; 
    this.loop   = {}; 
    this.playing  = []; 
    this.stopped  = []; 
    this.playingIndex = {}; 
    this.game = game; 
    this.volume = 1; 
    this.disabled = game.getSetting("soundDisabled") == "true" ? true : false; 
    this.multiple = ["snd_eat","snd_eatghost"]; 
    this.backgroundSounds = ["original","elektro","dance","rock","pop","kids"]; 
    this.interval  = {}; 
}; 

Sound.prototype.load = function(name, path, realload, callback) { 
    console.log('Sound.prototype.load'); 
    var _self = this; 

    //save the path 
    this.paths[name] = path; 

    if(_self.loaded[name] == true) { 
     if(callback) callback(); 
    } else { 
     if(realload) { 
      //load the audio file 
      _self.files[name] = new Media(path, 
       function(){}, 
       function(){}, 
       function(status){ 
        //check if done 
        if(status == 4 && _self.stopped.indexOf(name) == -1) { 
         if(_self.loop[name] == true) { 
          _self.files[name].play(); 
         } else { 
          var i = _self.playing.indexOf(name); 
          if(i != -1) { 
           _self.playing.slice(i,1); 
          } 
         } 
        } 
       }); 

      //set the loaded flag 
      _self.loaded[name] = true; 
      if(callback) callback(); 

     } else {    
      _self.loaded[name] = false; 
      if(callback) callback(); 
     } 
    } 
}; 

Sound.prototype.toggleSound = function() { 
    console.log('Sound.prototype.toggleSound'); 

    if(this.disabled) { 
     this.enableSound(); 
    } else { 
     this.disableSound(); 
    } 
}; 

Sound.prototype.enableSound = function() { 
    console.log('Sound.prototype.enableSound'); 

    this.disabled = false; 
    this.game.saveSettings("soundDisabled", "false"); 
    if(this.game.getSetting("music") == "original") { 
     this.play(this.game.getSetting("music"), false, 0.2); 
    } else { 
     this.play(this.game.getSetting("music"), true, 0.2); 
    } 
}; 

Sound.prototype.disableSound = function(callback) { 
    console.log('Sound.prototype.disableSound'); 

    var _self = this; 
    this.disabled = true; 
    this.game.saveSettings("soundDisabled", "true"); 

    for (var i = 0; i < this.playing.length; i++) { 
     _self.stop(this.playing[i]); 
    } 
    this.playing = []; 
    if(callback) callback(); 
}; 

Sound.prototype.isDisabled = function() { 
    return this.disabled; 
}; 

Sound.prototype.isLoaded = function(name) { 
    console.log('Sound.prototype.isLoaded'); 

    var _self = this; 

    var i = _self.playingIndex[name]; 
    if(i === undefined || i == null) i = 1; 
    _self.playingIndex[name] = i; 

    return (_self.loaded[name] == true) || (_self.multiple.indexOf(name) != -1 && _self.loaded[name + "_" + i] == true); 
}; 

Sound.prototype.play = function(name, loop, volume, callback) { 
    console.log('Sound.prototype.play'); 

    var _self = this; 

    function doPlay() { 
     //remove from the stopped list 
     var i = _self.stopped.indexOf(name); 
     if(i != -1) { 
      _self.stopped.slice(i,1); 
     } 

     //add to the playing list 
     if(_self.playing.indexOf(name) == -1) _self.playing.push(name); 

     //check if the sound can be played multiple times 
     if(_self.multiple.indexOf(name) != -1) { 
      var i = _self.playingIndex[name]; 
      if(i === undefined || i == null) i = 1; 
      i++; 
      if(i > 5) i = 1; 
      _self.playingIndex[name] = i; 
      name = name + "_" + i; 
     } 

     //set the volumen 
     if(volume !== undefined) { 
      _self.files[name].setVolume(volume); 
     } else { 
      _self.files[name].setVolume(_self.volume); 
     } 

     _self.files[name].play(); 
     _self.loop[name] = loop; 

     if(loop) { 
      var duration = _self.files[name].getDuration(); 
      if(duration != -1) { 
       _self.interval[name] = setInterval(function(){ 
        _self.files[name].play(); 
       }, (duration+10) * 1000); 
      } 
     } 
    } 

    var blnPlay = true; 
    if(Platform.isApp() && this.isBackgroundSound(name) == false) blnPlay = false; 

    if(this.disabled == false && blnPlay == true) { 
     if(_self.isLoaded(name)) { 
      doPlay(); 
      if(callback) callback(); 
     } else { 
      _self.load(name, _self.paths[name], true, function(){ 
       doPlay(); 
       if(callback) callback(); 
      }); 
     } 
    } else { 
     if(callback) callback(); 
    } 
}; 

Sound.prototype.stop = function(name) { 
    console.log('Sound.prototype.stop'); 

    if(this.files[name] !== undefined) { 
     this.stopped.push(name); 
     if(this.interval[name] !== undefined){ 
      clearInterval(this.interval[name]); 
     } 
     this.files[name].stop(); 
    } 
}; 

Sound.prototype.pause = function() { 
    console.log('Sound.prototype.pause'); 

    for (var i = 0; i < playing.length; i++) { 
     this.files[playing[i]].pause(); 
    } 
}; 

Sound.prototype.resume = function() { 
    console.log('Sound.prototype.resume'); 

    for (var i = 0; i < playing.length; i++) { 
     this.files[playing[i]].play(); 
    }   
}; 

Sound.prototype.isBackgroundSound = function(snd) { 
    console.log('Sound.prototype.isBackgroundSound'); 

    return (this.backgroundSounds.indexOf(snd) != -1); 
}; 
+0

Код, в котором вы на самом деле пытаетесь воспроизвести аудио, будет полезен ... Существует несколько способов воспроизведения аудио в Кордове. Аудио тег, плагин для мультимедиа, другие плагины и т. Д. Какой метод вы используете для воспроизведения звука? Также, какую версию Кордовы вы используете? У вас есть установка CSP в index.html? –

+0

Cheers Brad, кодовая база довольно запутанная, но я вставлю audio.js выше. Похоже, что он использует функции из плагина Media. Не похоже, что CSP установлен в индексе. Получил звук, используя собственные вызовы javascript, но это не оптимально. – irth

ответ

1

То есть много кода. По моему опыту медиа-штекер определенно очень утончен (и глючит). Я использую его много. Вы можете убедиться, что вы можете загружать и воспроизводить один файл, просто запустив простой пример, как это:

var player = new Media(path, 
    function playSuccess() { 
     console.log("success"); 
     player.release(); 
    }, 
    function playError(err) { 
     console.log("uh oh: " + err.code); 
    }); 
player.play(); 

Я заметил, что вы не освободив ресурсы, которые могут быть проблемой с длинной запущенной игрой.

Вы пытаетесь воспроизвести/закодировать звуки, обнаружив остановку в статусной функции? Я думаю, что вы можете сделать это из функции успеха, снова вызвав игру (возможно, завернутый в setTimeout (xx.play, 0)). Раньше я не пробовал вызывать игру из этих обратных вызовов.

+0

Привет, спасибо Brad .. новая функция Media() работает, как и новый Audio(). похоже, что разница в том, что Media имеет обратный вызов. Я буду играть с тем, как остановить звук. Вероятно, все звуки на корневой области, чтобы правильный вызов функции мог воспроизводить/приостанавливать звуки. Спасибо за помощь! – irth

Смежные вопросы