6518afe6737e5140c58272551c1217d2ce941f1d
[blender.git] / intern / audaspace / intern / AUD_SoftwareDevice.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/intern/AUD_SoftwareDevice.h
28  *  \ingroup audaspaceintern
29  */
30
31
32 #ifndef AUD_SOFTWAREDEVICE
33 #define AUD_SOFTWAREDEVICE
34
35 #include "AUD_IDevice.h"
36 #include "AUD_Mixer.h"
37 #include "AUD_Buffer.h"
38 struct AUD_SoftwareHandle;
39
40 #include <list>
41 #include <pthread.h>
42
43 /**
44  * This device plays is a generic device with software mixing.
45  * Classes implementing this have to:
46  *  - Implement the playing function.
47  *  - Prepare the m_specs, m_mixer variables.
48  *  - Call the create and destroy functions.
49  *  - Call the mix function to retrieve their audio data.
50  */
51 class AUD_SoftwareDevice : public AUD_IDevice
52 {
53 protected:
54         /**
55          * The specification of the device.
56          */
57         AUD_DeviceSpecs m_specs;
58
59         /**
60          * The mixer.
61          */
62         AUD_Reference<AUD_Mixer> m_mixer;
63
64         /**
65          * Initializes member variables.
66          */
67         void create();
68
69         /**
70          * Uninitializes member variables.
71          */
72         void destroy();
73
74         /**
75          * Mixes the next samples into the buffer.
76          * \param buffer The target buffer.
77          * \param length The length in samples to be filled.
78          */
79         void mix(data_t* buffer, int length);
80
81         /**
82          * This function tells the device, to start or pause playback.
83          * \param playing True if device should playback.
84          */
85         virtual void playing(bool playing)=0;
86
87 private:
88         /**
89          * The reading buffer.
90          */
91         AUD_Buffer m_buffer;
92
93         /**
94          * The list of sounds that are currently playing.
95          */
96         std::list<AUD_SoftwareHandle*> m_playingSounds;
97
98         /**
99          * The list of sounds that are currently paused.
100          */
101         std::list<AUD_SoftwareHandle*> m_pausedSounds;
102
103         /**
104          * Whether there is currently playback.
105          */
106         bool m_playback;
107
108         /**
109          * The mutex for locking.
110          */
111         pthread_mutex_t m_mutex;
112
113         /**
114          * The overall volume of the device.
115          */
116         float m_volume;
117
118         /**
119          * Checks if a handle is valid.
120          * \param handle The handle to check.
121          * \return Whether the handle is valid.
122          */
123         bool isValid(AUD_Handle* handle);
124
125 public:
126         virtual AUD_DeviceSpecs getSpecs() const;
127         virtual AUD_Handle* play(AUD_Reference<AUD_IReader> reader, bool keep = false);
128         virtual AUD_Handle* play(AUD_Reference<AUD_IFactory> factory, bool keep = false);
129         virtual bool pause(AUD_Handle* handle);
130         virtual bool resume(AUD_Handle* handle);
131         virtual bool stop(AUD_Handle* handle);
132         virtual bool getKeep(AUD_Handle* handle);
133         virtual bool setKeep(AUD_Handle* handle, bool keep);
134         virtual bool seek(AUD_Handle* handle, float position);
135         virtual float getPosition(AUD_Handle* handle);
136         virtual AUD_Status getStatus(AUD_Handle* handle);
137         virtual void lock();
138         virtual void unlock();
139         virtual float getVolume() const;
140         virtual void setVolume(float volume);
141         virtual float getVolume(AUD_Handle* handle);
142         virtual bool setVolume(AUD_Handle* handle, float volume);
143         virtual float getPitch(AUD_Handle* handle);
144         virtual bool setPitch(AUD_Handle* handle, float pitch);
145         virtual int getLoopCount(AUD_Handle* handle);
146         virtual bool setLoopCount(AUD_Handle* handle, int count);
147         virtual bool setStopCallback(AUD_Handle* handle, stopCallback callback = NULL, void* data = NULL);
148 };
149
150 #endif //AUD_SOFTWAREDEVICE