X_AudioSprite_lengthSilence = 10000, // 一番最初の無音部分の長さ\r
X_AudioSprite_lengthDistance = 5000, // 音間の無音の長さ\r
X_AudioSprite_uid = 0,\r
- X_AudioSprite_members = {},\r
X_AudioSprite_TEMP = {\r
presets : {},\r
BGMs : {},\r
bgmLooped : false,\r
bgmPlaying : false\r
},\r
- X_AudioSprite_instance,\r
+ X_AudioSprite,\r
X_AudioSprite_numTracks,\r
X_AudioSprite_useVideo;\r
\r
urls = setting[ 'urls' ],\r
video = setting[ 'useVideo' ],\r
n = video ? 1 : setting[ 'numTracks' ] || 1,\r
- option = {\r
- volume : setting[ 'volume' ] || 0.5,\r
- autoplay : true,\r
- startTime : 0,\r
- endTime : X_AudioSprite_lengthSilence,\r
- loop : true\r
- },\r
- k, i, v, track; \r
+ volume = setting[ 'volume' ],\r
+ k, i, v, track;\r
\r
- if( !X_AudioSprite_instance ){\r
- X_AudioSprite_instance = X_Class_override( X_EventDispatcher(), X_AudioSprite_members );\r
- X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_AudioSprite_instance, X_AudioSprite_handleEvent );\r
+ if( !X_AudioSprite ){\r
+ X_AudioSprite = X_Class_override( X_EventDispatcher(), X_AudioSprite_members );\r
+ X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite, X_AudioSprite_handleEvent );\r
};\r
\r
n = n <= X_AudioSprite_maxTracks ? n : X_AudioSprite_maxTracks;\r
};\r
};\r
\r
- X_Audio_startDetectionBackend( X_Audio_BACKENDS[ 0 ], X_AudioSprite_instance, X_Array_copy( urls ), option );\r
+ X_Audio_startDetectionBackend(\r
+ X_Audio_BACKENDS[ 0 ],\r
+ X_AudioSprite,\r
+ X_Array_copy( urls ),\r
+ {\r
+ 'volume' : 0 <= volume && volume <= 1 ? volume : 1,\r
+ 'autoplay' : true,\r
+ 'startTime' : 0,\r
+ 'endTime' : X_AudioSprite_lengthSilence,\r
+ 'loop' : true\r
+ });\r
\r
- X_AudioSprite_instance[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], X_AudioSprite_backendHandler );\r
- X_AudioSprite_instance[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_AudioSprite_handleEvent );\r
+ X_AudioSprite[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], X_AudioSprite_backendHandler );\r
+ X_AudioSprite[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_AudioSprite_handleEvent );\r
\r
X_AudioSprite_useVideo = video;\r
- X_AudioSprite_numTracks = X_AudioSprite_instance[ 'numTracks' ] = n;\r
+ X_AudioSprite_numTracks = X_AudioSprite[ 'numTracks' ] = n;\r
\r
- return X_AudioSprite_instance;\r
+ return X_AudioSprite;\r
};\r
\r
X[ 'AudioSprite' ][ 'shouldUse' ] = X_AudioSprite_shouldUse;\r
// TODO 終わりかけのもの、と一番古いもの、どちらを再利用するか?これ以上に細かい実装を望む場合は X.AudioSprite は使わず自力で実装\r
function X_AudioSprite_getTrackEnded(){\r
var tracks = X_AudioSprite_TEMP.tracks,\r
- l = tracks.length,\r
+ l = X_AudioSprite_numTracks,\r
i = 0, track, state, last = 1 / 0, _last, index;\r
\r
for( ; i < l; ++i ){\r
return tracks[ index ];\r
};\r
\r
-X_AudioSprite_members =\r
+var X_AudioSprite_members =\r
/** @lends X.AudioSprite.prototype */\r
{\r
/**\r
'numTracks' : 0,\r
\r
/**\r
- * モバイル用タッチイベント中に呼び出す\r
- */\r
- 'on1stTouch' : function(){\r
- var i = 0, l = X_AudioSprite_TEMP.tracks.length;\r
-\r
- for( ; i < l; ++i ){\r
- //if( X_UA[ 'iOS' ] ){\r
- // X_AudioSprite_TEMP.tracks[ i ][ '_rawObject' ].load();\r
- //} else {\r
- X_AudioSprite_instance[ 'pause' ]( i );\r
- //};\r
- };\r
- },\r
- \r
- /**\r
* 再生\r
* @param {string} name トラック名\r
* @return {number} uid\r
if( bgm ){\r
track = bgm;\r
} else\r
- if( 1 < tracks.length ){\r
+ if( 1 < X_AudioSprite_numTracks ){\r
track = X_AudioSprite_TEMP.bgmTrack = X_AudioSprite_getTrackEnded();\r
} else {\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 ], X_AudioSprite_instance, 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, X_AudioSprite_handleEvent ).playing ){\r
track.setState({\r
'loop' : true,\r
'looped' : X_AudioSprite_TEMP.bgmLooped,\r
};\r
\r
} else {\r
- if( 1 < tracks.length ){\r
+ if( 1 < X_AudioSprite_numTracks ){\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 ], X_AudioSprite_instance, X_AudioSprite_handleEvent )\r
+ [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite, 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 ], X_AudioSprite_instance, 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, X_AudioSprite_handleEvent ).playing ){\r
track.setState({\r
'loop' : true,\r
'looped' : false,\r
- //'currentTime' : preset[ 0 ],\r
+ 'currentTime' : preset[ 0 ],\r
'startTime' : preset[ 0 ],\r
'endTime' : preset[ 1 ],\r
'loopStartTime' : 0,\r
},\r
\r
/**\r
- * ポーズ\r
- * @param {number} uid トラックID\r
- * @return {number} uid\r
+ * ポーズ, uid を指定しない、または '*' で呼び出した場合、全てのトラックを pause する。\r
+ * @param {number} uid=undefined トラックID, '*'\r
+ * @return {AudioSprite}\r
*/\r
'pause' : function( uid ){\r
- var track = X_AudioSprite_TEMP.tracks[ uid ];\r
+ var tracks = X_AudioSprite_TEMP.tracks,\r
+ i, l, track;\r
\r
- if( X_AudioSprite_TEMP.bgmTrack === track ){\r
- X_AudioSprite_TEMP.bgmPosition = track.currentTime();\r
- X_AudioSprite_TEMP.bgmPlaying = false;\r
- X_AudioSprite_TEMP.bgmTrack = null;\r
+ if( uid === '*' || uid === undefined ){\r
+ for( i = 0, l = X_AudioSprite_numTracks; i < l; ++i ){\r
+ X_AudioSprite[ 'pause' ]( i );\r
+ };\r
+ } else\r
+ if( track = tracks[ uid ] ){\r
+ if( X_AudioSprite_TEMP.bgmTrack === track ){\r
+ X_AudioSprite_TEMP.bgmPosition = track.currentTime();\r
+ X_AudioSprite_TEMP.bgmPlaying = false;\r
+ X_AudioSprite_TEMP.bgmTrack = null;\r
+ };\r
+ track.play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence );\r
+ track.seek( 0 );\r
+ X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED ); \r
};\r
- track && track.play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence );\r
- track && track.seek( 0 );\r
- X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED );\r
- return X_AudioSprite_instance;\r
+ return X_AudioSprite;\r
},\r
\r
/**\r
- * シーク\r
+ * シーク, 現在のトラックの長さ内で相対指定する\r
* @param {number} uid トラックID\r
* @param {number} position ms\r
* @return {AudioSprite}\r
start = X_Audio_getStartTime( track, end );\r
0 <= position && position <= ( end - start ) && track.seek( start + position );\r
};\r
- return X_AudioSprite_instance;\r
+ return X_AudioSprite;\r
},\r
\r
/**\r
if( opt_volume === undefined ){\r
return X_AudioSprite_TEMP.volume;\r
};\r
- for( i = X_AudioSprite_TEMP.tracks.length; i; ){\r
+ for( i = X_AudioSprite_numTracks; i; ){\r
X_AudioSprite_TEMP.tracks[ --i ].volume( opt_volume );\r
};\r
- return X_AudioSprite_instance;\r
+ return X_AudioSprite;\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 X_AudioSprite_instance;\r
+ return X_AudioSprite;\r
},\r
\r
/**\r
return { 'volume' : X_AudioSprite_TEMP.volume, 'playing' : false };\r
};\r
track && track.setState( opt_obj );\r
- return X_AudioSprite_instance;\r
+ return X_AudioSprite;\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, track;\r
\r
switch( e.type ){\r
case X_EVENT_BACKEND_READY :\r
backend = X_Audio_BACKENDS[ e[ 'backendID' ] ];\r
option = e[ 'option' ];\r
\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
+ X_AudioSprite[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler );\r
+ X_AudioSprite[ 'source' ] = src = e[ 'source' ];\r
+ X_AudioSprite[ 'backendName' ] = name = backend.backendName;\r
\r
//console.log( i + ' / ' + X_AudioSprite_numTracks );\r
\r
for( i = 0; i < X_AudioSprite_numTracks; ++i ){\r
if( X_AudioSprite_useVideo || ( i === 1 && X_AudioSprite_useVideoForMulti ) ){\r
+ option = X_Object_deepCopy( option );\r
option[ 'useVideo' ] = true;\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 )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite_instance, X_AudioSprite_handleEvent ) );\r
+ X_AudioSprite_TEMP.tracks.push(\r
+ last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite, X_AudioSprite_handleEvent ) );\r
};\r
\r
_e = {\r
'backendName' : name\r
};\r
// touch 可能で backend ready\r
- \r
- if( name === 'WebAudio' ){\r
- if( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch ){\r
- last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_instance[ 'asyncDispatch' ], [ _e ] );\r
- } else {\r
- X_AudioSprite_instance[ 'asyncDispatch' ]( _e );\r
- };\r
- last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler );\r
+ // WebAudio\r
+ if( backend.backendID === 1 && ( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch ) ){\r
+ last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite, X_AudioSprite[ 'asyncDispatch' ], [ _e ] );\r
} else\r
- if( name === 'HTMLAudio' ){\r
- if( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ){\r
- last[ 'listenOnce' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD, X_AudioSprite_instance, X_AudioSprite_instance[ 'asyncDispatch' ], [ _e ] );\r
- last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler );\r
- } else {\r
- X_AudioSprite_instance[ 'asyncDispatch' ]( _e );\r
- last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler );\r
- \r
- // READY, needTouchForPlay, needTouchForLoad\r
- if( X_HTMLAudio_durationFix ){\r
- for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){\r
- X_AudioSprite_instance[ 'pause' ]( i );\r
- };\r
- };\r
- };\r
- \r
+ // HTMLAudio\r
+ if( backend.backendID === 2 && ( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ) ){\r
+ last[ 'listenOnce' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD, X_AudioSprite, X_AudioSprite[ 'asyncDispatch' ], [ _e ] );\r
} else {\r
- X_AudioSprite_instance[ 'asyncDispatch' ]( _e );\r
- \r
- console.log( 'AudioSprite - X_EVENT_BACKEND_READY' );\r
- \r
- last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler );\r
+ X_AudioSprite[ 'asyncDispatch' ]( _e );\r
};\r
+ \r
+ last[ 'listenOnce' ]( X_EVENT_READY, X_AudioSprite, X_AudioSprite_backendHandler );\r
return X_CALLBACK_STOP_NOW;\r
\r
case X_EVENT_BACKEND_NONE :\r
- X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler )\r
+ X_AudioSprite[ 'unlisten' ]( X_EVENT_BACKEND_READY, X_AudioSprite, X_AudioSprite_backendHandler )\r
[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
return X_CALLBACK_STOP_NOW;\r
\r
case X_EVENT_READY :\r
console.log( 'X.AudioSprite - Ready!' );\r
- for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){\r
- X_AudioSprite_instance[ 'pause' ]( i );\r
+ for( i = 0; i < X_AudioSprite_numTracks; ++i ){\r
+ track = X_AudioSprite_TEMP.tracks[ i ];\r
+ ( track.autoplay || track._playReserved ) && track.actualPlay();\r
+ delete track._playReserved;\r
};\r
- X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_READY );\r
+ X_AudioSprite[ '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 ) && X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING );\r
+ ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && X_AudioSprite[ '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 ) && X_AudioSprite_instance[ 'asyncDispatch' ]( e.type );\r
+ ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && X_AudioSprite[ '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
- X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
+ X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
} else {\r
if( e.target.looped ){\r
- // X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
+ // X_AudioSprite[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
} else {\r
- X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid\r
+ X_AudioSprite[ '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
- X_AudioSprite_instance.play( X_AudioSprite_TEMP.bgmName );\r
+ X_AudioSprite.play( X_AudioSprite_TEMP.bgmName );\r
return X_CALLBACK_PREVENT_DEFAULT;\r
};\r
};\r
i = X_AudioSprite_TEMP.tracks.indexOf( e.target );\r
if( 0 <= i ){\r
e[ 'trackID' ] = i;\r
- X_AudioSprite_instance[ 'dispatch' ]( e );\r
+ X_AudioSprite[ 'dispatch' ]( e );\r
};\r
break;\r
\r
console.log( '■ デアクティブ' );\r
// track.pause();\r
tracks = X_AudioSprite_TEMP.tracks;\r
- i = tracks.length;\r
+ i = X_AudioSprite_numTracks;\r
for( ; i; ){\r
track = tracks[ --i ];\r
track.playing && X_AudioSprite_TEMP.pauseTracks.push( track ) && track.pause();\r
};\r
break;\r
\r
+ case X_EVENT_UNLOAD :\r
+ console.log( '■ unload' );\r
+ \r
case X_EVENT_KILL_INSTANCE :\r
- \r
while( X_AudioSprite_TEMP.tracks.length ){\r
X_AudioSprite_TEMP.tracks.pop()[ 'kill' ]();\r
};\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 ], X_AudioSprite_instance, X_AudioSprite_handleEvent );\r
+ X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE, X_EVENT_UNLOAD ], X_AudioSprite, X_AudioSprite_handleEvent );\r
break;\r
};\r
};\r