stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
86 lines • 4.14 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.divMod = void 0;
exports.downSample = downSample;
exports.upSample = exports.resampleWaveformData = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var resampleWaveformData = (waveformData, amplitudesCount) => waveformData.length === amplitudesCount ? waveformData : waveformData.length > amplitudesCount ? downSample(waveformData, amplitudesCount) : upSample(waveformData, amplitudesCount);
exports.resampleWaveformData = resampleWaveformData;
function downSample(data, targetOutputSize) {
if (data.length <= targetOutputSize || targetOutputSize === 0) {
return data;
}
if (targetOutputSize === 1) {
return [mean(data)];
}
var result = [];
var bucketSize = (data.length - 2) / (targetOutputSize - 2);
var lastSelectedPointIndex = 0;
result.push(data[lastSelectedPointIndex]);
var maxAreaPoint, maxArea, triangleArea;
for (var bucketIndex = 1; bucketIndex < targetOutputSize - 1; bucketIndex++) {
var previousBucketRefPoint = data[lastSelectedPointIndex];
var nextBucketMean = getNextBucketMean(data, bucketIndex, bucketSize);
var currentBucketStartIndex = Math.floor((bucketIndex - 1) * bucketSize) + 1;
var nextBucketStartIndex = Math.floor(bucketIndex * bucketSize) + 1;
var countUnitsBetweenAtoC = 1 + nextBucketStartIndex - currentBucketStartIndex;
maxArea = triangleArea = -1;
for (var currentPointIndex = currentBucketStartIndex; currentPointIndex < nextBucketStartIndex; currentPointIndex++) {
var countUnitsBetweenAtoB = Math.abs(currentPointIndex - currentBucketStartIndex) + 1;
var countUnitsBetweenBtoC = countUnitsBetweenAtoC - countUnitsBetweenAtoB;
var currentPointValue = data[currentPointIndex];
triangleArea = triangleAreaHeron(triangleBase(Math.abs(previousBucketRefPoint - currentPointValue), countUnitsBetweenAtoB), triangleBase(Math.abs(currentPointValue - nextBucketMean), countUnitsBetweenBtoC), triangleBase(Math.abs(previousBucketRefPoint - nextBucketMean), countUnitsBetweenAtoC));
if (triangleArea > maxArea) {
maxArea = triangleArea;
maxAreaPoint = data[currentPointIndex];
lastSelectedPointIndex = currentPointIndex;
}
}
if (typeof maxAreaPoint !== 'undefined') {
result.push(maxAreaPoint);
}
}
result.push(data[data.length - 1]);
return result;
}
var triangleAreaHeron = (a, b, c) => {
var s = (a + b + c) / 2;
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
};
var triangleBase = (a, b) => Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
var mean = values => values.reduce((acc, value) => acc + value, 0) / values.length;
var divMod = (num, divisor) => [Math.floor(num / divisor), num % divisor];
exports.divMod = divMod;
var getNextBucketMean = (data, currentBucketIndex, bucketSize) => {
var nextBucketStartIndex = Math.floor(currentBucketIndex * bucketSize) + 1;
var nextNextBucketStartIndex = Math.floor((currentBucketIndex + 1) * bucketSize) + 1;
nextNextBucketStartIndex = nextNextBucketStartIndex < data.length ? nextNextBucketStartIndex : data.length;
return mean(data.slice(nextBucketStartIndex, nextNextBucketStartIndex));
};
var upSample = (values, targetSize) => {
if (!values.length) {
console.warn('Cannot extend empty array of amplitudes.');
return values;
}
if (values.length > targetSize) {
console.warn('Requested to extend the waveformData that is longer than the target list size');
return values;
}
if (targetSize === values.length) {
return values;
}
var _divMod = divMod(targetSize, values.length),
_divMod2 = (0, _slicedToArray2.default)(_divMod, 2),
bucketSize = _divMod2[0],
remainder = _divMod2[1];
var result = [];
for (var i = 0; i < values.length; i++) {
var extra = remainder && remainder-- ? 1 : 0;
result.push(...Array(bucketSize + extra).fill(values[i]));
}
return result;
};
exports.upSample = upSample;
//# sourceMappingURL=audioSampling.js.map