38cbc2d1867f38d40ffb0f2004353d3cafb95682
[blender.git] / intern / audaspace / intern / AUD_SequencerFactory.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * Copyright 2009-2011 Jörg Hermann Müller
5  *
6  * This file is part of AudaSpace.
7  *
8  * Audaspace is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * AudaSpace is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Audaspace; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file audaspace/intern/AUD_SequencerFactory.h
26  *  \ingroup audaspaceintern
27  */
28
29
30 #ifndef __AUD_SEQUENCERFACTORY_H__
31 #define __AUD_SEQUENCERFACTORY_H__
32
33 #include "AUD_IFactory.h"
34 #include "AUD_AnimateableProperty.h"
35 #include "AUD_ILockable.h"
36
37 #include <list>
38 #include <pthread.h>
39
40 class AUD_SequencerEntry;
41
42 /**
43  * This factory represents sequenced entries to play a sound scene.
44  */
45 class AUD_SequencerFactory : public AUD_IFactory, public AUD_ILockable
46 {
47         friend class AUD_SequencerReader;
48 private:
49         /// The target specification.
50         AUD_Specs m_specs;
51
52         /// The status of the factory. Changes every time a non-animated parameter changes.
53         int m_status;
54
55         /// The entry status. Changes every time an entry is removed or added.
56         int m_entry_status;
57
58         /// The next unused ID for the entries.
59         int m_id;
60
61         /// The sequenced entries.
62         std::list<AUD_Reference<AUD_SequencerEntry> > m_entries;
63
64         /// Whether the whole scene is muted.
65         bool m_muted;
66
67         /// The FPS of the scene.
68         float m_fps;
69
70         /// Speed of Sound.
71         float m_speed_of_sound;
72
73         /// Doppler factor.
74         float m_doppler_factor;
75
76         /// Distance model.
77         AUD_DistanceModel m_distance_model;
78
79         /// The animated volume.
80         AUD_AnimateableProperty m_volume;
81
82         /// The animated listener location.
83         AUD_AnimateableProperty m_location;
84
85         /// The animated listener orientation.
86         AUD_AnimateableProperty m_orientation;
87
88         /// The mutex for locking.
89         pthread_mutex_t m_mutex;
90
91         // hide copy constructor and operator=
92         AUD_SequencerFactory(const AUD_SequencerFactory&);
93         AUD_SequencerFactory& operator=(const AUD_SequencerFactory&);
94
95 public:
96         /**
97          * Creates a new sound scene.
98          * \param specs The output audio data specification.
99          * \param fps The FPS of the scene.
100          * \param muted Whether the whole scene is muted.
101          */
102         AUD_SequencerFactory(AUD_Specs specs, float fps, bool muted);
103         ~AUD_SequencerFactory();
104
105         /**
106          * Locks the factory.
107          */
108         virtual void lock();
109
110         /**
111          * Unlocks the previously locked factory.
112          */
113         virtual void unlock();
114
115         /**
116          * Sets the audio output specification.
117          * \param specs The new specification.
118          */
119         void setSpecs(AUD_Specs specs);
120
121         /**
122          * Sets the scene's FPS.
123          * \param fps The new FPS.
124          */
125         void setFPS(float fps);
126
127         /**
128          * Sets the muting state of the scene.
129          * \param muted Whether the scene is muted.
130          */
131         void mute(bool muted);
132
133         /**
134          * Retrieves the muting state of the scene.
135          * \return Whether the scene is muted.
136          */
137         bool getMute() const;
138
139         /**
140          * Retrieves the speed of sound.
141          * This value is needed for doppler effect calculation.
142          * \return The speed of sound.
143          */
144         float getSpeedOfSound() const;
145
146         /**
147          * Sets the speed of sound.
148          * This value is needed for doppler effect calculation.
149          * \param speed The new speed of sound.
150          */
151         void setSpeedOfSound(float speed);
152
153         /**
154          * Retrieves the doppler factor.
155          * This value is a scaling factor for the velocity vectors of sources and
156          * listener which is used while calculating the doppler effect.
157          * \return The doppler factor.
158          */
159         float getDopplerFactor() const;
160
161         /**
162          * Sets the doppler factor.
163          * This value is a scaling factor for the velocity vectors of sources and
164          * listener which is used while calculating the doppler effect.
165          * \param factor The new doppler factor.
166          */
167         void setDopplerFactor(float factor);
168
169         /**
170          * Retrieves the distance model.
171          * \return The distance model.
172          */
173         AUD_DistanceModel getDistanceModel() const;
174
175         /**
176          * Sets the distance model.
177          * \param model distance model.
178          */
179         void setDistanceModel(AUD_DistanceModel model);
180
181         /**
182          * Retrieves one of the animated properties of the factory.
183          * \param type Which animated property to retrieve.
184          * \return A pointer to the animated property, valid as long as the
185          *         factory is.
186          */
187         AUD_AnimateableProperty* getAnimProperty(AUD_AnimateablePropertyType type);
188
189         /**
190          * Adds a new entry to the scene.
191          * \param sound The sound this entry should play.
192          * \param begin The start time.
193          * \param end The end time or a negative value if determined by the sound.
194          * \param skip How much seconds should be skipped at the beginning.
195          * \return The entry added.
196          */
197         AUD_Reference<AUD_SequencerEntry> add(AUD_Reference<AUD_IFactory> sound, float begin, float end, float skip);
198
199         /**
200          * Removes an entry from the scene.
201          * \param entry The entry to remove.
202          */
203         void remove(AUD_Reference<AUD_SequencerEntry> entry);
204
205         /**
206          * Creates a new reader with high quality resampling.
207          * \return The new reader.
208          */
209         AUD_Reference<AUD_IReader> createQualityReader();
210
211         virtual AUD_Reference<AUD_IReader> createReader();
212 };
213
214 #endif //__AUD_SEQUENCERFACTORY_H__