tmp
[blender.git] / extern / audaspace / include / sequence / SequenceData.h
1 /*******************************************************************************
2  * Copyright 2009-2016 Jörg Müller
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  ******************************************************************************/
16
17 #pragma once
18
19 /**
20  * @file SequenceData.h
21  * @ingroup sequence
22  * The SequenceData class.
23  */
24
25 #include "respec/Specification.h"
26 #include "sequence/AnimateableProperty.h"
27 #include "devices/I3DDevice.h"
28 #include "util/ILockable.h"
29
30 #include <list>
31 #include <memory>
32 #include <mutex>
33
34 AUD_NAMESPACE_BEGIN
35
36 class SequenceEntry;
37 class ISound;
38
39 /**
40  * This class represents sequenced entries to play a sound scene.
41  */
42 class AUD_API SequenceData : public ILockable
43 {
44         friend class SequenceReader;
45 private:
46         /// The target specification.
47         Specs m_specs;
48
49         /// The status of the sequence. Changes every time a non-animated parameter changes.
50         int m_status;
51
52         /// The entry status. Changes every time an entry is removed or added.
53         int m_entry_status;
54
55         /// The next unused ID for the entries.
56         int m_id;
57
58         /// The sequenced entries.
59         std::list<std::shared_ptr<SequenceEntry> > m_entries;
60
61         /// Whether the whole scene is muted.
62         bool m_muted;
63
64         /// The FPS of the scene.
65         float m_fps;
66
67         /// Speed of Sound.
68         float m_speed_of_sound;
69
70         /// Doppler factor.
71         float m_doppler_factor;
72
73         /// Distance model.
74         DistanceModel m_distance_model;
75
76         /// The animated volume.
77         AnimateableProperty m_volume;
78
79         /// The animated listener location.
80         AnimateableProperty m_location;
81
82         /// The animated listener orientation.
83         AnimateableProperty m_orientation;
84
85         /// The mutex for locking.
86         std::recursive_mutex m_mutex;
87
88         // delete copy constructor and operator=
89         SequenceData(const SequenceData&) = delete;
90         SequenceData& operator=(const SequenceData&) = delete;
91
92 public:
93         /**
94          * Creates a new sound scene.
95          * \param specs The output audio data specification.
96          * \param fps The FPS of the scene.
97          * \param muted Whether the whole scene is muted.
98          */
99         SequenceData(Specs specs, float fps, bool muted);
100         virtual ~SequenceData();
101
102         /**
103          * Locks the sequence.
104          */
105         virtual void lock();
106
107         /**
108          * Unlocks the previously locked sequence.
109          */
110         virtual void unlock();
111
112         /**
113          * Retrieves the audio output specification.
114          * \return The specification.
115          */
116         Specs getSpecs();
117
118         /**
119          * Sets the audio output specification.
120          * \param specs The new specification.
121          */
122         void setSpecs(Specs specs);
123
124         /**
125          * Retrieves the scene's FPS.
126          * \return The scene's FPS.
127          */
128         float getFPS() const;
129
130         /**
131          * Sets the scene's FPS.
132          * \param fps The new FPS.
133          */
134         void setFPS(float fps);
135
136         /**
137          * Sets the muting state of the scene.
138          * \param muted Whether the scene is muted.
139          */
140         void mute(bool muted);
141
142         /**
143          * Retrieves the muting state of the scene.
144          * \return Whether the scene is muted.
145          */
146         bool isMuted() const;
147
148         /**
149          * Retrieves the speed of sound.
150          * This value is needed for doppler effect calculation.
151          * \return The speed of sound.
152          */
153         float getSpeedOfSound() const;
154
155         /**
156          * Sets the speed of sound.
157          * This value is needed for doppler effect calculation.
158          * \param speed The new speed of sound.
159          */
160         void setSpeedOfSound(float speed);
161
162         /**
163          * Retrieves 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          * \return The doppler factor.
167          */
168         float getDopplerFactor() const;
169
170         /**
171          * Sets the doppler factor.
172          * This value is a scaling factor for the velocity vectors of sources and
173          * listener which is used while calculating the doppler effect.
174          * \param factor The new doppler factor.
175          */
176         void setDopplerFactor(float factor);
177
178         /**
179          * Retrieves the distance model.
180          * \return The distance model.
181          */
182         DistanceModel getDistanceModel() const;
183
184         /**
185          * Sets the distance model.
186          * \param model distance model.
187          */
188         void setDistanceModel(DistanceModel model);
189
190         /**
191          * Retrieves one of the animated properties of the sequence.
192          * \param type Which animated property to retrieve.
193          * \return A pointer to the animated property, valid as long as the
194          *         sequence is.
195          */
196         AnimateableProperty* getAnimProperty(AnimateablePropertyType type);
197
198         /**
199          * Adds a new entry to the scene.
200          * \param sound The sound this entry should play.
201          * \param begin The start time.
202          * \param end The end time or a negative value if determined by the sound.
203          * \param skip How much seconds should be skipped at the beginning.
204          * \return The entry added.
205          */
206         std::shared_ptr<SequenceEntry> add(std::shared_ptr<ISound> sound, float begin, float end, float skip);
207
208         /**
209          * Removes an entry from the scene.
210          * \param entry The entry to remove.
211          */
212         void remove(std::shared_ptr<SequenceEntry> entry);
213 };
214
215 AUD_NAMESPACE_END