mpv: remove audio-buffer=0.5 hack from mpv.conf
The hack should no longer be necessary, as 0.29.0 includes a few commits from me that makes the opensles output driver work more properly. Also include an extra patch that allows the buffer size to either be increased and decreased (and done more properly).
This commit is contained in:
parent
3bf686ca29
commit
5f34372f2e
@ -3,8 +3,14 @@
|
||||
# Enable OpenSL ES output, since this should work on all Android devices
|
||||
ao=opensles
|
||||
|
||||
# Increase audio buffer to help with stuttering with bluetooth devices. See #1127.
|
||||
audio-buffer=0.5
|
||||
# Use the following option to increase or decrease audio buffer
|
||||
# when necessary / desired. The default is 250ms (0.25s).
|
||||
|
||||
# opensles-buffer-size-in-ms=250
|
||||
|
||||
# You can also use the generic audio-buffer option (which takes
|
||||
# value in second instead), but it will only has effect on the
|
||||
# opensles ao if the above option is explicitly set to 0.
|
||||
|
||||
# Disable Video Decode and Output. Termux doesn't support video output (with the exception of "tct").
|
||||
vid=no
|
||||
|
115
packages/mpv/sles_enqueue.patch
Normal file
115
packages/mpv/sles_enqueue.patch
Normal file
@ -0,0 +1,115 @@
|
||||
diff --git a/audio/out/ao_opensles.c b/audio/out/ao_opensles.c
|
||||
index ea48de892e..9f984bed52 100644
|
||||
--- a/audio/out/ao_opensles.c
|
||||
+++ b/audio/out/ao_opensles.c
|
||||
@@ -35,12 +35,13 @@ struct priv {
|
||||
SLBufferQueueItf buffer_queue;
|
||||
SLEngineItf engine;
|
||||
SLPlayItf play;
|
||||
- char *buf;
|
||||
- size_t buffer_size;
|
||||
+ void *buf;
|
||||
+ int bytes_per_enqueue;
|
||||
pthread_mutex_t buffer_lock;
|
||||
double audio_latency;
|
||||
|
||||
- int cfg_frames_per_buffer;
|
||||
+ int frames_per_enqueue;
|
||||
+ int buffer_size_in_ms;
|
||||
};
|
||||
|
||||
static const int fmtmap[][2] = {
|
||||
@@ -71,7 +72,6 @@ static void uninit(struct ao *ao)
|
||||
|
||||
free(p->buf);
|
||||
p->buf = NULL;
|
||||
- p->buffer_size = 0;
|
||||
}
|
||||
|
||||
#undef DESTROY
|
||||
@@ -81,26 +81,22 @@ static void buffer_callback(SLBufferQueueItf buffer_queue, void *context)
|
||||
struct ao *ao = context;
|
||||
struct priv *p = ao->priv;
|
||||
SLresult res;
|
||||
- void *data[1];
|
||||
double delay;
|
||||
|
||||
pthread_mutex_lock(&p->buffer_lock);
|
||||
|
||||
- data[0] = p->buf;
|
||||
- delay = 2 * p->buffer_size / (double)ao->bps;
|
||||
+ delay = 2 * p->frames_per_enqueue / (double)ao->samplerate;
|
||||
delay += p->audio_latency;
|
||||
- ao_read_data(ao, data, p->buffer_size / ao->sstride,
|
||||
+ ao_read_data(ao, &p->buf, p->frames_per_enqueue,
|
||||
mp_time_us() + 1000000LL * delay);
|
||||
|
||||
- res = (*buffer_queue)->Enqueue(buffer_queue, p->buf, p->buffer_size);
|
||||
+ res = (*buffer_queue)->Enqueue(buffer_queue, p->buf, p->bytes_per_enqueue);
|
||||
if (res != SL_RESULT_SUCCESS)
|
||||
MP_ERR(ao, "Failed to Enqueue: %d\n", res);
|
||||
|
||||
pthread_mutex_unlock(&p->buffer_lock);
|
||||
}
|
||||
|
||||
-#define DEFAULT_BUFFER_SIZE_MS 250
|
||||
-
|
||||
#define CHK(stmt) \
|
||||
{ \
|
||||
SLresult res = stmt; \
|
||||
@@ -155,17 +151,35 @@ static int init(struct ao *ao)
|
||||
// samplesPerSec is misnamed, actually it's samples per ms
|
||||
pcm.samplesPerSec = ao->samplerate * 1000;
|
||||
|
||||
- if (p->cfg_frames_per_buffer)
|
||||
- ao->device_buffer = p->cfg_frames_per_buffer;
|
||||
- else
|
||||
- ao->device_buffer = ao->samplerate * DEFAULT_BUFFER_SIZE_MS / 1000;
|
||||
- p->buffer_size = ao->device_buffer * ao->channels.num *
|
||||
+ if (p->buffer_size_in_ms) {
|
||||
+ ao->device_buffer = ao->samplerate * p->buffer_size_in_ms / 1000;
|
||||
+ // As the purpose of buffer_size_in_ms is to request a specific
|
||||
+ // soft buffer size:
|
||||
+ ao->def_buffer = 0;
|
||||
+ }
|
||||
+
|
||||
+ // But it does not make sense if it is smaller than the enqueue size:
|
||||
+ if (p->frames_per_enqueue) {
|
||||
+ ao->device_buffer = MPMAX(ao->device_buffer, p->frames_per_enqueue);
|
||||
+ } else {
|
||||
+ if (ao->device_buffer) {
|
||||
+ p->frames_per_enqueue = ao->device_buffer;
|
||||
+ } else if (ao->def_buffer) {
|
||||
+ p->frames_per_enqueue = ao->def_buffer * ao->samplerate;
|
||||
+ } else {
|
||||
+ MP_ERR(ao, "Enqueue size is not set and can neither be derived\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ p->bytes_per_enqueue = p->frames_per_enqueue * ao->channels.num *
|
||||
af_fmt_to_bytes(ao->format);
|
||||
- p->buf = calloc(1, p->buffer_size);
|
||||
+ p->buf = calloc(1, p->bytes_per_enqueue);
|
||||
if (!p->buf) {
|
||||
MP_ERR(ao, "Failed to allocate device buffer\n");
|
||||
goto error;
|
||||
}
|
||||
+
|
||||
int r = pthread_mutex_init(&p->buffer_lock, NULL);
|
||||
if (r) {
|
||||
MP_ERR(ao, "Failed to initialize the mutex: %d\n", r);
|
||||
@@ -248,8 +262,12 @@ const struct ao_driver audio_out_opensles = {
|
||||
.resume = resume,
|
||||
|
||||
.priv_size = sizeof(struct priv),
|
||||
+ .priv_defaults = &(const struct priv) {
|
||||
+ .buffer_size_in_ms = 250,
|
||||
+ },
|
||||
.options = (const struct m_option[]) {
|
||||
- OPT_INTRANGE("frames-per-buffer", cfg_frames_per_buffer, 0, 1, 96000),
|
||||
+ OPT_INTRANGE("frames-per-enqueue", frames_per_enqueue, 0, 1, 96000),
|
||||
+ OPT_INTRANGE("buffer-size-in-ms", buffer_size_in_ms, 0, 0, 500),
|
||||
{0}
|
||||
},
|
||||
.options_prefix = "opensles",
|
Loading…
Reference in New Issue
Block a user