OSDN Git Service

Version 0.6.181, fix X.UA & X.HTMLAudio & X.AudioSprite.
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 02_XHTMLAudio.js
index 10a5bfd..1ab50db 100644 (file)
@@ -17,6 +17,9 @@
  * memo\r
  * 1. AOSP4.1 iframe 内の Audio は親に focus が移っても再生を継続する\r
  * 2. AOSP oggはシークが乱れる m4a, mp3 は優秀\r
+ * \r
+ * http://unolabo.boo.jp/archives/2011/06/13-iphone%E3%81%AEaudio%E5%91%A8%E3%82%8A%E3%81%AE%E3%83%A1%E3%83%A2.html\r
+ * 【JS】iPhoneのAudio周りのメモ iOS4.0 と 4.2 の違い\r
  */\r
        /*\r
         * durationFix\r
@@ -59,13 +62,13 @@ var
        // Gecko PC + Android でseek時に再生がしばしば止まる問題の修正\r
        X_HTMLAudio_needPlayForSeek = X_UA[ 'Gecko' ],\r
        // \r
-       X_HTMLAudio_pauseFix            = ( X_UA[ 'Windows' ] && 12 <= X_UA[ 'Opera' ] && 0 < ' XP XPSP2 2003|XP64'.indexOf( X_UA[ 'Windows' ] ) ), // XP + Opera12 のみ?\r
+       X_HTMLAudio_pauseFix            = 12 <= X_UA[ 'Opera' ] && 0 < ' XP XPSP2 2003|XP64'.indexOf( X_UA[ 'Windows' ] ), // XP + Opera12 のみ?\r
 \r
-       X_HTMLAudio_need1stTouch        = X_UA[ 'iOS' ] || 4 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ] || X_UA[ 'WinPhone' ] || ( X_UA[ 'Blink' ] && X_UA[ 'Android' ] ),\r
+       X_HTMLAudio_need1stTouch        = X_UA[ 'iOS' ] || 4.2 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ] || X_UA[ 'WinPhone' ] || ( X_UA[ 'Blink' ] && X_UA[ 'Android' ] ),\r
        \r
        X_HTMLAudio_playTrigger     = ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) ? 'canplay' : X_UA[ 'iOS' ] ? 'suspend' : X_UA[ 'Blink' ] ? 'stalled' : 'canplaythrough',\r
        \r
-       X_HTMLAudio_durationFix     = X_UA[ 'iOS' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'Windows' ] && 12 <= X_UA[ 'Opera' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
+       X_HTMLAudio_durationFix     = X_UA[ 'iOS' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) || ( X_UA[ 'Windows' ] && 12 <= X_UA[ 'Opera' ] ),\r
        \r
        X_HTMLAudio_shortPlayFix        = X_UA[ 'AOSP' ]; // Android 4.1.1 でも遭遇\r
 \r
@@ -77,7 +80,7 @@ if( X_Audio_constructor ){
                {\r
                        _closed               : true,\r
                        _loaded               : false,\r
-                       _ready            : false,              \r
+                       _ready            : false,\r
                        _src                      : '',\r
                        \r
                        _touchRequested   : false,\r
@@ -118,12 +121,20 @@ if( X_Audio_constructor ){
                                        raw.style.cssText         = 'position:absolute;bottom:0;left:-50px;width:100px;height:100px;opacity:0;';\r
                                        raw.controls              = false;\r
                                        raw.WebKitPlaysInline = true;\r
-                                       raw.src                       = source;\r
                                        X_elmBody.appendChild( raw );\r
                                } else {\r
-                                       raw = X_TEMP.rawAudio || new X_Audio_constructor( source );\r
+                                       raw = X_TEMP.rawAudio || new X_Audio_constructor( '' );\r
                                        // X_Doc_create( 'audio', { src : source } )[ 'appendTo' ]( X.Doc.body );\r
-                                       raw.autobuffer = raw.autoplay = false;\r
+                                       \r
+                                       raw.preload  = 'auto';\r
+                                       //if( X_UA[ 'AOSP' ] < 4.2 ){\r
+                                               raw.autoplay = true; //raw.autobuffer = true; // Android 4.0-4.1.x で必要\r
+                                       //} else {\r
+                                       //      raw.autoplay = raw.autobuffer = false;\r
+                                       //};\r
+                                       //raw.autoplay = raw.autobuffer = raw.loop = false; // loop を使えば ended で止まること回避できるかも 但し ended イベントが起きなくなる\r
+                                       \r
+                                       if( X_TEMP.rawAudio ) delete X_TEMP.rawAudio;\r
                                };\r
                                \r
                                this[ '_rawObject' ] = raw;\r
@@ -139,7 +150,6 @@ if( X_Audio_constructor ){
                                                'playing', 'waiting', 'seeking',\r
                                                'durationchange', 'timeupdate', 'ended' ] );\r
 \r
-\r
                                this[ 'listen' ]( [\r
                                                'loadstart', 'load',\r
                                                'progress', 'error',\r
@@ -149,11 +159,8 @@ if( X_Audio_constructor ){
                                                'playing', 'waiting', 'seeking',\r
                                                'durationchange', 'timeupdate', 'ended' ], this.onDebug );\r
 \r
-                               if( X_TEMP.rawAudio ){\r
-                                       raw.src = source;\r
-                                       X_UA[ 'AOSP' ] < 3 && raw.load();\r
-                                       delete X_TEMP.rawAudio;\r
-                               };\r
+                               raw.src = source;\r
+                               raw.load(); // Android4.1.1 HTL21 では必要!\r
                        },\r
                        \r
                        onDebug : function( e ){\r
@@ -161,7 +168,7 @@ if( X_Audio_constructor ){
                                        type       : X_EVENT_DEBUG,\r
                                        'rawEvent' : e.type,\r
                                        current    : this.getActualCurrentTime() | 0,\r
-                                       duration   : this.duration | 0 } );\r
+                                       duration   : this[ '_rawObject' ].duration } );\r
                        },\r
                        \r
                        handleEvent : function( e ){\r
@@ -230,15 +237,15 @@ if( X_Audio_constructor ){
                                                if( this._durationFixPhase & 3 ){ // 1 or 2\r
                                                        duration = raw.duration;\r
                                                } else\r
-                                               if( this.getActualCurrentTime() === this._lastCurrentTime ){\r
+                                               if( ( now = this.getActualCurrentTime() ) === this._lastCurrentTime ){\r
                                                        eventType = X_EVENT_MEDIA_WAITING;\r
                                                } else {\r
-                                                       this._lastCurrentTime = this.getActualCurrentTime();\r
+                                                       this._lastCurrentTime = now; // *1 rm\r
 \r
                                                        if( this.playing ){\r
                                                                end = X_Audio_getEndTime( this ) + this._shortPlayFixTime;\r
-                                                               now = this.getActualCurrentTime();\r
                                                                //console.log( now + ' / ' + end );\r
+                                                               // || now < this._lastCurrentTime // loop した場合\r
                                                                if( 0 + end <= 0 + now ){ // 0+ なぜか iem9 で必要,,,\r
                                                                        if( this.autoLoop ){\r
                                                                                console.log( '☆★☆ 曲の最後に到達 @timeupdate now-end:' + ( now - end ) );\r
@@ -250,6 +257,7 @@ if( X_Audio_constructor ){
                                                                        };\r
                                                                } else {\r
                                                                        eventType = X_EVENT_MEDIA_PLAYING;\r
+                                                                       // *1 this._lastCurrentTime = now;\r
                                                                };\r
                                                        };\r
                                                };\r
@@ -272,9 +280,9 @@ if( X_Audio_constructor ){
                                                if( X_HTMLAudio_volumeFix ){\r
                                                        raw.volume = this.gain;\r
                                                };\r
-                                               if( X_HTMLAudio_currentTimeFix && !this._currentFixStart ){\r
+                                               //if( X_HTMLAudio_currentTimeFix && !this._currentFixStart ){\r
                                                        //this._currentFixStart = X_Timer_now(); // 正確な再生開始時間に補正\r
-                                               };\r
+                                               //};\r
                                                eventType = !this._durationFixSkip && !this._endedFixON ? X_EVENT_MEDIA_PLAYING : X_EVENT_MEDIA_WAITING;\r
                                        //case 'play' :            //   再生が開始された。play()メソッドからの復帰後に発生する場合に発生\r
                                        //case 'pause' :                  //    再生が一時停止された。pauseメソッドからの復帰後に発生する場合に発生\r
@@ -444,16 +452,18 @@ if( X_Audio_constructor ){
                        },\r
                        \r
                        actualPause : function(){\r
+                               var raw = this[ '_rawObject' ];\r
+                               \r
                                console.log( '[HTMLAudio] pause' );\r
                                \r
                                this.seekTime = this.getActualCurrentTime();\r
 \r
                                delete this._currentFixStart;\r
 \r
-                               !this[ '_rawObject' ].error && this[ '_rawObject' ].pause();\r
+                               !raw.error && raw.pause();\r
                                \r
                                if( X_HTMLAudio_pauseFix ){\r
-                                       this[ '_rawObject' ].src = '';\r
+                                       raw.src = '';\r
                                        if( X_HTMLAudio_durationFix ){\r
                                                delete this._durationFixPhase;\r
                                                delete this._durationFixSkip;\r