audio: make buffer size configurable

Really only for testing.
This commit is contained in:
wm4 2014-09-04 23:48:27 +02:00
parent 7ab228629e
commit a7d737a698
6 changed files with 23 additions and 6 deletions

View File

@ -994,6 +994,20 @@ Audio
Do not use.
``--audio-buffer=<seconds>``
Set the audio output minimum buffer. The audio device might actually create
a larger buffer if it pleases. If the device creates a smaller buffer,
additional audio is buffered in an additional software buffer.
Making this larger will make soft-volume and other filters react slower,
introduce additional issues on playback speed change, and block the
player on audio format changes. A smaller buffer might lead to audio
dropouts.
This option should be used for testing only. If a non-default value helps
significantly, the mpv developers should be contacted.
Default: 0.2 (200 ms).
Subtitles
---------

View File

@ -152,6 +152,7 @@ static struct ao *ao_create(bool probing, struct mpv_global *global,
.channels = channels,
.format = format,
.log = mp_log_new(ao, log, name),
.def_buffer = global->opts->audio_buffer,
};
if (ao->driver->encode != !!ao->encode_lavc_ctx)
goto error;
@ -187,7 +188,7 @@ static struct ao *ao_create(bool probing, struct mpv_global *global,
ao->device_buffer = ao->driver->get_space(ao);
MP_VERBOSE(ao, "device buffer: %d samples.\n", ao->device_buffer);
}
ao->buffer = MPMAX(ao->device_buffer, MIN_BUFFER * ao->samplerate);
ao->buffer = MPMAX(ao->device_buffer, ao->def_buffer * ao->samplerate);
MP_VERBOSE(ao, "using soft-buffer of %d samples.\n", ao->buffer);
if (ao->api->init(ao) < 0)

View File

@ -25,9 +25,6 @@
#include "audio/chmap.h"
#include "audio/chmap_sel.h"
// Minimum buffer size in seconds.
#define MIN_BUFFER 0.2
// If ao_get_delay() reaches this value after ao_play() was called with the
// AOPLAY_FINAL_CHUNK flag set, the playback core expects that the audio has
// all been played.
@ -56,6 +53,7 @@ struct ao {
struct mp_log *log; // Using e.g. "[ao/coreaudio]" as prefix
int buffer;
double def_buffer;
void *api_priv;
};

View File

@ -168,11 +168,11 @@ static int unlocked_get_space(struct ao *ao)
int space = mp_audio_buffer_get_write_available(p->buffer);
if (ao->driver->get_space) {
// The following code attempts to keep the total buffered audio to
// MIN_BUFFER/2+device_buffer in order to improve latency.
// def_buffer/2+device_buffer in order to improve latency.
int device_space = ao->driver->get_space(ao);
int device_buffered = ao->device_buffer - device_space;
int soft_buffered = mp_audio_buffer_samples(p->buffer);
int min_buffer = MIN_BUFFER / 2 * ao->samplerate + ao->device_buffer;
int min_buffer = ao->def_buffer / 2 * ao->samplerate + ao->device_buffer;
int total_buffer = device_buffered + soft_buffered;
int missing = min_buffer - total_buffer;
space = MPMIN(space, missing);

View File

@ -371,6 +371,8 @@ const m_option_t mp_opts[] = {
({"no", 0},
{"yes", 1}, {"", 1},
{"weak", -1})),
OPT_DOUBLE("audio-buffer", audio_buffer, M_OPT_MIN | M_OPT_MAX,
.min = 0, .max = 10),
OPT_GEOMETRY("geometry", vo.geometry, 0),
OPT_SIZE_BOX("autofit", vo.autofit, 0),
@ -558,6 +560,7 @@ const struct MPOpts mp_default_opts = {
.mixer_init_mute = -1,
.volstep = 3,
.gapless_audio = -1,
.audio_buffer = 0.2,
.vo = {
.video_driver_list = NULL,
.monitor_pixel_aspect = 1.0,

View File

@ -74,6 +74,7 @@ typedef struct MPOpts {
int volstep;
float softvol_max;
int gapless_audio;
double audio_buffer;
mp_vo_opts vo;
int allow_win_drag;