Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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/opt.h"
  31. #include "libavutil/time.h"
  32. #include "libavcodec/avcodec.h"
  33. #include "libavformat/avformat.h"
  34. #include "libavformat/internal.h"
  35. #include "timefilter.h"
  36. #include "avdevice.h"
  37.  
  38. /**
  39.  * Size of the internal FIFO buffers as a number of audio packets
  40.  */
  41. #define FIFO_PACKETS_NUM 16
  42.  
  43. typedef struct JackData {
  44.     AVClass        *class;
  45.     jack_client_t * client;
  46.     int             activated;
  47.     sem_t           packet_count;
  48.     jack_nframes_t  sample_rate;
  49.     jack_nframes_t  buffer_size;
  50.     jack_port_t **  ports;
  51.     int             nports;
  52.     TimeFilter *    timefilter;
  53.     AVFifoBuffer *  new_pkts;
  54.     AVFifoBuffer *  filled_pkts;
  55.     int             pkt_xrun;
  56.     int             jack_xrun;
  57. } JackData;
  58.  
  59. static int process_callback(jack_nframes_t nframes, void *arg)
  60. {
  61.     /* Warning: this function runs in realtime. One mustn't allocate memory here
  62.      * or do any other thing that could block. */
  63.  
  64.     int i, j;
  65.     JackData *self = arg;
  66.     float * buffer;
  67.     jack_nframes_t latency, cycle_delay;
  68.     AVPacket pkt;
  69.     float *pkt_data;
  70.     double cycle_time;
  71.  
  72.     if (!self->client)
  73.         return 0;
  74.  
  75.     /* The approximate delay since the hardware interrupt as a number of frames */
  76.     cycle_delay = jack_frames_since_cycle_start(self->client);
  77.  
  78.     /* Retrieve filtered cycle time */
  79.     cycle_time = ff_timefilter_update(self->timefilter,
  80.                                       av_gettime() / 1000000.0 - (double) cycle_delay / self->sample_rate,
  81.                                       self->buffer_size);
  82.  
  83.     /* Check if an empty packet is available, and if there's enough space to send it back once filled */
  84.     if ((av_fifo_size(self->new_pkts) < sizeof(pkt)) || (av_fifo_space(self->filled_pkts) < sizeof(pkt))) {
  85.         self->pkt_xrun = 1;
  86.         return 0;
  87.     }
  88.  
  89.     /* Retrieve empty (but allocated) packet */
  90.     av_fifo_generic_read(self->new_pkts, &pkt, sizeof(pkt), NULL);
  91.  
  92.     pkt_data  = (float *) pkt.data;
  93.     latency   = 0;
  94.  
  95.     /* Copy and interleave audio data from the JACK buffer into the packet */
  96.     for (i = 0; i < self->nports; i++) {
  97.     #if HAVE_JACK_PORT_GET_LATENCY_RANGE
  98.         jack_latency_range_t range;
  99.         jack_port_get_latency_range(self->ports[i], JackCaptureLatency, &range);
  100.         latency += range.max;
  101.     #else
  102.         latency += jack_port_get_total_latency(self->client, self->ports[i]);
  103.     #endif
  104.         buffer = jack_port_get_buffer(self->ports[i], self->buffer_size);
  105.         for (j = 0; j < self->buffer_size; j++)
  106.             pkt_data[j * self->nports + i] = buffer[j];
  107.     }
  108.  
  109.     /* Timestamp the packet with the cycle start time minus the average latency */
  110.     pkt.pts = (cycle_time - (double) latency / (self->nports * self->sample_rate)) * 1000000.0;
  111.  
  112.     /* Send the now filled packet back, and increase packet counter */
  113.     av_fifo_generic_write(self->filled_pkts, &pkt, sizeof(pkt), NULL);
  114.     sem_post(&self->packet_count);
  115.  
  116.     return 0;
  117. }
  118.  
  119. static void shutdown_callback(void *arg)
  120. {
  121.     JackData *self = arg;
  122.     self->client = NULL;
  123. }
  124.  
  125. static int xrun_callback(void *arg)
  126. {
  127.     JackData *self = arg;
  128.     self->jack_xrun = 1;
  129.     ff_timefilter_reset(self->timefilter);
  130.     return 0;
  131. }
  132.  
  133. static int supply_new_packets(JackData *self, AVFormatContext *context)
  134. {
  135.     AVPacket pkt;
  136.     int test, pkt_size = self->buffer_size * self->nports * sizeof(float);
  137.  
  138.     /* Supply the process callback with new empty packets, by filling the new
  139.      * packets FIFO buffer with as many packets as possible. process_callback()
  140.      * can't do this by itself, because it can't allocate memory in realtime. */
  141.     while (av_fifo_space(self->new_pkts) >= sizeof(pkt)) {
  142.         if ((test = av_new_packet(&pkt, pkt_size)) < 0) {
  143.             av_log(context, AV_LOG_ERROR, "Could not create packet of size %d\n", pkt_size);
  144.             return test;
  145.         }
  146.         av_fifo_generic_write(self->new_pkts, &pkt, sizeof(pkt), NULL);
  147.     }
  148.     return 0;
  149. }
  150.  
  151. static int start_jack(AVFormatContext *context)
  152. {
  153.     JackData *self = context->priv_data;
  154.     jack_status_t status;
  155.     int i, test;
  156.  
  157.     /* Register as a JACK client, using the context filename as client name. */
  158.     self->client = jack_client_open(context->filename, JackNullOption, &status);
  159.     if (!self->client) {
  160.         av_log(context, AV_LOG_ERROR, "Unable to register as a JACK client\n");
  161.         return AVERROR(EIO);
  162.     }
  163.  
  164.     sem_init(&self->packet_count, 0, 0);
  165.  
  166.     self->sample_rate = jack_get_sample_rate(self->client);
  167.     self->ports       = av_malloc_array(self->nports, sizeof(*self->ports));
  168.     if (!self->ports)
  169.         return AVERROR(ENOMEM);
  170.     self->buffer_size = jack_get_buffer_size(self->client);
  171.  
  172.     /* Register JACK ports */
  173.     for (i = 0; i < self->nports; i++) {
  174.         char str[16];
  175.         snprintf(str, sizeof(str), "input_%d", i + 1);
  176.         self->ports[i] = jack_port_register(self->client, str,
  177.                                             JACK_DEFAULT_AUDIO_TYPE,
  178.                                             JackPortIsInput, 0);
  179.         if (!self->ports[i]) {
  180.             av_log(context, AV_LOG_ERROR, "Unable to register port %s:%s\n",
  181.                    context->filename, str);
  182.             jack_client_close(self->client);
  183.             return AVERROR(EIO);
  184.         }
  185.     }
  186.  
  187.     /* Register JACK callbacks */
  188.     jack_set_process_callback(self->client, process_callback, self);
  189.     jack_on_shutdown(self->client, shutdown_callback, self);
  190.     jack_set_xrun_callback(self->client, xrun_callback, self);
  191.  
  192.     /* Create time filter */
  193.     self->timefilter  = ff_timefilter_new (1.0 / self->sample_rate, self->buffer_size, 1.5);
  194.     if (!self->timefilter) {
  195.         jack_client_close(self->client);
  196.         return AVERROR(ENOMEM);
  197.     }
  198.  
  199.     /* Create FIFO buffers */
  200.     self->filled_pkts = av_fifo_alloc_array(FIFO_PACKETS_NUM, sizeof(AVPacket));
  201.     /* New packets FIFO with one extra packet for safety against underruns */
  202.     self->new_pkts    = av_fifo_alloc_array((FIFO_PACKETS_NUM + 1), sizeof(AVPacket));
  203.     if (!self->new_pkts) {
  204.         jack_client_close(self->client);
  205.         return AVERROR(ENOMEM);
  206.     }
  207.     if ((test = supply_new_packets(self, context))) {
  208.         jack_client_close(self->client);
  209.         return test;
  210.     }
  211.  
  212.     return 0;
  213.  
  214. }
  215.  
  216. static void free_pkt_fifo(AVFifoBuffer **fifo)
  217. {
  218.     AVPacket pkt;
  219.     while (av_fifo_size(*fifo)) {
  220.         av_fifo_generic_read(*fifo, &pkt, sizeof(pkt), NULL);
  221.         av_free_packet(&pkt);
  222.     }
  223.     av_fifo_freep(fifo);
  224. }
  225.  
  226. static void stop_jack(JackData *self)
  227. {
  228.     if (self->client) {
  229.         if (self->activated)
  230.             jack_deactivate(self->client);
  231.         jack_client_close(self->client);
  232.     }
  233.     sem_destroy(&self->packet_count);
  234.     free_pkt_fifo(&self->new_pkts);
  235.     free_pkt_fifo(&self->filled_pkts);
  236.     av_freep(&self->ports);
  237.     ff_timefilter_destroy(self->timefilter);
  238. }
  239.  
  240. static int audio_read_header(AVFormatContext *context)
  241. {
  242.     JackData *self = context->priv_data;
  243.     AVStream *stream;
  244.     int test;
  245.  
  246.     if ((test = start_jack(context)))
  247.         return test;
  248.  
  249.     stream = avformat_new_stream(context, NULL);
  250.     if (!stream) {
  251.         stop_jack(self);
  252.         return AVERROR(ENOMEM);
  253.     }
  254.  
  255.     stream->codec->codec_type   = AVMEDIA_TYPE_AUDIO;
  256. #if HAVE_BIGENDIAN
  257.     stream->codec->codec_id     = AV_CODEC_ID_PCM_F32BE;
  258. #else
  259.     stream->codec->codec_id     = AV_CODEC_ID_PCM_F32LE;
  260. #endif
  261.     stream->codec->sample_rate  = self->sample_rate;
  262.     stream->codec->channels     = self->nports;
  263.  
  264.     avpriv_set_pts_info(stream, 64, 1, 1000000);  /* 64 bits pts in us */
  265.     return 0;
  266. }
  267.  
  268. static int audio_read_packet(AVFormatContext *context, AVPacket *pkt)
  269. {
  270.     JackData *self = context->priv_data;
  271.     struct timespec timeout = {0, 0};
  272.     int test;
  273.  
  274.     /* Activate the JACK client on first packet read. Activating the JACK client
  275.      * means that process_callback() starts to get called at regular interval.
  276.      * If we activate it in audio_read_header(), we're actually reading audio data
  277.      * from the device before instructed to, and that may result in an overrun. */
  278.     if (!self->activated) {
  279.         if (!jack_activate(self->client)) {
  280.             self->activated = 1;
  281.             av_log(context, AV_LOG_INFO,
  282.                    "JACK client registered and activated (rate=%dHz, buffer_size=%d frames)\n",
  283.                    self->sample_rate, self->buffer_size);
  284.         } else {
  285.             av_log(context, AV_LOG_ERROR, "Unable to activate JACK client\n");
  286.             return AVERROR(EIO);
  287.         }
  288.     }
  289.  
  290.     /* Wait for a packet coming back from process_callback(), if one isn't available yet */
  291.     timeout.tv_sec = av_gettime() / 1000000 + 2;
  292.     if (sem_timedwait(&self->packet_count, &timeout)) {
  293.         if (errno == ETIMEDOUT) {
  294.             av_log(context, AV_LOG_ERROR,
  295.                    "Input error: timed out when waiting for JACK process callback output\n");
  296.         } else {
  297.             char errbuf[128];
  298.             int ret = AVERROR(errno);
  299.             av_strerror(ret, errbuf, sizeof(errbuf));
  300.             av_log(context, AV_LOG_ERROR, "Error while waiting for audio packet: %s\n",
  301.                    errbuf);
  302.         }
  303.         if (!self->client)
  304.             av_log(context, AV_LOG_ERROR, "Input error: JACK server is gone\n");
  305.  
  306.         return AVERROR(EIO);
  307.     }
  308.  
  309.     if (self->pkt_xrun) {
  310.         av_log(context, AV_LOG_WARNING, "Audio packet xrun\n");
  311.         self->pkt_xrun = 0;
  312.     }
  313.  
  314.     if (self->jack_xrun) {
  315.         av_log(context, AV_LOG_WARNING, "JACK xrun\n");
  316.         self->jack_xrun = 0;
  317.     }
  318.  
  319.     /* Retrieve the packet filled with audio data by process_callback() */
  320.     av_fifo_generic_read(self->filled_pkts, pkt, sizeof(*pkt), NULL);
  321.  
  322.     if ((test = supply_new_packets(self, context)))
  323.         return test;
  324.  
  325.     return 0;
  326. }
  327.  
  328. static int audio_read_close(AVFormatContext *context)
  329. {
  330.     JackData *self = context->priv_data;
  331.     stop_jack(self);
  332.     return 0;
  333. }
  334.  
  335. #define OFFSET(x) offsetof(JackData, x)
  336. static const AVOption options[] = {
  337.     { "channels", "Number of audio channels.", OFFSET(nports), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
  338.     { NULL },
  339. };
  340.  
  341. static const AVClass jack_indev_class = {
  342.     .class_name     = "JACK indev",
  343.     .item_name      = av_default_item_name,
  344.     .option         = options,
  345.     .version        = LIBAVUTIL_VERSION_INT,
  346.     .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
  347. };
  348.  
  349. AVInputFormat ff_jack_demuxer = {
  350.     .name           = "jack",
  351.     .long_name      = NULL_IF_CONFIG_SMALL("JACK Audio Connection Kit"),
  352.     .priv_data_size = sizeof(JackData),
  353.     .read_header    = audio_read_header,
  354.     .read_packet    = audio_read_packet,
  355.     .read_close     = audio_read_close,
  356.     .flags          = AVFMT_NOFILE,
  357.     .priv_class     = &jack_indev_class,
  358. };
  359.