svn merge -r39781:39792 https://svn.blender.org/svnroot/bf-blender/trunk/blender...
[blender-staging.git] / intern / audaspace / intern / AUD_SequencerFactory.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_SequencerFactory.h
28  *  \ingroup audaspaceintern
29  */
30
31
32 #ifndef AUD_SEQUENCERFACTORY
33 #define AUD_SEQUENCERFACTORY
34
35 #include "AUD_IFactory.h"
36 #include "AUD_AnimateableProperty.h"
37
38 #include <list>
39 #include <pthread.h>
40
41 class AUD_SequencerEntry;
42
43 /**
44  * This factory represents sequenced entries to play a sound scene.
45  */
46 class AUD_SequencerFactory : public AUD_IFactory
47 {
48         friend class AUD_SequencerReader;
49 private:
50         /// The target specification.
51         AUD_Specs m_specs;
52
53         /// The status of the factory. Changes every time a non-animated parameter changes.
54         int m_status;
55
56         /// The entry status. Changes every time an entry is removed or added.
57         int m_entry_status;
58
59         /// The next unused ID for the entries.
60         int m_id;
61
62         /// The sequenced entries.
63         std::list<AUD_Reference<AUD_SequencerEntry> > m_entries;
64
65         /// Whether the whole scene is muted.
66         bool m_muted;
67
68         /// The FPS of the scene.
69         float m_fps;
70
71         /// Speed of Sound.
72         float m_speed_of_sound;
73
74         /// Doppler factor.
75         float m_doppler_factor;
76
77         /// Distance model.
78         AUD_DistanceModel m_distance_model;
79
80         /// The animated volume.
81         AUD_AnimateableProperty m_volume;
82
83         /// The animated listener location.
84         AUD_AnimateableProperty m_location;
85
86         /// The animated listener orientation.
87         AUD_AnimateableProperty m_orientation;
88
89         /// The mutex for locking.
90         pthread_mutex_t m_mutex;
91
92         // hide copy constructor and operator=
93         AUD_SequencerFactory(const AUD_SequencerFactory&);
94         AUD_SequencerFactory& operator=(const AUD_SequencerFactory&);
95
96 public:
97         /**
98          * Creates a new sound scene.
99          * \param specs The output audio data specification.
100          * \param fps The FPS of the scene.
101          * \param muted Whether the whole scene is muted.
102          */
103         AUD_SequencerFactory(AUD_Specs specs, float fps, bool muted);
104         ~AUD_SequencerFactory();
105
106         /**
107          * Locks the factory.
108          */
109         void lock();
110
111         /**
112          * Unlocks the previously locked factory.
113          */
114         void unlock();
115
116         /**
117          * Sets the audio output specification.
118          * \param specs The new specification.
119          */
120         void setSpecs(AUD_Specs specs);
121
122         /**
123          * Sets the scene's FPS.
124          * \param fps The new FPS.
125          */
126         void setFPS(float fps);
127
128         /**
129          * Sets the muting state of the scene.
130          * \param muted Whether the scene is muted.
131          */
132         void mute(bool muted);
133
134         /**
135          * Retrieves the muting state of the scene.
136          * \return Whether the scene is muted.
137          */
138         bool getMute() const;
139
140         /**
141          * Retrieves the speed of sound.
142          * This value is needed for doppler effect calculation.
143          * \return The speed of sound.
144          */
145         float getSpeedOfSound() const;
146
147         /**
148          * Sets the speed of sound.
149          * This value is needed for doppler effect calculation.
150          * \param speed The new speed of sound.
151          */
152         void setSpeedOfSound(float speed);
153
154         /**
155          * Retrieves the doppler factor.
156          * This value is a scaling factor for the velocity vectors of sources and
157          * listener which is used while calculating the doppler effect.
158          * \return The doppler factor.
159          */
160         float getDopplerFactor() const;
161
162         /**
163          * Sets the doppler factor.
164          * This value is a scaling factor for the velocity vectors of sources and
165          * listener which is used while calculating the doppler effect.
166          * \param factor The new doppler factor.
167          */
168         void setDopplerFactor(float factor);
169
170         /**
171          * Retrieves the distance model.
172          * \return The distance model.
173          */
174         AUD_DistanceModel getDistanceModel() const;
175
176         /**
177          * Sets the distance model.
178          * \param model distance model.
179          */
180         void setDistanceModel(AUD_DistanceModel model);
181
182         /**
183          * Retrieves one of the animated properties of the factory.
184          * \param type Which animated property to retrieve.
185          * \return A pointer to the animated property, valid as long as the
186          *         factory is.
187          */
188         AUD_AnimateableProperty* getAnimProperty(AUD_AnimateablePropertyType type);
189
190         /**
191          * Adds a new entry to the scene.
192          * \param sound The sound this entry should play.
193          * \param begin The start time.
194          * \param end The end time or a negative value if determined by the sound.
195          * \param skip How much seconds should be skipped at the beginning.
196          * \return The entry added.
197          */
198         AUD_Reference<AUD_SequencerEntry> add(AUD_Reference<AUD_IFactory> sound, float begin, float end, float skip);
199
200         /**
201          * Removes an entry from the scene.
202          * \param entry The entry to remove.
203          */
204         void remove(AUD_Reference<AUD_SequencerEntry> entry);
205
206         /**
207          * Creates a new reader with high quality resampling.
208          * \return The new reader.
209          */
210         AUD_Reference<AUD_IReader> createQualityReader();
211
212         virtual AUD_Reference<AUD_IReader> createReader();
213 };
214
215 #endif //AUD_SEQUENCERFACTORY