- case 'suspend' : // ブラウザが意図的にコンテンツの取得を現在行っていない場合に発生(ダウンロードは未完了)\r
- case 'abort' : // ダウンロードの完了前にコンテンツの取得を停止した場合に発生(この停止はエラーによるものではない)\r
- case 'error' : // コンテンツの取得実行中にエラーが発生した場合に発生\r
- case 'emptied' : // 読み込み中に致命的なエラーが発生したか、実行状態ででload()メソッドが実行された場合に発生\r
- case 'stalled' : // ブラウザがコンテンツの取得を試みたが、データがまだ用意されていない場合に発生\r
- break;\r
- \r
- \r
- case 'play' : // 再生が開始された。play()メソッドからの復帰後に発生する場合に発生\r
- case 'pause' : // 再生が一時停止された。pauseメソッドからの復帰後に発生する場合に発生\r
- case 'waiting' : // 次のフレームが利用不可のため再生を停止したが、そのフレームがやがて利用可能になると想定している場合に発生\r
- case 'playing' : // 再生が開始された場合に発生 \r
- case 'seeking' : // シークがtrueに変化し、イベントを発生させるのに十分な時間がシーク操作にかかっている場合に発生\r
- case 'seeked' : // シークがfalseに変化した場合に発生\r
- case 'ratechange' : // defaultPlaybackRate属性とplaybackRate属性のどちらかが更新された場合に発生\r
- case 'volumechange' : // volume属性とmuted属性のどちらかが変化した場合に発生\r
- if( this._playForDuration ) return;\r
- break;\r
- \r
- case 'timeupdate' : // 通常の再生が行われ現在の再生位置の変化が起こった場合に発生\r
- // console.log( this._rawObject.currentTime );\r
- if( this._playForDuration ) return; \r
- this._onEnded();\r
- break;\r
- \r
- case 'ended' :\r
- if( X_Audio_HTMLAudioWrapper_currentTimeFix2 ){\r
- delete this._currentTimeFix;\r
- };\r
- if( !this._closed && this.loop ){\r
- this.looped = true;\r
- ( this.proxy.dispatch( 'looped' ) & X.Callback.PREVENT_DEFAULT ) || this.play();\r
- } else {\r
- this._timerID && X.Timer.remove( this._timerID );\r
- this.seekTime = 0;\r
- delete this._timerID;\r
- delete this.playing;\r
+ // TODO firefox で 短い音声でtimeupdate, ended が発火しない <- 最後の音に無音部分を追加する\r
+ case 'timeupdate' : // 通常の再生が行われ現在の再生位置の変化が起こった場合に発生\r
+ if( this._seekingFixON ){\r
+ eventType = X_EVENT_MEDIA_SEEKING;\r
+ } else\r
+ if( this._durationFixPhase === 8 ){\r
+ this._durationFixPhase = 0;\r
+ this._readyState |= 1;\r
+ } else\r
+ if( this._durationFixPhase === 4 ){ // 1 or 2\r
+ duration = raw.duration;\r
+ eventType = X_EVENT_MEDIA_WAITING;\r
+ } else\r
+ if( this._touchState === 3 && !X_HTMLAudio_durationFix ){\r
+ this._touchState = 0;\r
+ this._readyState |= 1;\r
+ } else\r
+ if( ( now = this.getActualCurrentTime() ) === this._lastCurrentTime ){\r
+ eventType = X_EVENT_MEDIA_WAITING;\r
+ } else\r
+ if( this.playing ){\r
+ end = X_Audio_getEndTime( this ) + this._shortPlayFixTime;\r
+ //console.log( now + ' / ' + end );\r
+ if( ( 0 + end <= 0 + now ) || // 0+ なぜか iem9 で必要,,,\r
+ ( now < this._lastCurrentTime && now < 2000 ) ){\r
+ //( ( X_HTMLAudio_endedFixAOSP2 || X_HTMLAudio_endedFixAOSP4 ) && ( now < this._lastCurrentTime && now < 1000 ) ) ){\r
+ // loop して0付近に戻った場合\r
+ // iOS8.4 ではこのタイミングで now が last より 0.1秒後退している場合がある\r
+ // iOS7.1 ではもっと小さい場合がある,,,\r
+ if( this.autoLoop ){\r
+ console.log( '☆★☆ 曲の最後に到達 @timeupdate now-end:' + ( now - end ) + ' now:' + now + ' last:' + this._lastCurrentTime );\r
+ ended = true;\r
+ //if( X_HTMLAudio_endedFixIOS ) actualEnded = true;\r
+ } else {\r
+ this.actualPause();\r
+ eventType = X_EVENT_MEDIA_ENDED;\r
+ };\r
+ } else {\r
+ eventType = X_EVENT_MEDIA_PLAYING;\r
+ };\r
+ this._lastCurrentTime = now;\r