tmp
[blender.git] / extern / audaspace / include / respec / JOSResampleReader.h
1 /*******************************************************************************
2  * Copyright 2009-2016 Jörg Müller
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  ******************************************************************************/
16
17 #pragma once
18
19 /**
20  * @file JOSResampleReader.h
21  * @ingroup respec
22  * The JOSResampleReader class.
23  */
24
25 #include "respec/ResampleReader.h"
26 #include "util/Buffer.h"
27
28 AUD_NAMESPACE_BEGIN
29
30 /**
31  * This resampling reader uses Julius O. Smith's resampling algorithm.
32  */
33 class AUD_API JOSResampleReader : public ResampleReader
34 {
35 private:
36         typedef void (JOSResampleReader::*resample_f)(double target_factor, int length, sample_t* buffer);
37
38         /**
39          * The half filter length.
40          */
41         static const int m_len;
42
43         /**
44          * The sample step size for the filter.
45          */
46         static const int m_L;
47
48         /**
49          * The filter coefficients.
50          */
51         static const float m_coeff[];
52
53         /**
54          * The reader channels.
55          */
56         Channels m_channels;
57
58         /**
59          * The sample position in the cache.
60          */
61         unsigned int m_n;
62
63         /**
64          * The subsample position in the cache.
65          */
66         double m_P;
67
68         /**
69          * The input data buffer.
70          */
71         Buffer m_buffer;
72
73         /**
74          * Double buffer for the sums.
75          */
76         Buffer m_sums;
77
78         /**
79          * How many samples in the cache are valid.
80          */
81         int m_cache_valid;
82
83         /**
84          * Resample function.
85          */
86         resample_f m_resample;
87
88         /**
89          * Last resampling factor.
90          */
91         double m_last_factor;
92
93         // delete copy constructor and operator=
94         JOSResampleReader(const JOSResampleReader&) = delete;
95         JOSResampleReader& operator=(const JOSResampleReader&) = delete;
96
97         /**
98          * Resets the resampler to its initial state.
99          */
100         void AUD_LOCAL reset();
101
102         /**
103          * Updates the buffer to be as small as possible for the coming reading.
104          * \param size The size of samples to be read.
105          * \param factor The next resampling factor.
106          * \param samplesize The size of a sample.
107          */
108         void AUD_LOCAL updateBuffer(int size, double factor, int samplesize);
109
110         void AUD_LOCAL resample(double target_factor, int length, sample_t* buffer);
111         void AUD_LOCAL resample_mono(double target_factor, int length, sample_t* buffer);
112         void AUD_LOCAL resample_stereo(double target_factor, int length, sample_t* buffer);
113
114 public:
115         /**
116          * Creates a resampling reader.
117          * \param reader The reader to mix.
118          * \param rate The target sampling rate.
119          */
120         JOSResampleReader(std::shared_ptr<IReader> reader, SampleRate rate);
121
122         virtual void seek(int position);
123         virtual int getLength() const;
124         virtual int getPosition() const;
125         virtual Specs getSpecs() const;
126         virtual void read(int& length, bool& eos, sample_t* buffer);
127 };
128
129 AUD_NAMESPACE_END