added inheritance support for "volume"

pull/89/head
jmoenig 2019-04-04 18:22:56 +02:00
rodzic 12c4a994fa
commit 82deaac4f2
4 zmienionych plików z 39 dodań i 9 usunięć

Wyświetl plik

@ -62,6 +62,7 @@
* updated German translation
* moved "stage width" and "stage height" into attribute menu of the OF block for the stage
* added 'volume' and 'balance' selectors to the OF block
* Objects, Threads, Blocks: added inheritance support for "volume"
### 2019-04-03
* Objects, Threads: Safari compatibility tweaks (only use StereoPanner if available)

Wyświetl plik

@ -2667,7 +2667,8 @@ BlockMorph.prototype.userMenu = function () {
yPosition: 'y position',
direction: 'direction',
getScale: 'size',
getCostumeIdx: 'costume #'
getCostumeIdx: 'costume #',
getVolume: 'volume'
}[this.selector];
if (field && rcvr && rcvr.exemplar) {
menu.addLine();

Wyświetl plik

@ -125,6 +125,7 @@ SpriteMorph.prototype.attributes =
'size',
'costumes',
'costume #',
'volume',
'sounds',
'scripts'
];
@ -2039,7 +2040,7 @@ SpriteMorph.prototype.blockTemplates = function (category) {
blocks.push(block('changeVolume'));
blocks.push(block('setVolume'));
blocks.push(watcherToggle('getVolume'));
blocks.push(block('getVolume'));
blocks.push(block('getVolume', this.inheritsAttribute('volume')));
blocks.push('-');
blocks.push(block('changePan'));
blocks.push(block('setPan'));
@ -3326,7 +3327,7 @@ SpriteMorph.prototype.playSound = function (name) {
} else {
gain.connect(ctx.destination);
}
this.setVolume(this.volume); // probably redundant as well
this.setVolume(this.getVolume()); // probably redundant as well
aud.play();
if (stage) {
stage.activeSounds.push(aud);
@ -3344,19 +3345,33 @@ SpriteMorph.prototype.reportSounds = function () {
// SpriteMorph volume
SpriteMorph.prototype.setVolume = function (num) {
SpriteMorph.prototype.setVolume = function (num, noShadow) {
this.volume = Math.max(Math.min(+num || 0, 100), 0);
this.getGainNode().gain.setValueAtTime(
1 / Math.pow(10, Math.log2(100 / this.volume)),
this.audioContext().currentTime
);
// propagate to children that inherit my volume
if (!noShadow) {
this.shadowAttribute('volume');
}
this.instances.forEach(function (instance) {
if (instance.cachedPropagation) {
if (instance.inheritsAttribute('volume')) {
instance.setVolume(num, true);
}
}
});
};
SpriteMorph.prototype.changeVolume = function (delta) {
this.setVolume(this.volume + (+delta || 0));
this.setVolume(this.getVolume() + (+delta || 0));
};
SpriteMorph.prototype.getVolume = function () {
if (this.inheritsAttribute('volume')) {
return this.exemplar.getVolume();
}
return this.volume;
};
@ -3427,7 +3442,7 @@ SpriteMorph.prototype.playFreq = function (hz) {
}
note.setInstrument(this.instrument);
note.oscillator.frequency.value = hz;
this.setVolume(this.volume);
this.setVolume(this.getVolume());
note.oscillator.connect(gain);
if (pan) {
gain.connect(pan);
@ -5818,7 +5833,14 @@ SpriteMorph.prototype.updatePropagationCache = function () {
// (only) needed for internal optimization caching
var myself = this;
this.cachedPropagation = !isNil(this.exemplar) && detect(
['x position', 'y position', 'direction', 'size', 'costume #'],
[
'x position',
'y position',
'direction',
'size',
'costume #',
'volume'
],
function (att) {
return contains(myself.inheritedAttributes, att);
}
@ -5937,6 +5959,10 @@ SpriteMorph.prototype.refreshInheritedAttribute = function (aName) {
this.cachedPropagation = true;
this.doSwitchToCostume(this.getCostumeIdx(), true);
break;
case 'volume':
this.cachedPropagation = true;
this.setVolume(this.getVolume(), true);
break;
case 'costumes':
idx = this.getCostumeIdx();
this.costumes = this.exemplar.costumes;
@ -10028,7 +10054,9 @@ WatcherMorph.prototype.update = function () {
yPosition: 'y position',
direction: 'direction',
getCostumeIdx: 'costume #',
getScale: 'size'} [this.getter];
getScale: 'size',
getVolume: 'volume'
} [this.getter];
isGhosted = att ? this.target.inheritsAttribute(att) : false;
}
if (newValue !== '' && !isNil(newValue)) {

Wyświetl plik

@ -4103,7 +4103,7 @@ Process.prototype.doPlayNoteForSecs = function (pitch, secs) {
// interpolated
var rcvr = this.blockReceiver();
if (!this.context.startTime) {
rcvr.setVolume(rcvr.volume); // b/c Chrome needs lazy initialization
rcvr.setVolume(rcvr.getVolume()); // b/c Chrome needs lazy initialization
rcvr.setPan(rcvr.pan); // b/c Chrome needs lazy initialization
this.context.startTime = Date.now();
this.context.activeNote = new Note(pitch);