X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F07_audio%2F10_XAudioSprite.js;h=bb4272b1ebd559f5603ab4734f39839b9bee5e12;hb=bafa8683f87b2f909d1301fca80684bf9ff221ed;hp=6d4cdbbbfb796792058a3c675643fd7ae0c5fa27;hpb=241005e2a5f9f8a7fddd6f610b76a915e9c05d30;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/07_audio/10_XAudioSprite.js b/0.6.x/js/07_audio/10_XAudioSprite.js index 6d4cdbb..bb4272b 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -4,20 +4,19 @@ * Mobile Opera11 は Audio をサポートするがイベントが取れない * iframe 内で生成して、Audio Sprite の preset で再生できないか? */ -var X_AudioSprite_shouldUse = X_HTMLAudio && ( X_UA[ 'iOS' ] || X_UA[ 'AOSP' ] || X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ), // Flash がない - X_AudioSprite_useVideoForMulti = //( 3.1 <= X_UA[ 'AOSP' ] < 4 ) || +var X_AudioSprite_shouldUse = X_HTMLAudio && ( X_UA[ 'iOS' ] || X_UA[ 'AOSP' ] || X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ), // Flash がない + X_AudioSprite_useVideoForMulti = //( 3.1 <= X_UA[ 'AOSP' ] < 4 ) || //( ( 4.2 <= X_UA[ 'AOSP' ] ), // ドスパラパッドはビデオのインライン再生が不可 false, X_AudioSprite_disableMultiTrack = !X_WebAudio && ( X_UA[ 'iOS' ] || 4 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) ), - X_AudioSprite_enableVolume = X_HTMLAudio && ( !X_UA[ 'iOS' ] && !X_UA[ 'AOSP' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上 + X_AudioSprite_enableVolume = X_HTMLAudio && ( !X_UA[ 'iOS' ] && !X_UA[ 'AOSP' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上 // http://tukumemo.com/html5-audio-sp/ // iOS6、Android4.1から同時再生が可能になりました。 X_AudioSprite_maxTracks = X_AudioSprite_useVideoForMulti ? 2 : X_AudioSprite_disableMultiTrack ? 1 : 9, X_AudioSprite_lengthSilence = 10000, // 一番最初の無音部分の長さ X_AudioSprite_lengthDistance = 5000, // 音間の無音の長さ X_AudioSprite_uid = 0, - X_AudioSprite_members = {}, X_AudioSprite_TEMP = { presets : {}, BGMs : {}, @@ -28,9 +27,10 @@ var X_AudioSprite_shouldUse = X_HTMLAudio && ( X_UA[ 'iOS' ] || X_UA[ 'AO bgmPosition : 0, bgmName : '', bgmLooped : false, - bgmPlaying : false + bgmPlaying : false, + event : null }, - X_AudioSprite_instance, + X_AudioSprite, X_AudioSprite_numTracks, X_AudioSprite_useVideo; @@ -61,19 +61,14 @@ X[ 'AudioSprite' ] = function( setting ){ urls = setting[ 'urls' ], video = setting[ 'useVideo' ], n = video ? 1 : setting[ 'numTracks' ] || 1, - option = { - volume : setting[ 'volume' ] || 0.5, - autoplay : false, - startTime : 0, - endTime : X_AudioSprite_lengthSilence, - loop : true - }, - k, i, v, track; + volume = setting[ 'volume' ], + k, i, v, track; - if( !X_AudioSprite_instance ){ - X_AudioSprite_instance = X_Class_override( X_EventDispatcher(), X_AudioSprite_members ); - X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_AudioSprite_instance, 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; @@ -96,15 +91,25 @@ X[ 'AudioSprite' ] = function( setting ){ }; }; - X_Audio_startDetectionBackend( X_Audio_BACKENDS[ 0 ], X_AudioSprite_instance, X_Array_copy( urls ), option ); + X_Audio_startDetectionBackend( + X_Audio_BACKENDS[ 0 ], + X_AudioSprite, + X_Array_copy( urls ), + { + 'volume' : 0 <= volume && volume <= 1 ? volume : 1, + 'autoplay' : true, + 'startTime' : 0, + 'endTime' : X_AudioSprite_lengthSilence, + 'loop' : true + }); - X_AudioSprite_instance[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], X_AudioSprite_backendHandler ); - X_AudioSprite_instance[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_AudioSprite_handleEvent ); + X_AudioSprite[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], X_AudioSprite_backendHandler ); + X_AudioSprite[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_AudioSprite_handleEvent ); X_AudioSprite_useVideo = video; - X_AudioSprite_numTracks = X_AudioSprite_instance[ 'numTracks' ] = n; + X_AudioSprite_numTracks = X_AudioSprite[ 'numTracks' ] = n; - return X_AudioSprite_instance; + return X_AudioSprite; }; X[ 'AudioSprite' ][ 'shouldUse' ] = X_AudioSprite_shouldUse; @@ -114,7 +119,7 @@ X[ 'AudioSprite' ][ 'enableMultiTrack' ] = !X_AudioSprite_disableMultiTrack; // TODO 終わりかけのもの、と一番古いもの、どちらを再利用するか?これ以上に細かい実装を望む場合は X.AudioSprite は使わず自力で実装 function X_AudioSprite_getTrackEnded(){ var tracks = X_AudioSprite_TEMP.tracks, - l = tracks.length, + l = X_AudioSprite_numTracks, i = 0, track, state, last = 1 / 0, _last, index; for( ; i < l; ++i ){ @@ -132,7 +137,7 @@ function X_AudioSprite_getTrackEnded(){ return tracks[ index ]; }; -X_AudioSprite_members = +var X_AudioSprite_members = /** @lends X.AudioSprite.prototype */ { /** @@ -141,21 +146,6 @@ X_AudioSprite_members = 'numTracks' : 0, /** - * モバイル用タッチイベント中に呼び出す - */ - 'on1stTouch' : function(){ - var i = 0, l = X_AudioSprite_TEMP.tracks.length; - - for( ; i < l; ++i ){ - //if( X_UA[ 'iOS' ] ){ - // X_AudioSprite_TEMP.tracks[ i ][ '_rawObject' ].load(); - //} else { - X_AudioSprite_instance[ 'pause' ]( i ); - //}; - }; - }, - - /** * 再生 * @param {string} name トラック名 * @return {number} uid @@ -182,13 +172,13 @@ X_AudioSprite_members = if( bgm ){ track = bgm; } else - if( 1 < tracks.length ){ + if( 1 < X_AudioSprite_numTracks ){ track = X_AudioSprite_TEMP.bgmTrack = X_AudioSprite_getTrackEnded(); } else { 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_instance, 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, @@ -205,10 +195,10 @@ X_AudioSprite_members = }; } else { - if( 1 < tracks.length ){ + 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_instance, 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 { @@ -220,18 +210,17 @@ 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_instance, 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, - //'currentTime' : preset[ 0 ], + 'currentTime' : preset[ 0 ], 'startTime' : preset[ 0 ], 'endTime' : preset[ 1 ], 'loopStartTime' : 0, 'loopEndTime' : X_AudioSprite_lengthSilence }); } else { - track.play( preset[ 0 ], preset[ 1 ], true, 0, X_AudioSprite_lengthSilence ); }; }; @@ -242,40 +231,48 @@ X_AudioSprite_members = }, /** - * ポーズ - * @param {number} uid トラックID - * @return {number} uid + * ポーズ, uid を指定しない、または '*' で呼び出した場合、全てのトラックを pause する。 + * @param {number} uid=undefined トラックID, '*' + * @return {AudioSprite} */ 'pause' : function( uid ){ - var track = X_AudioSprite_TEMP.tracks[ uid ]; + var tracks = X_AudioSprite_TEMP.tracks, + i, l, track; - if( X_AudioSprite_TEMP.bgmTrack === track ){ - X_AudioSprite_TEMP.bgmPosition = track.currentTime(); - X_AudioSprite_TEMP.bgmPlaying = false; - X_AudioSprite_TEMP.bgmTrack = null; + if( uid === '*' || uid === undefined ){ + for( i = 0, l = X_AudioSprite_numTracks; i < l; ++i ){ + X_AudioSprite[ 'pause' ]( i ); + }; + } else + if( track = tracks[ uid ] ){ + if( X_AudioSprite_TEMP.bgmTrack === track ){ + X_AudioSprite_TEMP.bgmPosition = track.currentTime(); + X_AudioSprite_TEMP.bgmPlaying = false; + X_AudioSprite_TEMP.bgmTrack = null; + }; + track.play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence ); + track.seek( 0 ); + X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED ); }; - track && track.play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence ); - track && track.seek( 0 ); - X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED ); - return X_AudioSprite_instance; + return X_AudioSprite; }, /** - * シーク + * シーク, 現在のトラックの長さ内で相対指定する * @param {number} uid トラックID * @param {number} position ms * @return {AudioSprite} */ 'seek' : function( uid, position ){ var track = X_AudioSprite_TEMP.tracks[ uid ], - end, strat; + end, start; if( track ){ delete track.seekTime; end = X_Audio_getEndTime( track ); start = X_Audio_getStartTime( track, end ); 0 <= position && position <= ( end - start ) && track.seek( start + position ); }; - return X_AudioSprite_instance; + return X_AudioSprite; }, /** @@ -291,17 +288,17 @@ X_AudioSprite_members = if( opt_volume === undefined ){ return X_AudioSprite_TEMP.volume; }; - for( i = X_AudioSprite_TEMP.tracks.length; i; ){ + for( i = X_AudioSprite_numTracks; i; ){ X_AudioSprite_TEMP.tracks[ --i ].volume( opt_volume ); }; - return X_AudioSprite_instance; + return X_AudioSprite; }; track = X_AudioSprite_TEMP.tracks[ uid ]; if( opt_volume === undefined ){ return track ? track.gain : -1; }; track && track.volume( opt_volume ); - return X_AudioSprite_instance; + return X_AudioSprite; }, /** @@ -329,12 +326,12 @@ X_AudioSprite_members = return { 'volume' : X_AudioSprite_TEMP.volume, 'playing' : false }; }; track && track.setState( opt_obj ); - return X_AudioSprite_instance; + return X_AudioSprite; } }; function X_AudioSprite_backendHandler( e ){ - var i, backend, option, src, name, last, _e; + var i, backend, option, src, name, last, _e, track; switch( e.type ){ case X_EVENT_BACKEND_READY : @@ -342,19 +339,21 @@ function X_AudioSprite_backendHandler( e ){ backend = X_Audio_BACKENDS[ e[ 'backendID' ] ]; option = e[ 'option' ]; - X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler ); - X_AudioSprite_instance[ 'source' ] = src = e[ 'source' ]; - X_AudioSprite_instance[ 'backendName' ] = name = backend.backendName; + X_AudioSprite[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler ); + X_AudioSprite[ 'source' ] = src = e[ 'source' ]; + X_AudioSprite[ 'backendName' ] = name = backend.backendName; //console.log( i + ' / ' + X_AudioSprite_numTracks ); for( i = 0; i < X_AudioSprite_numTracks; ++i ){ if( X_AudioSprite_useVideo || ( i === 1 && X_AudioSprite_useVideoForMulti ) ){ + option = X_Object_deepCopy( option ); option[ 'useVideo' ] = true; console.log( 'use video' ); }; // Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する - X_AudioSprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite_instance, X_AudioSprite_handleEvent ) ); + X_AudioSprite_TEMP.tracks.push( + last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite_handleEvent ) ); }; _e = { @@ -362,84 +361,82 @@ function X_AudioSprite_backendHandler( e ){ 'source' : src, 'backendName' : name }; - // touch 可能で backend ready - if( name === 'WebAudio' ){ - if( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch ){ - last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_instance[ 'asyncDispatch' ], [ _e ] ); - } else { - X_AudioSprite_instance[ 'asyncDispatch' ]( _e ); - }; - last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler ); - } else - if( name === 'HTMLAudio' ){ - if( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ){ - last[ 'listenOnce' ]( X_EVENT_MEDIA_CAN_TOUCH_LOAD, X_AudioSprite_instance, X_AudioSprite_instance[ 'asyncDispatch' ], [ _e ] ); - last[ 'listenOnce' ]( !X_HTMLAudio_durationFix ? X_EVENT_MEDIA_PLAYING : X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler ); - } else { - X_AudioSprite_instance[ 'asyncDispatch' ]( _e ); - last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler ); - - // READY, needTouchForPlay, needTouchForLoad - if( X_HTMLAudio_durationFix ){ - for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){ - X_AudioSprite_instance[ 'pause' ]( i ); - }; - }; - }; - + // 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_instance[ 'asyncDispatch' ]( _e ); - - console.log( 'AudioSprite - X_EVENT_BACKEND_READY' ); - - last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler ); + X_AudioSprite[ 'asyncDispatch' ]( _e ); }; + + // TODO 全ての track の READY で! + last[ 'listen' ]( X_EVENT_PROGRESS, X_AudioSprite_backendHandler ) + [ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_backendHandler ); return X_CALLBACK_STOP_NOW; case X_EVENT_BACKEND_NONE : - X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_READY, X_AudioSprite_instance, 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_READY : - case X_EVENT_MEDIA_PLAYING : + 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_PROGRESS : + X_AudioSprite[ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : e[ 'percent' ] } ); + break; + + case X_EVENT_READY : console.log( 'X.AudioSprite - Ready!' ); - X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_READY ); + for( i = 0; i < X_AudioSprite_numTracks; ++i ){ + track = X_AudioSprite_TEMP.tracks[ i ]; + ( track.autoplay || track._playReserved ) && track.actualPlay(); + delete track._playReserved; + }; + this[ 'listen' ]( X_EVENT_PROGRESS, X_AudioSprite_backendHandler ); + X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_READY ); break; }; }; 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_instance[ '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_instance[ '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 ){ + // BGM X_AudioSprite_TEMP.bgmLooped = true; - X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid + X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { - if( e.target.looped ){ - // X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid - } else { - X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid + // SE + if( !track.looped ){ + X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid }; //console.log( '[AudioSprite] bgmPlaying:' + X_AudioSprite_TEMP.bgmPlaying + ' ' + !X_AudioSprite_TEMP.bgmTrack ); // single track | iOS if( X_AudioSprite_TEMP.bgmPlaying && !X_AudioSprite_TEMP.bgmTrack ){ - X_AudioSprite_TEMP.bgmTrack = e.target; - X_AudioSprite_instance.play( X_AudioSprite_TEMP.bgmName ); + X_AudioSprite_TEMP.bgmTrack = track; + X_AudioSprite.play( X_AudioSprite_TEMP.bgmName ); return X_CALLBACK_PREVENT_DEFAULT; }; }; @@ -447,10 +444,10 @@ 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_instance[ 'dispatch' ]( e ); + X_AudioSprite[ 'dispatch' ]( e ); }; break; @@ -466,21 +463,27 @@ function X_AudioSprite_handleEvent( e ){ console.log( '■ デアクティブ' ); // track.pause(); tracks = X_AudioSprite_TEMP.tracks; - i = tracks.length; + i = X_AudioSprite_numTracks; for( ; i; ){ track = tracks[ --i ]; track.playing && X_AudioSprite_TEMP.pauseTracks.push( track ) && track.pause(); }; break; + case X_EVENT_BACKEND_NONE : + case X_EVENT_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 ]; @@ -492,7 +495,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_AudioSprite_instance, X_AudioSprite_handleEvent ); + X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite_handleEvent ); + X_AudioSprite = null; break; }; };