mirror of
https://github.com/Tonejs/Tone.js
synced 2025-01-01 06:28:46 +00:00
3a0a55be7b
will mute all other instances of Tone.Solo when an instance.solo=true
124 lines
No EOL
2.7 KiB
JavaScript
124 lines
No EOL
2.7 KiB
JavaScript
define(["Tone/core/Tone", "Tone/core/Gain"], function (Tone) {
|
|
|
|
/**
|
|
* @class Tone.Solo lets you isolate a specific audio stream. When
|
|
* an instance is set to `solo=true`, it will mute all other instances.
|
|
* @extends {Tone}
|
|
* @example
|
|
* var soloA = new Tone.Solo()
|
|
* var soloB = new Tone.Solo()
|
|
* soloA.solo = true
|
|
* //no audio will pass through soloB
|
|
*/
|
|
Tone.Solo = function(){
|
|
|
|
var options = Tone.defaults(arguments, ["solo"], Tone.Solo);
|
|
Tone.call(this);
|
|
|
|
/**
|
|
* The input and output node
|
|
* @type {Tone.Gain}
|
|
*/
|
|
this.input = this.output = new Tone.Gain();
|
|
|
|
/**
|
|
* Holds the current solo information
|
|
* @type {Boolean}
|
|
* @private
|
|
*/
|
|
this._solo = false;
|
|
|
|
/**
|
|
* A bound _soloed method
|
|
* @type {Function}
|
|
* @private
|
|
*/
|
|
this._soloBind = this._soloed.bind(this);
|
|
|
|
//listen for solo events class-wide.
|
|
this.context.on("solo", this._soloBind);
|
|
//set initially
|
|
this.solo = options.solo;
|
|
};
|
|
|
|
Tone.extend(Tone.Solo);
|
|
|
|
/**
|
|
* The defaults
|
|
* @type {Object}
|
|
* @static
|
|
*/
|
|
Tone.Solo.defaults = {
|
|
solo: false,
|
|
};
|
|
|
|
/**
|
|
* Isolates this instance and mutes all other instances of Tone.Solo.
|
|
* Only one instance can be soloed at a time. A soloed
|
|
* instance will report `solo=false` when another instance is soloed.
|
|
* @memberOf Tone.Solo#
|
|
* @type {Boolean}
|
|
* @name solo
|
|
*/
|
|
Object.defineProperty(Tone.Solo.prototype, "solo", {
|
|
get : function(){
|
|
return this._solo;
|
|
},
|
|
set : function(solo){
|
|
this._solo = solo;
|
|
if (solo){
|
|
this.context._currentSolo = this;
|
|
this.context.emit("solo", this);
|
|
} else if (this.context._currentSolo === this){
|
|
this.context._currentSolo = null;
|
|
this.context.emit("solo", this);
|
|
} else if (this.context._currentSolo){
|
|
this._soloed();
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* If the current instance is muted, i.e. another instance is soloed
|
|
* @memberOf Tone.Solo#
|
|
* @type {Boolean}
|
|
* @name muted
|
|
* @readOnly
|
|
*/
|
|
Object.defineProperty(Tone.Solo.prototype, "muted", {
|
|
get : function(){
|
|
return this.input.gain.value === 0;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Solo the current instance and unsolo all other instances.
|
|
* @param {Tone.Solo} instance The instance which is being soloed/unsoloed.
|
|
* @private
|
|
*/
|
|
Tone.Solo.prototype._soloed = function(){
|
|
if (this.context._currentSolo){
|
|
if (this.context._currentSolo !== this){
|
|
this._solo = false;
|
|
this.input.gain.value = 0;
|
|
} else {
|
|
this.input.gain.value = 1;
|
|
}
|
|
} else {
|
|
this.input.gain.value = 1;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Clean up
|
|
* @return {Tone.Solo} this
|
|
*/
|
|
Tone.Solo.prototype.dispose = function(){
|
|
Tone.prototype.dispose.call(this);
|
|
this.context.off("solo", this._soloBind);
|
|
this._soloBind = null;
|
|
return this;
|
|
};
|
|
|
|
return Tone.Solo;
|
|
}); |