merge with trunk at r27259 and commit of a patch by anthony jones to fix msvc (though...
[blender-staging.git] / intern / audaspace / intern / AUD_Mixer.h
1 /*
2  * $Id: AUD_Mixer.h 25643 2010-01-01 05:09:30Z nexyon $
3  *
4  * ***** BEGIN LGPL LICENSE BLOCK *****
5  *
6  * Copyright 2009 Jörg Hermann Müller
7  *
8  * This file is part of AudaSpace.
9  *
10  * AudaSpace is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * AudaSpace is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with AudaSpace.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  * ***** END LGPL LICENSE BLOCK *****
24  */
25
26 #ifndef AUD_MIXER
27 #define AUD_MIXER
28
29 #define AUD_MIXER_RESAMPLER AUD_SRCResampleFactory
30
31 #include "AUD_ConverterFunctions.h"
32 class AUD_ConverterFactory;
33 class AUD_MIXER_RESAMPLER;
34 class AUD_ChannelMapperFactory;
35 class AUD_Buffer;
36 class AUD_IReader;
37 #include <list>
38
39 struct AUD_MixerBuffer
40 {
41         sample_t* buffer;
42         int start;
43         int length;
44         float volume;
45 };
46
47 /**
48  * This class is able to mix audiosignals of different channel count and sample
49  * rate and convert it to a specific output format.
50  * It uses a default ChannelMapperFactory and a SRCResampleFactory for
51  * the perparation.
52  */
53 class AUD_Mixer
54 {
55 private:
56         /**
57          * The resampling factory that resamples all readers for superposition.
58          */
59         AUD_MIXER_RESAMPLER* m_resampler;
60
61         /**
62          * The channel mapper factory that maps all readers for superposition.
63          */
64         AUD_ChannelMapperFactory* m_mapper;
65
66         /**
67          * The list of buffers to superpose.
68          */
69         std::list<AUD_MixerBuffer> m_buffers;
70
71         /**
72          * The output specification.
73          */
74         AUD_DeviceSpecs m_specs;
75
76         /**
77          * The temporary mixing buffer.
78          */
79         AUD_Buffer* m_buffer;
80
81         /**
82          * Converter function.
83          */
84         AUD_convert_f m_convert;
85
86 public:
87         /**
88          * Creates the mixer.
89          */
90         AUD_Mixer();
91
92         /**
93          * Destroys the mixer.
94          */
95         ~AUD_Mixer();
96
97         /**
98          * This funuction prepares a reader for playback.
99          * \param reader The reader to prepare.
100          * \return The reader that should be used for playback.
101          */
102         AUD_IReader* prepare(AUD_IReader* reader);
103
104         /**
105          * Returns the target specification for superposing.
106          * \return The target specification.
107          */
108         AUD_DeviceSpecs getSpecs();
109
110         /**
111          * Sets the target specification for superposing.
112          * \param specs The target specification.
113          */
114         void setSpecs(AUD_DeviceSpecs specs);
115
116         /**
117          * Adds a buffer for superposition.
118          * \param buffer The buffer to superpose.
119          * \param start The start sample of the buffer.
120          * \param length The length of the buffer in samples.
121          * \param volume The mixing volume. Must be a value between 0.0 and 1.0.
122          */
123         void add(sample_t* buffer, int start, int length, float volume);
124
125         /**
126          * Superposes all added buffers into an output buffer.
127          * \param buffer The target buffer for superposing.
128          * \param length The length of the buffer in samples.
129          * \param volume The mixing volume. Must be a value between 0.0 and 1.0.
130          */
131         void superpose(data_t* buffer, int length, float volume);
132 };
133
134 #endif //AUD_MIXER