function downsampleTrimBuffer()

in lex-web-ui/src/lib/lex/wav-worker.js [185:232]


function downsampleTrimBuffer(buffer, rate) {
  if (rate === options.sampleRate) {
    return buffer;
  }

  const length = buffer.length;
  const sampleRateRatio = options.sampleRate / rate;
  const newLength = Math.round(length / sampleRateRatio);

  const result = new Float32Array(newLength);
  let offsetResult = 0;
  let offsetBuffer = 0;
  let firstNonQuiet = 0;
  let lastNonQuiet = length;
  while (offsetResult < result.length) {
    const nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
    let accum = 0;
    let count = 0;
    for (let i = offsetBuffer; (i < nextOffsetBuffer) && (i < length); i++) {
      accum += buffer[i];
      count++;
    }
    // mark first and last sample over the quiet threshold
    if (accum > options.quietTrimThreshold) {
      if (firstNonQuiet === 0) {
        firstNonQuiet = offsetResult;
      }
      lastNonQuiet = offsetResult;
    }
    result[offsetResult] = accum / count;
    offsetResult++;
    offsetBuffer = nextOffsetBuffer;
  }

  /*
  console.info('encoder trim size reduction',
    (Math.min(newLength, lastNonQuiet + options.quietTrimSlackBack) -
    Math.max(0, firstNonQuiet - options.quietTrimSlackBack)) / result.length
  );
  */
  return (options.useTrim) ?
    // slice based on quiet threshold and put slack back into the buffer
    result.slice(
      Math.max(0, firstNonQuiet - options.quietTrimSlackBack),
      Math.min(newLength, lastNonQuiet + options.quietTrimSlackBack)
    ) :
    result;
}