1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/* ------------------------------------------------------------------
* Copyright (C) 2011 Martin Storsjo
* Copyright (C) 2016 Matthias P. Braendli
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/*! \file JackInput.h
*
* This input uses JACK to get audio data. This always uses drift
* compensation, because there is no blocking way to read from JACK.
*/
#ifndef __JACK_INPUT_H
#define __JACK_INPUT_H
#include "config.h"
#include <cstdio>
#include <string>
#if HAVE_JACK
extern "C" {
#include <jack/jack.h>
}
#include "SampleQueue.h"
// 16 bits per sample is fine for now
#define BYTES_PER_SAMPLE 2
class JackInput
{
public:
JackInput(const char* jack_name,
unsigned int channels,
unsigned int samplerate,
SampleQueue<uint8_t>& queue) :
m_client(NULL),
m_jack_name(jack_name),
m_channels(channels),
m_rate(samplerate),
m_queue(queue) { }
~JackInput() {
if (m_client) {
jack_client_close(m_client);
}
}
/*! Prepare the audio input
*
* \return 0 on success
*/
int prepare();
private:
JackInput(const JackInput& other);
jack_client_t *m_client;
std::vector<jack_port_t*> m_input_ports;
const char* m_jack_name;
unsigned int m_channels;
unsigned int m_rate;
// Callback for real-time JACK process
void jack_process(jack_nframes_t nframes);
// Callback when JACK shuts down
void jack_shutdown()
{
m_fault = true;
}
bool m_fault;
bool m_running;
SampleQueue<uint8_t>& m_queue;
// Static functions for JACK callbacks
static int process_cb(jack_nframes_t nframes, void *arg)
{
((JackInput*)arg)->jack_process(nframes);
return 0;
}
static void shutdown_cb(void *arg)
{
((JackInput*)arg)->jack_shutdown();
}
};
#endif // HAVE_JACK
#endif
|