svn merge -r39781:39792 https://svn.blender.org/svnroot/bf-blender/trunk/blender...
[blender-staging.git] / intern / audaspace / jack / AUD_JackDevice.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/jack/AUD_JackDevice.h
28  *  \ingroup audjack
29  */
30
31
32 #ifndef AUD_JACKDEVICE
33 #define AUD_JACKDEVICE
34
35
36 #include "AUD_SoftwareDevice.h"
37 #include "AUD_Buffer.h"
38
39 #include <string>
40
41 #include <jack.h>
42 #include <ringbuffer.h>
43
44 typedef void (*AUD_syncFunction)(void*, int, float);
45
46 /**
47  * This device plays back through Jack.
48  */
49 class AUD_JackDevice : public AUD_SoftwareDevice
50 {
51 private:
52         /**
53          * The output ports of jack.
54          */
55         jack_port_t** m_ports;
56
57         /**
58          * The jack client.
59          */
60         jack_client_t* m_client;
61
62         /**
63          * The output buffer.
64          */
65         AUD_Buffer m_buffer;
66
67         /**
68          * The deinterleaving buffer.
69          */
70         AUD_Buffer m_deinterleavebuf;
71
72         jack_ringbuffer_t** m_ringbuffers;
73
74         /**
75          * Whether the device is valid.
76          */
77         bool m_valid;
78
79         /**
80          * Invalidates the jack device.
81          * \param data The jack device that gets invalidet by jack.
82          */
83         static void jack_shutdown(void *data);
84
85         /**
86          * Mixes the next bytes into the buffer.
87          * \param length The length in samples to be filled.
88          * \param data A pointer to the jack device.
89          * \return 0 what shows success.
90          */
91         static int jack_mix(jack_nframes_t length, void *data);
92
93         static int jack_sync(jack_transport_state_t state, jack_position_t* pos, void* data);
94
95         /**
96          * Next Jack Transport state (-1 if not expected to change).
97          */
98         jack_transport_state_t m_nextState;
99
100         /**
101          * Current jack transport status.
102          */
103         jack_transport_state_t m_state;
104
105         /**
106          * Syncronisation state.
107          */
108         int m_sync;
109
110         /**
111          * External syncronisation callback function.
112          */
113         AUD_syncFunction m_syncFunc;
114
115         /**
116          * Data for the sync function.
117          */
118         void* m_syncFuncData;
119
120         /**
121          * The mixing thread.
122          */
123         pthread_t m_mixingThread;
124
125         /**
126          * Mutex for mixing.
127          */
128         pthread_mutex_t m_mixingLock;
129
130         /**
131          * Condition for mixing.
132          */
133         pthread_cond_t m_mixingCondition;
134
135         /**
136          * Mixing thread function.
137          * \param device The this pointer.
138          * \return NULL.
139          */
140         static void* runMixingThread(void* device);
141
142         /**
143          * Updates the ring buffers.
144          */
145         void updateRingBuffers();
146
147         // hide copy constructor and operator=
148         AUD_JackDevice(const AUD_JackDevice&);
149         AUD_JackDevice& operator=(const AUD_JackDevice&);
150
151 protected:
152         virtual void playing(bool playing);
153
154 public:
155         /**
156          * Creates a Jack client for audio output.
157          * \param name The client name.
158          * \param specs The wanted audio specification, where only the channel count
159          *              is important.
160          * \param buffersize The size of the internal buffer.
161          * \exception AUD_Exception Thrown if the audio device cannot be opened.
162          */
163         AUD_JackDevice(std::string name, AUD_DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE);
164
165         /**
166          * Closes the Jack client.
167          */
168         virtual ~AUD_JackDevice();
169
170         /**
171          * Starts jack transport playback.
172          */
173         void startPlayback();
174
175         /**
176          * Stops jack transport playback.
177          */
178         void stopPlayback();
179
180         /**
181          * Seeks jack transport playback.
182          * \param time The time to seek to.
183          */
184         void seekPlayback(float time);
185
186         /**
187          * Sets the sync callback for jack transport playback.
188          * \param sync The callback function.
189          * \param data The data for the function.
190          */
191         void setSyncCallback(AUD_syncFunction sync, void* data);
192
193         /**
194          * Retrieves the jack transport playback time.
195          * \return The current time position.
196          */
197         float getPlaybackPosition();
198
199         /**
200          * Returns whether jack transport plays back.
201          * \return Whether jack transport plays back.
202          */
203         bool doesPlayback();
204 };
205
206 #endif //AUD_JACKDEVICE