OSDN Git Service

Version 0.6.217, add #switch for X.Audio.
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 02_XHTMLAudio.js
index 80723b9..1c88ae5 100644 (file)
@@ -54,6 +54,8 @@ var
        \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
@@ -107,7 +109,7 @@ if( X_Audio_constructor ){
                        // 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
@@ -175,11 +177,11 @@ if( X_Audio_constructor ){
                                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
@@ -203,7 +205,7 @@ if( X_Audio_constructor ){
                                \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
@@ -227,11 +229,10 @@ if( X_Audio_constructor ){
                                                // 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
@@ -278,9 +279,18 @@ if( X_Audio_constructor ){
                                                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
@@ -328,7 +338,11 @@ if( X_Audio_constructor ){
                                        //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
@@ -336,10 +350,6 @@ if( X_Audio_constructor ){
                                        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
@@ -369,7 +379,7 @@ if( X_Audio_constructor ){
                                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
@@ -397,7 +407,7 @@ if( X_Audio_constructor ){
 \r
                        actualPlay : function( forcePlay, forceReload ){\r
                                var raw = this[ '_rawObject' ],\r
-                                       e, begin, end;\r
+                                       begin, end;\r
 \r
                                if( !raw ) return;\r
                                \r
@@ -415,11 +425,13 @@ if( X_Audio_constructor ){
                                };\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
@@ -436,7 +448,7 @@ if( X_Audio_constructor ){
                                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
@@ -467,7 +479,7 @@ if( X_Audio_constructor ){
 \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
@@ -507,7 +519,7 @@ if( X_Audio_constructor ){
                        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
@@ -568,7 +580,9 @@ if( X_Audio_constructor ){
                 *  - 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