X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F07_audio%2F10_XAudioSprite.js;h=d6a40b66413831419c9b03583e5cfb8b36232f66;hb=8e63f506d14490e852fa557d326ca91f9cdd3baf;hp=6cdc290b3f86e26fff2fe61dd94373e7c8054961;hpb=4ff55e875a0aa86831f3a07e0c278deddc1e18bb;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 6cdc290..d6a40b6 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -4,12 +4,12 @@ * Mobile Opera11 は Audio をサポートするがイベントが取れない * 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, // ドスパラパッドはビデオのインライン再生が不可 +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[ '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_enableVolume = window.HTMLAudioElement && ( !X_UA.iOS && !X_UA.AndroidBrowser && !X_UA.OperaMobile && !X_UA.OperaTablet ), // TODO fennec は 25以上 + 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[ 'AndroidWebkit' ] <= 534.3 ), + 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, // 一番最初の無音部分の長さ X_Audio_Sprite_lengthDistance = 5000, // 音間の無音の長さ @@ -19,7 +19,7 @@ var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA.iOS || X presets : {}, BGMs : {}, tracks : [], - pauseTracks : [], // X.Event.DEACTIVATE によって pause した再生中のトラックたち。 + pauseTracks : [], // X_EVENT_DEACTIVATE によって pause した再生中のトラックたち。 volume : 1, bgmTrack : null, bgmPosition : 0, @@ -27,30 +27,63 @@ var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA.iOS || X 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( new 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; @@ -83,95 +116,29 @@ function X_Audio_Sprite_getTrackEnded(){ * BGM_02 : [ '56.00', '1:15.230', true ] * } * - * X.Event.BACKEND_READY - * X.Event.BACKEND_NONE + * X_EVENT_BACKEND_READY + * X_EVENT_BACKEND_NONE * - * X.Event.READY - * X.Event.MEDIA_LOOPED - * X.Event.MEDIA_ENDED + * X_EVENT_READY + * X_EVENT_MEDIA_LOOPED + * X_EVENT_MEDIA_ENDED * */ 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; - }, - - 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; - }, + 'numTracks' : 0, - load : function(){ + 'load' : function(){ var tracks = X_Audio_Sprite_TEMP.tracks, i = 0, l = tracks.length; for( ; i < l; ++i ){ - if( X_UA.WinPhone ){ + if( X_UA[ 'WinPhone' ] ){ console.log( '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,53 +174,50 @@ 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 { if( 1 < tracks.length ){ 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 ); + [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ) + .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 ); - this.asyncDispatch( X.Event.MEDIA_PAUSED ); + 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,87 +264,126 @@ 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 ){ - var track = X_Audio_Sprite_TEMP.tracks[ uid ]; + 'state' : function( uid, opt_obj ){ + var track = X_Audio_Sprite_TEMP.tracks[ uid ], + state, start, end; // TODO uid = 0 if( opt_obj === undefined ){ - return track ? track.state() : { volume : X_Audio_Sprite_TEMP.volume }; + // TODO pause + if( track ){ + state = track.getState(); + start = state.startTime; + return { + '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 : + 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 : e.type, - source : e.source, - backendName : e.backendName + 'type' : X_EVENT_BACKEND_READY, + '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; }; }; - this.asyncDispatch( _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 ); }; }; + + return X_Callback_STOP_NOW; break; - case X.Event.BACKEND_NONE : - this.asyncDispatch( X.Event.BACKEND_NONE ); - e.target.unlisten( X.Event.BACKEND_READY, this, X_Audio_Sprite_handleEvent ); + case X_EVENT_BACKEND_NONE : + this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler ) + [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE ); + return X_Callback_STOP_NOW; break; - case X.Event.READY : + 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 標準ブラウザ + e.target[ 'listenOnce' ]( X_EVENT_MEDIA_PLAYING, this, this.asyncDispatch, [ X_EVENT_READY ] ); // Android 標準ブラウザ return; }; - this.asyncDispatch( X.Event.READY ); + this[ 'asyncDispatch' ]( X_EVENT_READY ); break; - - case X.Event.MEDIA_PLAYING : - ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.state().looped ) && this.asyncDispatch( X.Event.MEDIA_PLAYING ); + }; +}; + + +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.looped ) && this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING ); break; - case X.Event.MEDIA_BEFORE_LOOP : + case X_EVENT_MEDIA_BEFORE_LOOP : if( e.target === X_Audio_Sprite_TEMP.bgmTrack ){ X_Audio_Sprite_TEMP.bgmLooped = true; - this.asyncDispatch( X.Event.MEDIA_LOOPED ); // TODO uid + this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { - if( e.target.state().looped ){ - //this.asyncDispatch( X.Event.MEDIA_LOOPED ); // TODO uid + if( e.target.looped ){ + //this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid } else { - this.asyncDispatch( X.Event.MEDIA_ENDED ); // TODO uid + 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; @@ -387,27 +393,45 @@ function X_Audio_Sprite_handleEvent( e ){ }; break; - case X.Event.VIEW_ACTIVATE : + // 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 : + case X_EVENT_VIEW_DEACTIVATE : console.log( '■ デアクティブ' ); // track.pause(); tracks = X_Audio_Sprite_TEMP.tracks; 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 : - X_ViewPort.unlisten( [ X.Event.VIEW_ACTIVATE, X.Event.VIEW_DEACTIVATE ], this, X_Audio_Sprite_handleEvent ); - this.close(); + 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 ); break; }; };