From 486d19a050444ad4d5277fa65a3da437f778ff0f Mon Sep 17 00:00:00 2001 From: itozyun Date: Thu, 29 Oct 2015 14:38:02 +0900 Subject: [PATCH] Version 0.6.185, fix X.AudioSprite & X_Node_onKill. --- 0.6.x/js/01_core/13_XClass.js | 2 +- 0.6.x/js/02_dom/04_XBoxModel.js | 4 +- 0.6.x/js/02_dom/06_XNodeCSS.js | 2 +- 0.6.x/js/02_dom/20_XNode.js | 23 +++++++---- 0.6.x/js/07_audio/01_XWebAudio.js | 10 +++-- 0.6.x/js/07_audio/02_XHTMLAudio.js | 48 ++++++++++++---------- 0.6.x/js/07_audio/10_XAudioSprite.js | 78 +++++++++++++++++++++--------------- 7 files changed, 98 insertions(+), 69 deletions(-) diff --git a/0.6.x/js/01_core/13_XClass.js b/0.6.x/js/01_core/13_XClass.js index f5cdc03..bf86574 100644 --- a/0.6.x/js/01_core/13_XClass.js +++ b/0.6.x/js/01_core/13_XClass.js @@ -581,7 +581,7 @@ function X_Class_actualConstructor( f, args ){ X_Class_useObjectCreate ? Object.create( klass.prototype ) : new klass( X_Closure_COMMAND_DROP ); - + def.live && def.live.push( instance ); if( ( X_UA[ 'AOSP' ] < 3 || X_UA[ 'iOS' ] < 5 ) && instance.constructor !== klass ){ diff --git a/0.6.x/js/02_dom/04_XBoxModel.js b/0.6.x/js/02_dom/04_XBoxModel.js index 37391ce..ad62c8d 100644 --- a/0.6.x/js/02_dom/04_XBoxModel.js +++ b/0.6.x/js/02_dom/04_XBoxModel.js @@ -65,7 +65,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_INIT, function(){ function X_Node_BoxModel_mesure( that, name ){ var flags = that[ '_flags' ], elm; - if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return 0; + if( ( ( flags & X_NodeFlags_IN_TREE ) === 0 ) || ( flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); @@ -223,7 +223,7 @@ function X_Node_offset( xnode ){ offset = { x : 0, y : 0 }, obj, parent, elm; - if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return offset; + if( ( ( flags & X_NodeFlags_IN_TREE ) === 0 ) || ( flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) ) return offset; if( X_Node_body === this || X_Node_html === this ) return offset; diff --git a/0.6.x/js/02_dom/06_XNodeCSS.js b/0.6.x/js/02_dom/06_XNodeCSS.js index a74eb98..4938a3a 100644 --- a/0.6.x/js/02_dom/06_XNodeCSS.js +++ b/0.6.x/js/02_dom/06_XNodeCSS.js @@ -639,7 +639,7 @@ function X_Node_CSS_setStyle( css, flags, name, newValue ){ function X_Node_cssText( v ){ var obj, i, l, attr, name; - if( v === this[ '_cssText' ] && ( this[ '_flags' ] & X_NodeFlags_OLD_CSSTEXT ) === 0 ){ + if( v === this[ '_cssText' ] && ( ( this[ '_flags' ] & X_NodeFlags_OLD_CSSTEXT ) === 0 ) ){ return this; }; diff --git a/0.6.x/js/02_dom/20_XNode.js b/0.6.x/js/02_dom/20_XNode.js index c303b3d..ca28821 100644 --- a/0.6.x/js/02_dom/20_XNode.js +++ b/0.6.x/js/02_dom/20_XNode.js @@ -9,7 +9,6 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( 'X.Node', X_Class.POOL_OBJECT, - { /** * 要素に振られるユニークID @@ -768,10 +767,11 @@ function X_Node_swap( v ){ }; /** - * 要素を抜く。 + * 要素を親要素から抜く。jQuery の remove と異なり、インスタンスは破壊(kill)されず、再び別の親に挿入等できる * @alias Node.prototype.remove * @return {Node} 自身。チェインメソッド * @example node.remove(); + * parent.append( node ); 新しい親に追加できる */ function X_Node_remove(){ var parent = this.parent, @@ -821,7 +821,9 @@ function X_Node_remove(){ */ function X_Node_empty(){ var xnodes = this[ '_xnodes' ], i; + if( xnodes && ( i = xnodes.length ) ){ + delete this[ '_xnodes' ]; for( ; i; ){ xnodes[ --i ][ 'kill' ](); }; @@ -836,18 +838,20 @@ function X_Node_onKill( that ){ if( ( that[ '_flags' ] & X_NodeFlags_EXIST ) === 0 ) return; - parent && parent[ '_xnodes' ].splice( parent[ '_xnodes' ].indexOf( that ), 1 ); + parent && parent[ '_xnodes' ] && parent[ '_xnodes' ].splice( parent[ '_xnodes' ].indexOf( that ), 1 ); elm = that[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( that ); - // elm && that[ '_listeners' ] && X_EventDispatcher_unlistenAll( that ); // イベントの退避 if( xnodes && ( i = xnodes.length ) ){ + delete that[ '_xnodes' ]; for( ; i; ){ xnodes[ --i ][ 'kill' ](); }; + xnodes.length = 0; }; - delete X_Node_CHASHE[ that[ '_uid' ] ]; + X_Node_CHASHE[ that[ '_uid' ] ] = null; // array に対して delete X_Node_CHASHE[ uid ] はまずい! + // remove _xnodes if( X_UA_DOM.IE4 ){ if( elm ){ @@ -860,7 +864,7 @@ function X_Node_onKill( that ){ } else { if( elm && elm.parentNode && elm.parentNode.tagName ){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = elm; - X_Node_reserveUpdate(); + X_Node_reserveUpdate(); }; }; }; @@ -1095,7 +1099,12 @@ function X_Node_html( html ){ // setter if( html !== undefined ){ // String 以外に Number や false null なども許可 if( !this[ '_tag' ] ) return this[ 'text' ]( html ); - return html ? this[ 'empty' ]()[ 'append' ].apply( this, X_HtmlParser_parse( html, true ) ) : this[ 'empty' ](); + + this[ 'empty' ](); + if( html ){ + X_Node_append.apply( this, X_HtmlParser_parse( html, true ) ); + }; + return this; }; // getter diff --git a/0.6.x/js/07_audio/01_XWebAudio.js b/0.6.x/js/07_audio/01_XWebAudio.js index e33630b..c29e0a4 100644 --- a/0.6.x/js/07_audio/01_XWebAudio.js +++ b/0.6.x/js/07_audio/01_XWebAudio.js @@ -82,6 +82,9 @@ var X_WebAudio_context = // 4s 以下ではない iPad 2G または iPad mi !X_UA[ 'iPhone_4s' ] && !X_UA[ 'iPad_2Mini1' ] && !X_UA[ 'iPod_4' ] && // Android2 + Gecko で WebAudio が極めて不安定 !( X_UA[ 'Fennec' ] && X_UA[ 'Android' ] < 3 ) && + // AOSP でも WebAudio を不完全に実装するものがある + !X_UA[ 'AOSP' ] && !( X_UA[ 'ChromeWV' ] < 5 ) && + !X_UA[ 'Blink' ] && // Firefox40.0.5 + Windows8 で音声が途中から鳴らなくなる // Firefox41.0.1 + Windows8 で音声が途中から鳴らなくなる !( 40 <= X_UA[ 'Gecko' ] && X_UA[ 'Gecko' ] < 42 && X_UA[ 'Windows' ] ) && @@ -196,7 +199,7 @@ if( X_WebAudio_context ){ i = list.indexOf( webAudio ); if( 0 < i ){ list.splice( i, 1 ); - if( list.length ){ + if( !list.length ){ this.xhr && this.xhr[ 'kill' ](); this[ 'kill' ](); }; @@ -300,9 +303,7 @@ if( X_WebAudio_context ){ this.audioBuffer = buffer; this.duration = buffer.duration * 1000; - this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY ); - - console.log( 'WebAudio buffer ready' ); + this.disatcher[ 'asyncDispatch' ]( X_WebAudio_touchState ? X_EVENT_MEDIA_TOUCH_FOR_LOAD : X_EVENT_READY ); }, actualPlay : function(){ @@ -321,6 +322,7 @@ if( X_WebAudio_context ){ // alert( 'タッチイベント以外での play! ' + ( e ? e.type : '' ) ); return; }; + this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY ); }; X_WebAudio_touchState = false; diff --git a/0.6.x/js/07_audio/02_XHTMLAudio.js b/0.6.x/js/07_audio/02_XHTMLAudio.js index 786f343..30b2794 100644 --- a/0.6.x/js/07_audio/02_XHTMLAudio.js +++ b/0.6.x/js/07_audio/02_XHTMLAudio.js @@ -65,11 +65,12 @@ var X_HTMLAudio_pauseFix = 12 <= X_UA[ 'Opera' ] && 0 < ' XP XPSP2 2003|XP64'.indexOf( X_UA[ 'Windows' ] ), // XP + Opera12 のみ? X_HTMLAudio_need1stTouch = X_UA[ 'iOS' ] || 4.2 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ] || X_UA[ 'WinPhone' ] || ( X_UA[ 'Blink' ] && X_UA[ 'Android' ] ), - + X_HTMLAudio_playTrigger = ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) ? 'canplay' : X_UA[ 'iOS' ] ? 'suspend' : X_UA[ 'Blink' ] ? 'stalled' : 'canplaythrough', - - X_HTMLAudio_durationFix = X_UA[ 'iOS' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) || ( X_UA[ 'Windows' ] && 12 <= X_UA[ 'Opera' ] ), - + + X_HTMLAudio_durationFix = X_UA[ 'iOS' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) || + ( X_UA[ 'Windows' ] && 12 <= X_UA[ 'Opera' ] ) || ( X_UA[ 'Blink' ] && X_UA[ 'Android' ] ), + X_HTMLAudio_shortPlayFix = X_UA[ 'AOSP' ]; // Android 4.1.1 でも遭遇 if( X_Audio_constructor ){ @@ -78,8 +79,6 @@ if( X_Audio_constructor ){ 'X.HTMLAudio', X_Class.POOL_OBJECT, { - _closed : true, - // 1: canplaythrought|timeupdateに達している、またはdurationFixが終了している // 2: READY イベント発火済 _readyState : 0, @@ -111,7 +110,6 @@ if( X_Audio_constructor ){ var raw; this.disatcher = disatcher || this; - this._closed = false; this._src = source; if( X_HTMLAudio_shortPlayFix ){ @@ -192,14 +190,13 @@ if( X_Audio_constructor ){ ready, eventType, duration, end, now; - if( this._closed ) return; + if( !raw ) return; //e.type !== 'timeupdate' && console.log( ' > ' + e.type ); switch( e.type ){ case X_EVENT_KILL_INSTANCE : - delete this._closed; this.playing && this.actualPause(); // 【javascript】モバイル向けブラウザでも音を鳴らしたい【WebAudio】 @@ -233,7 +230,7 @@ if( X_Audio_constructor ){ this._readyState |= 1; }; case 'canplay' : // 今すぐに再生を再開できるが、バッファリングが不十分でコンテンツを最後まで表示できないと予測している場合に発生 - if( this._durationFixPhase === 1 && !X_HTMLAudio_need1stTouch ){ + if( this._durationFixPhase === 1 && !X_HTMLAudio_need1stTouch ){ // PC Opera12 用 durationFix this._durationFixPhase = 2; this.actualPlay(); raw.currentTime = 0; // Win8 + Opera12 で必要 @@ -324,7 +321,8 @@ if( X_Audio_constructor ){ }; // duration は Infinity, NaN, 0 の場合があるため、これを除外する - if( 0 < duration && X_Type_isFinite( duration ) ){ + // chrome18 for Android は duration = 100 の間はシークができない? 28 は可能 + if( 0 < duration && X_Type_isFinite( duration ) && duration !== 100 ){ this.duration = duration * 1000; if( this._durationFixPhase === 4 ){ @@ -333,7 +331,6 @@ if( X_Audio_constructor ){ if( this.autoplay || this._playReserved ){ console.log( '☆ 再生 <- DurationFix の終了' ); - delete this._playReserved; this.actualPlay(); } else if( X_HTMLAudio_pauseFix ){ @@ -367,7 +364,7 @@ if( X_Audio_constructor ){ }; } else if( this._readyState === 1 && this.duration ){ - this._readyState = 3; + this._readyState = 2; this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY ); console.log( '> Audio Loaded!! ' + e.type + ' d:' + ( this.duration | 0 ) ); } else @@ -380,13 +377,20 @@ if( X_Audio_constructor ){ var raw = this[ '_rawObject' ], e, begin, end; - if( this._closed ) return; + if( !raw ) return; - if( !raw.src ){ // X_HTMLAudio_pauseFix によって src が空になっている - console.log( '○ 削除された audio.src の復帰' ); - raw.src = this._src; - return; - }; + this._playReserved = true; + + if( X_HTMLAudio_pauseFix ){ + if( !raw.src ){ // X_HTMLAudio_pauseFix によって src が空になっている + console.log( '○ 削除された audio.src の復帰' ); + raw.src = this._src; + return; + }; + if( this._durationFixPhase < 2 ){ + return; + }; + }; if( this._touchState === 2 ){ e = X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length - 1 ]; @@ -396,11 +400,12 @@ if( X_Audio_constructor ){ }; this._touchState = 3; } else - if( this._readyState !== 3 && this._durationFixPhase < 2 ){ - this._playReserved = true; + if( this._readyState !== 2 && this._durationFixPhase < 2 ){ return; }; + delete this._playReserved; + if( this._durationFixPhase & 3 ){ // 1 or 2 console.log( '▲ DurationFix の開始' ); this._durationFixPhase = 4; @@ -432,7 +437,6 @@ if( X_Audio_constructor ){ } else if( X_HTMLAudio_needPlayForSeek || forcePlay ){ raw.play(); - //console.log( '[HTMLAudio] currentTime より先.' ); }; //http://himaxoff.blog111.fc2.com/blog-entry-97.html diff --git a/0.6.x/js/07_audio/10_XAudioSprite.js b/0.6.x/js/07_audio/10_XAudioSprite.js index 763eca7..7754228 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -27,7 +27,8 @@ var X_AudioSprite_shouldUse = X_HTMLAudio && ( X_UA[ 'iOS' ] || X_UA[ 'A bgmPosition : 0, bgmName : '', bgmLooped : false, - bgmPlaying : false + bgmPlaying : false, + event : null }, X_AudioSprite, X_AudioSprite_numTracks, @@ -63,10 +64,11 @@ X[ 'AudioSprite' ] = function( setting ){ volume = setting[ 'volume' ], k, i, v, track; - if( !X_AudioSprite ){ - X_AudioSprite = X_Class_override( X_EventDispatcher(), X_AudioSprite_members ); - X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite, X_AudioSprite_handleEvent ); - }; + + if( X_AudioSprite ) X_AudioSprite[ 'kill' ](); + + X_AudioSprite = X_Class_override( X_EventDispatcher(), X_AudioSprite_members ); + X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite_handleEvent ); n = n <= X_AudioSprite_maxTracks ? n : X_AudioSprite_maxTracks; @@ -176,7 +178,7 @@ var X_AudioSprite_members = track = X_AudioSprite_TEMP.bgmTrack = tracks[ 0 ]; }; - if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite, X_AudioSprite_handleEvent ).playing ){ + if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_handleEvent ).playing ){ track.setState({ 'loop' : true, 'looped' : X_AudioSprite_TEMP.bgmLooped, @@ -196,7 +198,7 @@ var X_AudioSprite_members = if( 1 < X_AudioSprite_numTracks ){ track = X_AudioSprite_getTrackEnded( X_AudioSprite_TEMP.bgmPlaying ); track - [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite, X_AudioSprite_handleEvent ) + [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_handleEvent ) .setState( { 'looped' : false } ); track.play( preset[ 0 ], preset[ 1 ], true, 0, X_AudioSprite_lengthSilence ); } else { @@ -208,7 +210,7 @@ var X_AudioSprite_members = }; track = tracks[ 0 ]; - if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite, X_AudioSprite_handleEvent ).playing ){ + if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_handleEvent ).playing ){ track.setState({ 'loop' : true, 'looped' : false, @@ -219,7 +221,6 @@ var X_AudioSprite_members = 'loopEndTime' : X_AudioSprite_lengthSilence }); } else { - track.play( preset[ 0 ], preset[ 1 ], true, 0, X_AudioSprite_lengthSilence ); }; }; @@ -352,7 +353,7 @@ function X_AudioSprite_backendHandler( e ){ }; // Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する X_AudioSprite_TEMP.tracks.push( - last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite, X_AudioSprite_handleEvent ) ); + last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite_handleEvent ) ); }; _e = { @@ -360,26 +361,36 @@ function X_AudioSprite_backendHandler( e ){ 'source' : src, 'backendName' : name }; - // touch 可能で backend ready - // WebAudio - if( backend.backendID === 1 && ( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch ) ){ - last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite, X_AudioSprite[ 'asyncDispatch' ], [ _e ] ); - } else - // HTMLAudio - if( backend.backendID === 2 && ( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ) ){ - last[ 'listenOnce' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD, X_AudioSprite, X_AudioSprite[ 'asyncDispatch' ], [ _e ] ); + + // TODO 今は touch 可能で backend ready + if( + // WebAudio + ( backend.backendID === 1 && ( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch ) ) || + // HTMLAudio + ( backend.backendID === 2 && ( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ) ) + ){ + X_AudioSprite_TEMP.event = _e; + last[ 'listenOnce' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD, X_AudioSprite_backendHandler ); } else { X_AudioSprite[ 'asyncDispatch' ]( _e ); }; - last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite, X_AudioSprite_backendHandler ); + // TODO 全ての track の READY で! + last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_backendHandler ); return X_CALLBACK_STOP_NOW; case X_EVENT_BACKEND_NONE : - X_AudioSprite[ 'unlisten' ]( X_EVENT_BACKEND_READY, X_AudioSprite, X_AudioSprite_backendHandler ) + X_AudioSprite + [ 'listen' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_handleEvent ) // kill を呼ぶ [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE ); return X_CALLBACK_STOP_NOW; + case X_EVENT_MEDIA_TOUCH_FOR_LOAD : + // TODO 全ての track の MEDIA_TOUCH_FOR_LOAD で! + X_AudioSprite[ 'asyncDispatch' ]( X_AudioSprite_TEMP.event ); + delete X_AudioSprite_TEMP.event; + break; + case X_EVENT_READY : console.log( 'X.AudioSprite - Ready!' ); for( i = 0; i < X_AudioSprite_numTracks; ++i ){ @@ -394,23 +405,21 @@ function X_AudioSprite_backendHandler( e ){ function X_AudioSprite_handleEvent( e ){ - var i, tracks, track, _e, k; + var track = e.target, i, tracks, _e, k; switch( e.type ){ case X_EVENT_MEDIA_PLAYING : - ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING ); - break; case X_EVENT_MEDIA_WAITING : case X_EVENT_MEDIA_SEEKING : - ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && X_AudioSprite[ 'asyncDispatch' ]( e.type ); + ( track === X_AudioSprite_TEMP.bgmTrack || !track.looped ) && X_AudioSprite[ 'asyncDispatch' ]( e.type ); break; case X_EVENT_MEDIA_BEFORE_LOOP : - if( e.target === X_AudioSprite_TEMP.bgmTrack ){ + if( track === X_AudioSprite_TEMP.bgmTrack ){ X_AudioSprite_TEMP.bgmLooped = true; X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { - if( e.target.looped ){ + if( track.looped ){ // X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid @@ -420,7 +429,7 @@ function X_AudioSprite_handleEvent( e ){ // single track | iOS if( X_AudioSprite_TEMP.bgmPlaying && !X_AudioSprite_TEMP.bgmTrack ){ - X_AudioSprite_TEMP.bgmTrack = e.target; + X_AudioSprite_TEMP.bgmTrack = track; X_AudioSprite.play( X_AudioSprite_TEMP.bgmName ); return X_CALLBACK_PREVENT_DEFAULT; }; @@ -429,7 +438,7 @@ function X_AudioSprite_handleEvent( e ){ case X_EVENT_DEBUG : - i = X_AudioSprite_TEMP.tracks.indexOf( e.target ); + i = X_AudioSprite_TEMP.tracks.indexOf( track ); if( 0 <= i ){ e[ 'trackID' ] = i; X_AudioSprite[ 'dispatch' ]( e ); @@ -455,16 +464,20 @@ function X_AudioSprite_handleEvent( e ){ }; break; + case X_EVENT_BACKEND_NONE : case X_EVENT_UNLOAD : - console.log( '■ unload' ); + X_AudioSprite[ 'kill' ](); + break; case X_EVENT_KILL_INSTANCE : + X_AudioSprite_TEMP.pauseTracks.length = 0; + while( X_AudioSprite_TEMP.tracks.length ){ X_AudioSprite_TEMP.tracks.pop()[ 'kill' ](); }; - for( k in X_AudioSprite_TEMP.bgms ){ - delete X_AudioSprite_TEMP.bgms[ k ]; + for( k in X_AudioSprite_TEMP.BGMs ){ + delete X_AudioSprite_TEMP.BGMs[ k ]; }; for( k in X_AudioSprite_TEMP.presets ){ delete X_AudioSprite_TEMP.presets[ k ]; @@ -476,7 +489,8 @@ function X_AudioSprite_handleEvent( e ){ X_AudioSprite_TEMP.bgmLooped = false; X_AudioSprite_TEMP.bgmPlaying = false; - X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite, X_AudioSprite_handleEvent ); + X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite_handleEvent ); + X_AudioSprite = null; break; }; }; -- 2.11.0