X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F07_audio%2F10_XAudioSprite.js;h=77542289573ef908ad2927635ff5ef802f2d0937;hb=486d19a050444ad4d5277fa65a3da437f778ff0f;hp=763eca75ce163d0d117eda2458618ea7092b1568;hpb=3c07e12e13272820cedf983e0d9fe46e5f0a4bd9;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 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; }; };