OSDN Git Service

fix X.UA & X.Audio, add X.KB.
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 10_XAudioSprite.js
index ac5b19e..53f5ed0 100644 (file)
@@ -5,12 +5,17 @@
  * iframe 内で生成して、Audio Sprite の preset で再生できないか?\r
  */\r
 var X_Audio_Sprite_shouldUse        = window.HTMLAudioElement && ( X_UA[ 'iOS' ] || X_UA[ 'AndroidBrowser' ] || X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ), // Flash がない\r
-       X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 \r
-       X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti,      \r
+       X_Audio_Sprite_useVideoForMulti = //( X_UA[ 'AndroidBrowser3' ] && 3.1 <= X_UA[ 'AndroidBrowser' ] ) || \r
+                                                                         //( ( 4.2 <= X_UA[ 'AndroidBrowser' ] || ( 4.1 <= X_UA[ 'AndroidBrowser' ] && 2 <= X_UA[ 'AndroidPatch' ] ) ) && X_UA[ 'AndroidWebkit' ] <= 534.3 ),\r
+                                                                         // ドスパラパッドはビデオのインライン再生が不可, 534.30 で Webkit系は終了, 次は 537.36 で Chrome系\r
+                                                                         false, //X_UA[ 'AndroidChromeBrowser' ],\r
+       X_Audio_Sprite_needTouchAndroid = X_UA[ 'AndroidChromeBrowser' ] && !X_Audio_WebAudioWrapper,\r
        X_Audio_Sprite_needTouchFirst   = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
-       X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ) && !( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
+       X_Audio_Sprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
        X_Audio_Sprite_enableVolume     = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
-       X_Audio_Sprite_maxTracks        = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,\r
+       // http://tukumemo.com/html5-audio-sp/\r
+       // iOS6、Android4.1から同時再生が可能になりました。\r
+       X_Audio_Sprite_maxTracks        = X_Audio_Sprite_useVideoForMulti ? 2 : X_Audio_Sprite_disableMultiTrack ? 1 : 9,\r
        X_Audio_Sprite_lengthSilence    = 10000, // 一番最初の無音部分の長さ\r
        X_Audio_Sprite_lengthDistance   = 5000,  // 音間の無音の長さ\r
        X_Audio_Sprite_uid              = 0,\r
@@ -54,6 +59,12 @@ X[ 'AudioSprite' ] = function( setting ){
        \r
        n = n <= X_Audio_Sprite_maxTracks ? n : X_Audio_Sprite_maxTracks;\r
        \r
+       // TODO\r
+       // Android4.x標準ブラウザ(Chrome系)でブラウザが隠れた場合に音が鳴り続ける問題、ビデオで解決できる?\r
+       //if( X_Audio_Sprite_needTouchAndroid && n === 1 ){\r
+       //      video = true;\r
+       //};\r
+       \r
        for( k in setting ){\r
                v = setting[ k ];\r
                if( X_Type_isArray( v ) && v !== urls ){\r
@@ -80,7 +91,7 @@ X[ 'AudioSprite' ] = function( setting ){
 \r
 X[ 'AudioSprite' ][ 'shouldUse'        ] = X_Audio_Sprite_shouldUse;\r
 X[ 'AudioSprite' ][ 'needTouchFirst'   ] = X_Audio_Sprite_needTouchFirst;\r
-X[ 'AudioSprite' ][ 'enableMultiTrack' ] = X_Audio_Sprite_enableMultiTrack;\r
+X[ 'AudioSprite' ][ 'enableMultiTrack' ] = !X_Audio_Sprite_disableMultiTrack;\r
 \r
 // 再生が終わっているもの、終わりかけのものを探す\r
 // TODO 終わりかけのもの、と一番古いもの、どちらを再利用するか?これ以上に細かい実装を望む場合は X.Audio.Sprite は使わず自力で実装\r
@@ -130,7 +141,13 @@ X_Audio_Sprite_members = {
                'load' : function(){\r
                        var tracks = X_Audio_Sprite_TEMP.tracks,\r
                                i = 0, l = tracks.length;\r
+\r
                        for( ; i < l; ++i ){\r
+                               if( X_Audio_Sprite_needTouchAndroid ){\r
+                                       console.log( '[duration fix]開始 - ' + tracks[ i ][ '_rawObject' ].duration );\r
+                                       tracks[ i ]._playForDuration = 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_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 );\r
@@ -142,7 +159,7 @@ X_Audio_Sprite_members = {
                },\r
                \r
                /*\r
-                * @return uid Number\r
+                * @return {number} uid\r
                 */\r
                'play' : function( name ){\r
                        var bgm     = X_Audio_Sprite_TEMP.bgmTrack,\r
@@ -309,6 +326,7 @@ function X_AudioSprite_backendHandler( e ){
                        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
+                                       console.log( 'use video' );\r
                                };\r
                                // Audiobackend の owner として null を渡すとAudioBackend 自身へ dispatch する\r
                                X_Audio_Sprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) );\r
@@ -338,7 +356,7 @@ function X_AudioSprite_backendHandler( e ){
                        last[ 'listenOnce' ]( X_EVENT_READY, this, X_AudioSprite_backendHandler );\r
 \r
                        // READY, needTouchForPlay, needTouchForLoad\r
-                       if( X_Audio_HTMLAudioWrapper_durationFix ){\r
+                       if( X_Audio_HTMLAudioWrapper_durationFix && !X_Audio_Sprite_needTouchFirst ){\r
                                for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){\r
                                        this[ 'pause' ]( i );\r
                                };\r
@@ -352,15 +370,15 @@ function X_AudioSprite_backendHandler( e ){
                        return X_CALLBACK_STOP_NOW;\r
                \r
                case X_EVENT_READY :\r
-                       console.log( 'X.AudioSprite - Ready!' );\r
-                       \r
                        if( X_Audio_Sprite_needTouchAndroid ){\r
                                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 ] );\r
                                return;\r
                        };\r
+                       \r
+                       console.log( 'X.AudioSprite - Ready!' );\r
                        this[ 'asyncDispatch' ]( X_EVENT_READY );\r
                        break;\r
        };\r