OSDN Git Service

Version 0.6.179, fix X.Audio & X.AudioSprite.
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 10_XAudioSprite.js
index 23ff7e5..cd91dc4 100644 (file)
@@ -8,10 +8,8 @@ var X_AudioSprite_shouldUse        = X_HTMLAudio && ( X_UA[ 'iOS' ] || X_UA[ 'AO
        X_AudioSprite_useVideoForMulti = //( 3.1 <= X_UA[ 'AOSP' ] < 4 ) || \r
                                                                          //( ( 4.2 <= X_UA[ 'AOSP' ] ),\r
                                                                          // ドスパラパッドはビデオのインライン再生が不可\r
-                                                                         false, //X_UA[ 'ChromeWV' ],\r
-       X_AudioSprite_needTouchAndroid = X_UA[ 'ChromeWV' ] && !X_WebAudio,\r
-       X_AudioSprite_needTouchFirst   = X_HTMLAudio_need1stTouch,\r
-       X_AudioSprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_WebAudio_context ) || ( X_UA[ 'AOSP4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 12 ),\r
+                                                                         false,\r
+       X_AudioSprite_disableMultiTrack = !X_WebAudio && ( X_UA[ 'iOS' ] || 4 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ] || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ) ),\r
        X_AudioSprite_enableVolume     = X_HTMLAudio && ( !X_UA[ 'iOS' ] && !X_UA[ 'AOSP' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
        // http://tukumemo.com/html5-audio-sp/\r
        // iOS6、Android4.1から同時再生が可能になりました。\r
@@ -110,7 +108,6 @@ X[ 'AudioSprite' ] = function( setting ){
 };\r
 \r
 X[ 'AudioSprite' ][ 'shouldUse'        ] = X_AudioSprite_shouldUse;\r
-X[ 'AudioSprite' ][ 'needTouchFirst'   ] = X_AudioSprite_needTouchFirst;\r
 X[ 'AudioSprite' ][ 'enableMultiTrack' ] = !X_AudioSprite_disableMultiTrack;\r
 \r
 // 再生が終わっているもの、終わりかけのものを探す\r
@@ -146,22 +143,14 @@ X_AudioSprite_members =
                /**\r
                 * モバイル用タッチイベント中に呼び出す\r
                 */\r
-               'load' : function(){\r
-                       var tracks = X_AudioSprite_TEMP.tracks,\r
-                               i = 0, l = tracks.length;\r
+               'on1stTouch' : function(){\r
+                       var i = 0, l = X_AudioSprite_TEMP.tracks.length;\r
 \r
                        for( ; i < l; ++i ){\r
-                               if( X_AudioSprite_needTouchAndroid ){\r
-                                       console.log( '[duration fix]開始 - ' + tracks[ i ][ '_rawObject' ].duration );\r
-                                       tracks[ i ]._durationFixPhase = 1;\r
-                                       tracks[ i ][ '_rawObject' ].play();\r
-                               } else\r
-                               if( X_UA[ 'WinPhone' ] ){\r
-                                       console.log( 'WinPhone : touch -> play()' );\r
-                                       //tracks[ i ].play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence ).seek( 0 );\r
-                                       this[ 'pause' ]( i );\r
+                               if( X_UA[ 'iOS' ] ){\r
+                                       X_AudioSprite_TEMP.tracks[ i ][ '_rawObject' ].load();\r
                                } else {\r
-                                       tracks[ i ][ '_rawObject' ].load();\r
+                                       X_AudioSprite_instance[ 'pause' ]( i );\r
                                };\r
                        };\r
                },\r
@@ -199,7 +188,7 @@ X_AudioSprite_members =
                                                track = X_AudioSprite_TEMP.bgmTrack = tracks[ 0 ];\r
                                        };\r
                                        \r
-                                       if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){\r
+                                       if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_instance, X_AudioSprite_handleEvent ).playing ){\r
                                                track.setState({\r
                                                                'loop'          : true,\r
                                                                'looped'        : X_AudioSprite_TEMP.bgmLooped,\r
@@ -219,7 +208,7 @@ X_AudioSprite_members =
                                        if( 1 < tracks.length ){\r
                                                track = X_AudioSprite_getTrackEnded( X_AudioSprite_TEMP.bgmPlaying );\r
                                                track\r
-                                                       [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent )\r
+                                                       [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_instance, X_AudioSprite_handleEvent )\r
                                                        .setState( { 'looped' : false } );\r
                                                track.play( preset[ 0 ], preset[ 1 ], true, 0, X_AudioSprite_lengthSilence );\r
                                        } else {\r
@@ -231,7 +220,7 @@ X_AudioSprite_members =
                                                };\r
                                                track = tracks[ 0 ];\r
                                        \r
-                                               if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){\r
+                                               if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], X_AudioSprite_instance, X_AudioSprite_handleEvent ).playing ){\r
                                                        track.setState({\r
                                                                        'loop'          : true,\r
                                                                        'looped'        : false,\r
@@ -267,8 +256,8 @@ X_AudioSprite_members =
                        };\r
                        track && track.play( 0, X_AudioSprite_lengthSilence, true, 0, X_AudioSprite_lengthSilence );\r
                        track && track.seek( 0 );\r
-                       this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED );\r
-                       return this;\r
+                       X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PAUSED );\r
+                       return X_AudioSprite_instance;\r
                },\r
                \r
                /**\r
@@ -286,7 +275,7 @@ X_AudioSprite_members =
                                start = X_Audio_getStartTime( track, end );\r
                                0 <= position && position <= ( end - start ) && track.seek( start + position );\r
                        };\r
-                       return this;\r
+                       return X_AudioSprite_instance;\r
                },\r
                \r
                /**\r
@@ -305,14 +294,14 @@ X_AudioSprite_members =
                                for( i = X_AudioSprite_TEMP.tracks.length; i; ){\r
                                        X_AudioSprite_TEMP.tracks[ --i ].volume( opt_volume );\r
                                };\r
-                               return this;\r
+                               return X_AudioSprite_instance;\r
                        };\r
                        track = X_AudioSprite_TEMP.tracks[ uid ];\r
                        if( opt_volume === undefined ){\r
                                return track ? track.gain : -1;\r
                        };\r
                        track && track.volume( opt_volume );\r
-                       return this;\r
+                       return X_AudioSprite_instance;\r
                },\r
                \r
                /**\r
@@ -340,12 +329,12 @@ X_AudioSprite_members =
                                return { 'volume' : X_AudioSprite_TEMP.volume, 'playing' : false };\r
                        };\r
                        track && track.setState( opt_obj );\r
-                       return this;\r
+                       return X_AudioSprite_instance;\r
                }\r
 };\r
 \r
 function X_AudioSprite_backendHandler( e ){\r
-       var i, backend, option, src, name, last, _e;\r
+       var i, backend, option, src, name, last, _e, touch;\r
        \r
        switch( e.type ){\r
                case X_EVENT_BACKEND_READY :\r
@@ -353,9 +342,9 @@ function X_AudioSprite_backendHandler( e ){
                        backend = X_Audio_BACKENDS[ e[ 'backendID' ] ];\r
                        option  = e[ 'option' ];\r
                        \r
-                       this[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler );\r
-                       this[ 'source' ]      = src = e[ 'source' ];\r
-                       this[ 'backendName' ] = name = backend.backendName;\r
+                       X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_AudioSprite_backendHandler );\r
+                       X_AudioSprite_instance[ 'source' ]      = src = e[ 'source' ];\r
+                       X_AudioSprite_instance[ 'backendName' ] = name = backend.backendName;\r
                \r
                        //console.log( i + ' / ' + X_AudioSprite_numTracks );\r
                \r
@@ -365,11 +354,7 @@ function X_AudioSprite_backendHandler( e ){
                                        console.log( 'use video' );\r
                                };\r
                                // Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する\r
-                               X_AudioSprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) );\r
-                               \r
-                               \r
-                               //console.dir( backend );\r
-                               //console.dir( last );\r
+                               X_AudioSprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option )[ 'listen' ]( X_EVENT_DEBUG, X_AudioSprite_instance, X_AudioSprite_handleEvent ) );\r
                        };\r
 \r
                        _e = {\r
@@ -377,45 +362,39 @@ function X_AudioSprite_backendHandler( e ){
                                'source'      : src,\r
                                'backendName' : name\r
                        };\r
+                       // touch 可能で backend ready\r
                        \r
-                       if( X_AudioSprite_needTouchFirst ){\r
-                               if( name === 'WebAudio' ){\r
-                                       _e[ 'needTouchForPlay' ] = true;\r
-                               } else {\r
-                                       _e[ 'needTouchForLoad' ] = true;\r
-                               };\r
+                       if( name === 'WebAudio' ){\r
+                               _e[ 'needTouchForPlay' ] = touch = X_WebAudio_need1stTouch;\r
+                       } else\r
+                       if( name === 'HTMLAudio' ){\r
+                               _e[ 'needTouchForLoad' ] = touch = X_HTMLAudio_need1stTouch;\r
                        };\r
-                       this[ 'asyncDispatch' ]( _e );\r
+\r
+                       X_AudioSprite_instance[ 'asyncDispatch' ]( _e );\r
                        \r
                        console.log( 'AudioSprite - X_EVENT_BACKEND_READY' );\r
                        \r
-                       last[ 'listenOnce' ]( X_EVENT_READY, this, X_AudioSprite_backendHandler );\r
+                       last[ 'listenOnce' ]( touch && !X_HTMLAudio_durationFix ? X_EVENT_MEDIA_PLAYING : X_EVENT_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler );\r
 \r
                        // READY, needTouchForPlay, needTouchForLoad\r
-                       if( X_HTMLAudio_durationFix && !X_AudioSprite_needTouchFirst ){\r
+                       if( /* X_HTMLAudio_durationFix && */ !touch ){\r
                                for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){\r
-                                       this[ 'pause' ]( i );\r
+                                       X_AudioSprite_instance[ 'pause' ]( i );\r
                                };\r
                        };\r
                        \r
                        return X_CALLBACK_STOP_NOW;\r
 \r
                case X_EVENT_BACKEND_NONE :\r
-                       this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler )\r
+                       X_AudioSprite_instance[ 'unlisten' ]( X_EVENT_BACKEND_READY, X_AudioSprite_instance, X_AudioSprite_backendHandler )\r
                                [ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
                        return X_CALLBACK_STOP_NOW;\r
                \r
-               case X_EVENT_READY :\r
-                       if( X_AudioSprite_needTouchAndroid ){\r
-                               for( i = 0; i < X_AudioSprite_TEMP.tracks.length; ++i ){\r
-                                       this[ 'pause' ]( i );\r
-                               };\r
-                               e.target[ 'listenOnce' ]( X_EVENT_MEDIA_PLAYING, this, this[ 'asyncDispatch' ], [ X_EVENT_READY ] );\r
-                               return;\r
-                       };\r
-                       \r
+               case X_EVENT_READY :            \r
+               case X_EVENT_MEDIA_PLAYING :\r
                        console.log( 'X.AudioSprite - Ready!' );\r
-                       this[ 'asyncDispatch' ]( X_EVENT_READY );\r
+                       X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_READY );\r
                        break;\r
        };\r
 };\r
@@ -426,22 +405,22 @@ function X_AudioSprite_handleEvent( e ){
        \r
        switch( e.type ){\r
                case X_EVENT_MEDIA_PLAYING :\r
-                       ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING );\r
+                       ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) &&  X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING );\r
                        break;\r
                case X_EVENT_MEDIA_WAITING :\r
                case X_EVENT_MEDIA_SEEKING :\r
-                       ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( e.type );\r
+                       ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) &&  X_AudioSprite_instance[ 'asyncDispatch' ]( e.type );\r
                        break;\r
                \r
                case X_EVENT_MEDIA_BEFORE_LOOP :\r
                        if( e.target === X_AudioSprite_TEMP.bgmTrack ){\r
                                X_AudioSprite_TEMP.bgmLooped = true;\r
-                               this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
+                                X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
                        } else {\r
                                if( e.target.looped ){\r
-                                       //this[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
+                                       // X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_LOOPED ); // TODO uid\r
                                } else {\r
-                                       this[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid\r
+                                        X_AudioSprite_instance[ 'asyncDispatch' ]( X_EVENT_MEDIA_ENDED ); // TODO uid\r
                                };\r
                                \r
                                //console.log( '[AudioSprite] bgmPlaying:' + X_AudioSprite_TEMP.bgmPlaying + ' ' + !X_AudioSprite_TEMP.bgmTrack );\r
@@ -449,12 +428,21 @@ function X_AudioSprite_handleEvent( e ){
                                // single track | iOS\r
                                if( X_AudioSprite_TEMP.bgmPlaying && !X_AudioSprite_TEMP.bgmTrack ){\r
                                        X_AudioSprite_TEMP.bgmTrack = e.target;\r
-                                       this.play( X_AudioSprite_TEMP.bgmName );\r
+                                        X_AudioSprite_instance.play( X_AudioSprite_TEMP.bgmName );\r
                                        return X_CALLBACK_PREVENT_DEFAULT;\r
                                };\r
                        };\r
                        break;\r
                \r
+               \r
+               case X_EVENT_DEBUG :\r
+                       i = X_AudioSprite_TEMP.tracks.indexOf( e.target );\r
+                       if( 0 <= i ){\r
+                               e[ 'trackID' ] = i;\r
+                               X_AudioSprite_instance[ 'dispatch' ]( e );\r
+                       };\r
+                       break;\r
+               \r
                // TODO Android Firefox で アクティブ検出できない!\r
                case X_EVENT_VIEW_ACTIVATE :\r
                        console.log( '■ アクティブ' );\r
@@ -493,7 +481,7 @@ function X_AudioSprite_handleEvent( e ){
                        X_AudioSprite_TEMP.bgmLooped   = false;\r
                        X_AudioSprite_TEMP.bgmPlaying  = false;\r
                        \r
-                       X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], this, X_AudioSprite_handleEvent );\r
+                       X_ViewPort[ 'unlisten' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ],  X_AudioSprite_instance, X_AudioSprite_handleEvent );\r
                        break;\r
        };\r
 };\r