Overte C++ Documentation
AudioSRC.h
1 //
2 // AudioSRC.h
3 // libraries/audio/src
4 //
5 // Created by Ken Cooke on 9/18/15.
6 // Copyright 2015 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_AudioSRC_h
13 #define hifi_AudioSRC_h
14 
15 #include <stdint.h>
16 
17 static const int SRC_MAX_CHANNELS = 4;
18 
19 // polyphase filter
20 static const int SRC_PHASEBITS = 9;
21 static const int SRC_PHASES = (1 << SRC_PHASEBITS);
22 static const int SRC_FRACBITS = 32 - SRC_PHASEBITS;
23 static const uint32_t SRC_FRACMASK = (1 << SRC_FRACBITS) - 1;
24 
25 static const float QFRAC_TO_FLOAT = 1.0f / (1 << SRC_FRACBITS);
26 static const float Q32_TO_FLOAT = 1.0f / (1ULL << 32);
27 
28 // blocking size in frames, chosen so block processing fits in L1 cache
29 static const int SRC_BLOCK = 256;
30 
31 class AudioSRC {
32 
33 public:
34  enum Quality {
35  LOW_QUALITY,
36  MEDIUM_QUALITY,
37  HIGH_QUALITY
38  };
39 
40  AudioSRC(int inputSampleRate, int outputSampleRate, int numChannels, Quality quality = MEDIUM_QUALITY);
41  ~AudioSRC();
42 
43  // deinterleaved float input/output (native format)
44  int render(float** inputs, float** outputs, int inputFrames);
45 
46  // interleaved int16_t input/output
47  int render(const int16_t* input, int16_t* output, int inputFrames);
48 
49  // interleaved float input/output
50  int render(const float* input, float* output, int inputFrames);
51 
52  int getMinOutput(int inputFrames);
53  int getMaxOutput(int inputFrames);
54  int getMinInput(int outputFrames);
55  int getMaxInput(int outputFrames);
56 
57 private:
58  float* _polyphaseFilter;
59  int* _stepTable;
60 
61  float* _history[SRC_MAX_CHANNELS];
62  float* _inputs[SRC_MAX_CHANNELS];
63  float* _outputs[SRC_MAX_CHANNELS];
64 
65  int _inputSampleRate;
66  int _outputSampleRate;
67  int _numChannels;
68  int _inputBlock;
69 
70  int _upFactor;
71  int _downFactor;
72  int _numTaps;
73  int _numHistory;
74 
75  int _phase;
76  int64_t _offset;
77  int64_t _step;
78 
79  int createRationalFilter(int upFactor, int downFactor, float gain, Quality quality);
80  int createIrrationalFilter(int upFactor, int downFactor, float gain, Quality quality);
81 
82  int multirateFilter1(const float* input0, float* output0, int inputFrames);
83  int multirateFilter2(const float* input0, const float* input1, float* output0, float* output1, int inputFrames);
84  int multirateFilter4(const float* input0, const float* input1, const float* input2, const float* input3,
85  float* output0, float* output1, float* output2, float* output3, int inputFrames);
86 
87  int multirateFilter1_ref(const float* input0, float* output0, int inputFrames);
88  int multirateFilter2_ref(const float* input0, const float* input1, float* output0, float* output1, int inputFrames);
89  int multirateFilter4_ref(const float* input0, const float* input1, const float* input2, const float* input3,
90  float* output0, float* output1, float* output2, float* output3, int inputFrames);
91 
92  int multirateFilter1_AVX2(const float* input0, float* output0, int inputFrames);
93  int multirateFilter2_AVX2(const float* input0, const float* input1, float* output0, float* output1, int inputFrames);
94  int multirateFilter4_AVX2(const float* input0, const float* input1, const float* input2, const float* input3,
95  float* output0, float* output1, float* output2, float* output3, int inputFrames);
96 
97  void convertInput(const int16_t* input, float** outputs, int numFrames);
98  void convertOutput(float** inputs, int16_t* output, int numFrames);
99 
100  void convertInput(const float* input, float** outputs, int numFrames);
101  void convertOutput(float** inputs, float* output, int numFrames);
102 };
103 
104 #endif // AudioSRC_h