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