resampler.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. ////////////////////////////////////////////////////////////////////////////
  2. // **** RESAMPLER **** //
  3. // Sinc-based Audio Resampling //
  4. // Copyright (c) 2006 - 2023 David Bryant. //
  5. // All Rights Reserved. //
  6. // Distributed under the BSD Software License (see license.txt) //
  7. ////////////////////////////////////////////////////////////////////////////
  8. // resampler.h
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <stdint.h>
  12. #include <stdio.h>
  13. #define _USE_MATH_DEFINES
  14. #include <math.h>
  15. #ifdef ENABLE_THREADS
  16. #include "workers.h"
  17. #endif
  18. #if defined(PATH_WIDTH) && (PATH_WIDTH == 64)
  19. typedef double artsample_t;
  20. #else
  21. typedef float artsample_t;
  22. #endif
  23. #define SUBSAMPLE_INTERPOLATE 0x1
  24. #define BLACKMAN_HARRIS 0x2
  25. #define INCLUDE_LOWPASS 0x4
  26. #define RESAMPLE_MULTITHREADED 0x8
  27. #define NO_FILTER_REDUCTION 0x10
  28. #define RESAMPLE_FIXED_RATIO 0x20 // internal use only, do not set
  29. #define EXTRAPOLATE_ENDPOINTS 0x40
  30. #define EXTRAPOLATE_PREFILL 0x80 // internal use only, do not set
  31. #define EXTEND_CONVOLUTION_MATH 0x100
  32. #define RESAMPLER_FLUSHED 0x200 // internal use only, do not set
  33. #define RESAMPLER_SNAP_OFFSET 0x400 // internal use only, do not set
  34. typedef struct {
  35. unsigned int input_used, output_generated;
  36. } ResampleResult;
  37. typedef struct resample {
  38. int numChannels, numSamples, numFilters, numTaps, inputIndex, flags;
  39. double *tempFilter, outputOffset, fixedRatio, lowpassRatio;
  40. double (*subsample)(struct resample *cxt, artsample_t *source, double offset);
  41. artsample_t **buffers, **filters;
  42. #ifdef ENABLE_THREADS
  43. Workers *workers;
  44. const artsample_t *input;
  45. artsample_t *cbuffer, *output;
  46. int numInputFrames, numOutputFrames, stride;
  47. ResampleResult res;
  48. double ratio;
  49. #endif
  50. } Resample;
  51. #ifdef __cplusplus
  52. extern "C" {
  53. #endif
  54. Resample *resampleInit(int numChannels, int numTaps, int numFilters,
  55. double lowpassRatio, int flags);
  56. Resample *resampleFixedRatioInit(int numChannels, int numTaps, int maxFilters,
  57. double sourceRate, double destinRate,
  58. int lowpassFreq, int flags);
  59. ResampleResult resampleProcess(Resample *cxt, const artsample_t *const *input,
  60. int numInputFrames, artsample_t *const *output,
  61. int numOutputFrames, double ratio);
  62. ResampleResult resampleProcessInterleaved(Resample *cxt,
  63. const artsample_t *input,
  64. int numInputFrames,
  65. artsample_t *output,
  66. int numOutputFrames, double ratio);
  67. ResampleResult resampleProcessAndFlush(Resample *cxt,
  68. const artsample_t *const *input,
  69. int numInputFrames,
  70. artsample_t *const *output,
  71. int numOutputFrames, double ratio);
  72. ResampleResult
  73. resampleProcessAndFlushInterleaved(Resample *cxt, const artsample_t *input,
  74. int numInputFrames, artsample_t *output,
  75. int numOutputFrames, double ratio);
  76. unsigned int resampleGetRequiredSamples(Resample *cxt, int numOutputFrames,
  77. double ratio);
  78. unsigned int resampleGetExpectedOutput(Resample *cxt, int numInputFrames,
  79. double ratio);
  80. void resampleAdvancePosition(Resample *cxt, double delta);
  81. double resampleGetLowpassRatio(Resample *cxt);
  82. double resampleGetPosition(Resample *cxt);
  83. int resampleGetNumFilters(Resample *cxt);
  84. int resampleInterpolationUsed(Resample *cxt);
  85. void resampleReset(Resample *cxt);
  86. void resampleFree(Resample *cxt);
  87. #ifdef __cplusplus
  88. }
  89. #endif