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