OSDN Git Service

Version 0.6.217, add #switch for X.Audio.
authoritozyun <itozyun@user.sourceforge.jp>
Thu, 12 May 2016 22:45:05 +0000 (07:45 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Thu, 12 May 2016 22:45:05 +0000 (07:45 +0900)
0.6.x/js/01_core/09_XURL.js
0.6.x/js/01_core/14_XEvent.js
0.6.x/js/02_dom/30_XTextRange.js
0.6.x/js/06_net/00_XNet.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/05_XWMPAudio.js
0.6.x/js/07_audio/10_XAudioSprite.js

index 1be41ad..2ac3f5d 100644 (file)
@@ -68,7 +68,11 @@ X[ 'URL' ] = {
        \r
        'cleanup'        : X_URL_cleanup,\r
        \r
-       'getEXT'         : X_URL_getEXT\r
+       'getEXT'         : X_URL_getEXT,\r
+\r
+       'getSearch'      : X_URL_getSearch,\r
+       \r
+       'getHash'        : X_URL_getHash\r
 };\r
 \r
 // ------------------------------------------------------------------------- //\r
@@ -152,6 +156,29 @@ function X_URL_getEXT( path ){
        return path.length ? path.pop() : '';\r
 };\r
 /**\r
+ * サーチクエリを返します。\r
+ * @alias X.URL.getSearch\r
+ * @param {string}\r
+ * @return {string}\r
+ */\r
+function X_URL_getSearch( path ){\r
+       path = path.split( '#' )[ 0 ].split( '?' );\r
+       path.splice( 0, 1 );\r
+       return path.join( '?' );\r
+}\r
+/**\r
+ * ハッシュフラグメントを返します。\r
+ * @alias X.URL.getHash\r
+ * @param {string}\r
+ * @return {string}\r
+ */\r
+function X_URL_getHash( path ){\r
+       path = path.split( '#' );\r
+       path.splice( 0, 1 );\r
+       return path.join( '#' );\r
+}\r
+\r
+/**\r
  * object を url パラメータにします。値が object の場合、データは失われます。\r
  * @alias X.URL.objToParam\r
  * @param {object}\r
index fa236ac..1771ecc 100644 (file)
@@ -112,7 +112,7 @@ var // 内部イベント
        X_EVENT_MEDIA_ENDED            = 46,\r
        X_EVENT_MEDIA_WAITING          = 47,\r
        X_EVENT_MEDIA_SEEKING          = 48,\r
-       X_EVENT_MEDIA_TOUCH_FOR_LOAD   = 49,\r
+       X_EVENT_MEDIA_WAIT_FOR_TOUCH   = 49,\r
        \r
        X_EVENT_NEED_AUTH              = 50,\r
        \r
@@ -228,7 +228,7 @@ X[ 'Event' ] = /** @lends X.Event */
        'MEDIA_ENDED'            : X_EVENT_MEDIA_ENDED,\r
        'MEDIA_WAITING'          : X_EVENT_MEDIA_WAITING,\r
        'MEDIA_SEEKING'          : X_EVENT_MEDIA_SEEKING,\r
-       'MEDIA_TOUCH_FOR_LOAD'   : X_EVENT_MEDIA_TOUCH_FOR_LOAD,\r
+       'MEDIA_WAIT_FOR_TOUCH'   : X_EVENT_MEDIA_WAIT_FOR_TOUCH,\r
        \r
        'NEED_AUTH'              : X_EVENT_NEED_AUTH,\r
        \r
index 80ddf4c..d6f8837 100644 (file)
@@ -131,11 +131,11 @@ function X_TextRange_getRawRange( tr ){
                                                        range.selectNodeContents( text ); // selectNodeContents は TextNode のみ?? Firefox\r
                                                        l = text.data.length;\r
 \r
-                                               for( j = 0, x = tr.v1, y = tr.v2; j < l; ++j ) {\r
+                                               for( j = 0, x = tr.v1, y = tr.v2; j < l; ++j ){\r
                                                        if( range ){\r
                                                            range.setStart( text, j );\r
                                                            range.setEnd( text, j + 1 );\r
-                                                           rect = range.getBoundingClientRect();                                               \r
+                                                           rect = range.getBoundingClientRect();\r
                                                        };\r
                                                    if( rect.left <= x && x <= rect.right && rect.top <= y && y <= rect.bottom ){\r
                                                        return {\r
@@ -146,7 +146,7 @@ function X_TextRange_getRawRange( tr ){
                                                        };\r
                                                    };\r
                                                };\r
-                                               offset += l;                                                    \r
+                                               offset += l;\r
                                                };\r
                                                range = null;\r
                                        } else {\r
@@ -186,7 +186,7 @@ function X_TextRange_getRect(){
                                'width'  : rect.width,\r
                                'height' : rect.height\r
                        };\r
-                       //range.detach && range.detach();                       \r
+                       //range.detach && range.detach();\r
                } else {\r
                        ret = {\r
                                'x'      : result.boundingLeft,\r
index 7d5b26f..9069396 100644 (file)
@@ -176,7 +176,7 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                };\r
                                \r
                                opt.netType   = type;\r
-                               opt[ 'url'  ] = url;                            \r
+                               opt[ 'url'  ] = url;\r
                                \r
                                X_Pair_create( this, opt );\r
                                \r
index 2d5f3b7..746f5a3 100644 (file)
@@ -228,8 +228,7 @@ if( X_XHR_w3c || X_XHR_msXML ){
                                \r
                                // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
                                if( !X_XHR._isMsXML && raw.overrideMimeType ){\r
-                                       type = X_URL_getEXT( url ) || dataType;\r
-                                       switch( type ){\r
+                                       switch( type = dataType ){\r
                                                case 'html' :\r
                                                case 'htm' :\r
                                                case 'xml' :\r
index 4b48359..4664aa0 100644 (file)
@@ -34,7 +34,7 @@ X_TEMP.onSystemReady.push(
  * <dt>X.Event.BACKEND_READY   <dd>音声(src リスト)を再生可能なバックエンドが見つかった。\r
  * <dt>X.Event.BACKEND_NONE    <dd>音声を再生可能なバックエンドが見つからなかった。Audio は kill されます。\r
  * <dt>X.Event.MEDIA_CAN_TOUCH <dd>モバイル端末の制約で音声の再生またはロードに、タッチを必要とする場合、タッチイベント内で play を呼び出す準備が出来たことを通知する。\r
- * <dt>X.Event.READY           <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、\r
+ * <dt>X.Event.READY           <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、モバイル端末の場合、タッチして再生が開始された場合に\r
  * <dt>X.Event.ERROR           <dd><ul>\r
  *   <li> 1 : ユーザーによってメディアの取得が中断された\r
  *   <li> 2 : ネットワークエラー\r
@@ -49,6 +49,12 @@ X_TEMP.onSystemReady.push(
  * <dt>X.Event.MEDIA_WAITING   <dd>再生中に音声が待機状態に。\r
  * <dt>X.Event.MEDIA_SEEKING   <dd>シーク中に音声が待機状態に。\r
  * </dl>\r
+ * <h4>ソースリストに与える url 文字列</h4>\r
+ * <p>ハッシュフラグメント以下にデータを書くことで、各オーディオバックエンドが再生可能性の判断にあたって参考にするデータを渡すことができます。\r
+ * <dl>\r
+ * <dt>CBR=1<dd>audio が固定ビットレートであることを示す。Android 用 Opera12- は可変ビットレートの mp3 を正しくシークできない。\r
+ * [ 'snd.mp3', 'snd.mp3#CBR=1' ] と指定すると、Android 用 Opera12- では CBR な mp3 が、他の環境ではよりファイルサイズの小さい VBR な mp3 が使用される。(未実装)\r
+ * <dt>ext=mp3<dd>パスに拡張子が含まれない場合、または上書き指定したい場合に指定する\r
  * \r
  * @alias X.Audio\r
  * @class 各種オーディオ機能をラップしインターフェイスを共通化する。\r
@@ -211,7 +217,7 @@ audio.setState(
 );\r
 \r
 function X_Audio_handleEvent( e ){\r
-       var backend, pair;\r
+       var backend, src, pair;\r
        \r
        switch( e.type ){\r
                case X_EVENT_BACKEND_READY :\r
@@ -252,8 +258,9 @@ function X_Audio_handleEvent( e ){
  */\r
 \r
 function X_Audio_startDetectionBackend( backend, xaudio, sourceList, option ){\r
-       var source = sourceList[ 0 ] || '', \r
-               ext    = X_URL_getEXT( source ),\r
+       var source = sourceList[ 0 ] || '',\r
+               hash   = X_URL_paramToObj( X_URL_getHash( source ) ),\r
+               ext    = hash[ 'ext' ] || X_URL_getEXT( source ),\r
                sup;\r
        \r
        if( source && backend ){\r
@@ -261,29 +268,36 @@ function X_Audio_startDetectionBackend( backend, xaudio, sourceList, option ){
                sup[ 5 ] = sup;\r
                \r
                xaudio[ 'listenOnce' ]( X_EVENT_COMPLETE, backend, X_Audio_onEndedDetection, sup );\r
-               backend.detect( xaudio, source, ext );\r
+               backend.detect( xaudio, ext, hash );\r
        } else {\r
                xaudio[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
        };\r
 };\r
 \r
 function X_Audio_onEndedDetection( e, xaudio, sourceList, option, source, ext, sup ){\r
-       var i = X_Audio_BACKENDS.indexOf( this ), backend;\r
+       var i = X_Audio_BACKENDS.indexOf( this ), _e, hash, backend;\r
        \r
        if( e.canPlay ){\r
-               xaudio[ 'asyncDispatch' ]( {\r
+               _e = {\r
                        type          : X_EVENT_BACKEND_READY,\r
                        'option'      : option,\r
                        'source'      : source,\r
-                       'backendName' : this[ 'backendName' ],\r
+                       'backendName' : this.backendName,\r
                        'backendID'   : i\r
-               } );                    \r
+               };\r
+               // WebAudio\r
+               if( this.backendID === 1 ) _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch;\r
+               // HTMLAudio\r
+               if( this.backendID === 2 ) _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch;\r
+\r
+               xaudio[ 'asyncDispatch' ]( _e );                        \r
        } else {\r
-               console.log( 'No ' + source + ' ' + this[ 'backendName' ] );\r
+               console.log( 'No ' + source + ' ' + this.backendName );\r
                if( sup[ 3 ] = source = sourceList[ sourceList.indexOf( source ) + 1 ] ){\r
-                       sup[ 4 ] = ext    = X_URL_getEXT( source );\r
+                       hash     = X_URL_paramToObj( X_URL_getHash( source ) );\r
+                       sup[ 4 ] = ext    = hash[ 'ext' ] || X_URL_getEXT( source );\r
                        xaudio[ 'listenOnce' ]( X_EVENT_COMPLETE, this, X_Audio_onEndedDetection, sup );\r
-                       this.detect( xaudio, source, ext );\r
+                       this.detect( xaudio, ext, hash );\r
                } else\r
                if( backend = X_Audio_BACKENDS[ i + 1 ] ){\r
                        X_Audio_startDetectionBackend( backend, xaudio, sourceList, option );\r
index 67011bb..1cc3cba 100644 (file)
@@ -306,7 +306,7 @@ if( X_WebAudio_context ){
                        this.audioBuffer = buffer;
                        this.duration    = buffer.duration * 1000;
 
-                                       this.disatcher[ 'asyncDispatch' ]( X_WebAudio_touchState ? X_EVENT_MEDIA_TOUCH_FOR_LOAD : X_EVENT_READY );
+                                       this.disatcher[ 'asyncDispatch' ]( X_WebAudio_touchState ? X_EVENT_MEDIA_WAIT_FOR_TOUCH : X_EVENT_READY );
                                },
                        
                        actualPlay : function(){
@@ -462,7 +462,7 @@ if( X_WebAudio_context ){
 
                        canPlay     : X_Audio_codecs,
 
-                       detect      : function( proxy, source, ext ){
+                       detect      : function( proxy, ext /* hash */ ){
                                proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : X_Audio_codecs[ ext ] } );
                        },
                        
index 17ea8ab..1c88ae5 100644 (file)
@@ -177,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
@@ -379,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
@@ -407,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
@@ -425,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
@@ -578,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
index d6b41e4..ea3dad7 100644 (file)
@@ -412,9 +412,7 @@ if( X_Plugin_SILVER_LIGHT_VERSION ){
                        'wav' : true\r
                },\r
 \r
-               detect : function( proxy, source, ext ){\r
-                       // TODO source = .mp3#CBR\r
-                       // 得意度で返す\r
+               detect : function( proxy, ext, hash ){\r
                        proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : ext === 'mp3' || ext === 'm4a' || ext === 'wma' || ext === 'wav' } );                            \r
                },\r
                \r
index a3c282a..5ee0c80 100644 (file)
@@ -223,7 +223,7 @@ if( X_Plugin_WMP_VERSION ){ // IETester で 6.x は不可
                        'aicf' : true
                },
 
-               detect : function( proxy, source, ext ){
+               detect : function( proxy, ext /* hash */ ){
                        proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : 0 <= 'mp3 m4a wma wav midi snd au aiff aicf'.indexOf( ext ) } );                         
                },
                
index bb4272b..f0183bc 100644 (file)
@@ -365,12 +365,12 @@ function X_AudioSprite_backendHandler( e ){
                        // TODO 今は touch 可能で backend ready\r
                        if(\r
                                // WebAudio\r
-                               ( backend.backendID === 1 && ( _e[ 'needTouchForPlay' ] = X_WebAudio_need1stTouch  ) ) ||\r
+                               ( e[ 'needTouchForPlay' ] && ( _e[ 'needTouchForPlay' ] = true ) ) ||\r
                                // HTMLAudio\r
-                               ( backend.backendID === 2 && ( _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch ) )\r
+                               ( e[ 'needTouchForLoad' ] && ( _e[ 'needTouchForLoad' ] = true ) )\r
                        ){\r
                                X_AudioSprite_TEMP.event = _e;\r
-                               last[ 'listenOnce' ]( X_EVENT_MEDIA_TOUCH_FOR_LOAD, X_AudioSprite_backendHandler );\r
+                               last[ 'listenOnce' ]( X_EVENT_MEDIA_WAIT_FOR_TOUCH, X_AudioSprite_backendHandler );\r
                        } else {\r
                                X_AudioSprite[ 'asyncDispatch' ]( _e );\r
                        };\r
@@ -386,8 +386,8 @@ function X_AudioSprite_backendHandler( e ){
                                [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
                        return X_CALLBACK_STOP_NOW;\r
                \r
-               case X_EVENT_MEDIA_TOUCH_FOR_LOAD :\r
-                       // TODO 全ての track の MEDIA_TOUCH_FOR_LOAD で!\r
+               case X_EVENT_MEDIA_WAIT_FOR_TOUCH :\r
+                       // TODO 全ての track の MEDIA_WAIT_FOR_TOUCH で!\r
                        X_AudioSprite[ 'asyncDispatch' ]( X_AudioSprite_TEMP.event );\r
                        delete X_AudioSprite_TEMP.event;\r
                        break;\r