Camera tracking: improvements of track preview widget
[blender.git] / intern / audaspace / jack / AUD_JackDevice.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * Copyright 2009-2011 Jörg Hermann Müller
5  *
6  * This file is part of AudaSpace.
7  *
8  * Audaspace is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * AudaSpace is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Audaspace; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file audaspace/jack/AUD_JackDevice.h
26  *  \ingroup audjack
27  */
28
29
30 #ifndef AUD_JACKDEVICE
31 #define AUD_JACKDEVICE
32
33
34 #include "AUD_SoftwareDevice.h"
35 #include "AUD_Buffer.h"
36
37 #include <string>
38
39 #if defined(__APPLE__) // always first include for jack weaklinking !
40 #include <weakjack.h>
41 #endif
42
43 #include <jack.h>
44 #include <ringbuffer.h>
45
46 typedef void (*AUD_syncFunction)(void*, int, float);
47
48 /**
49  * This device plays back through Jack.
50  */
51 class AUD_JackDevice : public AUD_SoftwareDevice
52 {
53 private:
54         /**
55          * The output ports of jack.
56          */
57         jack_port_t** m_ports;
58
59         /**
60          * The jack client.
61          */
62         jack_client_t* m_client;
63
64         /**
65          * The output buffer.
66          */
67         AUD_Buffer m_buffer;
68
69         /**
70          * The deinterleaving buffer.
71          */
72         AUD_Buffer m_deinterleavebuf;
73
74         jack_ringbuffer_t** m_ringbuffers;
75
76         /**
77          * Whether the device is valid.
78          */
79         bool m_valid;
80
81         /**
82          * Invalidates the jack device.
83          * \param data The jack device that gets invalidet by jack.
84          */
85         static void jack_shutdown(void *data);
86
87         /**
88          * Mixes the next bytes into the buffer.
89          * \param length The length in samples to be filled.
90          * \param data A pointer to the jack device.
91          * \return 0 what shows success.
92          */
93         static int jack_mix(jack_nframes_t length, void *data);
94
95         static int jack_sync(jack_transport_state_t state, jack_position_t* pos, void* data);
96
97         /**
98          * Next Jack Transport state (-1 if not expected to change).
99          */
100         jack_transport_state_t m_nextState;
101
102         /**
103          * Current jack transport status.
104          */
105         jack_transport_state_t m_state;
106
107         /**
108          * Syncronisation state.
109          */
110         int m_sync;
111
112         /**
113          * External syncronisation callback function.
114          */
115         AUD_syncFunction m_syncFunc;
116
117         /**
118          * Data for the sync function.
119          */
120         void* m_syncFuncData;
121
122         /**
123          * The mixing thread.
124          */
125         pthread_t m_mixingThread;
126
127         /**
128          * Mutex for mixing.
129          */
130         pthread_mutex_t m_mixingLock;
131
132         /**
133          * Condition for mixing.
134          */
135         pthread_cond_t m_mixingCondition;
136
137         /**
138          * Mixing thread function.
139          * \param device The this pointer.
140          * \return NULL.
141          */
142         static void* runMixingThread(void* device);
143
144         /**
145          * Updates the ring buffers.
146          */
147         void updateRingBuffers();
148
149         // hide copy constructor and operator=
150         AUD_JackDevice(const AUD_JackDevice&);
151         AUD_JackDevice& operator=(const AUD_JackDevice&);
152
153 protected:
154         virtual void playing(bool playing);
155
156 public:
157         /**
158          * Creates a Jack client for audio output.
159          * \param name The client name.
160          * \param specs The wanted audio specification, where only the channel count
161          *              is important.
162          * \param buffersize The size of the internal buffer.
163          * \exception AUD_Exception Thrown if the audio device cannot be opened.
164          */
165         AUD_JackDevice(std::string name, AUD_DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE);
166
167         /**
168          * Closes the Jack client.
169          */
170         virtual ~AUD_JackDevice();
171
172         /**
173          * Starts jack transport playback.
174          */
175         void startPlayback();
176
177         /**
178          * Stops jack transport playback.
179          */
180         void stopPlayback();
181
182         /**
183          * Seeks jack transport playback.
184          * \param time The time to seek to.
185          */
186         void seekPlayback(float time);
187
188         /**
189          * Sets the sync callback for jack transport playback.
190          * \param sync The callback function.
191          * \param data The data for the function.
192          */
193         void setSyncCallback(AUD_syncFunction sync, void* data);
194
195         /**
196          * Retrieves the jack transport playback time.
197          * \return The current time position.
198          */
199         float getPlaybackPosition();
200
201         /**
202          * Returns whether jack transport plays back.
203          * \return Whether jack transport plays back.
204          */
205         bool doesPlayback();
206 };
207
208 #endif //AUD_JACKDEVICE