Go to the documentation of this file.
25 #include <jack/jack.h>
41 #define FIFO_PACKETS_NUM 16
67 jack_nframes_t latency, cycle_delay;
76 cycle_delay = jack_frames_since_cycle_start(self->client);
80 av_gettime() / 1000000.0 - (
double) cycle_delay / self->sample_rate,
97 for (
i = 0;
i <
self->nports;
i++) {
98 jack_latency_range_t range;
99 jack_port_get_latency_range(self->ports[
i], JackCaptureLatency, &range);
100 latency += range.max;
101 buffer = jack_port_get_buffer(self->ports[
i], self->buffer_size);
102 for (j = 0; j <
self->buffer_size; j++)
103 pkt_data[j * self->nports +
i] =
buffer[j];
107 pkt.
pts = (cycle_time - (
double) latency / (self->nports * self->sample_rate)) * 1000000.0;
133 int test, pkt_size =
self->buffer_size *
self->nports *
sizeof(
float);
155 self->client = jack_client_open(
context->url, JackNullOption, &
status);
161 sem_init(&self->packet_count, 0, 0);
163 self->sample_rate = jack_get_sample_rate(self->client);
167 self->buffer_size = jack_get_buffer_size(self->client);
170 for (
i = 0;
i <
self->nports;
i++) {
173 self->ports[
i] = jack_port_register(self->client,
str,
174 JACK_DEFAULT_AUDIO_TYPE,
176 if (!self->ports[
i]) {
179 jack_client_close(self->client);
190 self->timefilter =
ff_timefilter_new (1.0 / self->sample_rate, self->buffer_size, 1.5);
191 if (!self->timefilter) {
192 jack_client_close(self->client);
200 if (!self->new_pkts) {
201 jack_client_close(self->client);
205 jack_client_close(self->client);
226 jack_deactivate(self->client);
227 jack_client_close(self->client);
267 struct timespec timeout = {0, 0};
274 if (!self->activated) {
275 if (!jack_activate(self->client)) {
278 "JACK client registered and activated (rate=%dHz, buffer_size=%d frames)\n",
279 self->sample_rate, self->buffer_size);
289 if (errno == ETIMEDOUT) {
291 "Input error: timed out when waiting for JACK process callback output\n");
305 if (self->pkt_xrun) {
310 if (self->jack_xrun) {
331 #define OFFSET(x) offsetof(JackData, x)
const AVInputFormat ff_jack_demuxer
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Opaque type representing a time filter state.
#define AV_LOG_WARNING
Something somehow does not look correct.
they must not be accessed directly The fifo field contains the frames that are queued in the input for processing by the filter The status_in and status_out fields contains the queued status(EOF or error) of the link
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
enum AVMediaType codec_type
General type of the encoded data.
static int xrun_callback(void *arg)
#define FIFO_PACKETS_NUM
Size of the internal FIFO buffers as a number of audio packets.
size_t av_fifo_can_read(const AVFifo *f)
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
int nb_channels
Number of channels in this layout.
static int start_jack(AVFormatContext *context)
static const AVClass jack_indev_class
int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
Put a description of the AVERROR code errnum in errbuf.
static av_cold int read_close(AVFormatContext *ctx)
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter.
jack_nframes_t sample_rate
@ AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define sem_timedwait(psem, val)
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
static int process_callback(jack_nframes_t nframes, void *arg)
static void free_pkt_fifo(AVFifo **fifop)
static int audio_read_packet(AVFormatContext *context, AVPacket *pkt)
size_t av_fifo_can_write(const AVFifo *f)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your context
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
static int read_header(FFV1Context *f)
Describe the class of an AVClass context structure.
static void shutdown_callback(void *arg)
const char * av_default_item_name(void *ptr)
Return the context name.
static int supply_new_packets(JackData *self, AVFormatContext *context)
AVChannelLayout ch_layout
Audio only.
int sample_rate
Audio only.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static void stop_jack(JackData *self)
static int audio_read_close(AVFormatContext *context)
void ff_timefilter_reset(TimeFilter *self)
Reset the filter.
#define AV_LOG_INFO
Standard information.
void ff_timefilter_destroy(TimeFilter *self)
Free all resources associated with the filter.
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
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.
#define av_malloc_array(a, b)
static const AVOption options[]
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter.
#define sem_destroy(psem)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
int64_t av_gettime(void)
Get the current time in microseconds.
jack_nframes_t buffer_size
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
#define flags(name, subs,...)
static int audio_read_header(AVFormatContext *context)