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,
92 pkt_data = (
float *) pkt.
data;
96 for (i = 0; i <
self->nports; i++) {
97 jack_latency_range_t range;
98 jack_port_get_latency_range(self->ports[i], JackCaptureLatency, &range);
100 buffer = jack_port_get_buffer(self->ports[i], self->buffer_size);
101 for (j = 0; j <
self->buffer_size; j++)
102 pkt_data[j * self->nports + i] = buffer[j];
106 pkt.
pts = (cycle_time - (double) latency / (self->nports * self->sample_rate)) * 1000000.0;
132 int test, pkt_size =
self->buffer_size *
self->nports *
sizeof(float);
154 self->client = jack_client_open(context->
url, JackNullOption, &status);
160 sem_init(&self->packet_count, 0, 0);
162 self->sample_rate = jack_get_sample_rate(self->client);
166 self->buffer_size = jack_get_buffer_size(self->client);
169 for (i = 0; i <
self->nports; i++) {
171 snprintf(str,
sizeof(str),
"input_%d", i + 1);
172 self->ports[
i] = jack_port_register(self->client, str,
173 JACK_DEFAULT_AUDIO_TYPE,
175 if (!self->ports[i]) {
178 jack_client_close(self->client);
189 self->timefilter =
ff_timefilter_new (1.0 / self->sample_rate, self->buffer_size, 1.5);
190 if (!self->timefilter) {
191 jack_client_close(self->client);
199 if (!self->new_pkts) {
200 jack_client_close(self->client);
204 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) 353 .priv_class = &jack_indev_class,
void ff_timefilter_destroy(TimeFilter *self)
Free all resources associated with the filter.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
void ff_timefilter_reset(TimeFilter *self)
Reset the filter.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
const char * av_default_item_name(void *ptr)
Return the context name.
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Opaque type representing a time filter state.
static int supply_new_packets(JackData *self, AVFormatContext *context)
int av_fifo_space(const AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVInputFormat ff_jack_demuxer
AVFifoBuffer * filled_pkts
static void free_pkt_fifo(AVFifoBuffer **fifo)
static av_cold int read_close(AVFormatContext *ctx)
#define FIFO_PACKETS_NUM
Size of the internal FIFO buffers as a number of audio packets.
Main libavdevice API header.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
char * url
input or output URL.
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
static const AVOption options[]
enum AVMediaType codec_type
General type of the encoded data.
#define sem_destroy(psem)
static int start_jack(AVFormatContext *context)
common internal API header
#define sem_timedwait(psem, val)
static int read_header(FFV1Context *f)
int64_t av_gettime(void)
Get the current time in microseconds.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
#define AV_LOG_INFO
Standard information.
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter.
Libavcodec external API header.
static int audio_read_packet(AVFormatContext *context, AVPacket *pkt)
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
static void test(const char *pattern, const char *host)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
jack_nframes_t sample_rate
a very simple circular buffer FIFO implementation
Describe the class of an AVClass context structure.
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
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
static int process_callback(jack_nframes_t nframes, void *arg)
static void shutdown_callback(void *arg)
#define flags(name, subs,...)
AVFifoBuffer * av_fifo_alloc_array(size_t nmemb, size_t size)
Initialize an AVFifoBuffer.
static int audio_read_close(AVFormatContext *context)
int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
Put a description of the AVERROR code errnum in errbuf.
int sample_rate
Audio only.
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter.
static int audio_read_header(AVFormatContext *context)
static int xrun_callback(void *arg)
static const AVClass jack_indev_class
void * priv_data
Format private data.
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
jack_nframes_t buffer_size
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define av_malloc_array(a, b)
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
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 local context
This structure stores compressed data.
static void stop_jack(JackData *self)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...