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