Audaspace:
[blender.git] / intern / audaspace / intern / AUD_SequencerFactory.cpp
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.cpp
26  *  \ingroup audaspaceintern
27  */
28
29
30 #include "AUD_SequencerFactory.h"
31 #include "AUD_SequencerReader.h"
32 #include "AUD_3DMath.h"
33 #include "AUD_MutexLock.h"
34
35 AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, float fps, bool muted) :
36         m_specs(specs),
37         m_status(0),
38         m_entry_status(0),
39         m_id(0),
40         m_muted(muted),
41         m_fps(fps),
42         m_speed_of_sound(434),
43         m_doppler_factor(1),
44         m_distance_model(AUD_DISTANCE_MODEL_INVERSE_CLAMPED),
45         m_location(3),
46         m_orientation(4)
47 {
48         AUD_Quaternion q;
49         m_orientation.write(q.get());
50         float f = 1;
51         m_volume.write(&f);
52
53         pthread_mutexattr_t attr;
54         pthread_mutexattr_init(&attr);
55         pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
56
57         pthread_mutex_init(&m_mutex, &attr);
58
59         pthread_mutexattr_destroy(&attr);
60 }
61
62 AUD_SequencerFactory::~AUD_SequencerFactory()
63 {
64         pthread_mutex_destroy(&m_mutex);
65 }
66
67 void AUD_SequencerFactory::lock()
68 {
69         pthread_mutex_lock(&m_mutex);
70 }
71
72 void AUD_SequencerFactory::unlock()
73 {
74         pthread_mutex_unlock(&m_mutex);
75 }
76
77 void AUD_SequencerFactory::setSpecs(AUD_Specs specs)
78 {
79         AUD_MutexLock lock(*this);
80
81         m_specs = specs;
82         m_status++;
83 }
84
85 void AUD_SequencerFactory::setFPS(float fps)
86 {
87         AUD_MutexLock lock(*this);
88
89         m_fps = fps;
90 }
91
92 void AUD_SequencerFactory::mute(bool muted)
93 {
94         AUD_MutexLock lock(*this);
95
96         m_muted = muted;
97 }
98
99 bool AUD_SequencerFactory::getMute() const
100 {
101         return m_muted;
102 }
103
104 float AUD_SequencerFactory::getSpeedOfSound() const
105 {
106         return m_speed_of_sound;
107 }
108
109 void AUD_SequencerFactory::setSpeedOfSound(float speed)
110 {
111         AUD_MutexLock lock(*this);
112
113         m_speed_of_sound = speed;
114         m_status++;
115 }
116
117 float AUD_SequencerFactory::getDopplerFactor() const
118 {
119         return m_doppler_factor;
120 }
121
122 void AUD_SequencerFactory::setDopplerFactor(float factor)
123 {
124         AUD_MutexLock lock(*this);
125
126         m_doppler_factor = factor;
127         m_status++;
128 }
129
130 AUD_DistanceModel AUD_SequencerFactory::getDistanceModel() const
131 {
132         return m_distance_model;
133 }
134
135 void AUD_SequencerFactory::setDistanceModel(AUD_DistanceModel model)
136 {
137         AUD_MutexLock lock(*this);
138
139         m_distance_model = model;
140         m_status++;
141 }
142
143 AUD_AnimateableProperty* AUD_SequencerFactory::getAnimProperty(AUD_AnimateablePropertyType type)
144 {
145         switch(type)
146         {
147         case AUD_AP_VOLUME:
148                 return &m_volume;
149         case AUD_AP_LOCATION:
150                 return &m_location;
151         case AUD_AP_ORIENTATION:
152                 return &m_orientation;
153         default:
154                 return NULL;
155         }
156 }
157
158 AUD_Reference<AUD_SequencerEntry> AUD_SequencerFactory::add(AUD_Reference<AUD_IFactory> sound, float begin, float end, float skip)
159 {
160         AUD_MutexLock lock(*this);
161
162         AUD_Reference<AUD_SequencerEntry> entry = new AUD_SequencerEntry(sound, begin, end, skip, m_id++);
163
164         m_entries.push_front(entry);
165         m_entry_status++;
166
167         return entry;
168 }
169
170 void AUD_SequencerFactory::remove(AUD_Reference<AUD_SequencerEntry> entry)
171 {
172         AUD_MutexLock lock(*this);
173
174         m_entries.remove(entry);
175         m_entry_status++;
176 }
177
178 AUD_Reference<AUD_IReader> AUD_SequencerFactory::createQualityReader()
179 {
180         return new AUD_SequencerReader(this, true);
181 }
182
183 AUD_Reference<AUD_IReader> AUD_SequencerFactory::createReader()
184 {
185         return new AUD_SequencerReader(this);
186 }