1 /**
  2  * Constructor
  3  *
  4  * @class builder to generate nodes chains. Used in WebAudio.Sound
  5  * @param {webkitAudioContext} audioContext the audio context
  6 */
  7 WebAudio.NodeChainBuilder	= function(audioContext){
  8 	console.assert( audioContext instanceof webkitAudioContext );
  9 	this._context	= audioContext;
 10 	this._firstNode	= null;
 11 	this._lastNode	= null;
 12 	this._nodes	= {};
 13 };
 14 
 15 /**
 16  * destructor
 17 */
 18 WebAudio.NodeChainBuilder.prototype.destroy	= function(){
 19 };
 20 
 21 /**
 22  * getter for the nodes
 23 */
 24 WebAudio.NodeChainBuilder.prototype.nodes	= function(){
 25 	return this._nodes;
 26 }
 27 
 28 /**
 29  * @returns the first node of the chain
 30 */
 31 WebAudio.NodeChainBuilder.prototype.first	= function(){
 32 	return this._firstNode;
 33 }
 34 
 35 /**
 36  * @returns the last node of the chain
 37 */
 38 WebAudio.NodeChainBuilder.prototype.last	= function(){
 39 	return this._lastNode;
 40 }
 41 
 42 WebAudio.NodeChainBuilder.prototype._addNode	= function(node, properties)
 43 {
 44 	// update this._bufferSourceDst - needed for .cloneBufferSource()
 45 	var lastIsBufferSource	= this._lastNode && ('playbackRate' in this._lastNode) ? true : false;
 46 	if( lastIsBufferSource )	this._bufferSourceDst	= node;
 47 
 48 	// connect this._lastNode to node if suitable
 49 	if( this._lastNode !== null )	this._lastNode.connect(node);
 50 	
 51 	// update this._firstNode && this._lastNode
 52 	if( this._firstNode === null )	this._firstNode	= node;
 53 	this._lastNode	= node;
 54 		
 55 	// apply properties to the node
 56 	for( var property in properties ){
 57 		node[property]	= properties[property];
 58 	}
 59 
 60 	// for chained API
 61 	return this;
 62 };
 63 
 64 
 65 /**
 66  * Clone the bufferSource. Used just before playing a sound
 67  * @returns {AudioBufferSourceNode} the clone AudioBufferSourceNode
 68 */
 69 WebAudio.NodeChainBuilder.prototype.cloneBufferSource	= function(){
 70 	console.assert(this._nodes.bufferSource, "no buffersource presents. Add one.");
 71 	var orig	= this._nodes.bufferSource;
 72 	var clone	= this._context.createBufferSource()
 73 	clone.buffer		= orig.buffer;
 74 	clone.playbackRate	= orig.playbackRate;
 75 	clone.loop		= orig.loop;
 76 	clone.connect(this._bufferSourceDst);
 77 	return clone;
 78 }
 79 
 80 /**
 81  * add a bufferSource
 82  *
 83  * @param {Object} [properties] properties to set in the created node
 84 */
 85 WebAudio.NodeChainBuilder.prototype.bufferSource	= function(properties){
 86 	var node		= this._context.createBufferSource()
 87 	this._nodes.bufferSource= node;
 88 	return this._addNode(node, properties)
 89 };
 90 
 91 /**
 92  * add a panner
 93  * 
 94  * @param {Object} [properties] properties to set in the created node
 95 */
 96 WebAudio.NodeChainBuilder.prototype.panner	= function(properties){
 97 	var node		= this._context.createPanner()
 98 	this._nodes.panner	= node;
 99 	return this._addNode(node, properties)
100 };
101 
102 /**
103  * add a analyser
104  *
105  * @param {Object} [properties] properties to set in the created node
106 */
107 WebAudio.NodeChainBuilder.prototype.analyser	= function(properties){
108 	var node		= this._context.createAnalyser()
109 	this._nodes.analyser	= node;
110 	return this._addNode(node, properties)
111 };
112 
113 /**
114  * add a gainNode
115  *
116  * @param {Object} [properties] properties to set in the created node
117 */
118 WebAudio.NodeChainBuilder.prototype.gainNode	= function(properties){
119 	var node		= this._context.createGainNode()
120 	this._nodes.gainNode	= node;
121 	return this._addNode(node, properties)
122 };
123 
124