+ loader : null,
+
+ _startPos : 0,
+ _endPosition : 0,
+ _startTime : 0,
+ _timerID : 0,
+ _interval : 0,
+ buffer : null,
+ source : null,
+ gainNode : null,
+ _onended : null,
+
+ Constructor : function( target, url, option ){
+ var i = 0,
+ l = X_Audio_BUFFER_LIST.length,
+ loader;
+
+ for( ; i < l; ++i ){
+ loader = X_Audio_BUFFER_LIST[ i ];
+ if( loader.url === url ){
+ this.loader = loader;
+ loader.webAudioList.push( this );
+ break;
+ };
+ };
+
+ if( !this.loader ){
+ this.loader = loader = new X_Audio_BufferLoader( this, url );
+ };
+
+ this.target = target || this;
+
+ this.setState( option );
+
+ this[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_WebAudio_handleEvent );
+
+ if( loader.buffer || loader.error ){
+ this._onLoadBufferComplete();
+ } else {
+ loader[ 'listenOnce' ]( X_EVENT_COMPLETE, this, this._onLoadBufferComplete );
+ };
+ },
+ _onLoadBufferComplete : function( e ){
+ var loader = this.loader,
+ buffer = loader.buffer;
+
+ e && loader[ 'unlisten' ]( X_EVENT_COMPLETE, this, this._onLoadBufferComplete );
+
+ if ( !buffer ) {
+ this.error = loader.error;
+
+ this.target[ 'dispatch' ]({
+ type : X_EVENT_ERROR,
+ error : loader.error,
+ message : loader.error === 1 ?
+ 'load buffer network error' :
+ 'buffer decode error'
+ });
+ this[ 'kill' ]();
+ return;
+ };
+
+ this.buffer = buffer;
+ this.duration = buffer.duration * 1000;
+
+ this.target[ 'asyncDispatch' ]( X_EVENT_READY );
+
+ this.autoplay && X_Timer_once( 16, this, this.play );
+
+ },