resampler.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /** @typedef {import('./types').LinearResamplerHandle} LinearResamplerHandle */
  2. const addon = require('./addon.js');
  3. /**
  4. * A linear resampler that converts audio from one sample rate to another.
  5. */
  6. class LinearResampler {
  7. /**
  8. * Create a linear resampler.
  9. *
  10. * @param {number} inputSampleRate - Input sample rate in Hz.
  11. * @param {number} outputSampleRate - Output sample rate in Hz.
  12. */
  13. constructor(inputSampleRate, outputSampleRate) {
  14. /** @type {LinearResamplerHandle} */
  15. this.handle =
  16. addon.createLinearResampler(inputSampleRate, outputSampleRate);
  17. this.inputSampleRate = inputSampleRate;
  18. this.outputSampleRate = outputSampleRate;
  19. }
  20. /**
  21. * Resample a chunk of audio samples.
  22. *
  23. * Call this for each chunk of input audio. For the final chunk, call
  24. * {@link flush} instead so that any internally buffered samples are
  25. * emitted.
  26. *
  27. * @param {Float32Array} samples - Input audio samples.
  28. * @returns {Float32Array} Resampled audio samples.
  29. */
  30. resample(samples) {
  31. return addon.resampleLinear(this.handle, samples, 0);
  32. }
  33. /**
  34. * Resample the final chunk of audio and flush internal buffers.
  35. *
  36. * This is the same as {@link resample} but sets flush=1 so that any
  37. * remaining samples buffered inside the resampler are emitted. Call
  38. * this once after the last chunk of input audio.
  39. *
  40. * @param {Float32Array} samples - The final chunk of input audio samples.
  41. * @returns {Float32Array} Resampled audio samples including buffered tail.
  42. */
  43. flush(samples) {
  44. return addon.resampleLinear(this.handle, samples, 1);
  45. }
  46. /**
  47. * Reset the resampler to its initial state, discarding any internal
  48. * buffered samples.
  49. */
  50. reset() {
  51. addon.linearResamplerReset(this.handle);
  52. }
  53. /**
  54. * Get the input sample rate.
  55. *
  56. * @returns {number} Input sample rate in Hz.
  57. */
  58. getInputSampleRate() {
  59. return addon.linearResamplerGetInputSampleRate(this.handle);
  60. }
  61. /**
  62. * Get the output sample rate.
  63. *
  64. * @returns {number} Output sample rate in Hz.
  65. */
  66. getOutputSampleRate() {
  67. return addon.linearResamplerGetOutputSampleRate(this.handle);
  68. }
  69. }
  70. module.exports = {
  71. LinearResampler,
  72. }