656496405dbe2e5096f4e40d34b21991a2aec202
[blender.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         pthread_mutex_t m_mixingLock;
126
127         pthread_cond_t m_mixingCondition;
128
129         static void* runMixingThread(void* device);
130
131         void updateRingBuffers();
132
133         // hide copy constructor and operator=
134         AUD_JackDevice(const AUD_JackDevice&);
135         AUD_JackDevice& operator=(const AUD_JackDevice&);
136
137 protected:
138         virtual void playing(bool playing);
139
140 public:
141         /**
142          * Creates a Jack client for audio output.
143          * \param name The client name.
144          * \param specs The wanted audio specification, where only the channel count
145          *              is important.
146          * \param buffersize The size of the internal buffer.
147          * \exception AUD_Exception Thrown if the audio device cannot be opened.
148          */
149         AUD_JackDevice(std::string name, AUD_DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE);
150
151         /**
152          * Closes the Jack client.
153          */
154         virtual ~AUD_JackDevice();
155
156         void startPlayback();
157         void stopPlayback();
158         void seekPlayback(float time);
159         void setSyncCallback(AUD_syncFunction sync, void* data);
160         float getPlaybackPosition();
161         bool doesPlayback();
162 };
163
164 #endif //AUD_JACKDEVICE