svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r22625:22668
[blender-staging.git] / intern / audaspace / SDL / AUD_SDLMixerReader.h
1 /*
2  * $Id$
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_SDLMIXERREADER
27 #define AUD_SDLMIXERREADER
28
29 #include "AUD_IReader.h"
30 class AUD_Buffer;
31
32 #include <SDL.h>
33
34 /**
35  * This class mixes a sound source with help of the SDL library.
36  * Unfortunately SDL is only capable of 8 and 16 bit audio, mono and stereo, as
37  * well as resampling only 2^n sample rate relationships where n is a natural
38  * number.
39  * \warning Although SDL can only resample 2^n sample rate relationships, this
40  *          class doesn't check for compliance, so in case of other factors,
41  *          the behaviour is undefined.
42  */
43 class AUD_SDLMixerReader : public AUD_IReader
44 {
45 private:
46         /**
47          * The reader that is being mixed.
48          */
49         AUD_IReader* m_reader;
50
51         /**
52          * The current reading position in the resampling buffer.
53          */
54         int m_rsposition;
55
56         /**
57          * The count of mixed samples in the resampling buffer.
58          */
59         int m_rssize;
60
61         /**
62          * The smallest count of source samples to get a fractionless resampling
63          * factor.
64          */
65         int m_ssize;
66
67         /**
68          * The smallest count of target samples to get a fractionless resampling
69          * factor.
70          */
71         int m_tsize;
72
73         /**
74          * The sound output buffer.
75          */
76         AUD_Buffer *m_buffer;
77
78         /**
79          * The resampling buffer.
80          */
81         AUD_Buffer *m_rsbuffer;
82
83         /**
84          * The target specification.
85          */
86         AUD_Specs m_tspecs;
87
88         /**
89          * The sample specification of the source.
90          */
91         AUD_Specs m_sspecs;
92
93         /**
94          * Saves whether the end of the source has been reached.
95          */
96         bool m_eor;
97
98         /**
99          * The SDL_AudioCVT structure used for resampling.
100          */
101         SDL_AudioCVT m_cvt;
102
103 public:
104         /**
105          * Creates a resampling reader.
106          * \param reader The reader to mix.
107          * \param specs The target specification.
108          * \exception AUD_Exception Thrown if the source specification cannot be
109          *            mixed to the target specification or if the reader is
110          *            NULL.
111          */
112         AUD_SDLMixerReader(AUD_IReader* reader, AUD_Specs specs);
113         /**
114          * Destroys the reader.
115          */
116         ~AUD_SDLMixerReader();
117
118         virtual bool isSeekable();
119         virtual void seek(int position);
120         virtual int getLength();
121         virtual int getPosition();
122         virtual AUD_Specs getSpecs();
123         virtual AUD_ReaderType getType();
124         virtual bool notify(AUD_Message &message);
125         virtual void read(int & length, sample_t* & buffer);
126 };
127
128 #endif //AUD_SDLMIXERREADER