tmp
[blender.git] / extern / audaspace / include / fx / ImpulseResponse.h
1 /*******************************************************************************
2 * Copyright 2015-2016 Juan Francisco Crespo Gal├ín
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 ImpulseResponse.h
21 * @ingroup fx
22 * The ImpulseResponse class.
23 */
24
25 #include "util/StreamBuffer.h"
26 #include "util/FFTPlan.h"
27 #include "IReader.h"
28
29 #include <memory>
30 #include <vector>
31
32 AUD_NAMESPACE_BEGIN
33
34 /**
35 * This class represents an impulse response that can be used in convolution.
36 * When this class is instanced, the impulse response is divided in channels and those channels are divided in parts of N/2 samples (N being the size of the FFT plan used).
37 * The main objetive of this class is to allow the reutilization of an impulse response in various sounds without having to process it more than one time.
38 * \warning The size of the FFTPlan used to process the impulse response must be the same as the one used in the convolver classes.
39 */
40 class AUD_API ImpulseResponse
41 {
42 private:
43         /**
44         * A tri-dimensional array (channels, parts, values) The impulse response is divided in channels and those channels are divided
45         * in parts of N/2 samples. Those parts are transformed to the frequency domain transform which generates uni-dimensional 
46         * arrays of fftwtf_complex data (complex numbers).
47         */
48         std::vector<std::shared_ptr<std::vector<std::shared_ptr<std::vector<std::complex<sample_t>>>>>> m_processedIR;
49
50         /**
51         * The specification of the samples.
52         */
53         Specs m_specs;
54
55         /**
56         * The length of the impulse response.
57         */
58         int m_length;
59
60         // delete copy constructor and operator=
61         ImpulseResponse(const ImpulseResponse&) = delete;
62         ImpulseResponse& operator=(const ImpulseResponse&) = delete;
63
64 public:
65         /**
66         * Creates a new ImpulseResponse object.
67         * The impulse response will be split and transformed to the frequency domain.
68         * \param impulseResponse The impulse response sound.
69         * \param plan A shared pointer to a FFT plan used to transform the impulse response.
70         */
71         ImpulseResponse(std::shared_ptr<StreamBuffer> impulseResponse, std::shared_ptr<FFTPlan> plan);
72
73         /**
74         * Creates a new ImpulseResponse object. This overload instances its own FFTPlan with default size.
75         * The impulse response will be split and transformed to the frequency domain.
76         * \param impulseResponse The impulse response sound.
77         */
78         ImpulseResponse(std::shared_ptr<StreamBuffer> impulseResponse);
79
80         /**
81         * Returns the specification of the impulse response.
82         * \return The specification of the impulse response.
83         */
84         Specs getSpecs();
85
86         /**
87         * Retrieves the length of the impulse response.
88         * \return The length of the impulse response.
89         */
90         int getLength();
91
92         /**
93         * Retrieves one channel of the impulse response.
94         * \param n The desired channel number (from 0 to channels-1).
95         * \return The desired channel of the impulse response.
96         */
97         std::shared_ptr<std::vector<std::shared_ptr<std::vector<std::complex<sample_t>>>>> getChannel(int n);
98
99 private:
100         /**
101         * Processes the impulse response sound for its use in the convovler classes.
102         * \param A shared pointer to a reader of the desired sound.
103         * \param plan A shared pointer to a FFT plan used to transform the impulse response.
104         */
105         void processImpulseResponse(std::shared_ptr<IReader> reader, std::shared_ptr<FFTPlan> plan);
106 };
107
108 AUD_NAMESPACE_END