Merge from trunk -r 22040:23000.
[blender.git] / intern / audaspace / OpenAL / AUD_OpenALDevice.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN LGPL LICENSE BLOCK *****
5  *
6  * Copyright 2009 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 Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with AudaSpace.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  * ***** END LGPL LICENSE BLOCK *****
24  */
25
26 #ifndef AUD_OPENALDEVICE
27 #define AUD_OPENALDEVICE
28
29 #include "AUD_IDevice.h"
30 #include "AUD_I3DDevice.h"
31 struct AUD_OpenALHandle;
32 struct AUD_OpenALBufferedFactory;
33 class AUD_ConverterFactory;
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_Specs m_specs;
60
61         /**
62          * Whether the device has the AL_EXT_MCFORMATS extension.
63          */
64         bool m_useMC;
65
66         /**
67          * The converter factory for readers with wrong input format.
68          */
69         AUD_ConverterFactory* m_converter;
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();
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 format from.
122          * \return Whether the format is valid or not.
123          */
124         bool getFormat(ALenum &format, AUD_Specs specs);
125
126 public:
127         /**
128          * Opens the OpenAL audio device for playback.
129          * \param specs The wanted audio specification.
130          * \param buffersize The size of the internal buffer.
131          * \note The specification really used for opening the device may differ.
132          * \note The buffersize will be multiplicated by three for this device.
133          * \exception AUD_Exception Thrown if the audio device cannot be opened.
134          */
135         AUD_OpenALDevice(AUD_Specs specs, 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_Specs getSpecs();
145         virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
146         virtual bool pause(AUD_Handle* handle);
147         virtual bool resume(AUD_Handle* handle);
148         virtual bool stop(AUD_Handle* handle);
149         virtual bool setKeep(AUD_Handle* handle, bool keep);
150         virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
151         virtual bool seek(AUD_Handle* handle, float position);
152         virtual float getPosition(AUD_Handle* handle);
153         virtual AUD_Status getStatus(AUD_Handle* handle);
154         virtual void lock();
155         virtual void unlock();
156         virtual bool checkCapability(int capability);
157         virtual bool setCapability(int capability, void *value);
158         virtual bool getCapability(int capability, void *value);
159
160         virtual AUD_Handle* play3D(AUD_IFactory* factory, bool keep = false);
161         virtual bool updateListener(AUD_3DData &data);
162         virtual bool setSetting(AUD_3DSetting setting, float value);
163         virtual float getSetting(AUD_3DSetting setting);
164         virtual bool updateSource(AUD_Handle* handle, AUD_3DData &data);
165         virtual bool setSourceSetting(AUD_Handle* handle,
166                                                                   AUD_3DSourceSetting setting, float value);
167         virtual float getSourceSetting(AUD_Handle* handle,
168                                                                    AUD_3DSourceSetting setting);
169 };
170
171 #endif //AUD_OPENALDEVICE