X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F07_audio%2F10_XAudioSprite.js;h=1ff87f674a712984cf2da3aaf8fb9fd521a2bc90;hb=20c3a948b20e52efc28fd103fc075d787c6d65d2;hp=99d7782a899ce8f4c0100e67628f88c4fb529235;hpb=0660e56af40d5df36e49c7a2deb7ec7e6638df98;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 99d7782..1ff87f6 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -5,10 +5,10 @@ * iframe 内で生成して、Audio Sprite の preset で再生できないか? */ var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA[ 'iOS' ] || X_UA[ 'AndroidBrowser' ] || X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ), // Flash がない - X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidBrowserWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 + X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti, X_Audio_Sprite_needTouchFirst = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ), - X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidBrowserWebkit' ] <= 534.3 ), + X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ) && !( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ), X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上 X_Audio_Sprite_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9, X_Audio_Sprite_lengthSilence = 10000, // 一番最初の無音部分の長さ @@ -27,30 +27,63 @@ var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA[ 'iOS' ] bgmLooped : false, bgmPlaying : false }, - X_Audio_Sprite_instance; + X_Audio_Sprite_instance, + X_Audio_Sprite_numTracks, + X_Audio_Sprite_useVideo; -X[ 'Audio' ][ 'Sprite' ] = { - - 'shouldUse' : X_Audio_Sprite_shouldUse, +X[ 'AudioSprite' ] = function( setting ){ + var tracks = X_Audio_Sprite_TEMP.tracks, + bgms = X_Audio_Sprite_TEMP.BGMs, + presets = X_Audio_Sprite_TEMP.presets, + urls = setting[ 'urls' ], + video = setting[ 'useVideo' ], + n = video ? 1 : setting[ 'numTracks' ] || 1, + option = { + volume : setting[ 'volume' ] || 0.5, + autoplay : false, + startTime : 0, + endTime : X_Audio_Sprite_lengthSilence, + loop : true + }, + k, i, v, track; - 'needTouchFirst' : X_Audio_Sprite_needTouchFirst, + if( X_Audio_Sprite_instance ){ + X_Audio_Sprite_instance[ 'kill' ](); + } else { + X_Audio_Sprite_instance = X_Class_override( X_EventDispatcher(), X_Audio_Sprite_members ); + X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_Audio_Sprite_instance, X_Audio_Sprite_handleEvent ); + }; - 'enableMultiTrack' : X_Audio_Sprite_enableMultiTrack, + n = n <= X_Audio_Sprite_maxTracks ? n : X_Audio_Sprite_maxTracks; - 'create' : function( setting ){ - // close() - if( X_Audio_Sprite_instance ){ - X_Audio_Sprite_instance.close(); - } else { - X_Audio_Sprite_instance = X_Class_override( X_EventDispatcher(), X_Audio_Sprite_members ); - X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_Audio_Sprite_instance, X_Audio_Sprite_handleEvent ); + for( k in setting ){ + v = setting[ k ]; + if( X_Type_isArray( v ) && v !== urls ){ + v = X_Object_cloneArray( v ); + for( i = v.length; i; ){ + --i; + if( i !== 2 ) v[ i ] = X_AudioWrapper_timeStringToNumber( v[ i ] ); + }; + if( v[ 2 ] ) bgms[ k ] = v; + presets[ k ] = v; }; - X_Audio_Sprite_instance.setup( setting ); - return X_Audio_Sprite_instance; - - } + }; + + X_Audio_startDetectionBackend( X_Audio_BACKENDS[ 0 ], X_Audio_Sprite_instance, X_Object_cloneArray( urls ), option ); + + X_Audio_Sprite_instance[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], X_AudioSprite_backendHandler ); + X_Audio_Sprite_instance[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Audio_Sprite_handleEvent ); + + X_Audio_Sprite_useVideo = video; + X_Audio_Sprite_numTracks = X_Audio_Sprite_instance[ 'numTracks' ] = n; + + return X_Audio_Sprite_instance; }; +X[ 'AudioSprite' ][ 'shouldUse' ] = X_Audio_Sprite_shouldUse; +X[ 'AudioSprite' ][ 'needTouchFirst' ] = X_Audio_Sprite_needTouchFirst; +X[ 'AudioSprite' ][ 'enableMultiTrack' ] = X_Audio_Sprite_enableMultiTrack; + // 再生が終わっているもの、終わりかけのものを探す // TODO 終わりかけのもの、と一番古いもの、どちらを再利用するか?これ以上に細かい実装を望む場合は X.Audio.Sprite は使わず自力で実装 function X_Audio_Sprite_getTrackEnded(){ @@ -60,7 +93,7 @@ function X_Audio_Sprite_getTrackEnded(){ for( ; i < l; ++i ){ track = tracks[ i ]; - state = track.state(); + state = track.getState(); if( !state.playing ) return track; if( track === X_Audio_Sprite_TEMP.bgmTrack ) continue; if( state.currentTime <= X_Audio_Sprite_lengthSilence + X_Audio_Sprite_lengthDistance ) return track; @@ -94,84 +127,18 @@ function X_Audio_Sprite_getTrackEnded(){ X_Audio_Sprite_members = { - setup : function( setting ){ - - var tracks = X_Audio_Sprite_TEMP.tracks, - bgms = X_Audio_Sprite_TEMP.BGMs, - presets = X_Audio_Sprite_TEMP.presets, - urls = setting[ 'urls' ], - video = setting[ 'useVideo' ], - n = video ? 1 : setting[ 'numTracks' ] || 1, - option = { - volume : setting[ 'volume' ] || 0.5, - autoplay : false, - startTime : 0, - endTime : X_Audio_Sprite_lengthSilence, - loop : true - }, - k, i, v, track; - - n = n <= X_Audio_Sprite_maxTracks ? n : X_Audio_Sprite_maxTracks; - - for( k in setting ){ - v = setting[ k ]; - if( X_Type_isArray( v ) && v !== urls ){ - v = X_Object_cloneArray( v ); - for( i = v.length; i; ){ - --i; - if( i !== 2 ) v[ i ] = X_AudioWrapper_timeStringToNumber( v[ i ] ); - }; - if( v[ 2 ] ) bgms[ k ] = v; - presets[ k ] = v; - }; - }; - - for( i = 0; i < n; ++i ){ - if( video || ( i === 1 && X_Audio_Sprite_useVideoForMulti ) ){ - option[ 'useVideo' ] = true; - }; - tracks.push( X[ 'Audio' ]( urls, X_Object_clone( option ) ) ); - }; - - tracks[ n - 1 ][ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], this, X_Audio_Sprite_handleEvent ); - - X_Audio_Sprite_instance.numTracks = n; - }, + 'numTracks' : 0, - close : function(){ - var tracks = X_Audio_Sprite_TEMP.tracks, - bgms = X_Audio_Sprite_TEMP.BGMs, - presets = X_Audio_Sprite_TEMP.presets, - k; - - while( tracks.length ){ - tracks.pop()[ 'kill' ](); - }; - - for( k in bgms ){ - delete bgms[ k ]; - }; - for( k in presets ){ - delete presets[ k ]; - }; - - X_Audio_Sprite_TEMP.bgmTrack = null; - X_Audio_Sprite_TEMP.bgmPosition = 0; - X_Audio_Sprite_TEMP.bgmName = ''; - X_Audio_Sprite_TEMP.bgmLooped = false; - X_Audio_Sprite_TEMP.bgmPlaying = false; - }, - - load : function(){ + 'load' : function(){ var tracks = X_Audio_Sprite_TEMP.tracks, i = 0, l = tracks.length; for( ; i < l; ++i ){ if( X_UA[ 'WinPhone' ] ){ - console.log( 'touch -> play()' ); + console.log( 'WinPhone : touch -> play()' ); //tracks[ i ].play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 ); - this.pause( i ); + this[ 'pause' ]( i ); } else { - X_Audio_getAudioWrapper( tracks[ i ] )[ '_rawObject' ].load(); + tracks[ i ][ '_rawObject' ].load(); }; }; }, @@ -179,7 +146,7 @@ X_Audio_Sprite_members = { /* * @return uid Number */ - play : function( name ){ + 'play' : function( name ){ var bgm = X_Audio_Sprite_TEMP.bgmTrack, tracks = X_Audio_Sprite_TEMP.tracks, bgms = X_Audio_Sprite_TEMP.BGMs, @@ -193,9 +160,11 @@ X_Audio_Sprite_members = { // bgm変更 X_Audio_Sprite_TEMP.bgmName = name; X_Audio_Sprite_TEMP.bgmPosition = preset[ 0 ]; - X_Audio_Sprite_TEMP.bgmPlaying = true; X_Audio_Sprite_TEMP.bgmLooped = false; }; + + X_Audio_Sprite_TEMP.bgmPlaying = true; + if( bgm ){ track = bgm; } else @@ -205,22 +174,20 @@ X_Audio_Sprite_members = { track = X_Audio_Sprite_TEMP.bgmTrack = tracks[ 0 ]; }; - if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){ - track - .state( { - loop : true, - looped : X_Audio_Sprite_TEMP.bgmLooped, - currentTime : X_Audio_Sprite_TEMP.bgmPosition, - startTime : preset[ 0 ], - endTime : preset[ 1 ], - loopStartTime : preset[ 3 ], - loopEndTime : preset[ 4 ] - } ); + if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).playing ){ + track.setState({ + 'loop' : true, + 'looped' : X_Audio_Sprite_TEMP.bgmLooped, + 'currentTime' : X_Audio_Sprite_TEMP.bgmPosition, + 'startTime' : preset[ 0 ], + 'endTime' : preset[ 1 ], + 'loopStartTime' : preset[ 3 ], + 'loopEndTime' : preset[ 4 ] + }); } else { - track - .state( { looped : X_Audio_Sprite_TEMP.bgmLooped } ) - .play( preset[ 0 ], preset[ 1 ], true, preset[ 3 ], preset[ 4 ] ) - .seek( X_Audio_Sprite_TEMP.bgmPosition ); + track.setState( { 'looped' : X_Audio_Sprite_TEMP.bgmLooped } ); + track.play( preset[ 0 ], preset[ 1 ], true, preset[ 3 ], preset[ 4 ] ); + track.seek( X_Audio_Sprite_TEMP.bgmPosition ); }; } else { @@ -228,30 +195,29 @@ X_Audio_Sprite_members = { track = X_Audio_Sprite_getTrackEnded( X_Audio_Sprite_TEMP.bgmPlaying ); track [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ) - .state( { looped : false } ) - .play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence ); + .setState( { 'looped' : false } ); + track.play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence ); } else { // single track, iOS if( bgm ){ X_Audio_Sprite_TEMP.bgmPosition = bgm.currentTime(); - console.log( 'bgm position : ' + X_Audio_Sprite_TEMP.bgmPosition + ' isPlay:' + bgm.isPlaying() ); + //console.log( 'bgm position : ' + X_Audio_Sprite_TEMP.bgmPosition + ' isPlay:' + bgm.playing ); X_Audio_Sprite_TEMP.bgmTrack = null; }; track = tracks[ 0 ]; - if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){ - track - .state( { - loop : true, - looped : false, - startTime : preset[ 0 ], - endTime : preset[ 1 ], - loopStartTime : 0, - loopEndTime : X_Audio_Sprite_lengthSilence - } ); + if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).playing ){ + track.setState({ + 'loop' : true, + 'looped' : false, + //'currentTime' : preset[ 0 ], + 'startTime' : preset[ 0 ], + 'endTime' : preset[ 1 ], + 'loopStartTime' : 0, + 'loopEndTime' : X_Audio_Sprite_lengthSilence + }); } else { - track - .play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence ); + track.play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence ); }; }; }; @@ -260,19 +226,20 @@ X_Audio_Sprite_members = { return -1; }, - pause : function( uid ){ + 'pause' : function( uid ){ var track = X_Audio_Sprite_TEMP.tracks[ uid ]; if( X_Audio_Sprite_TEMP.bgmTrack === track ){ X_Audio_Sprite_TEMP.bgmPosition = track.currentTime(); X_Audio_Sprite_TEMP.bgmPlaying = false; X_Audio_Sprite_TEMP.bgmTrack = null; }; - track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 ); + track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ); + track && track.seek( 0 ); this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED ); return this; }, - seek : function( uid, position ){ + 'seek' : function( uid, position ){ var track = X_Audio_Sprite_TEMP.tracks[ uid ], end; if( track ){ @@ -283,7 +250,7 @@ X_Audio_Sprite_members = { return this; }, - volume : function( uid, opt_volume ){ + 'volume' : function( uid, opt_volume ){ var track, i; // TODO uid = 0 if( uid === 0 ){ @@ -297,48 +264,64 @@ X_Audio_Sprite_members = { }; track = X_Audio_Sprite_TEMP.tracks[ uid ]; if( opt_volume === undefined ){ - return track ? track.volume() : -1; + return track ? track.gain : -1; }; track && track.volume( opt_volume ); return this; }, - state : function( uid, opt_obj ){ + 'state' : function( uid, opt_obj ){ var track = X_Audio_Sprite_TEMP.tracks[ uid ], state, start, end; // TODO uid = 0 if( opt_obj === undefined ){ // TODO pause if( track ){ - state = track.state(); + state = track.getState(); start = state.startTime; return { - 'currentTime' : state.currentTime - state.startTime, - 'playing' : state.startTime <= state.currentTime && state.currentTime <= state.endTime, - 'duration' : state.endTime - state.startTime, + 'currentTime' : state.currentTime - start, + 'playing' : start <= state.currentTime && state.currentTime <= state.endTime, + 'duration' : state.endTime - start, 'volume' : X_Audio_Sprite_TEMP.volume }; }; return { 'volume' : X_Audio_Sprite_TEMP.volume, 'playing' : false }; }; - track && track.state( opt_obj ); + track && track.setState( opt_obj ); return this; } }; -function X_Audio_Sprite_handleEvent( e ){ - var i, tracks, track, _e; +function X_AudioSprite_backendHandler( e ){ + var i, backend, option, src, name, last, _e; switch( e.type ){ case X_EVENT_BACKEND_READY : + + backend = X_Audio_BACKENDS[ e[ 'backendID' ] ]; + option = e[ 'option' ]; + + this[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler ); + this[ 'source' ] = src = e[ 'source' ]; + this[ 'backendName' ] = name = backend.backendName; + + for( i = 0; i < X_Audio_Sprite_numTracks; ++i ){ + if( X_Audio_Sprite_useVideo || ( i === 1 && X_Audio_Sprite_useVideoForMulti ) ){ + option[ 'useVideo' ] = true; + }; + // Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する + X_Audio_Sprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) ); + }; + _e = { 'type' : X_EVENT_BACKEND_READY, - 'source' : e[ 'source' ], - 'backendName' : e[ 'backendName' ] + 'source' : src, + 'backendName' : name }; if( X_Audio_Sprite_needTouchFirst ){ - if( e.backendName === 'Web Audio' ){ + if( name === 'Web Audio' ){ _e[ 'needTouchForPlay' ] = true; } else { _e[ 'needTouchForLoad' ] = true; @@ -346,37 +329,44 @@ function X_Audio_Sprite_handleEvent( e ){ }; this[ 'asyncDispatch' ]( _e ); - e.target - [ 'unlisten' ]( X_EVENT_BACKEND_NONE, this, X_Audio_Sprite_handleEvent ) - [ 'listenOnce' ]( X_EVENT_READY, this, X_Audio_Sprite_handleEvent ); + last[ 'listenOnce' ]( X_EVENT_READY, this, X_AudioSprite_backendHandler ); // READY, needTouchForPlay, needTouchForLoad if( X_Audio_HTMLAudioWrapper_durationFix ){ for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){ - X_Audio_Sprite_instance.pause( i ); + this[ 'pause' ]( i ); }; }; - break; + + return X_Callback_STOP_NOW; case X_EVENT_BACKEND_NONE : - this[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE ); - e.target[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_Audio_Sprite_handleEvent ); - break; + this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler ) + [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE ); + return X_Callback_STOP_NOW; case X_EVENT_READY : console.log( 'X.AudioSprite - Ready!' ); + if( X_Audio_Sprite_needTouchAndroid ){ for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){ - X_Audio_Sprite_instance.pause( i ); + this[ 'pause' ]( i ); }; e.target[ 'listenOnce' ]( X_EVENT_MEDIA_PLAYING, this, this.asyncDispatch, [ X_EVENT_READY ] ); // Android 標準ブラウザ return; }; this[ 'asyncDispatch' ]( X_EVENT_READY ); break; - + }; +}; + + +function X_Audio_Sprite_handleEvent( e ){ + var i, tracks, track, _e, k; + + switch( e.type ){ case X_EVENT_MEDIA_PLAYING : - ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.state().looped ) && this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING ); + ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING ); break; case X_EVENT_MEDIA_BEFORE_LOOP : @@ -384,12 +374,14 @@ function X_Audio_Sprite_handleEvent( e ){ X_Audio_Sprite_TEMP.bgmLooped = true; this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { - if( e.target.state().looped ){ + if( e.target.looped ){ //this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { this[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid }; + console.log( '[AudioSprite] ' + X_Audio_Sprite_TEMP.bgmPlaying + ' ' + !X_Audio_Sprite_TEMP.bgmTrack ); + // single track | iOS if( X_Audio_Sprite_TEMP.bgmPlaying && !X_Audio_Sprite_TEMP.bgmTrack ){ X_Audio_Sprite_TEMP.bgmTrack = e.target; @@ -399,11 +391,12 @@ function X_Audio_Sprite_handleEvent( e ){ }; break; + // TODO Android Firefox で アクティブ検出できない! case X_EVENT_VIEW_ACTIVATE : console.log( '■ アクティブ' ); // track.play(); or iOS need touch?? tracks = X_Audio_Sprite_TEMP.pauseTracks; - while( tracks.length ) tracks.pop().play(); + while( tracks.length ) tracks.pop().actualPlay(); break; case X_EVENT_VIEW_DEACTIVATE : @@ -413,13 +406,30 @@ function X_Audio_Sprite_handleEvent( e ){ i = tracks.length; for( ; i; ){ track = tracks[ --i ]; - track.isPlaying() && X_Audio_Sprite_TEMP.pauseTracks.push( track.pause() ); + track.playing && X_Audio_Sprite_TEMP.pauseTracks.push( track ) && track.pause(); }; break; case X_EVENT_KILL_INSTANCE : + + while( X_Audio_Sprite_TEMP.tracks.length ){ + X_Audio_Sprite_TEMP.tracks.pop()[ 'kill' ](); + }; + + for( k in X_Audio_Sprite_TEMP.bgms ){ + delete X_Audio_Sprite_TEMP.bgms[ k ]; + }; + for( k in X_Audio_Sprite_TEMP.presets ){ + delete X_Audio_Sprite_TEMP.presets[ k ]; + }; + + X_Audio_Sprite_TEMP.bgmTrack = null; + X_Audio_Sprite_TEMP.bgmPosition = 0; + X_Audio_Sprite_TEMP.bgmName = ''; + X_Audio_Sprite_TEMP.bgmLooped = false; + X_Audio_Sprite_TEMP.bgmPlaying = false; + X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], this, X_Audio_Sprite_handleEvent ); - this.close(); break; }; };