OSDN Git Service

Version 0.6.170, X.Audio is working ADVANCED_OPTIMIZATIONS.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 5 Aug 2015 05:31:21 +0000 (14:31 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 5 Aug 2015 05:31:21 +0000 (14:31 +0900)
14 files changed:
0.6.x/css/xui.css
0.6.x/index.html
0.6.x/js/01_core/02_XUA.js
0.6.x/js/01_core/13_XClass.js
0.6.x/js/01_core/15_XEventDispatcher.js
0.6.x/js/02_dom/10_XNodeAnime.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/07_audio/00_XAudio.js
0.6.x/js/07_audio/01_XWebAudio.js
0.6.x/js/07_audio/02_XHTMLAudio.js
0.6.x/js/07_audio/03_XSilverlightAudio.js
0.6.x/js/07_audio/10_XAudioSprite.js
0.6.x/js/20_ui/20_Root.js [moved from 0.6.x/js/20_ui/20_PageRoot.js with 87% similarity]
0.6.x/js/main.js

index 96374b9..cfebdab 100644 (file)
                font-family: 'MS Pゴシック',sans-serif;\r
        }\r
 \r
-.PageRoot {\r
+.Root {\r
        height   : 100%;\r
 }\r
 \r
-.PageRoot,\r
-.PageRoot div {\r
+.Root,\r
+.Root div {\r
 /* 要素は絶対配置される */\r
        position           : absolute;\r
        top                : 0;\r
        white-space        : -moz-pre-wrap; /* Mozilla */\r
        /* white-space : -hp-pre-wrap;  HP Printers */   \r
 }\r
-.IE5x .PageRoot, .IE5x .PageRoot div,\r
-.IE6  .PageRoot, .IE6  .PageRoot div,\r
-.IE7  .PageRoot, .IE7  .PageRoot div, {\r
+.IE5x .Root, .IE5x .Root div,\r
+.IE6  .Root, .IE6  .Root div,\r
+.IE7  .Root, .IE7  .Root div, {\r
        word-break  : break-all;  /* ie5+ */\r
 }\r
-.IE .PageRoot, .IE .PageRoot div {\r
+.IE .Root, .IE .Root div {\r
        white-space : normal/* ie系では、 float要素へ回り込みする、 white-space の効いているテキストの位置が狂う */\r
 }\r
 \r
index 43d4c63..b66af41 100644 (file)
@@ -30,7 +30,7 @@
 <script type="text/javascript" src="js/20_ui/16_Repeater.js"></script>\r
 <script type="text/javascript" src="js/20_ui/17_List.js"></script>\r
 <script type="text/javascript" src="js/20_ui/17_Text.js"></script>\r
-<script type="text/javascript" src="js/20_ui/20_PageRoot.js"></script>\r
+<script type="text/javascript" src="js/20_ui/20_Root.js"></script>\r
 \r
 <script type="text/javascript" src="js/onReachEndOfScript.js"></script>\r
 \r
index b99223a..3ce9532 100644 (file)
@@ -545,7 +545,7 @@ var X_UA = X[ 'UA' ] = {},
                 * @type {number}\r
                 */\r
                X_UA[ 'AndroidWebkit' ] = i;\r
-               alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i );\r
+               //alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i );\r
                \r
        } else\r
        if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
index 45747b1..6cf56b8 100644 (file)
@@ -92,7 +92,7 @@ X_Class_CommonMethods =
                        };\r
 \r
                        if( this[ 'instanceOf' ]( Node ) ){\r
-                               console.log( 'KILL : ' + this.call( 'outerHTML' ) );\r
+                               // console.log( 'KILL : ' + this.call( 'outerHTML' ) );\r
                                X_Node_onKill( this );\r
                        };\r
 \r
index 5a5b17d..91e10b8 100644 (file)
@@ -15,7 +15,7 @@
  * <dd>dispatch 中か?さらにインスタンス自身の dispatch がネストした場合、その深さを記憶します。\r
  * <dt>2:RESERVES Array\r
  * <dd>イベント発火中に listen() が呼ばれた場合に引数を蓄え、完了時(DISPATCHING===0)に再度 listen() するための一時ストアです。\r
- * <dt>3:UNLISTENS Array\r
+ * <dt>3:UNLISTENS Object\r
  * <dd>イベント発火中に unlisten() が呼ばれた場合に対象リスナを記憶し、リスナが呼ばれないようにします。完了時(DISPATCHING===0)に再度 unlisten() します。\r
  * <dt>4:KILL_RESERVED boolean\r
  * <dd>dispatch 中に kill() が呼ばれた場合に一旦 kill をキャンセルし、完了時(DISPATCHING===0)に再度 kill() するためのフラグです。\r
@@ -176,7 +176,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                                if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
                                if( opt_arg1 === undefined ) return X_EventDispatcher_needsIndex ? 0 : true;\r
                                \r
-                               // TODO callbackHash か?判定が不十分!\r
+                               // TODO callbackHash か?判定が不十分! skipConvertion\r
                                if( opt_arg1.kind ){\r
                                        cbHash = opt_arg1;\r
                                } else {\r
@@ -189,6 +189,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                                                if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.name === cbHash.name && f.supplement === cbHash.supplement && f.lock === lock ) ) return false;\r
                                        };\r
                                };\r
+                               \r
                                for( i = list.length; i; ){\r
                                        f = list[ --i ];\r
                                        if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.name === cbHash.name && f.supplement === cbHash.supplement && f.lock === lock ) ){\r
@@ -215,6 +216,9 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                                        e = delay;\r
                                        delay = 0;\r
                                };\r
+                               //{+dev\r
+                               delay === undefined && eval( 'throw "asyncDispatch で undefined イベントが指定されました"' );\r
+                               //}+dev\r
                                timerID = X_Timer_add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] );\r
                                X_EventDispatcher_LAZY_TIMERS[ timerID ] = this;\r
                                return timerID;\r
@@ -255,22 +259,24 @@ function X_EventDispatcher_dispatch( e ){
        } else {\r
                listeners[ X_LISTENERS_DISPATCHING ] = 1;\r
        };\r
-       \r
-       // todo:\r
-       // type も保存\r
-       listeners[ X_LISTENERS_UNLISTENS ] = listeners[ X_LISTENERS_UNLISTENS ] || {};\r
-       unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
+\r
+       //listeners[ X_LISTENERS_UNLISTENS ] = listeners[ X_LISTENERS_UNLISTENS ] || {};\r
+       //unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
        \r
        for( i = 0; i < list.length; ++i ){\r
                f = list[ i ];\r
+               // TODO removed フラグは?\r
+               if( f.removed ) continue;\r
+               /*\r
                if( !unlistens ){\r
                        unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
                };\r
                if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
+               */\r
                \r
-               r = X_Closure_proxyCallback( f, args || ( args = [ e ] ) ) || 0;\r
+               r = X_Closure_proxyCallback( f, args || ( args = [ e ] ) );\r
                \r
-               if( f.once || r & X_CALLBACK_UN_LISTEN ){\r
+               if( f.once || ( r & X_CALLBACK_UN_LISTEN ) ){\r
                        // dispatch 中に unlisten が作られることがある\r
                        if( !unlistens ){\r
                                unlistens = listeners[ X_LISTENERS_UNLISTENS ] || ( listeners[ X_LISTENERS_UNLISTENS ] = {} );\r
@@ -455,13 +461,17 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
 \r
        f = ( list = listeners[ opt_type ] )[ i ];\r
        \r
-       if( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ){\r
+       if( listeners[ X_LISTENERS_DISPATCHING ] ){\r
+               unlistens = listeners[ X_LISTENERS_UNLISTENS ] || ( listeners[ X_LISTENERS_UNLISTENS ] = {} );\r
                // _unlistens に入っている callbackHash は、lock のチェックは済んでいる\r
                ( unlistens = unlistens[ opt_type ] ) ?\r
                        ( unlistens[ unlistens.length ] = f ) :\r
                        ( listeners[ X_LISTENERS_UNLISTENS ][ opt_type ] = [ f ] );\r
+               f.removed = true;\r
        } else {\r
-               delete f.once;\r
+               //delete f.once;\r
+               X_Object_clear( f );\r
+               \r
                if( list.length !== 1 ){\r
                        list.splice( i, 1 );\r
                } else {\r
index 003b89c..1c95264 100644 (file)
@@ -65,7 +65,7 @@ var X_Node_ANIMATIONS            = [],
        \r
        X_Node_Anime_hasTransform    = !!X_Node_CSS_VENDER_PREFIX[ 'transform' ],\r
        /* Opera mobile で  translateZ(0) が有効だと XY が 0 0 になる */\r
-       /* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox, 手当てが済むまでここは常に false */\r
+       /* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox */\r
        X_Node_Anime_translateZ      = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ? ' translateZ(0)' : '',\r
        /* Opera12(XP,8.1) 切った方がスムース, win Safari3 で、たまに動作が止まってしまう、、、 */\r
        X_Node_Anime_hasTransition   = !!X_Node_CSS_VENDER_PREFIX[ 'transitionDelay' ] && !X_UA[ 'Opera' ], // && !( X_UA[ 'Webkit' ]  <= 528.16 ),\r
@@ -292,9 +292,6 @@ function X_Node_Anime_detectAnimationLayers(){
        X_Node_Anime_needsDetection = false;\r
 };\r
 \r
-/* TODO\r
- * 0:無, 1:子のGPU解除待 2:GPU予約, 3:GPU now!, 4:GPU解除予約\r
- */\r
 function X_Node_Anime_updateAnimation( xnode ){\r
        var obj   = xnode[ '_anime' ],\r
                phase = obj.phase,\r
@@ -344,14 +341,13 @@ function X_Node_Anime_updateAnimation( xnode ){
                        //console.log( 'duration = 0 の場合、アニメーションの解除' );\r
                        // duration = 0 の場合、アニメーションの解除\r
                        \r
-               case 3 : // アニメーションの解除\r
+               case 3 : // TransitionEnd -> アニメーションの解除\r
                        obj.phase = obj.gpuParent ? 10 : 4;\r
                        \r
                        console.log( '#### アニメーションの解除 ' + obj.phase );\r
                        \r
                        // このタイミングで animation 関連の css を削除したところ(X_Node_Anime_clearTransition)、iOS3、4 で再描画忘れが度々起きるように、、、\r
                        if( !obj.gpuParent ) X_Node_Anime_clearTransition( xnode );\r
-                       //xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : obj.gpuParent } );\r
                        break;\r
 \r
                case 4 :\r
@@ -361,7 +357,6 @@ function X_Node_Anime_updateAnimation( xnode ){
 \r
                case 10 :\r
                        // アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機)\r
-                       //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?\r
                        if( !obj.gpuTimerID ){\r
                                console.log( '#### アニメーションは停止 ' + obj.wait );\r
                                if( obj.wait ){\r
index 0531a29..785bcbf 100644 (file)
@@ -74,7 +74,7 @@ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+
        X_Net_XHR_msXMLVer    = 0,      \r
        X_Net_XHR_msXML       = X_Net_XHR_createMSXML && X_Net_XHR_createMSXML( true ),\r
        \r
-       X_Net_XHR_neverReuse  = X_UA[ 'IE' ] < 9, // ie7,8 の xhr はリユース不可。msxml はリユース可能。\r
+       X_Net_XHR_neverReuse  = X_UA[ 'IE' ] < 9 || X_UA[ 'iOS' ] || X_UA[ 'Android' ], // ie7,8 の xhr はリユース不可。msxml はリユース可能。\r
        \r
        X_Net_XHR_TYPE_FLASH  = 8,\r
        X_Net_XHR_TYPE_GADGET = 16;\r
@@ -470,7 +470,6 @@ X_TEMP.X_Net_XHR_params = {
                                                                        data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
                                                                        break;\r
                                                        };\r
-\r
                                                        X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } );\r
                                                } else {\r
                                                        X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } );\r
@@ -479,8 +478,8 @@ X_TEMP.X_Net_XHR_params = {
                                        \r
                                        case 'progress' :\r
                                                if( e.lengthComputable ){\r
-                                                       X_NET_XHRWrapper._percent = e.loaded / e.total;\r
-                                                       live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent } );\r
+                                                       X_NET_XHRWrapper._percent = e.loaded / e.total * 100;\r
+                                                       live && X_NET_XHRWrapper._percent < 100 && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent } );\r
                                                };\r
                                                break;\r
                                        \r
@@ -511,10 +510,12 @@ X_TEMP.X_Net_XHR_params = {
                        },\r
                        \r
                        onUploadProgress : X_Net_XHR_upload && function( e ){\r
-                               var raw  = X_NET_XHRWrapper[ '_rawObject' ].upload,\r
-                                       live = !X_NET_XHRWrapper._canceled,\r
-                                       states, data;\r
-                               live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent, 'uploadPercent' : ( e.loaded / e.total ) } );\r
+                               !X_NET_XHRWrapper._canceled &&\r
+                                       X_NET_XHRWrapper[ 'asyncDispatch' ]( {\r
+                                               type            : X_EVENT_PROGRESS,\r
+                                               'percent'       : X_NET_XHRWrapper._percent,\r
+                                               'uploadPercent' : e.loaded / e.total * 100\r
+                                       } );\r
                        }\r
                };\r
        // 同期リクエストでなければならない場合, unload, beforeunload時\r
index 783e885..b12e679 100644 (file)
@@ -271,12 +271,12 @@ var X_Audio_AbstractAudioBackend = X_EventDispatcher[ 'inherits' ](
                play : function( startTime, endTime, loop, loopStartTime, loopEndTime ){\r
                        if( 0 <= startTime ){\r
                                this.setState( {\r
-                                       currentTime   : startTime,\r
-                                       startTime     : startTime,\r
-                                       endTime       : endTime,\r
-                                       loop          : loop,\r
-                                       loopStartTime : loopStartTime,\r
-                                       loopEndTime   : loopEndTime\r
+                                       'currentTime'   : startTime,\r
+                                       'startTime'     : startTime,\r
+                                       'endTime'       : endTime,\r
+                                       'loop'          : loop,\r
+                                       'loopStartTime' : loopStartTime,\r
+                                       'loopEndTime'   : loopEndTime\r
                                } );\r
                        };\r
                        this.actualPlay();\r
@@ -284,7 +284,7 @@ var X_Audio_AbstractAudioBackend = X_EventDispatcher[ 'inherits' ](
                \r
                seek : function( seekTime ){\r
                        if( seekTime < X_AudioWrapper_getEndTime( this ) ){\r
-                               this.setState( { currentTime : seekTime } );\r
+                               this.setState( { 'currentTime' : seekTime } );\r
                        };\r
                },\r
                \r
@@ -296,21 +296,21 @@ var X_Audio_AbstractAudioBackend = X_EventDispatcher[ 'inherits' ](
                        if( v === undefined ){\r
                                return this.autoLoop;\r
                        };\r
-                       this.setState( { loop : v } );\r
+                       this.setState( { 'loop' : v } );\r
                },\r
 \r
                volume : function( v ){\r
                        if( v === undefined ){\r
                                return this.gain;\r
                        };\r
-                       this.setState( { volume : v } );\r
+                       this.setState( { 'volume' : v } );\r
                },\r
 \r
                currentTime : function( v ){\r
                        if( v === undefined ){\r
                                return this.playing ? this.getActualCurrentTime() : this.seekTime;\r
                        };\r
-                       this.setState( { currentTime : v } );\r
+                       this.setState( { 'currentTime' : v } );\r
                },\r
                \r
                getState : function(){\r
@@ -432,6 +432,8 @@ var X_Audio_AbstractAudioBackend = X_EventDispatcher[ 'inherits' ](
                                                        };\r
                                                };\r
                                                break;\r
+                                       default :\r
+                                               throw 'bad arg';\r
                                };\r
                        };\r
                        \r
index e8fd81b..dd90819 100644 (file)
@@ -1,7 +1,8 @@
 
 var X_Audio_WebAudio_context = !X_UA[ 'iPhone_4s' ]  && !X_UA[ 'iPad_2Mini1' ]  && !X_UA[ 'iPod_4' ]  &&
+                                                               // TODO なんで fennec を禁止?
                                                                !( X_UA[ 'Gecko' ] && X_UA[ 'Android' ] ) &&
-                                                               ( window.AudioContext || window.webkitAudioContext ),
+                                                               ( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ),
        X_Audio_BUFFER_LIST      = [],
        X_Audio_WebAudioWrapper,
        X_Audio_BufferLoader;
@@ -14,7 +15,7 @@ if( X_Audio_WebAudio_context ){
        X_Audio_WebAudio_context = new X_Audio_WebAudio_context;
        
        X_Audio_BufferLoader = X_EventDispatcher[ 'inherits' ](
-               'X.AV.WebAudioBufferLoader',
+               'X.WebAudio.BufferLoader',
                X_Class.POOL_OBJECT,
                {
                        url             : '',
@@ -26,10 +27,10 @@ if( X_Audio_WebAudio_context ){
             error           : 0,
             webAudioList    : null,
             
-                       Constructor : function( webAudio, url ){
+                       'Constructor' : function( webAudio, url ){
                                this.webAudioList = [ webAudio ];
                                this.url = url;
-                               this.xhr = X.Net( { 'xhr' : url, 'dataType' : 'arraybuffer' } )
+                               this.xhr = X[ 'Net' ]( { 'xhr' : url, 'dataType' : 'arraybuffer' } )
                                                                        [ 'listen' ]( X_EVENT_PROGRESS, this )
                                                                        [ 'listenOnce' ]( [ X_EVENT_SUCCESS, X_EVENT_COMPLETE ], this );
                        },
@@ -48,15 +49,13 @@ if( X_Audio_WebAudio_context ){
                                        // iOS 7.1 で decodeAudioData に処理が入った瞬間にスクリーンを長押しする(スクロールを繰り返す)と
                                        // decoeAudioData の処理がキャンセルされることがある(エラーやコールバックの発火もなく、ただ処理が消滅する)。
                                        // ただし iOS 8.1.2 では エラーになる
-                                               if( X_Audio_WebAudio_context.createBuffer && X_UA[ 'iOS' ] < 8 ){
-                                                       this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.response, false ) );
+                                               if( X_UA[ 'iOS' ] < 8 || !X_Audio_WebAudio_context[ 'decodeAudioData' ] ){
+                                                       this._onDecodeSuccess( X_Audio_WebAudio_context[ 'createBuffer' ]( e.response, false ) );
                                                } else
-                                               if( X_Audio_WebAudio_context.decodeAudioData ){
-                                                       X_Audio_WebAudio_context.decodeAudioData( e.response,
+                                               if( X_Audio_WebAudio_context[ 'decodeAudioData' ] ){
+                                                       X_Audio_WebAudio_context[ 'decodeAudioData' ]( e.response,
                                                                this.onDecodeSuccess = X_Closure_create( this, this._onDecodeSuccess ),
                                                                this.onDecodeError   = X_Closure_create( this, this._onDecodeError ) );
-                                               } else {
-                                                       this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.response, false ) );
                                                };
                                                break;
 
@@ -118,7 +117,7 @@ if( X_Audio_WebAudio_context ){
        
        
        X_Audio_WebAudioWrapper = X_Audio_AbstractAudioBackend[ 'inherits' ](
-               'X.AV.WebAudioWrapper',
+               'X.WebAudio',
                X_Class.POOL_OBJECT,
                {
                        
@@ -130,11 +129,11 @@ if( X_Audio_WebAudio_context ){
             _timerID        : 0,
             _interval       : 0,
                buffer          : null,
-               source          : null,
+               bufferSource    : null,
             gainNode        : null,
             _onended        : null,
             
-                       Constructor : function( target, url, option ){                          
+                       'Constructor' : function( target, url, option ){                                
                                var i = 0,
                                        l = X_Audio_BUFFER_LIST.length,
                                        loader;
@@ -171,12 +170,12 @@ if( X_Audio_WebAudio_context ){
 
                                delete this.buffer;
                                
-                               this.playing  && this.actualPause();
-                   this.source   && this._sourceDispose();
+                               this.playing      && this.actualPause();
+                   this.bufferSource && this._sourceDispose();
        
-                   this._onended && X_Closure_correct( this._onended );        
+                   this._onended     && X_Closure_correct( this._onended );    
        
-                   this.gainNode && this.gainNode.disconnect();
+                   this.gainNode     && this.gainNode.disconnect();
                        },
                                _onLoadBufferComplete : function( e ){
                                        var loader = this.loader,
@@ -203,6 +202,8 @@ if( X_Audio_WebAudio_context ){
 
                                        this.target[ 'asyncDispatch' ]( X_EVENT_READY );
                        
+                       console.log( 'WebAudio buffer ready' );
+                       
                        this.autoplay && X_Timer_once( 16, this, this.play );
                                        
                                },
@@ -220,31 +221,31 @@ if( X_Audio_WebAudio_context ){
                                
                                console.log( '[WebAudio] play ' + begin + ' -> ' + end );
                                
-                               if( this.source ) this._sourceDispose();
+                               if( this.bufferSource ) this._sourceDispose();
                                if( !this.gainNode ){
-                                       this.gainNode = X_Audio_WebAudio_context.createGain ? X_Audio_WebAudio_context.createGain() : X_Audio_WebAudio_context.createGainNode();
-                       this.gainNode.connect( X_Audio_WebAudio_context.destination );
+                                       this.gainNode = X_Audio_WebAudio_context[ 'createGain' ] ? X_Audio_WebAudio_context[ 'createGain' ]() : X_Audio_WebAudio_context[ 'createGainNode' ]();
+                       this.gainNode[ 'connect' ]( X_Audio_WebAudio_context[ 'destination' ] );
                                };
-                   this.source        = X_Audio_WebAudio_context.createBufferSource();
-                   this.source.buffer = this.buffer;
-                   this.source.connect( this.gainNode );
+                   this.bufferSource        = X_Audio_WebAudio_context[ 'createBufferSource' ]();
+                   this.bufferSource.buffer = this.buffer;
+                   this.bufferSource[ 'connect' ]( this.gainNode );
                    
-                   this.gainNode.gain.value = this.gain;
+                   this.gainNode[ 'gain' ].value = this.gain;
                    
                    // おかしい、stop 前に外していても呼ばれる、、、@Firefox33.1
                    // 破棄された X.Callback が呼ばれて、obj.proxy() でエラーになる。Firefox では、onended は使わない
-                if( false && this.source.onended !== undefined ){
+                if( false && this.bufferSource.onended !== undefined ){
                        //console.log( '> use onended' );
-                       this.source.onended = this._onended || ( this._onended = X_Closure_create( this, this._onEnded ) );
+                       this.bufferSource.onended = this._onended || ( this._onended = X_Closure_create( this, this._onEnded ) );
                 } else {
                        this._timerID && X_Timer_remove( this._timerID );
                                        this._timerID = X_Timer_once( end - begin, this, this._onEnded );
                 };
        
-                   if( this.source.start ){
-                       this.source.start( 0, begin / 1000, end / 1000 );
+                   if( this.bufferSource.start ){
+                       this.bufferSource.start( 0, begin / 1000, end / 1000 );
                    } else {
-                       this.source.noteGrainOn( 0, begin / 1000, end / 1000 );
+                       this.bufferSource[ 'noteGrainOn' ]( 0, begin / 1000, end / 1000 );
                    };
                    
                    this.playing      = true;
@@ -255,9 +256,9 @@ if( X_Audio_WebAudio_context ){
                        },
                        
                                _sourceDispose : function(){
-                           this.source.disconnect();
-                           delete this.source.onended;
-                           delete this.source;
+                           this.bufferSource.disconnect();
+                           delete this.bufferSource.onended;
+                           delete this.bufferSource;
                        },
 
                                _onInterval : function(){
@@ -311,11 +312,11 @@ if( X_Audio_WebAudio_context ){
                                delete this._timerID;
                                delete this.playing;
 
-                   if( this.source ){
-                       if( this.source.onended ) delete this.source.onended;
+                   if( this.bufferSource ){
+                       if( this.bufferSource.onended ) delete this.bufferSource.onended;
                        
-                       this.source.stop ? 
-                               this.source.stop( 0 ) : this.source.noteOff( 0 );
+                       this.bufferSource.stop ? 
+                               this.bufferSource.stop( 0 ) : this.bufferSource[ 'noteOff' ]( 0 );
                    };
                        },
                        
@@ -328,7 +329,7 @@ if( X_Audio_WebAudio_context ){
                        this.actualPlay();
                                } else
                                if( result & 4 ){
-                      this.gainNode.gain.value = this.gain;
+                      this.gainNode[ 'gain' ].value = this.gain;
                                };
                        }
 
index 7206221..3972841 100644 (file)
@@ -87,7 +87,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                        _lastCurrentTime : 0,\r
                        _src             : '',\r
                        \r
-                       Constructor : function( target, source, option ){\r
+                       'Constructor' : function( target, source, option ){\r
                                var raw;\r
                                \r
                                this.target  = target || this;\r
@@ -168,7 +168,10 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                \r
                                X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( e.type );\r
                                \r
-                               X_Audio_HTMLAudioWrapper_ieMobile9Fix && e.type !== 'timeupdate' && console.log( e.type );\r
+                               // global に公開\r
+                               window[ '__rawAudio' ] = this[ '_rawObject' ];\r
+                               \r
+                               /* X_Audio_HTMLAudioWrapper_ieMobile9Fix && */ e.type !== 'timeupdate' && console.log( e.type );\r
                                \r
                                switch( e.type ){\r
                                        case 'loadstart' :      //      ブラウザがコンテンツの検索を開始した場合に発生\r
@@ -241,6 +244,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                                delete this.playing;\r
                                                break;\r
        \r
+                                       // TODO firefox で 短い音声でtimeupdate, ended が発火しない\r
                                        case 'timeupdate' :     //      通常の再生が行われ現在の再生位置の変化が起こった場合に発生\r
                                                if( X_Audio_HTMLAudioWrapper_ieMobile9Fix ){\r
                                                        if( this._playForDuration === 1 ){\r
@@ -268,7 +272,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                    if( this.playing ){\r
                                        end = X_AudioWrapper_getEndTime( this );\r
                                        now = this.getActualCurrentTime();\r
-                                       console.log( end + ' / ' + now );\r
+                                       console.log( now + ' / ' + end );\r
                                        if( 0 + end <= 0 + now ){ // なぜか iem9 で必要,,,\r
                                                if( this.autoLoop ){\r
                                                        if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
@@ -365,7 +369,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                begin = this._beginTime = X_AudioWrapper_getStartTime( this, end, true );\r
 \r
                    if( X_Audio_HTMLAudioWrapper_shortPlayFix ){\r
-                       begin -= end - begin > 1000 ? 200 : 400;\r
+                       begin -= ( end - begin > 1000 ) ? 200 : 400;\r
                        begin  = begin < 0 ? 0 : begin;\r
                    };\r
 \r
@@ -385,11 +389,16 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
                                    };\r
                                this[ '_rawObject' ].play();\r
                                this.playing = true;\r
+                           } else\r
+                           if( X_UA[ 'Gecko' ] ){\r
+                               // Gecko PC + Android でseek時に再生がしばしば止まる問題の修正\r
+                               this[ '_rawObject' ].play();\r
                            };\r
+                           \r
                                //http://himaxoff.blog111.fc2.com/blog-entry-97.html\r
                                //Firefox3.6では一度も play() していない状態で currentTime = 0 を実行するとエラーになる。\r
                                //また、GoogleChrome7 では currentTime = 0 直後に play() すると、pause()した位置前後の音が混ざることがある。(少なくとも自分の環境では)\r
-                               this[ '_rawObject' ].currentTime = this._lastCurrentTime = begin / 1000;\r
+                               this[ '_rawObject' ].currentTime = this._lastCurrentTime = begin / 1000 | 0;\r
 \r
                            console.log( '[HTMLAudio] play ' + begin + ' -> ' + end );\r
                    \r
index c716a9a..6999b81 100644 (file)
@@ -45,7 +45,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] ){
                        _lastState      : '',\r
                        _interval       : 0, // setInterval timer id\r
                        \r
-                       Constructor : function( target, source, option ){\r
+                       'Constructor' : function( target, source, option ){\r
                                !X_Audio_SLAudio_uid && X_TEMP.slaudioInit();\r
                                \r
                                /*\r
index 8c86151..ac5b19e 100644 (file)
@@ -304,12 +304,18 @@ function X_AudioSprite_backendHandler( e ){
                        this[ 'source' ]      = src = e[ 'source' ];\r
                        this[ 'backendName' ] = name = backend.backendName;\r
                \r
+                       console.log( i + ' / ' + X_Audio_Sprite_numTracks );\r
+               \r
                        for( i = 0; i < X_Audio_Sprite_numTracks; ++i ){\r
                                if( X_Audio_Sprite_useVideo || ( i === 1 && X_Audio_Sprite_useVideoForMulti ) ){\r
                                        option[ 'useVideo' ] = true;\r
                                };\r
                                // Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する\r
                                X_Audio_Sprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) );\r
+                               \r
+                               \r
+                               console.dir( backend );\r
+                               console.dir( last );\r
                        };\r
 \r
                        _e = {\r
@@ -327,6 +333,8 @@ function X_AudioSprite_backendHandler( e ){
                        };\r
                        this[ 'asyncDispatch' ]( _e );\r
                        \r
+                       console.log( 'AudioSprite - X_EVENT_BACKEND_READY' );\r
+                       \r
                        last[ 'listenOnce' ]( X_EVENT_READY, this, X_AudioSprite_backendHandler );\r
 \r
                        // READY, needTouchForPlay, needTouchForLoad\r
@@ -350,7 +358,7 @@ function X_AudioSprite_backendHandler( e ){
                                for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){\r
                                        this[ 'pause' ]( i );\r
                                };\r
-                               e.target[ 'listenOnce' ]( X_EVENT_MEDIA_PLAYING, this, this.asyncDispatch, [ X_EVENT_READY ] ); // Android 標準ブラウザ\r
+                               e.target[ 'listenOnce' ]( X_EVENT_MEDIA_PLAYING, this, this[ 'asyncDispatch' ], [ X_EVENT_READY ] ); // Android 標準ブラウザ\r
                                return;\r
                        };\r
                        this[ 'asyncDispatch' ]( X_EVENT_READY );\r
@@ -384,7 +392,7 @@ function X_Audio_Sprite_handleEvent( e ){
                                if( X_Audio_Sprite_TEMP.bgmPlaying && !X_Audio_Sprite_TEMP.bgmTrack ){\r
                                        X_Audio_Sprite_TEMP.bgmTrack = e.target;\r
                                        this.play( X_Audio_Sprite_TEMP.bgmName );\r
-                                       return X.Callback.PREVENT_DEFAULT;\r
+                                       return X_CALLBACK_PREVENT_DEFAULT;\r
                                };\r
                        };\r
                        break;\r
similarity index 87%
rename from 0.6.x/js/20_ui/20_PageRoot.js
rename to 0.6.x/js/20_ui/20_Root.js
index 09ca3c5..e1a756f 100644 (file)
@@ -67,8 +67,8 @@ function X_UI_eventRellay( e ){
  * 背景画像を読み終える onload で活動開始
  */
 
-var XUI_PageRoot = XUI_Box.inherits(
-       '_PageRoot',
+var XUI_Root = XUI_Box.inherits(
+       '_Root',
        X_Class.FINAL,
        {
                layout                : XUI_Layout_Canvas,
@@ -124,10 +124,10 @@ var XUI_PageRoot = XUI_Box.inherits(
                        X_Timer_once( 0, this, this.afterAddToView );
                },
                afterAddToView : function(){
-                       this.xnode[ 'className' ]( 'PageRoot' );
+                       this.xnode[ 'className' ]( 'Root' );
                        
                        this.creationComplete();
-                       X_Timer_once( 0, this, XUI_PageRoot_do1stCalculate );
+                       X_Timer_once( 0, this, XUI_Root_do1stCalculate );
                },
                
                reserveCalc : function(){
@@ -151,7 +151,7 @@ var XUI_PageRoot = XUI_Box.inherits(
                        
                        this.calcReserved = false;
                        
-                       X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, XUI_PageRoot_onViewUpdate );
+                       X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, XUI_Root_onViewUpdate );
                        
                        return X_CALLBACK_NONE;
                },
@@ -167,7 +167,7 @@ var XUI_PageRoot = XUI_Box.inherits(
        }
 );
 
-function XUI_PageRoot_do1stCalculate(){
+function XUI_Root_do1stCalculate(){
        this.calculate();
        this.phase = 4;
        X.ViewPort
@@ -175,36 +175,36 @@ function XUI_PageRoot_do1stCalculate(){
                [ 'listen' ]( X_EVENT_BASE_FONT_RESIZED, this, this.calculate );
 };
 
-function XUI_PageRoot_onViewUpdate( e ){
+function XUI_Root_onViewUpdate( e ){
        this[ 'dispatch' ]( XUI_Event.LAYOUT_COMPLETE );
 };
 
-//var XUI_PageRoot;
+//var XUI_Root;
 // TODO singleton
-X.UI.PageRoot = X.UI.Box.inherits(
-       'PageRoot',
+X.UI.Root = X.UI.Box.inherits(
+       'Root',
        X_Class.NONE,
        {
                Constructor : function(){
                        var supports;
                        
-                       //if( !XUI_PageRoot ){
+                       //if( !XUI_Root ){
                                supports = XUI_Attr_createAttrDef( XUI_Box.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf );
                                
-                               XUI_PageRoot.prototype.layout       = XUI_Layout_Canvas;
-                               XUI_PageRoot.prototype.usableAttrs = supports;
-                               XUI_PageRoot.prototype.attrClass    = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports, {
+                               XUI_Root.prototype.layout       = XUI_Layout_Canvas;
+                               XUI_Root.prototype.usableAttrs = supports;
+                               XUI_Root.prototype.attrClass    = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports, {
                                                                        width  : '100%',
                                                                        height : '100%'
                                                                } );
                        //};
-                       X_Pair_create( this, XUI_PageRoot( this, XUI_Layout_Canvas, arguments ) );
+                       X_Pair_create( this, XUI_Root( this, XUI_Layout_Canvas, arguments ) );
                }
        });
 /*
-X.UI.PageRoot = X.UI.Box.presets(
-       'PageRoot',
-       XUI_PageRoot,
+X.UI.Root = X.UI.Box.presets(
+       'Root',
+       XUI_Root,
        {
                width  : '100%',
                height : '100%'
index abe9b58..874940a 100644 (file)
@@ -1,7 +1,7 @@
 var scroll;\r
 \r
 with( X.UI ){\r
-       PageRoot(\r
+       Root(\r
                scroll = ScrollBox(\r
                        Layout.Canvas,\r
                        {\r