OSDN Git Service

Version 0.6.170, X.Audio is working ADVANCED_OPTIMIZATIONS.
[pettanr/clientJs.git] / 0.6.x / js / 07_audio / 01_XWebAudio.js
index e8fd81b..dd90819 100644 (file)
@@ -1,7 +1,8 @@
 
 var X_Audio_WebAudio_context = !X_UA[ 'iPhone_4s' ]  && !X_UA[ 'iPad_2Mini1' ]  && !X_UA[ 'iPod_4' ]  &&
+                                                               // TODO なんで fennec を禁止?
                                                                !( X_UA[ 'Gecko' ] && X_UA[ 'Android' ] ) &&
-                                                               ( window.AudioContext || window.webkitAudioContext ),
+                                                               ( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ),
        X_Audio_BUFFER_LIST      = [],
        X_Audio_WebAudioWrapper,
        X_Audio_BufferLoader;
@@ -14,7 +15,7 @@ if( X_Audio_WebAudio_context ){
        X_Audio_WebAudio_context = new X_Audio_WebAudio_context;
        
        X_Audio_BufferLoader = X_EventDispatcher[ 'inherits' ](
-               'X.AV.WebAudioBufferLoader',
+               'X.WebAudio.BufferLoader',
                X_Class.POOL_OBJECT,
                {
                        url             : '',
@@ -26,10 +27,10 @@ if( X_Audio_WebAudio_context ){
             error           : 0,
             webAudioList    : null,
             
-                       Constructor : function( webAudio, url ){
+                       'Constructor' : function( webAudio, url ){
                                this.webAudioList = [ webAudio ];
                                this.url = url;
-                               this.xhr = X.Net( { 'xhr' : url, 'dataType' : 'arraybuffer' } )
+                               this.xhr = X[ 'Net' ]( { 'xhr' : url, 'dataType' : 'arraybuffer' } )
                                                                        [ 'listen' ]( X_EVENT_PROGRESS, this )
                                                                        [ 'listenOnce' ]( [ X_EVENT_SUCCESS, X_EVENT_COMPLETE ], this );
                        },
@@ -48,15 +49,13 @@ if( X_Audio_WebAudio_context ){
                                        // iOS 7.1 で decodeAudioData に処理が入った瞬間にスクリーンを長押しする(スクロールを繰り返す)と
                                        // decoeAudioData の処理がキャンセルされることがある(エラーやコールバックの発火もなく、ただ処理が消滅する)。
                                        // ただし iOS 8.1.2 では エラーになる
-                                               if( X_Audio_WebAudio_context.createBuffer && X_UA[ 'iOS' ] < 8 ){
-                                                       this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.response, false ) );
+                                               if( X_UA[ 'iOS' ] < 8 || !X_Audio_WebAudio_context[ 'decodeAudioData' ] ){
+                                                       this._onDecodeSuccess( X_Audio_WebAudio_context[ 'createBuffer' ]( e.response, false ) );
                                                } else
-                                               if( X_Audio_WebAudio_context.decodeAudioData ){
-                                                       X_Audio_WebAudio_context.decodeAudioData( e.response,
+                                               if( X_Audio_WebAudio_context[ 'decodeAudioData' ] ){
+                                                       X_Audio_WebAudio_context[ 'decodeAudioData' ]( e.response,
                                                                this.onDecodeSuccess = X_Closure_create( this, this._onDecodeSuccess ),
                                                                this.onDecodeError   = X_Closure_create( this, this._onDecodeError ) );
-                                               } else {
-                                                       this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.response, false ) );
                                                };
                                                break;
 
@@ -118,7 +117,7 @@ if( X_Audio_WebAudio_context ){
        
        
        X_Audio_WebAudioWrapper = X_Audio_AbstractAudioBackend[ 'inherits' ](
-               'X.AV.WebAudioWrapper',
+               'X.WebAudio',
                X_Class.POOL_OBJECT,
                {
                        
@@ -130,11 +129,11 @@ if( X_Audio_WebAudio_context ){
             _timerID        : 0,
             _interval       : 0,
                buffer          : null,
-               source          : null,
+               bufferSource    : null,
             gainNode        : null,
             _onended        : null,
             
-                       Constructor : function( target, url, option ){                          
+                       'Constructor' : function( target, url, option ){                                
                                var i = 0,
                                        l = X_Audio_BUFFER_LIST.length,
                                        loader;
@@ -171,12 +170,12 @@ if( X_Audio_WebAudio_context ){
 
                                delete this.buffer;
                                
-                               this.playing  && this.actualPause();
-                   this.source   && this._sourceDispose();
+                               this.playing      && this.actualPause();
+                   this.bufferSource && this._sourceDispose();
        
-                   this._onended && X_Closure_correct( this._onended );        
+                   this._onended     && X_Closure_correct( this._onended );    
        
-                   this.gainNode && this.gainNode.disconnect();
+                   this.gainNode     && this.gainNode.disconnect();
                        },
                                _onLoadBufferComplete : function( e ){
                                        var loader = this.loader,
@@ -203,6 +202,8 @@ if( X_Audio_WebAudio_context ){
 
                                        this.target[ 'asyncDispatch' ]( X_EVENT_READY );
                        
+                       console.log( 'WebAudio buffer ready' );
+                       
                        this.autoplay && X_Timer_once( 16, this, this.play );
                                        
                                },
@@ -220,31 +221,31 @@ if( X_Audio_WebAudio_context ){
                                
                                console.log( '[WebAudio] play ' + begin + ' -> ' + end );
                                
-                               if( this.source ) this._sourceDispose();
+                               if( this.bufferSource ) this._sourceDispose();
                                if( !this.gainNode ){
-                                       this.gainNode = X_Audio_WebAudio_context.createGain ? X_Audio_WebAudio_context.createGain() : X_Audio_WebAudio_context.createGainNode();
-                       this.gainNode.connect( X_Audio_WebAudio_context.destination );
+                                       this.gainNode = X_Audio_WebAudio_context[ 'createGain' ] ? X_Audio_WebAudio_context[ 'createGain' ]() : X_Audio_WebAudio_context[ 'createGainNode' ]();
+                       this.gainNode[ 'connect' ]( X_Audio_WebAudio_context[ 'destination' ] );
                                };
-                   this.source        = X_Audio_WebAudio_context.createBufferSource();
-                   this.source.buffer = this.buffer;
-                   this.source.connect( this.gainNode );
+                   this.bufferSource        = X_Audio_WebAudio_context[ 'createBufferSource' ]();
+                   this.bufferSource.buffer = this.buffer;
+                   this.bufferSource[ 'connect' ]( this.gainNode );
                    
-                   this.gainNode.gain.value = this.gain;
+                   this.gainNode[ 'gain' ].value = this.gain;
                    
                    // おかしい、stop 前に外していても呼ばれる、、、@Firefox33.1
                    // 破棄された X.Callback が呼ばれて、obj.proxy() でエラーになる。Firefox では、onended は使わない
-                if( false && this.source.onended !== undefined ){
+                if( false && this.bufferSource.onended !== undefined ){
                        //console.log( '> use onended' );
-                       this.source.onended = this._onended || ( this._onended = X_Closure_create( this, this._onEnded ) );
+                       this.bufferSource.onended = this._onended || ( this._onended = X_Closure_create( this, this._onEnded ) );
                 } else {
                        this._timerID && X_Timer_remove( this._timerID );
                                        this._timerID = X_Timer_once( end - begin, this, this._onEnded );
                 };
        
-                   if( this.source.start ){
-                       this.source.start( 0, begin / 1000, end / 1000 );
+                   if( this.bufferSource.start ){
+                       this.bufferSource.start( 0, begin / 1000, end / 1000 );
                    } else {
-                       this.source.noteGrainOn( 0, begin / 1000, end / 1000 );
+                       this.bufferSource[ 'noteGrainOn' ]( 0, begin / 1000, end / 1000 );
                    };
                    
                    this.playing      = true;
@@ -255,9 +256,9 @@ if( X_Audio_WebAudio_context ){
                        },
                        
                                _sourceDispose : function(){
-                           this.source.disconnect();
-                           delete this.source.onended;
-                           delete this.source;
+                           this.bufferSource.disconnect();
+                           delete this.bufferSource.onended;
+                           delete this.bufferSource;
                        },
 
                                _onInterval : function(){
@@ -311,11 +312,11 @@ if( X_Audio_WebAudio_context ){
                                delete this._timerID;
                                delete this.playing;
 
-                   if( this.source ){
-                       if( this.source.onended ) delete this.source.onended;
+                   if( this.bufferSource ){
+                       if( this.bufferSource.onended ) delete this.bufferSource.onended;
                        
-                       this.source.stop ? 
-                               this.source.stop( 0 ) : this.source.noteOff( 0 );
+                       this.bufferSource.stop ? 
+                               this.bufferSource.stop( 0 ) : this.bufferSource[ 'noteOff' ]( 0 );
                    };
                        },
                        
@@ -328,7 +329,7 @@ if( X_Audio_WebAudio_context ){
                        this.actualPlay();
                                } else
                                if( result & 4 ){
-                      this.gainNode.gain.value = this.gain;
+                      this.gainNode[ 'gain' ].value = this.gain;
                                };
                        }