limiter-audio-worklet-processor 1.1.41 → 1.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/build/es5/bundle.js +7 -52
- package/package.json +18 -18
package/README.md
CHANGED
|
@@ -2,5 +2,4 @@
|
|
|
2
2
|
|
|
3
3
|
**The AudioWorkletProcessor which is used by the limiter-audio-worklet package.**
|
|
4
4
|
|
|
5
|
-
[](https://github.com/chrisguttandin/limiter-audio-worklet-processor/network/dependencies)
|
|
6
5
|
[](https://www.npmjs.com/package/limiter-audio-worklet-processor)
|
package/build/es5/bundle.js
CHANGED
|
@@ -18,17 +18,14 @@
|
|
|
18
18
|
var ConstantMemoryDeque = /*#__PURE__*/function () {
|
|
19
19
|
function ConstantMemoryDeque(_buffer) {
|
|
20
20
|
_classCallCheck__default["default"](this, ConstantMemoryDeque);
|
|
21
|
-
|
|
22
21
|
this._buffer = _buffer;
|
|
23
22
|
this._firstIndex = 0;
|
|
24
23
|
this._isEmpty = true;
|
|
25
24
|
this._lastIndex = 0;
|
|
26
|
-
|
|
27
25
|
if (this._buffer.length === 0) {
|
|
28
26
|
throw new Error('The given buffer is too small.');
|
|
29
27
|
}
|
|
30
28
|
}
|
|
31
|
-
|
|
32
29
|
_createClass__default["default"](ConstantMemoryDeque, [{
|
|
33
30
|
key: "size",
|
|
34
31
|
get: function get() {
|
|
@@ -38,21 +35,18 @@
|
|
|
38
35
|
key: "first",
|
|
39
36
|
value: function first() {
|
|
40
37
|
this._throwIfEmpty();
|
|
41
|
-
|
|
42
38
|
return this._buffer[this._firstIndex];
|
|
43
39
|
}
|
|
44
40
|
}, {
|
|
45
41
|
key: "last",
|
|
46
42
|
value: function last() {
|
|
47
43
|
this._throwIfEmpty();
|
|
48
|
-
|
|
49
44
|
return this._buffer[this._lastIndex];
|
|
50
45
|
}
|
|
51
46
|
}, {
|
|
52
47
|
key: "pop",
|
|
53
48
|
value: function pop() {
|
|
54
49
|
this._throwIfEmpty();
|
|
55
|
-
|
|
56
50
|
if (this._firstIndex === this._lastIndex) {
|
|
57
51
|
this._isEmpty = true;
|
|
58
52
|
} else {
|
|
@@ -63,7 +57,6 @@
|
|
|
63
57
|
key: "shift",
|
|
64
58
|
value: function shift() {
|
|
65
59
|
this._throwIfEmpty();
|
|
66
|
-
|
|
67
60
|
if (this._firstIndex === this._lastIndex) {
|
|
68
61
|
this._isEmpty = true;
|
|
69
62
|
} else {
|
|
@@ -78,11 +71,9 @@
|
|
|
78
71
|
this._isEmpty = false;
|
|
79
72
|
} else {
|
|
80
73
|
var nextIndex = this._decrementIndex(this._firstIndex);
|
|
81
|
-
|
|
82
74
|
if (nextIndex === this._lastIndex) {
|
|
83
75
|
throw new Error('Deque is full.');
|
|
84
76
|
}
|
|
85
|
-
|
|
86
77
|
this._buffer[nextIndex] = value;
|
|
87
78
|
this._firstIndex = nextIndex;
|
|
88
79
|
}
|
|
@@ -105,18 +96,15 @@
|
|
|
105
96
|
}
|
|
106
97
|
}
|
|
107
98
|
}]);
|
|
108
|
-
|
|
109
99
|
return ConstantMemoryDeque;
|
|
110
100
|
}();
|
|
111
101
|
|
|
112
102
|
var readFromRingBuffer = function readFromRingBuffer(target, source, offset) {
|
|
113
103
|
var theoreticalNextOffset = offset + source.length;
|
|
114
|
-
|
|
115
104
|
if (theoreticalNextOffset <= target.length) {
|
|
116
105
|
source.set(new Float32Array(target.buffer, target.byteOffset + offset * source.BYTES_PER_ELEMENT, source.length));
|
|
117
106
|
return theoreticalNextOffset === target.length ? 0 : theoreticalNextOffset;
|
|
118
107
|
}
|
|
119
|
-
|
|
120
108
|
var nextOffset = theoreticalNextOffset - target.length;
|
|
121
109
|
var lengthOfFirstChunk = target.length - offset;
|
|
122
110
|
source.set(new Float32Array(target.buffer, target.byteOffset + offset * source.BYTES_PER_ELEMENT, lengthOfFirstChunk));
|
|
@@ -126,12 +114,10 @@
|
|
|
126
114
|
|
|
127
115
|
var writeToRingBuffer = function writeToRingBuffer(target, source, offset) {
|
|
128
116
|
var theoreticalNextOffset = offset + source.length;
|
|
129
|
-
|
|
130
117
|
if (theoreticalNextOffset <= target.length) {
|
|
131
118
|
target.set(source, offset);
|
|
132
119
|
return theoreticalNextOffset === target.length ? 0 : theoreticalNextOffset;
|
|
133
120
|
}
|
|
134
|
-
|
|
135
121
|
var nextOffset = theoreticalNextOffset - target.length;
|
|
136
122
|
var lengthOfFirstChunk = target.length - offset;
|
|
137
123
|
target.set(new Float32Array(source.buffer, source.byteOffset, lengthOfFirstChunk), offset);
|
|
@@ -140,36 +126,28 @@
|
|
|
140
126
|
};
|
|
141
127
|
|
|
142
128
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
|
|
143
|
-
|
|
144
129
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
145
130
|
var RELEASE_TIME_SECONDS = 0.5;
|
|
146
131
|
var RELEASE_GAIN = Math.exp(-1 / (sampleRate * RELEASE_TIME_SECONDS));
|
|
147
132
|
var THRESHOLD = Math.pow(10, -0.1);
|
|
148
|
-
|
|
149
133
|
var computeEnvelope = function computeEnvelope(envelopeBuffer, delayBuffer, offset, constantMemoryDeque) {
|
|
150
134
|
var previousEnvelopeValue = envelopeBuffer[127];
|
|
151
|
-
|
|
152
135
|
for (var i = 0; i < 128; i += 1) {
|
|
153
136
|
var readOffset = (offset + i) % delayBuffer.length;
|
|
154
137
|
var absoluteValue = Math.abs(delayBuffer[readOffset]);
|
|
155
138
|
var maximumValue = void 0;
|
|
156
139
|
var remainingSteps = void 0;
|
|
157
|
-
|
|
158
140
|
if (constantMemoryDeque !== null) {
|
|
159
141
|
while (constantMemoryDeque.size > 0 && absoluteValue >= Math.abs(delayBuffer[constantMemoryDeque.first()])) {
|
|
160
142
|
constantMemoryDeque.shift();
|
|
161
143
|
}
|
|
162
|
-
|
|
163
144
|
if (constantMemoryDeque.size === 0 || absoluteValue < Math.abs(delayBuffer[constantMemoryDeque.first()])) {
|
|
164
145
|
constantMemoryDeque.unshift(readOffset);
|
|
165
146
|
}
|
|
166
|
-
|
|
167
147
|
var dropOffset = (offset + i + 128) % delayBuffer.length;
|
|
168
|
-
|
|
169
148
|
if (constantMemoryDeque.last() === dropOffset) {
|
|
170
149
|
constantMemoryDeque.pop();
|
|
171
150
|
}
|
|
172
|
-
|
|
173
151
|
var indexOfMaximum = constantMemoryDeque.last();
|
|
174
152
|
maximumValue = Math.abs(delayBuffer[indexOfMaximum]);
|
|
175
153
|
remainingSteps = indexOfMaximum < readOffset ? readOffset - indexOfMaximum + 1 : readOffset + delayBuffer.length - indexOfMaximum + 1;
|
|
@@ -177,62 +155,46 @@
|
|
|
177
155
|
maximumValue = absoluteValue;
|
|
178
156
|
remainingSteps = 1;
|
|
179
157
|
}
|
|
180
|
-
|
|
181
158
|
var difference = previousEnvelopeValue - maximumValue;
|
|
182
|
-
|
|
183
159
|
if (previousEnvelopeValue < maximumValue) {
|
|
184
160
|
previousEnvelopeValue = previousEnvelopeValue - difference / remainingSteps;
|
|
185
161
|
} else {
|
|
186
162
|
previousEnvelopeValue = maximumValue + RELEASE_GAIN * difference;
|
|
187
163
|
}
|
|
188
|
-
|
|
189
164
|
envelopeBuffer[i] = previousEnvelopeValue;
|
|
190
165
|
}
|
|
191
166
|
};
|
|
192
|
-
|
|
193
167
|
var LimiterAudioWorkletProcessor = /*#__PURE__*/function (_AudioWorkletProcesso) {
|
|
194
168
|
_inherits__default["default"](LimiterAudioWorkletProcessor, _AudioWorkletProcesso);
|
|
195
|
-
|
|
196
169
|
var _super = _createSuper(LimiterAudioWorkletProcessor);
|
|
197
|
-
|
|
198
170
|
function LimiterAudioWorkletProcessor(_ref) {
|
|
199
171
|
var _this;
|
|
200
|
-
|
|
201
172
|
var channelCount = _ref.channelCount,
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
173
|
+
channelCountMode = _ref.channelCountMode,
|
|
174
|
+
numberOfInputs = _ref.numberOfInputs,
|
|
175
|
+
numberOfOutputs = _ref.numberOfOutputs,
|
|
176
|
+
outputChannelCount = _ref.outputChannelCount,
|
|
177
|
+
processorOptions = _ref.processorOptions;
|
|
208
178
|
_classCallCheck__default["default"](this, LimiterAudioWorkletProcessor);
|
|
209
|
-
|
|
210
179
|
var attack = _typeof__default["default"](processorOptions) === 'object' && processorOptions !== null && 'attack' in processorOptions ? processorOptions.attack : 0;
|
|
211
|
-
|
|
212
180
|
if (typeof attack !== 'number') {
|
|
213
181
|
throw new Error('The attack needs to be of type "number".');
|
|
214
182
|
}
|
|
215
|
-
|
|
216
183
|
if (attack < 0) {
|
|
217
184
|
throw new Error("The attack can't be negative.");
|
|
218
185
|
}
|
|
219
|
-
|
|
220
186
|
if (channelCountMode !== 'explicit') {
|
|
221
187
|
throw new Error('The channelCountMode needs to be "explicit".');
|
|
222
188
|
}
|
|
223
|
-
|
|
224
189
|
if (numberOfInputs !== 1) {
|
|
225
190
|
throw new Error('The numberOfInputs must be 1.');
|
|
226
191
|
}
|
|
227
|
-
|
|
228
192
|
if (numberOfOutputs !== 1) {
|
|
229
193
|
throw new Error('The numberOfOutputs must be 1.');
|
|
230
194
|
}
|
|
231
|
-
|
|
232
195
|
if (outputChannelCount === undefined || channelCount !== outputChannelCount[0]) {
|
|
233
196
|
throw new Error('The channelCount must be the same as the outputChannelCount of the first output.');
|
|
234
197
|
}
|
|
235
|
-
|
|
236
198
|
_this = _super.call(this);
|
|
237
199
|
var attackSamples = sampleRate * attack;
|
|
238
200
|
var delaySize = Math.round(attackSamples);
|
|
@@ -255,19 +217,15 @@
|
|
|
255
217
|
_this._writeOffset = 0;
|
|
256
218
|
return _this;
|
|
257
219
|
}
|
|
258
|
-
|
|
259
220
|
_createClass__default["default"](LimiterAudioWorkletProcessor, [{
|
|
260
221
|
key: "process",
|
|
261
222
|
value: function process(_ref2, _ref3) {
|
|
262
223
|
var _ref4 = _slicedToArray__default["default"](_ref2, 1),
|
|
263
|
-
|
|
264
|
-
|
|
224
|
+
input = _ref4[0];
|
|
265
225
|
var _ref5 = _slicedToArray__default["default"](_ref3, 1),
|
|
266
|
-
|
|
267
|
-
|
|
226
|
+
output = _ref5[0];
|
|
268
227
|
var numberOfChannels = input.length;
|
|
269
228
|
var writeOffset = this._writeOffset;
|
|
270
|
-
|
|
271
229
|
for (var channel = 0; channel < numberOfChannels; channel += 1) {
|
|
272
230
|
var constantMemoryDeque = this._constantMemoryDeques === null ? null : this._constantMemoryDeques[channel];
|
|
273
231
|
var delayBuffer = this._delayBuffers[channel];
|
|
@@ -277,17 +235,14 @@
|
|
|
277
235
|
this._writeOffset = writeToRingBuffer(delayBuffer, inputChannelData, writeOffset);
|
|
278
236
|
computeEnvelope(envelopeBuffer, delayBuffer, writeOffset, constantMemoryDeque);
|
|
279
237
|
readFromRingBuffer(delayBuffer, outputChannelData, this._writeOffset);
|
|
280
|
-
|
|
281
238
|
for (var i = 0; i < 128; i += 1) {
|
|
282
239
|
var gain = Math.min(1, THRESHOLD / envelopeBuffer[i]);
|
|
283
240
|
outputChannelData[i] *= gain;
|
|
284
241
|
}
|
|
285
242
|
}
|
|
286
|
-
|
|
287
243
|
return true;
|
|
288
244
|
}
|
|
289
245
|
}]);
|
|
290
|
-
|
|
291
246
|
return LimiterAudioWorkletProcessor;
|
|
292
247
|
}( /*#__PURE__*/_wrapNativeSuper__default["default"](AudioWorkletProcessor));
|
|
293
248
|
LimiterAudioWorkletProcessor.parameterDescriptors = [];
|
package/package.json
CHANGED
|
@@ -9,28 +9,28 @@
|
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@babel/runtime": "^7.
|
|
12
|
+
"@babel/runtime": "^7.19.4",
|
|
13
13
|
"tslib": "^2.4.0"
|
|
14
14
|
},
|
|
15
15
|
"description": "The AudioWorkletProcessor which is used by the limiter-audio-worklet package.",
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@babel/core": "^7.
|
|
17
|
+
"@babel/core": "^7.19.6",
|
|
18
18
|
"@babel/plugin-external-helpers": "^7.18.6",
|
|
19
|
-
"@babel/plugin-transform-runtime": "^7.
|
|
20
|
-
"@babel/preset-env": "^7.
|
|
21
|
-
"@commitlint/cli": "^17.
|
|
22
|
-
"@commitlint/config-angular": "^17.0
|
|
19
|
+
"@babel/plugin-transform-runtime": "^7.19.6",
|
|
20
|
+
"@babel/preset-env": "^7.19.4",
|
|
21
|
+
"@commitlint/cli": "^17.1.2",
|
|
22
|
+
"@commitlint/config-angular": "^17.1.0",
|
|
23
23
|
"@rollup/plugin-babel": "^5.3.1",
|
|
24
24
|
"chai": "^4.3.6",
|
|
25
25
|
"commitizen": "^4.2.5",
|
|
26
26
|
"cz-conventional-changelog": "^3.3.0",
|
|
27
|
-
"eslint": "^8.
|
|
28
|
-
"eslint-config-holy-grail": "^52.0.
|
|
27
|
+
"eslint": "^8.26.0",
|
|
28
|
+
"eslint-config-holy-grail": "^52.0.33",
|
|
29
29
|
"grunt": "^1.5.3",
|
|
30
30
|
"grunt-cli": "^1.4.3",
|
|
31
31
|
"grunt-sh": "^0.2.0",
|
|
32
32
|
"husky": "^8.0.1",
|
|
33
|
-
"karma": "^6.4.
|
|
33
|
+
"karma": "^6.4.1",
|
|
34
34
|
"karma-chrome-launcher": "^3.1.1",
|
|
35
35
|
"karma-cli": "^2.0.0",
|
|
36
36
|
"karma-firefox-launcher": "^2.1.2",
|
|
@@ -42,19 +42,19 @@
|
|
|
42
42
|
"karma-webpack": "^5.0.0",
|
|
43
43
|
"load-grunt-config": "^4.0.1",
|
|
44
44
|
"memory-fs": "^0.5.0",
|
|
45
|
-
"mocha": "^10.
|
|
45
|
+
"mocha": "^10.1.0",
|
|
46
46
|
"prettier": "^2.7.1",
|
|
47
47
|
"pretty-quick": "^3.1.3",
|
|
48
48
|
"rimraf": "^3.0.2",
|
|
49
|
-
"rollup": "^2.
|
|
50
|
-
"sinon": "^14.0.
|
|
49
|
+
"rollup": "^2.79.1",
|
|
50
|
+
"sinon": "^14.0.1",
|
|
51
51
|
"sinon-chai": "^3.7.0",
|
|
52
|
-
"standardized-audio-context": "^25.3.
|
|
53
|
-
"ts-loader": "^9.
|
|
54
|
-
"tsconfig-holy-grail": "^11.1.
|
|
52
|
+
"standardized-audio-context": "^25.3.33",
|
|
53
|
+
"ts-loader": "^9.4.1",
|
|
54
|
+
"tsconfig-holy-grail": "^11.1.36",
|
|
55
55
|
"tslint": "^6.1.3",
|
|
56
|
-
"tslint-config-holy-grail": "^53.2.
|
|
57
|
-
"typescript": "^4.
|
|
56
|
+
"tslint-config-holy-grail": "^53.2.33",
|
|
57
|
+
"typescript": "^4.8.4",
|
|
58
58
|
"webpack": "^5.74.0"
|
|
59
59
|
},
|
|
60
60
|
"files": [
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"test": "grunt lint && grunt test"
|
|
78
78
|
},
|
|
79
79
|
"types": "build/es2019/module.d.ts",
|
|
80
|
-
"version": "1.1.
|
|
80
|
+
"version": "1.1.43"
|
|
81
81
|
}
|