FFmpeg
Loading...
Searching...
No Matches
jack.c
Go to the documentation of this file.
1/*
2 * JACK Audio Connection Kit input device
3 * Copyright (c) 2009 Samalyse
4 * Author: Olivier Guilyardi <olivier samalyse com>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg 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 GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include "config.h"
24#include <semaphore.h>
25#include <jack/jack.h>
26
27#include "libavutil/internal.h"
28#include "libavutil/log.h"
29#include "libavutil/fifo.h"
30#include "libavutil/mem.h"
31#include "libavutil/opt.h"
32#include "libavutil/time.h"
34#include "libavformat/demux.h"
36#include "timefilter.h"
37#include "avdevice.h"
38
39/**
40 * Size of the internal FIFO buffers as a number of audio packets
41 */
42#define FIFO_PACKETS_NUM 16
43
44typedef struct JackData {
45 AVClass *class;
46 jack_client_t * client;
49 jack_nframes_t sample_rate;
50 jack_nframes_t buffer_size;
51 jack_port_t ** ports;
52 int nports;
58} JackData;
59
60static int process_callback(jack_nframes_t nframes, void *arg)
61{
62 /* Warning: this function runs in realtime. One mustn't allocate memory here
63 * or do any other thing that could block. */
64
65 int i, j;
66 JackData *self = arg;
67 float * buffer;
68 jack_nframes_t latency, cycle_delay;
70 float *pkt_data;
71 double cycle_time;
72
73 if (!self->client)
74 return 0;
75
76 /* The approximate delay since the hardware interrupt as a number of frames */
77 cycle_delay = jack_frames_since_cycle_start(self->client);
78
79 /* Retrieve filtered cycle time */
80 cycle_time = ff_timefilter_update(self->timefilter,
81 av_gettime() / 1000000.0 - (double) cycle_delay / self->sample_rate,
82 self->buffer_size);
83
84 /* Check if an empty packet is available, and if there's enough space to send it back once filled */
85 if (!av_fifo_can_read(self->new_pkts) ||
87 self->pkt_xrun = 1;
88 return 0;
89 }
90
91 /* Retrieve empty (but allocated) packet */
92 av_fifo_read(self->new_pkts, &pkt, 1);
93
94 pkt_data = (float *) pkt.data;
95 latency = 0;
96
97 /* Copy and interleave audio data from the JACK buffer into the packet */
98 for (i = 0; i < self->nports; i++) {
99 jack_latency_range_t range;
100 jack_port_get_latency_range(self->ports[i], JackCaptureLatency, &range);
101 latency += range.max;
102 buffer = jack_port_get_buffer(self->ports[i], self->buffer_size);
103 for (j = 0; j < self->buffer_size; j++)
104 pkt_data[j * self->nports + i] = buffer[j];
105 }
106
107 /* Timestamp the packet with the cycle start time minus the average latency */
108 pkt.pts = (cycle_time - (double) latency / (self->nports * self->sample_rate)) * 1000000.0;
109
110 /* Send the now filled packet back, and increase packet counter */
111 av_fifo_write(self->filled_pkts, &pkt, 1);
112 sem_post(&self->packet_count);
113
114 return 0;
115}
116
117static void shutdown_callback(void *arg)
118{
119 JackData *self = arg;
120 self->client = NULL;
121}
122
123static int xrun_callback(void *arg)
124{
125 JackData *self = arg;
126 self->jack_xrun = 1;
128 return 0;
129}
130
131static int supply_new_packets(JackData *self, AVFormatContext *context)
132{
134 int test, pkt_size = self->buffer_size * self->nports * sizeof(float);
135
136 /* Supply the process callback with new empty packets, by filling the new
137 * packets FIFO buffer with as many packets as possible. process_callback()
138 * can't do this by itself, because it can't allocate memory in realtime. */
139 while (av_fifo_can_write(self->new_pkts)) {
140 if ((test = av_new_packet(&pkt, pkt_size)) < 0) {
141 av_log(context, AV_LOG_ERROR, "Could not create packet of size %d\n", pkt_size);
142 return test;
143 }
144 av_fifo_write(self->new_pkts, &pkt, 1);
145 }
146 return 0;
147}
148
149static int start_jack(AVFormatContext *context)
150{
151 JackData *self = context->priv_data;
152 jack_status_t status;
153 int i, test;
154
155 /* Register as a JACK client, using the context url as client name. */
156 self->client = jack_client_open(context->url, JackNullOption, &status);
157 if (!self->client) {
158 av_log(context, AV_LOG_ERROR, "Unable to register as a JACK client\n");
159 return AVERROR(EIO);
160 }
161
162 sem_init(&self->packet_count, 0, 0);
163
164 self->sample_rate = jack_get_sample_rate(self->client);
165 self->ports = av_malloc_array(self->nports, sizeof(*self->ports));
166 if (!self->ports)
167 return AVERROR(ENOMEM);
168 self->buffer_size = jack_get_buffer_size(self->client);
169
170 /* Register JACK ports */
171 for (i = 0; i < self->nports; i++) {
172 char str[32];
173 snprintf(str, sizeof(str), "input_%d", i + 1);
174 self->ports[i] = jack_port_register(self->client, str,
175 JACK_DEFAULT_AUDIO_TYPE,
176 JackPortIsInput, 0);
177 if (!self->ports[i]) {
178 av_log(context, AV_LOG_ERROR, "Unable to register port %s:%s\n",
179 context->url, str);
180 jack_client_close(self->client);
181 return AVERROR(EIO);
182 }
183 }
184
185 /* Register JACK callbacks */
186 jack_set_process_callback(self->client, process_callback, self);
187 jack_on_shutdown(self->client, shutdown_callback, self);
188 jack_set_xrun_callback(self->client, xrun_callback, self);
189
190 /* Create time filter */
191 self->timefilter = ff_timefilter_new (1.0 / self->sample_rate, self->buffer_size, 1.5);
192 if (!self->timefilter) {
193 jack_client_close(self->client);
194 return AVERROR(ENOMEM);
195 }
196
197 /* Create FIFO buffers */
199 /* New packets FIFO with one extra packet for safety against underruns */
200 self->new_pkts = av_fifo_alloc2((FIFO_PACKETS_NUM + 1), sizeof(AVPacket), 0);
201 if (!self->new_pkts) {
202 jack_client_close(self->client);
203 return AVERROR(ENOMEM);
204 }
205 if ((test = supply_new_packets(self, context))) {
206 jack_client_close(self->client);
207 return test;
208 }
209
210 return 0;
211
212}
213
214static void free_pkt_fifo(AVFifo **fifop)
215{
216 AVFifo *fifo = *fifop;
218 while (av_fifo_read(fifo, &pkt, 1) >= 0)
220 av_fifo_freep2(fifop);
221}
222
223static void stop_jack(JackData *self)
224{
225 if (self->client) {
226 if (self->activated)
227 jack_deactivate(self->client);
228 jack_client_close(self->client);
229 }
231 free_pkt_fifo(&self->new_pkts);
233 av_freep(&self->ports);
235}
236
238{
239 JackData *self = context->priv_data;
240 AVStream *stream;
241 int test;
242
243 if ((test = start_jack(context)))
244 return test;
245
246 stream = avformat_new_stream(context, NULL);
247 if (!stream) {
248 stop_jack(self);
249 return AVERROR(ENOMEM);
250 }
251
253#if HAVE_BIGENDIAN
255#else
257#endif
258 stream->codecpar->sample_rate = self->sample_rate;
259 stream->codecpar->ch_layout.nb_channels = self->nports;
260
261 avpriv_set_pts_info(stream, 64, 1, 1000000); /* 64 bits pts in us */
262 return 0;
263}
264
266{
267 JackData *self = context->priv_data;
268 struct timespec timeout = {0, 0};
269 int test;
270
271 /* Activate the JACK client on first packet read. Activating the JACK client
272 * means that process_callback() starts to get called at regular interval.
273 * If we activate it in audio_read_header(), we're actually reading audio data
274 * from the device before instructed to, and that may result in an overrun. */
275 if (!self->activated) {
276 if (!jack_activate(self->client)) {
277 self->activated = 1;
278 av_log(context, AV_LOG_INFO,
279 "JACK client registered and activated (rate=%dHz, buffer_size=%d frames)\n",
280 self->sample_rate, self->buffer_size);
281 } else {
282 av_log(context, AV_LOG_ERROR, "Unable to activate JACK client\n");
283 return AVERROR(EIO);
284 }
285 }
286
287 /* Wait for a packet coming back from process_callback(), if one isn't available yet */
288 timeout.tv_sec = av_gettime() / 1000000 + 2;
289 if (sem_timedwait(&self->packet_count, &timeout)) {
290 if (errno == ETIMEDOUT) {
291 av_log(context, AV_LOG_ERROR,
292 "Input error: timed out when waiting for JACK process callback output\n");
293 } else {
294 int ret = AVERROR(errno);
295 av_log(context, AV_LOG_ERROR, "Error while waiting for audio packet: %s\n",
296 av_err2str(ret));
297 }
298 if (!self->client)
299 av_log(context, AV_LOG_ERROR, "Input error: JACK server is gone\n");
300
301 return AVERROR(EIO);
302 }
303
304 if (self->pkt_xrun) {
305 av_log(context, AV_LOG_WARNING, "Audio packet xrun\n");
306 self->pkt_xrun = 0;
307 }
308
309 if (self->jack_xrun) {
310 av_log(context, AV_LOG_WARNING, "JACK xrun\n");
311 self->jack_xrun = 0;
312 }
313
314 /* Retrieve the packet filled with audio data by process_callback() */
315 av_fifo_read(self->filled_pkts, pkt, 1);
316
317 if ((test = supply_new_packets(self, context)))
318 return test;
319
320 return 0;
321}
322
324{
325 JackData *self = context->priv_data;
326 stop_jack(self);
327 return 0;
328}
329
330#define OFFSET(x) offsetof(JackData, x)
331static const AVOption options[] = {
332 { "channels", "Number of audio channels.", OFFSET(nports), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
333 { NULL },
334};
335
336static const AVClass jack_indev_class = {
337 .class_name = "JACK indev",
338 .item_name = av_default_item_name,
339 .option = options,
340 .version = LIBAVUTIL_VERSION_INT,
342};
343
345 .p.name = "jack",
346 .p.long_name = NULL_IF_CONFIG_SMALL("JACK Audio Connection Kit"),
347 .p.flags = AVFMT_NOFILE,
348 .p.priv_class = &jack_indev_class,
349 .priv_data_size = sizeof(JackData),
353};
const FFInputFormat ff_jack_demuxer
Definition jack.c:344
static av_cold int audio_read_header(AVFormatContext *s1)
Definition alsa_dec.c:61
static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt)
Definition alsa_dec.c:106
Main libavdevice API header.
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition avformat.c:834
Main libavformat public API header.
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition avformat.h:488
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define NULL
Definition coverity.c:32
static AVPacket * pkt
static int read_header(FFV1Context *f, RangeCoder *c)
Definition ffv1dec.c:578
A generic FIFO API.
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition opt.h:355
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_CODEC_ID_PCM_F32LE
Definition codec_id.h:351
@ AV_CODEC_ID_PCM_F32BE
Definition codec_id.h:350
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition packet.c:98
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition error.h:122
#define AVERROR(e)
Definition error.h:45
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition fifo.c:47
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition fifo.c:286
size_t av_fifo_can_write(const AVFifo *f)
Definition fifo.c:94
size_t av_fifo_can_read(const AVFifo *f)
Definition fifo.c:87
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition fifo.c:188
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition fifo.c:240
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_INFO
Standard information.
Definition log.h:221
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
#define FIFO_PACKETS_NUM
Size of the internal FIFO buffers as a number of audio packets.
Definition jack.c:42
static int audio_read_close(AVFormatContext *context)
Definition jack.c:323
static void free_pkt_fifo(AVFifo **fifop)
Definition jack.c:214
static int audio_read_header(AVFormatContext *context)
Definition jack.c:237
static int start_jack(AVFormatContext *context)
Definition jack.c:149
static const AVClass jack_indev_class
Definition jack.c:336
static void stop_jack(JackData *self)
Definition jack.c:223
static int process_callback(jack_nframes_t nframes, void *arg)
Definition jack.c:60
static int audio_read_packet(AVFormatContext *context, AVPacket *pkt)
Definition jack.c:265
#define OFFSET(x)
Definition jack.c:330
static int xrun_callback(void *arg)
Definition jack.c:123
static void shutdown_callback(void *arg)
Definition jack.c:117
static int supply_new_packets(JackData *self, AVFormatContext *context)
Definition jack.c:131
const char * arg
Definition jacosubdec.c:65
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static av_cold int read_close(AVFormatContext *ctx)
Definition libcdio.c:143
@ AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT
Definition log.h:44
enum AVColorRange range
Memory handling functions.
AVOptions.
#define sem_timedwait(psem, val)
Definition semaphore.h:28
#define sem_destroy(psem)
Definition semaphore.h:29
#define sem_post(psem)
Definition semaphore.h:26
#define sem_init
Definition semaphore.h:40
#define sem_t
Definition semaphore.h:25
#define snprintf
Definition snprintf.h:34
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition codec_par.h:207
enum AVMediaType codec_type
General type of the encoded data.
Definition codec_par.h:53
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
int sample_rate
The number of audio samples per second.
Definition codec_par.h:213
Definition fifo.c:35
Format I/O context.
Definition avformat.h:1333
char * url
input or output URL.
Definition avformat.h:1449
void * priv_data
Format private data.
Definition avformat.h:1361
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
int nports
Definition jack.c:52
jack_nframes_t buffer_size
Definition jack.c:50
int activated
Definition jack.c:47
jack_port_t ** ports
Definition jack.c:51
AVFifo * filled_pkts
Definition jack.c:55
AVFifo * new_pkts
Definition jack.c:54
jack_client_t * client
Definition jack.c:46
int jack_xrun
Definition jack.c:57
sem_t packet_count
Definition jack.c:48
TimeFilter * timefilter
Definition jack.c:53
jack_nframes_t sample_rate
Definition jack.c:49
int pkt_xrun
Definition jack.c:56
Opaque type representing a time filter state.
Definition timefilter.c:34
Definition idctdsp.c:35
#define av_malloc_array(a, b)
#define av_freep(p)
#define av_log(a,...)
static char buffer[20]
Definition seek.c:32
int64_t av_gettime(void)
Get the current time in microseconds.
Definition time.c:40
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter.
Definition timefilter.c:76
void ff_timefilter_destroy(TimeFilter *self)
Free all resources associated with the filter.
Definition timefilter.c:66
void ff_timefilter_reset(TimeFilter *self)
Reset the filter.
Definition timefilter.c:71
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter.
Definition timefilter.c:50