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