Welcome to mirror list, hosted at ThFree Co, Russian Federation.

SequenceData.h « sequence « include « audaspace « extern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b3df0548a4d9e69aac714ec3306549a478cdc16e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/*******************************************************************************
 * Copyright 2009-2016 Jörg Müller
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

#pragma once

/**
 * @file SequenceData.h
 * @ingroup sequence
 * The SequenceData class.
 */

#include "respec/Specification.h"
#include "sequence/AnimateableProperty.h"
#include "devices/I3DDevice.h"
#include "util/ILockable.h"

#include <list>
#include <memory>
#include <mutex>

AUD_NAMESPACE_BEGIN

class SequenceEntry;
class ISound;

/**
 * This class represents sequenced entries to play a sound scene.
 */
class AUD_API SequenceData : public ILockable
{
	friend class SequenceReader;
private:
	/// The target specification.
	Specs m_specs;

	/// The status of the sequence. Changes every time a non-animated parameter changes.
	int m_status;

	/// The entry status. Changes every time an entry is removed or added.
	int m_entry_status;

	/// The next unused ID for the entries.
	int m_id;

	/// The sequenced entries.
	std::list<std::shared_ptr<SequenceEntry> > m_entries;

	/// Whether the whole scene is muted.
	bool m_muted;

	/// The FPS of the scene.
	float m_fps;

	/// Speed of Sound.
	float m_speed_of_sound;

	/// Doppler factor.
	float m_doppler_factor;

	/// Distance model.
	DistanceModel m_distance_model;

	/// The animated volume.
	AnimateableProperty m_volume;

	/// The animated listener location.
	AnimateableProperty m_location;

	/// The animated listener orientation.
	AnimateableProperty m_orientation;

	/// The mutex for locking.
	std::recursive_mutex m_mutex;

	// delete copy constructor and operator=
	SequenceData(const SequenceData&) = delete;
	SequenceData& operator=(const SequenceData&) = delete;

public:
	/**
	 * Creates a new sound scene.
	 * \param specs The output audio data specification.
	 * \param fps The FPS of the scene.
	 * \param muted Whether the whole scene is muted.
	 */
	SequenceData(Specs specs, float fps, bool muted);
	virtual ~SequenceData();

	/**
	 * Locks the sequence.
	 */
	virtual void lock();

	/**
	 * Unlocks the previously locked sequence.
	 */
	virtual void unlock();

	/**
	 * Retrieves the audio output specification.
	 * \return The specification.
	 */
	Specs getSpecs();

	/**
	 * Sets the audio output specification.
	 * \param specs The new specification.
	 */
	void setSpecs(Specs specs);

	/**
	 * Retrieves the scene's FPS.
	 * \return The scene's FPS.
	 */
	float getFPS() const;

	/**
	 * Sets the scene's FPS.
	 * \param fps The new FPS.
	 */
	void setFPS(float fps);

	/**
	 * Sets the muting state of the scene.
	 * \param muted Whether the scene is muted.
	 */
	void mute(bool muted);

	/**
	 * Retrieves the muting state of the scene.
	 * \return Whether the scene is muted.
	 */
	bool isMuted() const;

	/**
	 * Retrieves the speed of sound.
	 * This value is needed for doppler effect calculation.
	 * \return The speed of sound.
	 */
	float getSpeedOfSound() const;

	/**
	 * Sets the speed of sound.
	 * This value is needed for doppler effect calculation.
	 * \param speed The new speed of sound.
	 */
	void setSpeedOfSound(float speed);

	/**
	 * Retrieves the doppler factor.
	 * This value is a scaling factor for the velocity vectors of sources and
	 * listener which is used while calculating the doppler effect.
	 * \return The doppler factor.
	 */
	float getDopplerFactor() const;

	/**
	 * Sets the doppler factor.
	 * This value is a scaling factor for the velocity vectors of sources and
	 * listener which is used while calculating the doppler effect.
	 * \param factor The new doppler factor.
	 */
	void setDopplerFactor(float factor);

	/**
	 * Retrieves the distance model.
	 * \return The distance model.
	 */
	DistanceModel getDistanceModel() const;

	/**
	 * Sets the distance model.
	 * \param model distance model.
	 */
	void setDistanceModel(DistanceModel model);

	/**
	 * Retrieves one of the animated properties of the sequence.
	 * \param type Which animated property to retrieve.
	 * \return A pointer to the animated property, valid as long as the
	 *         sequence is.
	 */
	AnimateableProperty* getAnimProperty(AnimateablePropertyType type);

	/**
	 * Adds a new entry to the scene.
	 * \param sound The sound this entry should play.
	 * \param begin The start time.
	 * \param end The end time or a negative value if determined by the sound.
	 * \param skip How much seconds should be skipped at the beginning.
	 * \return The entry added.
	 */
	std::shared_ptr<SequenceEntry> add(std::shared_ptr<ISound> sound, float begin, float end, float skip);

	/**
	 * Removes an entry from the scene.
	 * \param entry The entry to remove.
	 */
	void remove(std::shared_ptr<SequenceEntry> entry);
};

AUD_NAMESPACE_END