OSDN Git Service

Version 0.6.133, fix for closure compiler - ADVANCED_OPTIMIZATIONS
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 03_XSilverlightAudio.js
index 51433aa..ce8ffa7 100644 (file)
@@ -22,7 +22,7 @@ if( X.Pulgin.SilverlightEnabled ){
                'X.AV.SilverlightAudioWrapper',\r
                X.Class.POOL_OBJECT,\r
                {\r
-                       _isSilverlight  : true, // for X.EventDispatcher.listen\r
+                       '_rawType'      : X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT,\r
                proxy           : null,\r
                \r
                        startTime       : 0,\r
@@ -69,6 +69,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                // TODO embed\r
                                this.proxy       = proxy;\r
                                this._source     = source;\r
+                               // X.Audio._slOnload_ は不可\r
                        this._onload     = 'XAudioSilverlightOnLoad' + ( ++X_Audio_SLAudio_uid );\r
                                this._callback   = window[ this._onload ] = X_Callback_create( this, this.onSLReady );\r
                        this.xnodeObject = X_Node_body\r
@@ -89,7 +90,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                        );\r
                                X_AudioWrapper_updateStates( this, option );\r
        \r
-                               this.listenOnce( X.Event.KILL_INSTANCE );\r
+                               this.listenOnce( X_Event.KILL_INSTANCE );\r
                        },\r
                        \r
                        onSLReady : function( sender ){\r
@@ -109,13 +110,14 @@ if( X.Pulgin.SilverlightEnabled ){
                                        '</Canvas>'));\r
                \r
                                this._rawObject = sender.findName('media'); // x:Name='media'\r
-                               \r
+\r
                                this.listen( [ 'MediaFailed', 'MediaOpened', 'MediaEnded', 'CurrentStateChanged' ] );\r
                        },\r
                        \r
                        handleEvent : function( e ){\r
                                var lastState, currentState;\r
                                \r
+                               console.log( e.type );\r
                                switch( e.type ){\r
                                        \r
                                        case 'MediaFailed' :\r
@@ -123,18 +125,19 @@ if( X.Pulgin.SilverlightEnabled ){
                                                this.playing = false;\r
                                                this._ended  = true;\r
                                                this._paused = false;\r
-                                               this.proxy.dispatch( 'error' ); // open failed\r
+                                               this.proxy.dispatch( X_Event.ERROR ); // open failed\r
                                                break;\r
 \r
                                        case 'MediaOpened' :\r
                                                // http://msdn.microsoft.com/ja-jp/library/bb979710(VS.95).aspx\r
                                                this.duration = this._rawObject.NaturalDuration.Seconds * 1000;\r
                                                // TODO 'canplaythrough'\r
-                                               this.proxy.asyncDispatch( 'loadstart' );\r
-                               this.proxy.asyncDispatch( 'loadedmetadata' );\r
-                               this.proxy.asyncDispatch( 'loadeddata' );\r
-                               this.proxy.asyncDispatch( 'canplay' );\r
-                               this.proxy.asyncDispatch( 'canplaythrough' );\r
+                                               //this.proxy.asyncDispatch( 'loadstart' );\r
+                               //this.proxy.asyncDispatch( 'loadedmetadata' );\r
+                               //this.proxy.asyncDispatch( 'loadeddata' );\r
+                               //this.proxy.asyncDispatch( 'canplay' );\r
+                               //this.proxy.asyncDispatch( 'canplaythrough' );\r
+                               this.proxy.asyncDispatch( X_Event.READY );\r
                                \r
                                this.autoplay && X.Timer.once( 16, this, this.play );\r
                                                break;\r
@@ -159,10 +162,10 @@ if( X.Pulgin.SilverlightEnabled ){
                                                        case 'Opening' :\r
                                                                switch( this._lastUserAction ){\r
                                                                        case 'play' :\r
-                                                                               this.proxy.dispatch( 'waiting' );\r
+                                                                               this.proxy.dispatch( X_Event.MEDIA_WAITING );\r
                                                                                break;\r
                                                                        case 'seek' :\r
-                                                                               this.proxy.dispatch( 'seeking' );\r
+                                                                               this.proxy.dispatch( X_Event.MEDIA_SEEKING );\r
                                                                                break;\r
                                                                        case 'pause' :\r
                                                                                break;\r
@@ -179,7 +182,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                                                this.playing = false;\r
                                                                this._ended  = true;\r
                                                                this._paused = false;\r
-                                                               this.proxy.dispatch( 'error' );\r
+                                                               this.proxy.dispatch( X_Event.ERROR );\r
                                                                break;\r
 \r
                                                        // userAction.pause()              -> MediaState('Paused') -> x\r
@@ -194,7 +197,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                                                                this.seekTime = 0;\r
                                                                                this._ended   = true;\r
                                                                                this._paused  = false;\r
-                                                                               this.proxy.dispatch( 'ended' );\r
+                                                                               this.proxy.dispatch( X_Event.MEDIA_ENDED );\r
                                                                                this._currentTime( this.startTime );\r
                                                                                break;\r
                                                                        case 'pause':\r
@@ -213,7 +216,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                                                this.playing = true;\r
                                                                this._ended  = false;\r
                                                                this._paused = false;\r
-                                                               this.proxy.dispatch( 'playing' );\r
+                                                               this.proxy.dispatch( X_Event.MEDIA_PLAYING );\r
                                                                break;\r
 \r
                                                        // stop()\r
@@ -226,10 +229,10 @@ if( X.Pulgin.SilverlightEnabled ){
                                                };\r
                                                break;\r
 \r
-                                       case X.Event.KILL_INSTANCE :\r
+                                       case X_Event.KILL_INSTANCE :\r
                                                if( this._onload ){\r
                                                        // window への delete に ie5 は対応しないが、そもそも ie5 は Silverlight に非対応\r
-                                                       delete window[ this._onload ];\r
+                                                       window[ this._onload ] = null;\r
                                                        delete this._onload;\r
                                                        X_Callback_correct( this._callback );\r
                                                };\r
@@ -240,7 +243,7 @@ if( X.Pulgin.SilverlightEnabled ){
                        \r
                        close : function(){\r
                                this.playing && this.pause();\r
-                               this.proxy.dispatch( 'ended' );\r
+                               this.proxy.dispatch( X_Event.MEDIA_ENDED );\r
                                this.kill();\r
                        },\r
                        \r
@@ -258,16 +261,17 @@ if( X.Pulgin.SilverlightEnabled ){
                                this._lastUserAction = 0 <= this.seekTime ? 'seek' : 'play';\r
                                \r
                                end   = X_AudioWrapper_getEndTime( this );\r
-                               begin = X_AudioWrapper_getStartTime( this, end, true );\r
+                               begin = X_AudioWrapper_getStartTime( this, end, true ) | 0;\r
                                \r
                                console.log( '[SLAudio] play ' + begin + ' -> ' + end );\r
                                \r
                            this._rawObject.Volume = this.volume;\r
+                           this._beginTime = begin;\r
                            this._currentTime( begin );\r
                            \r
                            if( !this.playing ){\r
                                    this._rawObject.play();\r
-                           this.proxy.dispatch( 'play' );\r
+                           //this.proxy.dispatch( 'play' );\r
                            \r
                            this.playing = true;\r
                            };\r
@@ -290,16 +294,25 @@ if( X.Pulgin.SilverlightEnabled ){
                                                delete this._interval;\r
                                                return X_Callback_UN_LISTEN;\r
                                        };\r
-                                       this.proxy.dispatch( 'timeupdate' );\r
+                                       this.proxy.dispatch( X_Event.MEDIA_PLAYING );\r
                                },\r
                                \r
                                _onEnded : function(){\r
-                                       var time;\r
+                                       var time, end;\r
                                        delete this._timerID;\r
                                        \r
                            if( this.playing ){\r
+                               console.log( '> end ' + X_AudioWrapper_getEndTime( this ) + ' current:' + ( this._rawObject.Position.Seconds * 1000 | 0 ) );\r
+                               time = this._rawObject.Position.Seconds * 1000 | 0;\r
+                               \r
+                               if( time <= this._beginTime ){\r
+                                       console.log( '== waiting' );\r
+                                       this.proxy.dispatch( X_Event.MEDIA_WAITING );\r
+                                       this._timerID = X.Timer.once( X_AudioWrapper_getEndTime( this ) - this._beginTime, this, this._onEnded );\r
+                                       return;\r
+                               };\r
                                \r
-                               time = this._rawObject.Position.Seconds * 1000 - X_AudioWrapper_getEndTime( this ) | 0;\r
+                               time -= X_AudioWrapper_getEndTime( this );\r
                                if( time < 0 ){\r
                                        console.log( '> onEnd ' + time );\r
                                        this._timerID = X.Timer.once( -time, this, this._onEnded );\r
@@ -307,11 +320,14 @@ if( X.Pulgin.SilverlightEnabled ){
                                };\r
                                \r
                                if( this.loop ){\r
-                                       this.looped = true;\r
-                                       ( this.proxy.dispatch( 'looped' ) | X.Callback.PREVENT_DEFAULT ) || this.play();\r
+                                       if( !( this.proxy.dispatch( X_Event.MEDIA_BEFORE_LOOP ) & X.Callback.PREVENT_DEFAULT ) ){\r
+                                               this.looped = true;\r
+                                               this.proxy.dispatch( X_Event.MEDIA_LOOPED );\r
+                                               this.play();\r
+                                       };\r
                                } else {\r
                                        this.pause();\r
-                                       this.proxy.dispatch( 'ended' );                         \r
+                                       this.proxy.dispatch( X_Event.MEDIA_ENDED );\r
                                };\r
                            };\r
                                },\r
@@ -327,7 +343,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                this._ended   = false;\r
                                                        \r
                                this._rawObject.pause();\r
-                               this.proxy.dispatch( 'pause' );\r
+                               //this.proxy.dispatch( 'pause' );\r
                        },\r
                        \r
                        // SilverlightAudio.state\r
@@ -341,9 +357,9 @@ if( X.Pulgin.SilverlightEnabled ){
                                        loopStartTime : this.loopStartTime < 0 ? this.startTime : this.loopStartTime,\r
                                        loopEndTime   : this.loopEndTime < 0 ? ( this.endTime || this.duration ) : this.loopEndTime,\r
                                        \r
-                                       currentTime   : this.playing ? this._rawObject.Position.Seconds * 1000 : this.seekTime,\r
-                                       \r
-                                       \r
+                                       // 整数化 しておかないと seek 時に不具合がある。\r
+                                       currentTime   : this.playing ? this._rawObject.Position.Seconds * 1000 | 0 : this.seekTime,\r
+\r
                                        loop          : this.loop,\r
                                        looped        : this.looped,\r
                                        volume        : this.volume,\r
@@ -364,7 +380,7 @@ if( X.Pulgin.SilverlightEnabled ){
                                                this._timerID && X.Timer.remove( this._timerID );\r
                                                \r
                                                if( halfway ){\r
-                                                       this._timerID = X.Timer.once( end - this._rawObject.Position.Seconds * 1000, this, this._onEnded );\r
+                                                       this._timerID = X.Timer.once( end - this._rawObject.Position.Seconds * 1000 | 0, this, this._onEnded );\r
                                                } else {\r
                                                        delete this._timerID;\r
                                                };\r
@@ -397,7 +413,7 @@ if( X.Pulgin.SilverlightEnabled ){
 \r
                detect : function( proxy, source, ext ){\r
                        var ok = ext === 'mp3' || ext === 'wma' || ext === 'wav';\r
-                       proxy.asyncDispatch( ok ? 'support' : 'nosupport' );                            \r
+                       proxy.asyncDispatch( { type : X_Event.COMPLETE, canPlay : ok } );                               \r
                },\r
                \r
                klass : X_Audio_SLAudioWrapper\r