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