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.
mplayer/SOURCES/0204_fix-ftbfs-jack-ffmpeg7...

130 lines
3.2 KiB

From 98f80775dff2b9f83ba9b2e247ef7b2174a107bf Mon Sep 17 00:00:00 2001
From: Alexander Strasser <eclipse7@gmx.net>
Date: Wed, 3 Apr 2024 22:57:40 +0200
Subject: [PATCH] ao jack: Switch from AVFifoBuffer to AVFifo
Removed from lavu on major bump to 59
TODO: Check for potential concurrency problems
---
libao2/ao_jack.c | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
--- a/libao2/ao_jack.c
+++ b/libao2/ao_jack.c
@@ -71,7 +71,7 @@
#define BUFFSIZE (NUM_CHUNKS * CHUNK_SIZE)
//! buffer for audio data
-static AVFifoBuffer *buffer;
+static AVFifo *buffer;
/**
* \brief insert len bytes into buffer
@@ -82,9 +82,10 @@
* If there is not enough room, the buffer is filled up
*/
static int write_buffer(unsigned char* data, int len) {
- int free = av_fifo_space(buffer);
+ int free = av_fifo_can_write(buffer);
if (len > free) len = free;
- return av_fifo_generic_write(buffer, data, len, NULL);
+ av_fifo_write(buffer, data, len);
+ return len;
}
static void silence(float **bufs, int cnt, int num_bufs);
@@ -96,10 +97,11 @@
int pos;
};
-static void deinterleave(void *info, void *src, int len) {
+static int deinterleave(void *info, void *src, size_t *lenp) {
struct deinterleave *di = info;
float *s = src;
int i;
+ int len = *lenp;
len /= sizeof(float);
for (i = 0; i < len; i++) {
di->bufs[di->cur_buf++][di->pos] = s[i];
@@ -108,6 +110,7 @@
di->pos++;
}
}
+ return 0;
}
/**
@@ -125,12 +128,13 @@
*/
static int read_buffer(float **bufs, int cnt, int num_bufs) {
struct deinterleave di = {bufs, num_bufs, 0, 0};
- int buffered = av_fifo_size(buffer);
+ size_t len = cnt * num_bufs * sizeof(float);
+ int buffered = av_fifo_can_read(buffer);
if (cnt * sizeof(float) * num_bufs > buffered) {
silence(bufs, cnt, num_bufs);
cnt = buffered / sizeof(float) / num_bufs;
}
- av_fifo_generic_read(buffer, &di, cnt * num_bufs * sizeof(float), deinterleave);
+ av_fifo_read_to_cb(buffer, deinterleave, &di, &len);
return cnt;
}
@@ -242,7 +246,7 @@
mp_msg(MSGT_AO, MSGL_FATAL, "[JACK] cannot open server\n");
goto err_out;
}
- buffer = av_fifo_alloc(BUFFSIZE);
+ buffer = av_fifo_alloc2(BUFFSIZE, 1, 0);
jack_set_process_callback(client, outputaudio, 0);
// list matching ports if connections should be made
@@ -302,8 +306,7 @@
free(client_name);
if (client)
jack_client_close(client);
- av_fifo_free(buffer);
- buffer = NULL;
+ av_fifo_freep2(&buffer);
return 0;
}
@@ -315,8 +318,7 @@
reset();
usec_sleep(100 * 1000);
jack_client_close(client);
- av_fifo_free(buffer);
- buffer = NULL;
+ av_fifo_freep2(&buffer);
}
/**
@@ -324,7 +326,7 @@
*/
static void reset(void) {
paused = 1;
- av_fifo_reset(buffer);
+ av_fifo_reset2(buffer);
paused = 0;
}
@@ -343,7 +345,7 @@
}
static int get_space(void) {
- return av_fifo_space(buffer);
+ return av_fifo_can_write(buffer);
}
/**
@@ -357,7 +359,7 @@
}
static float get_delay(void) {
- int buffered = av_fifo_size(buffer); // could be less
+ int buffered = av_fifo_can_read(buffer); // could be less
float in_jack = jack_latency;
if (estimate && callback_interval > 0) {
float elapsed = (float)GetTimer() / 1000000.0 - callback_time;