OSDN Git Service

Version 0.6.193, bug fixes X.Node.Anime.
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 03_XSilverlightAudio.js
index 30d9548..c713961 100644 (file)
  * SilverlLight5 ie6&7(ietester,winxp), ie8(winxp) で動作確認。firefox32 では動作しない。(4以下の方がよい?)\r
  */\r
 \r
-var X_Audio_SLAudioWrapper,\r
-       X_Audio_SLAudio_uid = 0;\r
+var X_SLAudio,\r
+       X_SLAudio_uid = 0;\r
 \r
-if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){\r
+if( X_Pulgin_SILVER_LIGHT_VERSION ){\r
        \r
        X_TEMP.slaudioInit = function(){\r
                //\r
                // http://blog.yuhiisk.com/archive/2014/12/20/dynamic-loading-and-complete-processing-of-script.html\r
-               var s = document.createElement( '<script id="silverlightaudio" type="text/xaml"></script>' );\r
+               var s;\r
                \r
-               document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );\r
+               if( X_UA[ 'IE' ] < 9 ){\r
+                       s = document.createElement( '<script id="silverlightaudio" type="text/xaml"></script>' );\r
+               } else {\r
+                       s = document.createElement( 'script' );\r
+                       s.id   = 'silverlightaudio';\r
+                       s.type = 'text/xaml';\r
+               };\r
+               \r
+               X_elmHead.appendChild( s );\r
                s.text = '<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"></Canvas>';\r
                \r
                delete X_TEMP.slaudioInit;\r
        };\r
        \r
        // X.Node.inherits はできない。_rawObject は <object> でなく silverlight\r
-       X_Audio_SLAudioWrapper = X_Audio_AbstractAudioBackend[ 'inherits' ](\r
-               'X.AV.SilverlightAudio',\r
+       X_SLAudio = X_AudioBase[ 'inherits' ](\r
+               'X.SilverlightAudio',\r
                X_Class.POOL_OBJECT,\r
                {\r
                        '_rawType'      : X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT,\r
@@ -45,21 +53,21 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                        _lastState      : '',\r
                        _interval       : 0, // setInterval timer id\r
                        \r
-                       'Constructor' : function( target, source, option ){\r
-                               !X_Audio_SLAudio_uid && X_TEMP.slaudioInit();\r
+                       'Constructor' : function( disatcher, source, option ){\r
+                               !X_SLAudio_uid && X_TEMP.slaudioInit();\r
                                \r
                                /*\r
                                 * [Silverlight 2]JavaScriptコードからSilverlightのオブジェクトを利用するには?[C#、VB]\r
                                 * http://www.atmarkit.co.jp/fdotnet/dotnettips/902slobjcallfromjs/slobjcallfromjs.html\r
                                 * このページのサンプルは sl5+firefox32 環境で動いている。xaml を js から利用する形ではなく、.xap を sl4 以下で作るのがよさそう.\r
                                 */\r
-                               \r
-                               // TODO embed\r
-                               this.target      = target || this;\r
+                               this.disatcher   = disatcher || this;\r
                                this._source     = source;\r
                                // X.Audio._slOnload_ は不可\r
-                       this._onload     = 'XAudioSilverlightOnLoad' + ( ++X_Audio_SLAudio_uid );\r
+                       this._onload     = 'XAudioSilverlightOnLoad' + ( ++X_SLAudio_uid );\r
                                this._callback   = window[ this._onload ] = X_Closure_create( this, this.onSLReady );\r
+                               \r
+                               // TODO embed\r
                        this.xnodeObject = X_Node_body\r
                                [ 'create' ]( 'object', {\r
                                                type   : 'application/x-silverlight-2',\r
@@ -114,7 +122,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                                if( this.playing ){\r
                                                        //X_Timer_once( 16, this, this.actualPlay );\r
                                                } else {\r
-                                                       this.target[ 'dispatch' ]( X_EVENT_ERROR ); // open failed\r
+                                                       this.disatcher[ 'dispatch' ]( X_EVENT_ERROR ); // open failed\r
                                                        this[ 'kill' ]();                                                       \r
                                                };\r
                                                break;\r
@@ -122,9 +130,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                        case 'MediaOpened' :\r
                                                // http://msdn.microsoft.com/ja-jp/library/bb979710(VS.95).aspx\r
                                                this.duration = this[ '_rawObject' ][ 'NaturalDuration' ][ 'Seconds' ] * 1000;\r
-                               this.target[ 'asyncDispatch' ]( X_EVENT_READY );\r
-                               \r
-                               this.autoplay && X_Timer_once( 16, this, this.actualPlay );\r
+                               this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY );\r
                                                break;\r
 \r
                                        case 'MediaEnded' :\r
@@ -151,10 +157,10 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                                        case 'Opening' :\r
                                                                switch( this._lastUserAction ){\r
                                                                        case 'play' :\r
-                                                                               this.target[ 'dispatch' ]( X_EVENT_MEDIA_WAITING );\r
+                                                                               this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_WAITING );\r
                                                                                break;\r
                                                                        case 'seek' :\r
-                                                                               this.target[ 'dispatch' ]( X_EVENT_MEDIA_SEEKING );\r
+                                                                               this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_SEEKING );\r
                                                                                break;\r
                                                                        case 'pause' :\r
                                                                                break;\r
@@ -171,7 +177,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                                                this.playing = false;\r
                                                                this._ended  = true;\r
                                                                this._paused = false;\r
-                                                               this.target[ 'dispatch' ]( X_EVENT_ERROR );\r
+                                                               this.disatcher[ 'dispatch' ]( X_EVENT_ERROR );\r
                                                                this[ 'kill' ]();\r
                                                                break;\r
 \r
@@ -187,9 +193,9 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                                                        case 'play': // play() -> file end -> event('ended')\r
                                                                        case 'seek':\r
                                                                                //this.seekTime = 0;\r
-                                                                               this._ended   = true;\r
-                                                                               this._paused  = false;\r
-                                                                               //this.target[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
+                                                                               this._ended  = true;\r
+                                                                               this._paused = false;\r
+                                                                               //this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
                                                                                //this.setCurrentTime( this.startTime );\r
                                                                                break;\r
                                                                        case 'pause':\r
@@ -208,24 +214,23 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                                                //this.playing = true;\r
                                                                this._ended  = false;\r
                                                                this._paused = false;\r
-                                                               this.target[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );\r
+                                                               this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );\r
                                                                break;\r
 \r
                                                        // stop()\r
                                                        case 'Stopped':\r
                                                                this.playing && X_Timer_once( 16, this, this.actualPlay );\r
-                                                               return;\r
                                                                \r
                                                                //this.playing = false;\r
-                                                               this._ended  = true;\r
-                                                               this._paused = false;\r
+                                                               //this._ended  = true;\r
+                                                               //this._paused = false;\r
                                                                //this.setCurrentTime( this.startTime );\r
                                                                break;\r
                                                };\r
                                                break;\r
 \r
                                        case X_EVENT_KILL_INSTANCE :\r
-                                               this.playing && this.target[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
+                                               this.playing && this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
                                                this.playing && this.actualPause();\r
                                        \r
                                                if( this._onload ){\r
@@ -246,14 +251,14 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                // もし kill 後に autoplayTimer で呼ばれても、_closed==true なので平気\r
                                if( this.error ) return;\r
                                if( !this.duration ){\r
-                                       this.autoplay = true;\r
+                                       this._playReserved = true;\r
                                        return;\r
                                };\r
                                \r
                                this._lastUserAction = 0 <= this.seekTime ? 'seek' : 'play';\r
                                \r
-                               end   = X_AudioWrapper_getEndTime( this );\r
-                               begin = X_AudioWrapper_getStartTime( this, end, true ) | 0;\r
+                               end   = X_Audio_getEndTime( this );\r
+                               begin = X_Audio_getStartTime( this, end, true ) | 0;\r
 \r
                                // 1 秒以下は指定できないため四捨五入\r
                                begin = ( begin / 1000 | 0 ) * 1000 + ( 500 < begin % 1000 ? 1000 : 0 ); \r
@@ -292,7 +297,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                                delete this._interval;\r
                                                return X_CALLBACK_UN_LISTEN;\r
                                        };\r
-                                       this.target[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );\r
+                                       this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );\r
                                },\r
                                \r
                                _onEnded : function(){\r
@@ -300,7 +305,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                        delete this._timerID;\r
                                        \r
                            if( this.playing ){\r
-                               //console.log( '> end ' + X_AudioWrapper_getEndTime( this ) + ' current:' + ( this.getActualCurrentTime() ) );\r
+                               //console.log( '> end ' + X_Audio_getEndTime( this ) + ' current:' + ( this.getActualCurrentTime() ) );\r
                                time = this.getActualCurrentTime();\r
                                \r
                                if( time < this._beginTime ){\r
@@ -310,13 +315,13 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                        console.log( '    > ' + time );\r
                                        this._ended && this[ '_rawObject' ].play();\r
                                        this._ended = false;\r
-                                       this.target[ 'dispatch' ]( X_EVENT_MEDIA_WAITING );\r
-                                       this._timerID = X_Timer_once( X_AudioWrapper_getEndTime( this ) - time, this, this._onEnded );\r
+                                       this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_WAITING );\r
+                                       this._timerID = X_Timer_once( X_Audio_getEndTime( this ) - time, this, this._onEnded );\r
                                        return;\r
                                };\r
                                \r
-                               time -= X_AudioWrapper_getEndTime( this );\r
-                               if( time < 0 ){\r
+                               time -= X_Audio_getEndTime( this );\r
+                               if( time < -50 ){\r
                                        console.log( ' > まだ終わらない ' + time );\r
                                        this._ended && this[ '_rawObject' ].play();\r
                                        this._ended = false;\r
@@ -326,32 +331,30 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                                \r
                                if( this.autoLoop ){\r
                                        console.log( '========= loop?' );\r
-                                       if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
+                                       if( !( this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
                                                console.log( '========== loopした' );\r
                                                this.looped = true;\r
-                                               this.target[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED );\r
+                                               this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED );\r
                                                this.actualPlay();\r
                                        };\r
                                } else {\r
                                        console.log( '========= pause' );\r
                                        this.actualPause();\r
-                                       this.target[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
+                                       this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );\r
                                };\r
                            };\r
                                },\r
                        \r
                        // SilverlightAudio.pause\r
                        actualPause : function(){\r
-                               if( this.error /*  || !this.playing */ ) return;\r
+                               if( this.error ) return;\r
                                \r
                                this._lastUserAction = 'pause';\r
-                               this.seekTime = this.getActualCurrentTime();\r
                                this.playing  = false;\r
                                this._paused  = true;\r
                                this._ended   = false;\r
                                \r
                                this[ '_rawObject' ].pause();\r
-                               //this.target[ 'dispatch' ]( 'pause' );\r
                        },\r
 \r
                        getActualCurrentTime : function(){\r
@@ -359,11 +362,13 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
                        },\r
                        \r
                        afterUpdateState : function( result ){\r
+                               var end, halfway;\r
+                               \r
                                if( result & 3 ){ // seek\r
                        this.actualPlay();\r
                                } else\r
                                if( result & 1 ){\r
-                                       end     = X_AudioWrapper_getEndTime( this );\r
+                                       end     = X_Audio_getEndTime( this );\r
                                        halfway = end < this.duration;\r
                                        this._timerID && X_Timer_remove( this._timerID );\r
                                        \r
@@ -396,19 +401,24 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] && !X_HTMLAudio ){
        }; */\r
 \r
        X_Audio_BACKENDS.push( {\r
-               backendName : 'Silverlight Audio',\r
+               backendID   : 8,\r
+               \r
+               backendName : 'Silverlight',\r
 \r
                canPlay : {\r
                        'mp3' : true,\r
+                       'm4a' : true,\r
                        'wma' : true,\r
                        'wav' : true\r
                },\r
 \r
                detect : function( proxy, source, ext ){\r
-                       proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : ext === 'mp3' || ext === 'wma' || ext === 'wav' } );                             \r
+                       // TODO source = .mp3#CBR\r
+                       // 得意度で返す\r
+                       proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : ext === 'mp3' || ext === 'm4a' || ext === 'wma' || ext === 'wav' } );                            \r
                },\r
                \r
-               klass : X_Audio_SLAudioWrapper\r
+               klass : X_SLAudio\r
                \r
        } );\r
 \r