- if( X_Audio_HTMLAudio_playTrigger === e.type || ( X_UA.AndroidBrowser2 && e.type === 'loadeddata' ) || loaded ){\r
- !this._loaded && this.autoplay && X.Timer.once( 16, this, this.play );\r
- this._loaded = true;\r
- console.log( 'Loaded! ' + e.type );\r
+ // duration は Infinity, NaN, 0 の場合があるため、これを除外する\r
+ // chrome18 for Android は duration = 100 の間はシークができない? 28 は可能\r
+ if( 0 < duration && X_Type_isFinite( duration ) && duration !== 100 ){\r
+ this.duration = duration * 1000;\r
+\r
+ if( this._durationFixPhase === 4 ){\r
+ console.log( '▼ DurationFix の終了 @' + e.type );\r
+ this._durationFixPhase = 8;\r
+ \r
+ if( this.autoplay || this._playReserved ){\r
+ console.log( '☆ 再生 <- DurationFix の終了' );\r
+ this.actualPlay();\r
+ } else\r
+ if( X_HTMLAudio_pauseFix ){\r
+ console.log( '☆ PAUSE <- DurationFix の終了' );\r
+ this.actualPause();\r
+ };\r
+ } else\r
+ if( this._durationFixPhase & 3 ){ // === 1 | 2\r
+ this._durationFixPhase = 8;\r
+ }; \r
+ };\r
+\r
+ //\r
+ if( this._touchState === 1 ){\r
+ if( e.type === X_HTMLAudio_playTrigger ){\r
+ this._touchState = 2;\r
+ this.disatcher[ 'asyncDispatch' ]( X_EVENT_MEDIA_WAIT_FOR_TOUCH );\r
+ };\r
+ } else\r
+ if( ended ){\r
+ if( this.autoLoop ){\r
+ if( !( this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
+ this.looped = true;\r
+ this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED );\r
+ this.actualPlay( X_HTMLAudio_endedFixCWV && actualEnded, X_HTMLAudio_endedFixAOSP3 && actualEnded );\r
+ };\r
+ } else {\r
+ this.seekTime = 0;\r
+ delete this.playing;\r
+ this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
+ };\r
+ } else\r
+ if( this._readyState === 1 && this.duration ){\r
+ this._readyState |= 2;\r
+ this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY );\r
+ console.log( '> Audio Loaded!! ' + e.type + ' d:' + ( this.duration | 0 ) );\r
+ } else\r
+ if( eventType ){\r
+ this.disatcher[ 'dispatch' ]( eventType );\r