Audaspace:
[blender.git] / intern / audaspace / OpenAL / AUD_OpenALDevice.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 #ifndef AUD_OPENALDEVICE
28 #define AUD_OPENALDEVICE
29
30 #include "AUD_IDevice.h"
31 #include "AUD_I3DDevice.h"
32 struct AUD_OpenALHandle;
33 struct AUD_OpenALBufferedFactory;
34
35 #include <AL/al.h>
36 #include <AL/alc.h>
37 #include <list>
38 #include <pthread.h>
39
40 /**
41  * This device plays through OpenAL.
42  */
43 class AUD_OpenALDevice : public AUD_IDevice, public AUD_I3DDevice
44 {
45 private:
46         /**
47          * The OpenAL device handle.
48          */
49         ALCdevice* m_device;
50
51         /**
52          * The OpenAL context.
53          */
54         ALCcontext* m_context;
55
56         /**
57          * The specification of the device.
58          */
59         AUD_DeviceSpecs m_specs;
60
61         /**
62          * Whether the device has the AL_EXT_MCFORMATS extension.
63          */
64         bool m_useMC;
65
66         /**
67          * The list of sounds that are currently playing.
68          */
69         std::list<AUD_OpenALHandle*>* m_playingSounds;
70
71         /**
72          * The list of sounds that are currently paused.
73          */
74         std::list<AUD_OpenALHandle*>* m_pausedSounds;
75
76         /**
77          * The list of buffered factories.
78          */
79         std::list<AUD_OpenALBufferedFactory*>* m_bufferedFactories;
80
81         /**
82          * The mutex for locking.
83          */
84         pthread_mutex_t m_mutex;
85
86         /**
87          * The streaming thread.
88          */
89         pthread_t m_thread;
90
91         /**
92          * The condition for streaming thread wakeup.
93          */
94         bool m_playing;
95
96         /**
97          * Buffer size.
98          */
99         int m_buffersize;
100
101         /**
102          * Starts the streaming thread.
103          */
104         void start();
105
106         /**
107          * Checks if a handle is valid.
108          * \param handle The handle to check.
109          * \return Whether the handle is valid.
110          */
111         bool isValid(AUD_Handle* handle);
112
113         /**
114          * Gets the format according to the specs.
115          * \param format The variable to put the format into.
116          * \param specs The specs to read the channel count from.
117          * \return Whether the format is valid or not.
118          */
119         bool getFormat(ALenum &format, AUD_Specs specs);
120
121         // hide copy constructor and operator=
122         AUD_OpenALDevice(const AUD_OpenALDevice&);
123         AUD_OpenALDevice& operator=(const AUD_OpenALDevice&);
124
125 public:
126         /**
127          * Opens the OpenAL audio device for playback.
128          * \param specs The wanted audio specification.
129          * \param buffersize The size of the internal buffer.
130          * \note The specification really used for opening the device may differ.
131          * \note The buffersize will be multiplicated by three for this device.
132          * \exception AUD_Exception Thrown if the audio device cannot be opened.
133          */
134         AUD_OpenALDevice(AUD_DeviceSpecs specs,
135                                          int buffersize = AUD_DEFAULT_BUFFER_SIZE);
136
137         /**
138          * Streaming thread main function.
139          */
140         void updateStreams();
141
142         virtual ~AUD_OpenALDevice();
143
144         virtual AUD_DeviceSpecs getSpecs() const;
145         virtual AUD_Handle* play(AUD_IReader* reader, bool keep = false);
146         virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
147         virtual bool pause(AUD_Handle* handle);
148         virtual bool resume(AUD_Handle* handle);
149         virtual bool stop(AUD_Handle* handle);
150         virtual bool getKeep(AUD_Handle* handle);
151         virtual bool setKeep(AUD_Handle* handle, bool keep);
152         virtual bool seek(AUD_Handle* handle, float position);
153         virtual float getPosition(AUD_Handle* handle);
154         virtual AUD_Status getStatus(AUD_Handle* handle);
155         virtual void lock();
156         virtual void unlock();
157         virtual float getVolume() const;
158         virtual void setVolume(float volume);
159         virtual float getVolume(AUD_Handle* handle);
160         virtual bool setVolume(AUD_Handle* handle, float volume);
161         virtual float getPitch(AUD_Handle* handle);
162         virtual bool setPitch(AUD_Handle* handle, float pitch);
163         virtual int getLoopCount(AUD_Handle* handle);
164         virtual bool setLoopCount(AUD_Handle* handle, int count);
165         virtual bool setStopCallback(AUD_Handle* handle, stopCallback callback = NULL, void* data = NULL);
166
167         virtual AUD_Vector3 getListenerLocation() const;
168         virtual void setListenerLocation(const AUD_Vector3& location);
169         virtual AUD_Vector3 getListenerVelocity() const;
170         virtual void setListenerVelocity(const AUD_Vector3& velocity);
171         virtual AUD_Quaternion getListenerOrientation() const;
172         virtual void setListenerOrientation(const AUD_Quaternion& orientation);
173         virtual float getSpeedOfSound() const;
174         virtual void setSpeedOfSound(float speed);
175         virtual float getDopplerFactor() const;
176         virtual void setDopplerFactor(float factor);
177         virtual AUD_DistanceModel getDistanceModel() const;
178         virtual void setDistanceModel(AUD_DistanceModel model);
179         virtual AUD_Vector3 getSourceLocation(AUD_Handle* handle);
180         virtual bool setSourceLocation(AUD_Handle* handle, const AUD_Vector3& location);
181         virtual AUD_Vector3 getSourceVelocity(AUD_Handle* handle);
182         virtual bool setSourceVelocity(AUD_Handle* handle, const AUD_Vector3& velocity);
183         virtual AUD_Quaternion getSourceOrientation(AUD_Handle* handle);
184         virtual bool setSourceOrientation(AUD_Handle* handle, const AUD_Quaternion& orientation);
185         virtual bool isRelative(AUD_Handle* handle);
186         virtual bool setRelative(AUD_Handle* handle, bool relative);
187         virtual float getVolumeMaximum(AUD_Handle* handle);
188         virtual bool setVolumeMaximum(AUD_Handle* handle, float volume);
189         virtual float getVolumeMinimum(AUD_Handle* handle);
190         virtual bool setVolumeMinimum(AUD_Handle* handle, float volume);
191         virtual float getDistanceMaximum(AUD_Handle* handle);
192         virtual bool setDistanceMaximum(AUD_Handle* handle, float distance);
193         virtual float getDistanceReference(AUD_Handle* handle);
194         virtual bool setDistanceReference(AUD_Handle* handle, float distance);
195         virtual float getAttenuation(AUD_Handle* handle);
196         virtual bool setAttenuation(AUD_Handle* handle, float factor);
197         virtual float getConeAngleOuter(AUD_Handle* handle);
198         virtual bool setConeAngleOuter(AUD_Handle* handle, float angle);
199         virtual float getConeAngleInner(AUD_Handle* handle);
200         virtual bool setConeAngleInner(AUD_Handle* handle, float angle);
201         virtual float getConeVolumeOuter(AUD_Handle* handle);
202         virtual bool setConeVolumeOuter(AUD_Handle* handle, float volume);
203 };
204
205 #endif //AUD_OPENALDEVICE