3D Audio GSoC:
[blender.git] / intern / audaspace / intern / AUD_ChannelMapperReader.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * Copyright 2009-2011 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 General Public License as published by
12  * the Free Software Foundation; either version 2 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 General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Audaspace; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file audaspace/intern/AUD_ChannelMapperReader.h
28  *  \ingroup audaspaceintern
29  */
30
31
32 #ifndef AUD_CHANNELMAPPERREADER
33 #define AUD_CHANNELMAPPERREADER
34
35 #include "AUD_EffectReader.h"
36 #include "AUD_Buffer.h"
37
38 /**
39  * This class maps a sound source's channels to a specific output channel count.
40  * \note The input sample format must be float.
41  */
42 class AUD_ChannelMapperReader : public AUD_EffectReader
43 {
44 private:
45         /**
46          * The sound reading buffer.
47          */
48         AUD_Buffer m_buffer;
49
50         /**
51          * The output specification.
52          */
53         AUD_Channels m_target_channels;
54
55         /**
56          * The channel count of the reader.
57          */
58         AUD_Channels m_source_channels;
59
60         /**
61          * The mapping specification.
62          */
63         float* m_mapping;
64
65         /**
66          * The size of the mapping.
67          */
68         int m_map_size;
69
70         /**
71          * The mono source angle.
72          */
73         float m_mono_angle;
74
75         static const AUD_Channel MONO_MAP[];
76         static const AUD_Channel STEREO_MAP[];
77         static const AUD_Channel STEREO_LFE_MAP[];
78         static const AUD_Channel SURROUND4_MAP[];
79         static const AUD_Channel SURROUND5_MAP[];
80         static const AUD_Channel SURROUND51_MAP[];
81         static const AUD_Channel SURROUND61_MAP[];
82         static const AUD_Channel SURROUND71_MAP[];
83         static const AUD_Channel* CHANNEL_MAPS[];
84
85         static const float MONO_ANGLES[];
86         static const float STEREO_ANGLES[];
87         static const float STEREO_LFE_ANGLES[];
88         static const float SURROUND4_ANGLES[];
89         static const float SURROUND5_ANGLES[];
90         static const float SURROUND51_ANGLES[];
91         static const float SURROUND61_ANGLES[];
92         static const float SURROUND71_ANGLES[];
93         static const float* CHANNEL_ANGLES[];
94
95         // hide copy constructor and operator=
96         AUD_ChannelMapperReader(const AUD_ChannelMapperReader&);
97         AUD_ChannelMapperReader& operator=(const AUD_ChannelMapperReader&);
98
99         /**
100          * Calculates the mapping matrix.
101          */
102         void calculateMapping();
103
104         /**
105          * Calculates the distance between two angles.
106          */
107         float angleDistance(float alpha, float beta);
108
109 public:
110         /**
111          * Creates a channel mapper reader.
112          * \param reader The reader to map.
113          * \param mapping The mapping specification as two dimensional float array.
114          */
115         AUD_ChannelMapperReader(AUD_Reference<AUD_IReader> reader, AUD_Channels channels);
116
117         /**
118          * Destroys the reader.
119          */
120         ~AUD_ChannelMapperReader();
121
122         /**
123          * Sets the requested channel output count.
124          * \param channels The channel output count.
125          */
126         void setChannels(AUD_Channels channels);
127
128         /**
129          * Sets the angle for mono sources.
130          * \param angle The angle for mono sources.
131          */
132         void setMonoAngle(float angle);
133
134         virtual AUD_Specs getSpecs() const;
135         virtual void read(int& length, bool& eos, sample_t* buffer);
136 };
137
138 #endif //AUD_CHANNELMAPPERREADER