You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
10KB

  1. /*
  2. * JACK Audio Connection Kit input device
  3. * Copyright (c) 2021 falkTX
  4. * Author: Filipe Coelho <falktx@falktx.com>
  5. * Based on jack.c by Olivier Guilyardi <olivier samalyse com>
  6. *
  7. * This file is part of FFmpeg.
  8. *
  9. * FFmpeg is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2.1 of the License, or (at your option) any later version.
  13. *
  14. * FFmpeg is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with FFmpeg; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. */
  23. #include "config.h"
  24. #include <semaphore.h>
  25. #include <jack/jack.h>
  26. #include <jack/ringbuffer.h>
  27. #include "libavutil/fifo.h"
  28. #include "libavutil/time.h"
  29. #include "libavformat/avformat.h"
  30. #include "libavformat/internal.h"
  31. #include "avdevice.h"
  32. /**
  33. * Maximum number of "packets" of audio to queue in ringbuffer
  34. */
  35. #define RINGBUFFER_NUM_PACKETS 8
  36. typedef struct JackData {
  37. AVClass* class;
  38. jack_client_t* client;
  39. int activated;
  40. sem_t packet_count;
  41. jack_nframes_t sample_rate;
  42. jack_nframes_t buffer_size;
  43. jack_port_t ** ports;
  44. int nports;
  45. AVFifoBuffer * new_pkts;
  46. int pkt_xrun;
  47. int jack_xrun;
  48. jack_nframes_t audio_pkt_size;
  49. float* audio_pkt;
  50. jack_ringbuffer_t* ringbuffer;
  51. } JackData;
  52. static int process_callback(jack_nframes_t nframes, void *arg)
  53. {
  54. /* Warning: this function runs in realtime. One mustn't allocate memory here
  55. * or do any other thing that could block. */
  56. int i, j;
  57. JackData *self = arg;
  58. float* audio_pkt = self->audio_pkt;
  59. float* buffer;
  60. if (!self->client) {
  61. return 0;
  62. }
  63. /* Check if audio is available */
  64. if (jack_ringbuffer_read_space(self->ringbuffer) < self->audio_pkt_size) {
  65. for (i = 0; i < self->nports; i++) {
  66. buffer = jack_port_get_buffer(self->ports[i], nframes);
  67. memset(buffer, 0, sizeof(float)*nframes);
  68. }
  69. self->pkt_xrun = 1;
  70. return 0;
  71. }
  72. /* Retrieve audio */
  73. jack_ringbuffer_read(self->ringbuffer, (char*)audio_pkt, self->audio_pkt_size);
  74. /* Copy and interleave audio data from the packet into the JACK buffer */
  75. for (i = 0; i < self->nports; i++) {
  76. buffer = jack_port_get_buffer(self->ports[i], nframes);
  77. for (j = 0; j < nframes; j++)
  78. buffer[j] = audio_pkt[j * self->nports + i];
  79. }
  80. sem_post(&self->packet_count);
  81. return 0;
  82. }
  83. static void shutdown_callback(void *arg)
  84. {
  85. JackData *self = arg;
  86. self->client = NULL;
  87. }
  88. static int xrun_callback(void *arg)
  89. {
  90. JackData *self = arg;
  91. self->jack_xrun = 1;
  92. return 0;
  93. }
  94. static int start_jack(AVFormatContext *context)
  95. {
  96. JackData *self = context->priv_data;
  97. int i;
  98. /* Register as a JACK client, using the context url as client name. */
  99. self->client = jack_client_open(context->url, JackNullOption, NULL);
  100. if (!self->client) {
  101. av_log(context, AV_LOG_ERROR, "Unable to register as a JACK client\n");
  102. return AVERROR(EIO);
  103. }
  104. self->ports = av_malloc_array(self->nports, sizeof(*self->ports));
  105. if (!self->ports)
  106. return AVERROR(ENOMEM);
  107. self->sample_rate = jack_get_sample_rate(self->client);
  108. self->buffer_size = jack_get_buffer_size(self->client);
  109. self->audio_pkt_size = self->nports * self->buffer_size * sizeof(float);
  110. self->ringbuffer = jack_ringbuffer_create(self->audio_pkt_size * RINGBUFFER_NUM_PACKETS);
  111. self->audio_pkt = av_malloc_array(self->audio_pkt_size, sizeof(float));
  112. if (!self->audio_pkt) {
  113. return AVERROR(ENOMEM);
  114. }
  115. sem_init(&self->packet_count, 0, 0);
  116. /* Register JACK ports */
  117. for (i = 0; i < self->nports; i++) {
  118. char str[16];
  119. snprintf(str, sizeof(str), "output_%d", i + 1);
  120. self->ports[i] = jack_port_register(self->client, str,
  121. JACK_DEFAULT_AUDIO_TYPE,
  122. JackPortIsOutput, 0);
  123. if (!self->ports[i]) {
  124. av_log(context, AV_LOG_ERROR, "Unable to register port %s:%s\n",
  125. context->url, str);
  126. jack_client_close(self->client);
  127. return AVERROR(EIO);
  128. }
  129. }
  130. /* Register JACK callbacks */
  131. jack_set_process_callback(self->client, process_callback, self);
  132. jack_on_shutdown(self->client, shutdown_callback, self);
  133. jack_set_xrun_callback(self->client, xrun_callback, self);
  134. return 0;
  135. }
  136. static void stop_jack(JackData *self)
  137. {
  138. if (self->client) {
  139. if (self->activated)
  140. jack_deactivate(self->client);
  141. jack_client_close(self->client);
  142. }
  143. sem_destroy(&self->packet_count);
  144. av_freep(&self->audio_pkt);
  145. av_freep(&self->ports);
  146. jack_ringbuffer_free(self->ringbuffer);
  147. }
  148. static av_cold int audio_write_header(AVFormatContext *context)
  149. {
  150. JackData *self = context->priv_data;
  151. AVStream *stream = NULL;
  152. int test;
  153. if (context->nb_streams != 1 || context->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
  154. av_log(stream, AV_LOG_ERROR, "Only a single audio stream is supported.\n");
  155. return AVERROR(EINVAL);
  156. }
  157. stream = context->streams[0];
  158. if ((test = start_jack(context)))
  159. return test;
  160. if (self->sample_rate != stream->codecpar->sample_rate) {
  161. av_log(stream, AV_LOG_ERROR,
  162. "sample rate %d not available, must use %d\n",
  163. stream->codecpar->sample_rate, self->sample_rate);
  164. stop_jack(self);
  165. return AVERROR(EIO);
  166. }
  167. avpriv_set_pts_info(stream, 64, 1, 1000000); /* 64 bits pts in us */
  168. return 0;
  169. }
  170. static int audio_write_packet(AVFormatContext *context, AVPacket *pkt)
  171. {
  172. JackData *self = context->priv_data;
  173. struct timespec timeout = {0, 0};
  174. int should_activate = 0;
  175. /* Check packet size */
  176. if (pkt->size > self->audio_pkt_size * (RINGBUFFER_NUM_PACKETS/2)) {
  177. av_log(context, AV_LOG_ERROR, "Packet is too big! (%u)\n", pkt->size);
  178. return AVERROR(EIO);
  179. }
  180. /* Check if there's enough space to send */
  181. if (jack_ringbuffer_write_space(self->ringbuffer)+1 < pkt->size) {
  182. av_log(context, AV_LOG_WARNING, "Audio source packet overrun, space left %lu\n",
  183. jack_ringbuffer_write_space(self->ringbuffer));
  184. if (!self->activated) {
  185. should_activate = 1;
  186. }
  187. } else {
  188. /* Write the packet to later be used by process_callback() */
  189. jack_ringbuffer_write(self->ringbuffer, pkt->data, pkt->size);
  190. if (!self->activated && jack_ringbuffer_write_space(self->ringbuffer)+1 >= pkt->size) {
  191. should_activate = 1;
  192. }
  193. }
  194. /* Activate the JACK client after a few packet writes. */
  195. if (should_activate) {
  196. if (!jack_activate(self->client)) {
  197. self->activated = 1;
  198. av_log(context, AV_LOG_INFO,
  199. "JACK client registered and activated (rate=%dHz, buffer_size=%d frames)\n",
  200. self->sample_rate, self->buffer_size);
  201. } else {
  202. av_log(context, AV_LOG_ERROR, "Unable to activate JACK client\n");
  203. return AVERROR(EIO);
  204. }
  205. }
  206. if (self->activated) {
  207. timeout.tv_sec = av_gettime() / 1000000 + 2;
  208. while (jack_ringbuffer_write_space(self->ringbuffer) < self->audio_pkt_size * (RINGBUFFER_NUM_PACKETS/2)) {
  209. if (sem_timedwait(&self->packet_count, &timeout)) {
  210. if (errno == ETIMEDOUT) {
  211. av_log(context, AV_LOG_ERROR,
  212. "Input error: timed out when waiting for JACK process callback input\n");
  213. } else {
  214. char errbuf[128];
  215. int ret = AVERROR(errno);
  216. av_strerror(ret, errbuf, sizeof(errbuf));
  217. av_log(context, AV_LOG_ERROR, "Error while waiting for audio packet: %s\n",
  218. errbuf);
  219. }
  220. if (!self->client) {
  221. av_log(context, AV_LOG_ERROR, "Input error: JACK server is gone\n");
  222. }
  223. return AVERROR(EIO);
  224. }
  225. }
  226. }
  227. if (self->pkt_xrun) {
  228. av_log(context, AV_LOG_WARNING, "Audio source packet underrun\n");
  229. self->pkt_xrun = 0;
  230. }
  231. if (self->jack_xrun) {
  232. av_log(context, AV_LOG_WARNING, "JACK output xrun\n");
  233. self->jack_xrun = 0;
  234. }
  235. return 0;
  236. }
  237. static int audio_write_trailer(AVFormatContext *context)
  238. {
  239. JackData *self = context->priv_data;
  240. stop_jack(self);
  241. return 0;
  242. }
  243. #define OFFSET(x) offsetof(JackData, x)
  244. static const AVOption options[] = {
  245. { "channels", "Number of audio channels.", OFFSET(nports), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
  246. { NULL },
  247. };
  248. static const AVClass jack_outdev_class = {
  249. .class_name = "JACK outdev",
  250. .item_name = av_default_item_name,
  251. .option = options,
  252. .version = LIBAVUTIL_VERSION_INT,
  253. .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
  254. };
  255. AVOutputFormat ff_jack_muxer = {
  256. .name = "jack",
  257. .long_name = NULL_IF_CONFIG_SMALL("JACK audio output"),
  258. .priv_data_size = sizeof(JackData),
  259. /* XXX: we make the assumption that the soundcard accepts this format */
  260. /* XXX: find better solution with "preinit" method, needed also in
  261. other formats */
  262. .audio_codec = AV_NE(AV_CODEC_ID_PCM_F32BE, AV_CODEC_ID_PCM_F32LE),
  263. .video_codec = AV_CODEC_ID_NONE,
  264. .write_header = audio_write_header,
  265. .write_packet = audio_write_packet,
  266. .write_trailer = audio_write_trailer,
  267. .flags = AVFMT_NOFILE,
  268. .priv_class = &jack_outdev_class,
  269. };