X_AudioSprite_useVideoForMulti = //( 3.1 <= X_UA[ 'AOSP' ] < 4 ) || \r
//( ( 4.2 <= X_UA[ 'AOSP' ] ),\r
// ドスパラパッドはビデオのインライン再生が不可\r
- false, //X_UA[ 'ChromeWV' ],\r
- X_AudioSprite_needTouchAndroid = X_UA[ 'ChromeWV' ] && !X_WebAudio,\r
- X_AudioSprite_needTouchFirst = X_HTMLAudio_need1stTouch,\r
- X_AudioSprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_WebAudio_context ) || ( X_UA[ 'AOSP4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 12 ),\r
+ false,\r
+ X_AudioSprite_disableMultiTrack = !X_WebAudio && ( X_UA[ 'iOS' ] || 4 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) ),\r
X_AudioSprite_enableVolume = X_HTMLAudio && ( !X_UA[ 'iOS' ] && !X_UA[ 'AOSP' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
// http://tukumemo.com/html5-audio-sp/\r
// iOS6、Android4.1から同時再生が可能になりました。\r
};\r
\r
X[ 'AudioSprite' ][ 'shouldUse' ] = X_AudioSprite_shouldUse;\r
-X[ 'AudioSprite' ][ 'needTouchFirst' ] = X_AudioSprite_needTouchFirst;\r
X[ 'AudioSprite' ][ 'enableMultiTrack' ] = !X_AudioSprite_disableMultiTrack;\r
\r
// 再生が終わっているもの、終わりかけのものを探す\r
/**\r
* モバイル用タッチイベント中に呼び出す\r
*/\r
- 'load' : function(){\r
- var tracks = X_AudioSprite_TEMP.tracks,\r
- i = 0, l = tracks.length;\r
+ 'on1stTouch' : function(){\r
+ var i = 0, l = X_AudioSprite_TEMP.tracks.length;\r
\r
for( ; i < l; ++i ){\r
- if( X_AudioSprite_needTouchAndroid ){\r
- console.log( '[duration fix]開始 - ' + tracks[ i ][ '_rawObject' ].duration );\r
- tracks[ i ]._durationFixPhase = 1;\r
- tracks[ i ][ '_rawObject' ].play();\r
- } else\r
- if( X_UA[ 'WinPhone' ] ){\r
- console.log( 'WinPhone : touch -> play()' );\r
- //tracks[ i ].play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence ).seek( 0 );\r
- this[ 'pause' ]( i );\r
+ if( X_UA[ 'iOS' ] ){\r
+ X_AudioSprite_TEMP.tracks[ i ][ '_rawObject' ].load();\r
} else {\r
- tracks[ i ][ '_rawObject' ].load();\r
+ X_AudioSprite_instance[ 'pause' ]( i );\r
};\r
};\r
},\r
track = X_AudioSprite_TEMP.bgmTrack = tracks[ 0 ];\r
};\r
\r
- if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){\r
+ 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 ){\r
track.setState({\r
'loop' : true,\r
'looped' : X_AudioSprite_TEMP.bgmLooped,\r
if( 1 < tracks.length ){\r
track = X_AudioSprite_getTrackEnded( X_AudioSprite_TEMP.bgmPlaying );\r
track\r
- [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent )\r
+ [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_instance, X_AudioSprite_handleEvent )\r
.setState( { 'looped' : false } );\r
track.play( preset[ 0 ], preset[ 1 ], true, 0, X_AudioSprite_lengthSilence );\r
} else {\r
};\r
track = tracks[ 0 ];\r
\r
- if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){\r
+ 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 ){\r
track.setState({\r
'loop' : true,\r
'looped' : false,\r
};\r
track && track.play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence );\r
track && track.seek( 0 );\r
- this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED );\r
- return this;\r
+ X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED );\r
+ return X_AudioSprite_instance;\r
},\r
\r
/**\r
start = X_Audio_getStartTime( track, end );\r
0 <= position && position <= ( end - start ) && track.seek( start + position );\r
};\r
- return this;\r
+ return X_AudioSprite_instance;\r
},\r
\r
/**\r
for( i = X_AudioSprite_TEMP.tracks.length; i; ){\r
X_AudioSprite_TEMP.tracks[ --i ].volume( opt_volume );\r
};\r
- return this;\r
+ return X_AudioSprite_instance;\r
};\r
track = X_AudioSprite_TEMP.tracks[ uid ];\r
if( opt_volume === undefined ){\r
return track ? track.gain : -1;\r
};\r
track && track.volume( opt_volume );\r
- return this;\r
+ return X_AudioSprite_instance;\r
},\r
\r
/**\r
return { 'volume' : X_AudioSprite_TEMP.volume, 'playing' : false };\r
};\r
track && track.setState( opt_obj );\r
- return this;\r
+ return X_AudioSprite_instance;\r
}\r
};\r
\r
function X_AudioSprite_backendHandler( e ){\r
- var i, backend, option, src, name, last, _e;\r
+ var i, backend, option, src, name, last, _e, touch;\r
\r
switch( e.type ){\r
case X_EVENT_BACKEND_READY :\r
backend = X_Audio_BACKENDS[ e[ 'backendID' ] ];\r
option = e[ 'option' ];\r
\r
- this[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler );\r
- this[ 'source' ] = src = e[ 'source' ];\r
- this[ 'backendName' ] = name = backend.backendName;\r
+ X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler );\r
+ X_AudioSprite_instance[ 'source' ] = src = e[ 'source' ];\r
+ X_AudioSprite_instance[ 'backendName' ] = name = backend.backendName;\r
\r
//console.log( i + ' / ' + X_AudioSprite_numTracks );\r
\r
console.log( 'use video' );\r
};\r
// Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する\r
- X_AudioSprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) );\r
- \r
- \r
- //console.dir( backend );\r
- //console.dir( last );\r
+ X_AudioSprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite_instance, X_AudioSprite_handleEvent ) );\r
};\r
\r
_e = {\r
'source' : src,\r
'backendName' : name\r
};\r
+ // touch 可能で backend ready\r
\r
- if( X_AudioSprite_needTouchFirst ){\r
- if( name === 'WebAudio' ){\r
- _e[ 'needTouchForPlay' ] = true;\r
- } else {\r
- _e[ 'needTouchForLoad' ] = true;\r
- };\r
+ if( name === 'WebAudio' ){\r
+ _e[ 'needTouchForPlay' ] = touch = X_WebAudio_need1stTouch;\r
+ } else\r
+ if( name === 'HTMLAudio' ){\r
+ _e[ 'needTouchForLoad' ] = touch = X_HTMLAudio_need1stTouch;\r
};\r
- this[ 'asyncDispatch' ]( _e );\r
+\r
+ X_AudioSprite_instance[ 'asyncDispatch' ]( _e );\r
\r
console.log( 'AudioSprite - X_EVENT_BACKEND_READY' );\r
\r
- last[ 'listenOnce' ]( X_EVENT_READY, this, X_AudioSprite_backendHandler );\r
+ last[ 'listenOnce' ]( touch && !X_HTMLAudio_durationFix ? X_EVENT_MEDIA_PLAYING : X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler );\r
\r
// READY, needTouchForPlay, needTouchForLoad\r
- if( X_HTMLAudio_durationFix && !X_AudioSprite_needTouchFirst ){\r
+ if( /* X_HTMLAudio_durationFix && */ !touch ){\r
for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){\r
- this[ 'pause' ]( i );\r
+ X_AudioSprite_instance[ 'pause' ]( i );\r
};\r
};\r
\r
return X_CALLBACK_STOP_NOW;\r
\r
case X_EVENT_BACKEND_NONE :\r
- this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler )\r
+ X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler )\r
[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
return X_CALLBACK_STOP_NOW;\r
\r
- case X_EVENT_READY :\r
- if( X_AudioSprite_needTouchAndroid ){\r
- for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){\r
- this[ 'pause' ]( i );\r
- };\r
- e.target[ 'listenOnce' ]( X_EVENT_MEDIA_PLAYING, this, this[ 'asyncDispatch' ], [ X_EVENT_READY ] );\r
- return;\r
- };\r
- \r
+ case X_EVENT_READY : \r
+ case X_EVENT_MEDIA_PLAYING :\r
console.log( 'X.AudioSprite - Ready!' );\r
- this[ 'asyncDispatch' ]( X_EVENT_READY );\r
+ X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_READY );\r
break;\r
};\r
};\r
\r
switch( e.type ){\r
case X_EVENT_MEDIA_PLAYING :\r
- ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING );\r
+ ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING );\r
break;\r
case X_EVENT_MEDIA_WAITING :\r
case X_EVENT_MEDIA_SEEKING :\r
- ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( e.type );\r
+ ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && X_AudioSprite_instance[ 'asyncDispatch' ]( e.type );\r
break;\r
\r
case X_EVENT_MEDIA_BEFORE_LOOP :\r
if( e.target === X_AudioSprite_TEMP.bgmTrack ){\r
X_AudioSprite_TEMP.bgmLooped = true;\r
- this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
+ X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
} else {\r
if( e.target.looped ){\r
- //this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
+ // X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
} else {\r
- this[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid\r
+ X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid\r
};\r
\r
//console.log( '[AudioSprite] bgmPlaying:' + X_AudioSprite_TEMP.bgmPlaying + ' ' + !X_AudioSprite_TEMP.bgmTrack );\r
// single track | iOS\r
if( X_AudioSprite_TEMP.bgmPlaying && !X_AudioSprite_TEMP.bgmTrack ){\r
X_AudioSprite_TEMP.bgmTrack = e.target;\r
- this.play( X_AudioSprite_TEMP.bgmName );\r
+ X_AudioSprite_instance.play( X_AudioSprite_TEMP.bgmName );\r
return X_CALLBACK_PREVENT_DEFAULT;\r
};\r
};\r
break;\r
\r
+ \r
+ case X_EVENT_DEBUG :\r
+ i = X_AudioSprite_TEMP.tracks.indexOf( e.target );\r
+ if( 0 <= i ){\r
+ e[ 'trackID' ] = i;\r
+ X_AudioSprite_instance[ 'dispatch' ]( e );\r
+ };\r
+ break;\r
+ \r
// TODO Android Firefox で アクティブ検出できない!\r
case X_EVENT_VIEW_ACTIVATE :\r
console.log( '■ アクティブ' );\r
X_AudioSprite_TEMP.bgmLooped = false;\r
X_AudioSprite_TEMP.bgmPlaying = false;\r
\r
- X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], this, X_AudioSprite_handleEvent );\r
+ X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_AudioSprite_instance, X_AudioSprite_handleEvent );\r
break;\r
};\r
};\r