\r
// Opera Mobile 12 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する\r
X_HTMLAudio_currentTimeFix = !!X_UA[ 'OperaMobile' ] || !!X_UA[ 'OperaTablet' ],\r
+ // Firefox44.0.2 で音声の再生開始に難あり...\r
+ X_HTMLAudio_playStartFix = X_UA[ 'Windows' ] && X_UA[ 'Gecko' ] === 44,\r
\r
X_HTMLAudio_volumeFix = X_UA[ 'Chrome' ],\r
/*\r
// 8:duration 取得済\r
// :timeupdate イベントで durationFixは完了\r
_durationFixPhase : X_HTMLAudio_durationFix ? 1 : 0,\r
- _lastCurrentTime : 0,\r
+ _lastCurrentTime : 0, // ms\r
\r
_shortPlayFixON : false,\r
_shortPlayFixTime : 0,\r
if( X_HTMLAudio_need1stTouch ){\r
raw.src = source;\r
} else {\r
- // if( this.autoplay ){\r
+ if( this.autoplay ){\r
raw.preload = 'auto';\r
raw.autoplay = true; // Android 4.0-4.1.x で必要\r
//raw.autobuffer = true;\r
- //};\r
+ };\r
raw.src = source;\r
raw.load(); // Android4.1.1 HTL21 では必要!\r
};\r
\r
if( !raw ) return;\r
\r
- //e.type !== 'timeupdate' && console.log( ' > ' + e.type );\r
+ // e.type !== 'timeupdate' && console.log( ' > ' + e.type );\r
\r
switch( e.type ){\r
\r
// opera Android 12 で buffered.end() へのアクセスはエラー try catch も無効、iem9 は常に end(0) = 0\r
if( X_HTMLAudio_progressEnabled && this.duration && this._readyState < 3 ){\r
buf = raw.buffered;\r
- time = 0;\r
- for( i = 0, l = buf.length; i < l; ++i ){\r
+ for( i = time = 0, l = buf && buf.length; i < l; ++i ){\r
time += buf[ 'end' ]( i ) - buf[ 'start' ]( i );\r
};\r
- this.disatcher[ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : time * 1000 / this.duration } );\r
+ this.disatcher[ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : time * 1000 / this.duration * 100 } );\r
};\r
break;\r
\r
if( ( now = this.getActualCurrentTime() ) === this._lastCurrentTime ){\r
eventType = X_EVENT_MEDIA_WAITING;\r
} else\r
+ if( X_HTMLAudio_playStartFix && ( now < this._lastCurrentTime ) ){\r
+ eventType = X_EVENT_MEDIA_WAITING;\r
+ //console.log( '@Firefox44.0.2 !! ' + now + ' / ' + this._lastCurrentTime );\r
+ // Firefox44.0.2 で音声の再生開始に難あり...\r
+ // 20回程度 currentTime の更新に失敗する....\r
+ this.actualPlay();\r
+ } else\r
if( this.playing ){\r
end = X_Audio_getEndTime( this ) + this._shortPlayFixTime;\r
- //console.log( now + ' / ' + end );\r
+\r
+ //console.log( '@ ' + now + ' / ' + this._lastCurrentTime + ' / ' + end );// Firefox44.0.2 で音声の再生開始に難あり...\r
+\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
//case 'ratechange' : // defaultPlaybackRate属性とplaybackRate属性のどちらかが更新された場合に発生\r
//case 'volumechange' : // volume属性とmuted属性のどちらかが変化した場合に発生\r
break;\r
- \r
+\r
+ case 'seeking' : // シークがtrueに変化し、イベントを発生させるのに十分な時間がシーク操作にかかっている場合に発生\r
+ eventType = X_EVENT_MEDIA_SEEKING;\r
+ if( X_HTMLAudio_seekingFixIOS ) this._seekingFixON = true;\r
+ break; \r
case 'seeked' :\r
if( X_HTMLAudio_seekingFixIOS ) this._seekingFixON = false;\r
break;\r
case 'waiting' : // 次のフレームが利用不可のため再生を停止したが、そのフレームがやがて利用可能になると想定している場合に発生\r
eventType = X_EVENT_MEDIA_WAITING;\r
break;\r
- case 'seeking' : // シークがtrueに変化し、イベントを発生させるのに十分な時間がシーク操作にかかっている場合に発生\r
- eventType = X_EVENT_MEDIA_SEEKING;\r
- if( X_HTMLAudio_seekingFixIOS ) this._seekingFixON = true;\r
- break;\r
};\r
\r
// duration は Infinity, NaN, 0 の場合があるため、これを除外する\r
if( this._touchState === 1 ){\r
if( e.type === X_HTMLAudio_playTrigger ){\r
this._touchState = 2;\r
- this.disatcher[ 'asyncDispatch' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD ); \r
+ this.disatcher[ 'asyncDispatch' ]( X_EVENT_MEDIA_WAIT_FOR_TOUCH );\r
};\r
} else\r
if( ended ){\r
\r
actualPlay : function( forcePlay, forceReload ){\r
var raw = this[ '_rawObject' ],\r
- e, begin, end;\r
+ begin, end;\r
\r
if( !raw ) return;\r
\r
};\r
\r
if( this._touchState === 2 ){\r
- e = X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length - 1 ];\r
+ //@dev{\r
+ var e = X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length - 1 ];\r
if( !e || !e[ 'pointerType' ] ){\r
alert( 'タッチイベント以外での play! ' + ( e ? e.type : '' ) );\r
return;\r
};\r
+ //@}\r
this._touchState = 3;\r
} else\r
if( this._readyState !== 3 && this._durationFixPhase < 2 ){\r
end = X_Audio_getEndTime( this );\r
begin = X_Audio_getStartTime( this, end, true );\r
\r
- this._lastCurrentTime = begin / 1000;\r
+ this._lastCurrentTime = begin;\r
\r
if( this._shortPlayFixON ){\r
this._shortPlayFixTime = ( 1000 < end - begin ) ? 200 : 400;\r
\r
// iOS で duration が 0 の時に触ると error\r
// 0 or 8\r
- if( !( this._durationFixPhase % 8 ) && this.duration ) raw.currentTime = this._lastCurrentTime;\r
+ if( !( this._durationFixPhase % 8 ) && this.duration ) raw.currentTime = this._lastCurrentTime / 1000;\r
\r
console.log( '[HTMLAudio] play ' + begin + ' -> ' + end + ' crt:' + ( raw.currentTime | 0 ) + ' last:' + this._lastCurrentTime );\r
\r
getActualCurrentTime : function(){\r
return ( X_HTMLAudio_currentTimeFix ?\r
X_Timer_now() - this._currentFixStart + this._currentFixBegin :\r
- this._seekingFixON ? this._lastCurrentTime * 1000 :\r
+ this._seekingFixON ? this._lastCurrentTime :\r
this[ '_rawObject' ].currentTime * 1000 | 0 );\r
},\r
/*\r
* - volume, muted iPhone(iOS4-6)、Android(2.3.6)では動作せず。\r
* - FireFox3.6, Android 2.3.6については、src変更後、load()を呼び出さないと切り替わらなかった。iPhoneはload()が不要。\r
*/ \r
- detect : function( proxy, source, ext ){\r
+ detect : function( proxy, ext, hash ){\r
+ // TODO hash.CBR\r
+ // 得意度で返す\r
proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : X_Audio_codecs[ ext ] } );\r
},\r
\r