Skip to content

Commit

Permalink
Replace cc.loader with pipeline loader
Browse files Browse the repository at this point in the history
  • Loading branch information
pandamicro committed Feb 25, 2016
1 parent 42515d5 commit 0ea9922
Show file tree
Hide file tree
Showing 24 changed files with 51 additions and 1,312 deletions.
8 changes: 4 additions & 4 deletions CCBoot.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,8 @@ cc.formatStr = function(){
};

require('../cocos2d/core/utils');
require('../cocos2d/core/platform/CCLoader');
require('../cocos2d/core/platform/CCSys');
require('../cocos2d/core/load-pipeline/CCLoader');

require('../cocos2d/core/CCGame');

Expand Down Expand Up @@ -276,7 +276,7 @@ function _load(config) {
} else {
// Load cocos modules
var ccModulesPath = cc.path.join(engineDir, "moduleConfig.json");
loader.loadJson(ccModulesPath, function (err, modulesJson) {
loader.load(ccModulesPath, function (err, modulesJson) {
if (err) throw new Error(err);
var modules = config["modules"] || [];
var moduleMap = modulesJson["module"];
Expand All @@ -287,8 +287,8 @@ function _load(config) {
var arr = _getJsListOfModule(moduleMap, modules[i], engineDir);
if (arr) jsList = jsList.concat(arr);
}
cc.loader.loadJsWithImg(jsList, function (err) {
if (err) throw err;
loader.load(jsList, function (err) {
if (err) throw new Error(JSON.stringify(err));
_afterEngineLoaded(config);
});
});
Expand Down
303 changes: 5 additions & 298 deletions cocos2d/audio/CCAudio.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,114 +26,6 @@

var JS = require('../core/platform/js');

/**
* Audio support in the browser
*
* MULTI_CHANNEL : Multiple audio while playing - If it doesn't, you can only play background music
* WEB_AUDIO : Support for WebAudio - Support W3C WebAudio standards, all of the audio can be played
* AUTOPLAY : Supports auto-play audio - if Don‘t support it, On a touch detecting background music canvas, and then replay
* REPLAY_AFTER_TOUCH : The first music will fail, must be replay after touchstart
* USE_EMPTIED_EVENT : Whether to use the emptied event to replace load callback
* DELAY_CREATE_CTX : delay created the context object - only webAudio
* NEED_MANUAL_LOOP : WebAudio loop attribute failure, need to manually perform loop
*
* May be modifications for a few browser version
*/
var __audioSupport;
(function(){

var DEBUG = false;

var sys = cc.sys;
var version = sys.browserVersion;

var supportTable = {
"common" : {MULTI_CHANNEL: true , WEB_AUDIO: supportWebAudio , AUTOPLAY: true }
};

// check if browser supports Web Audio
// check Web Audio's context
var supportWebAudio = !!(window.AudioContext || window.webkitAudioContext || window.mozAudioContext);

supportTable[sys.BROWSER_TYPE_IE] = {MULTI_CHANNEL: true , WEB_AUDIO: supportWebAudio , AUTOPLAY: true, USE_EMPTIED_EVENT: true};
// ANDROID //
supportTable[sys.BROWSER_TYPE_ANDROID] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false};
supportTable[sys.BROWSER_TYPE_CHROME] = {MULTI_CHANNEL: true , WEB_AUDIO: true , AUTOPLAY: false};
supportTable[sys.BROWSER_TYPE_FIREFOX] = {MULTI_CHANNEL: true , WEB_AUDIO: true , AUTOPLAY: true , DELAY_CREATE_CTX: true};
supportTable[sys.BROWSER_TYPE_UC] = {MULTI_CHANNEL: true , WEB_AUDIO: false, AUTOPLAY: false};
supportTable[sys.BROWSER_TYPE_QQ] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: true };
supportTable[sys.BROWSER_TYPE_OUPENG] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false, REPLAY_AFTER_TOUCH: true , USE_EMPTIED_EVENT: true };
supportTable[sys.BROWSER_TYPE_WECHAT] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false, REPLAY_AFTER_TOUCH: true , USE_EMPTIED_EVENT: true };
supportTable[sys.BROWSER_TYPE_360] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: true };
supportTable[sys.BROWSER_TYPE_MIUI] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: true };
supportTable[sys.BROWSER_TYPE_LIEBAO] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false, REPLAY_AFTER_TOUCH: true , USE_EMPTIED_EVENT: true };
supportTable[sys.BROWSER_TYPE_SOUGOU] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false, REPLAY_AFTER_TOUCH: true , USE_EMPTIED_EVENT: true };
//"Baidu" browser can automatically play
//But because it may be play failed, so need to replay and auto
supportTable[sys.BROWSER_TYPE_BAIDU] = {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false, REPLAY_AFTER_TOUCH: true , USE_EMPTIED_EVENT: true };
supportTable[sys.BROWSER_TYPE_BAIDU_APP]= {MULTI_CHANNEL: false, WEB_AUDIO: false, AUTOPLAY: false, REPLAY_AFTER_TOUCH: true , USE_EMPTIED_EVENT: true };

// APPLE //
supportTable[sys.BROWSER_TYPE_SAFARI] = {MULTI_CHANNEL: true , WEB_AUDIO: true , AUTOPLAY: false, webAudioCallback: function(realUrl){
document.createElement("audio").src = realUrl;
}};

if(cc.sys.isMobile){
if(cc.sys.os !== cc.sys.OS_IOS)
__audioSupport = supportTable[sys.browserType] || supportTable["common"];
else
__audioSupport = supportTable[sys.BROWSER_TYPE_SAFARI];
}else{
switch(sys.browserType){
case sys.BROWSER_TYPE_IE:
__audioSupport = supportTable[sys.BROWSER_TYPE_IE];
break;
case sys.BROWSER_TYPE_FIREFOX:
__audioSupport = supportTable[sys.BROWSER_TYPE_FIREFOX];
break;
default:
__audioSupport = supportTable["common"];
}
}

///////////////////////////
// Browser compatibility//
///////////////////////////
if(version){
switch(sys.browserType){
case sys.BROWSER_TYPE_CHROME:
version = parseInt(version);
if(version < 30){
__audioSupport = {MULTI_CHANNEL: false , WEB_AUDIO: true , AUTOPLAY: false};
}else if(version === 42){
__audioSupport.NEED_MANUAL_LOOP = true;
}
break;
case sys.BROWSER_TYPE_MIUI:
if(cc.sys.isMobile){
version = version.match(/\d+/g);
if(version[0] < 2 || (version[0] === 2 && version[1] === 0 && version[2] <= 1)){
__audioSupport.AUTOPLAY = false;
}
}
break;
}
}

if(DEBUG){
setTimeout(function(){
cc.log("browse type: " + sys.browserType);
cc.log("browse version: " + version);
cc.log("MULTI_CHANNEL: " + __audioSupport.MULTI_CHANNEL);
cc.log("WEB_AUDIO: " + __audioSupport.WEB_AUDIO);
cc.log("AUTOPLAY: " + __audioSupport.AUTOPLAY);
}, 0);
}

window.__audioSupport = __audioSupport;

})();

/**
* Encapsulate DOM and webAudio
*/
Expand Down Expand Up @@ -445,190 +337,6 @@ JS.mixin(cc.Audio.prototype, {
SWB = polyfill.MULTI_CHANNEL,
SWC = polyfill.AUTOPLAY;

var support = [];

(function(){
var audio = document.createElement("audio");
if(audio.canPlayType) {
var ogg = audio.canPlayType('audio/ogg; codecs="vorbis"');
if (ogg && ogg !== "") support.push(".ogg");
var mp3 = audio.canPlayType("audio/mpeg");
if (mp3 && mp3 !== "") support.push(".mp3");
var wav = audio.canPlayType('audio/wav; codecs="1"');
if (wav && wav !== "") support.push(".wav");
var mp4 = audio.canPlayType("audio/mp4");
if (mp4 && mp4 !== "") support.push(".mp4");
var m4a = audio.canPlayType("audio/x-m4a");
if (m4a && m4a !== "") support.push(".m4a");
}
})();
try{
if(SWA){
var context = new (window.AudioContext || window.webkitAudioContext || window.mozAudioContext)();
if(polyfill.DELAY_CREATE_CTX)
setTimeout(function(){ context = new (window.AudioContext || window.webkitAudioContext || window.mozAudioContext)(); }, 0);
}
}catch(error){
SWA = false;
cc.log("browser don't support web audio");
}

var loader = {

cache: {},

load: function(realUrl, url, res, cb){

if(support.length === 0)
return cb("can not support audio!");

var i;

if(cc.loader.audioPath)
realUrl = cc.path.join(cc.loader.audioPath, realUrl);

var extname = cc.path.extname(realUrl);

var typeList = [extname];
for(i=0; i<support.length; i++){
if(extname !== support[i]){
typeList.push(support[i]);
}
}

var audio;

if(loader.cache[url])
return cb(null, loader.cache[url]);

if(SWA){
try{
var volume = context["createGain"]();
volume["gain"].value = 1;
volume["connect"](context["destination"]);
audio = new cc.Audio(context, volume, realUrl);
if(polyfill.NEED_MANUAL_LOOP)
audio._manualLoop = true;
}catch(err){
SWA = false;
cc.log("browser don't support web audio");
audio = new cc.Audio(null, null, realUrl);
}
}else{
audio = new cc.Audio(null, null, realUrl);
}

this.loadAudioFromExtList(realUrl, typeList, audio, cb);

loader.cache[url] = audio;

},

loadAudioFromExtList: function(realUrl, typeList, audio, cb){

if(typeList.length === 0){
var ERRSTR = "can not found the resource of audio! Last match url is : ";
ERRSTR += realUrl.replace(/\.(.*)?$/, "(");
support.forEach(function(ext){
ERRSTR += ext + "|";
});
ERRSTR = ERRSTR.replace(/\|$/, ")");
return cb({status:520, errorMessage:ERRSTR}, null);
}

realUrl = cc.path.changeExtname(realUrl, typeList.splice(0, 1));

if(SWA){//Buffer
if(polyfill.webAudioCallback)
polyfill.webAudioCallback(realUrl);
var request = new XMLHttpRequest();
request.open("GET", realUrl, true);
request.responseType = "arraybuffer";

// Our asynchronous callback
request.onload = function () {
context["decodeAudioData"](request.response, function(buffer){
//success
audio.setBuffer(buffer);
cb(null, audio);
}, function(){
//error
loader.loadAudioFromExtList(realUrl, typeList, audio, cb);
});
};

request.onerror = function(){
cb({status:520, errorMessage:ERRSTR}, null);
};

request.send();
}else{//DOM

var element = document.createElement("audio");
var cbCheck = false;
var termination = false;

var timer = setTimeout(function(){
if(element.readyState === 0){
emptied();
}else{
termination = true;
element.pause();
document.body.removeChild(element);
cb("audio load timeout : " + realUrl, audio);
}
}, 10000);

var success = function(){
if(!cbCheck){
//element.pause();
try { element.currentTime = 0;
element.volume = 1; } catch (e) {}
document.body.removeChild(element);
audio.setElement(element);
element.removeEventListener("canplaythrough", success, false);
element.removeEventListener("error", failure, false);
element.removeEventListener("emptied", emptied, false);
!termination && cb(null, audio);
cbCheck = true;
clearTimeout(timer);
}
};

var failure = function(){
if(!cbCheck) return;
//element.pause();
document.body.removeChild(element);
element.removeEventListener("canplaythrough", success, false);
element.removeEventListener("error", failure, false);
element.removeEventListener("emptied", emptied, false);
!termination && loader.loadAudioFromExtList(realUrl, typeList, audio, cb);
cbCheck = true;
clearTimeout(timer);
};

var emptied = function(){
termination = true;
success();
cb(null, audio);
};

element.addEventListener("canplaythrough", success, false);
element.addEventListener("error", failure, false);
if(polyfill.USE_EMPTIED_EVENT)
element.addEventListener("emptied", emptied, false);

element.src = realUrl;
document.body.appendChild(element);
element.volume = 0;
//some browsers cannot pause(qq 6.1)
//element.play();
}

}
};
cc.loader.register(["mp3", "ogg", "wav", "mp4", "m4a"], loader);

/**
* cc.audioEngine is the singleton object, it provide simple audio APIs.
* @class audioEngine
Expand Down Expand Up @@ -661,10 +369,10 @@ JS.mixin(cc.Audio.prototype, {
if(bgMusic && bgMusic.src !== url && bgMusic.getPlaying()){
bgMusic.stop();
}
var audio = loader.cache[url];
var audio = cc.loader.getRes(url);
if(!audio){
cc.loader.load(url);
audio = loader.cache[url];
audio = cc.loader.getRes(url);
}
audio.play(0, loop);
audio.setVolume(this._musicVolume);
Expand Down Expand Up @@ -826,10 +534,10 @@ JS.mixin(cc.Audio.prototype, {
}else if(!SWA && i > this._maxAudioInstance){
cc.log("Error: %s greater than %d", url, this._maxAudioInstance);
}else{
var audio = loader.cache[url];
var audio = cc.loader.getRes(url);
if(!audio){
cc.loader.load(url);
audio = loader.cache[url];
audio = cc.loader.getRes(url);
}
audio = audio.cloneNode();
audio.setVolume(this._effectVolume);
Expand Down Expand Up @@ -988,7 +696,6 @@ JS.mixin(cc.Audio.prototype, {
var pool = this._audioPool[url];
if(pool) pool.length = 0;
delete this._audioPool[url];
delete loader.cache[url];
},

/**
Expand Down Expand Up @@ -1056,4 +763,4 @@ JS.mixin(cc.Audio.prototype, {
}, 150);
}

})(__audioSupport);
})(cc.sys.__audioSupport);
4 changes: 2 additions & 2 deletions cocos2d/core/CCGame.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,8 +260,8 @@ var game = /** @lends cc.game# */{
// Load game scripts
var jsList = config[CONFIG_KEY.jsList];
if (jsList) {
cc.loader.loadJsWithImg(jsList, function (err) {
if (err) throw new Error(err);
cc.loader.load(jsList, function (err) {
if (err) throw new Error(JSON.stringify(err));
self._prepared = true;
if (cb) cb();
});
Expand Down
Loading

0 comments on commit 0ea9922

Please sign in to comment.