From 0ac724f0025d48e1372ac82c62d504aaadf19735 Mon Sep 17 00:00:00 2001 From: LAGonauta Date: Mon, 31 Aug 2020 11:04:17 -0300 Subject: ao_openal: restore working condition with new push API --- audio/out/ao_openal.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'audio') diff --git a/audio/out/ao_openal.c b/audio/out/ao_openal.c index 0c5ec2d7f1..ca36230ea2 100644 --- a/audio/out/ao_openal.c +++ b/audio/out/ao_openal.c @@ -175,9 +175,6 @@ static void uninit(struct ao *ao) static int init(struct ao *ao) { - MP_FATAL(ao, "broken.\n"); - return -1; - float position[3] = {0, 0, 0}; float direction[6] = {0, 0, -1, 0, 1, 0}; ALCdevice *dev = NULL; @@ -267,6 +264,7 @@ static int init(struct ao *ao) goto err_out; } + ao->device_buffer = p->num_buffers * p->num_samples; return 0; err_out: @@ -316,7 +314,7 @@ static bool audio_write(struct ao *ao, void **data, int samples) for (int i = 0; i < num; i++) { char *d = *data; buffer_size[cur_buf] = - MPMIN(samples - num * p->num_samples, p->num_samples); + MPMIN(samples - i * p->num_samples, p->num_samples); d += i * buffer_size[cur_buf] * ao->sstride; alBufferData(buffers[cur_buf], p->al_format, d, buffer_size[cur_buf] * ao->sstride, ao->samplerate); @@ -340,18 +338,18 @@ static void get_state(struct ao *ao, struct mp_pcm_state *state) unqueue_buffers(ao); alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); - double soft_source_latency = 0; + double source_offset = 0; if(alIsExtensionPresent("AL_SOFT_source_latency")) { ALdouble offsets[2]; LPALGETSOURCEDVSOFT alGetSourcedvSOFT = alGetProcAddress("alGetSourcedvSOFT"); alGetSourcedvSOFT(source, AL_SEC_OFFSET_LATENCY_SOFT, offsets); // Additional latency to the play buffer, the remaining seconds to be // played minus the offset (seconds already played) - soft_source_latency = offsets[1] - offsets[0]; + source_offset = offsets[1] - offsets[0]; } else { float offset = 0; alGetSourcef(source, AL_SEC_OFFSET, &offset); - soft_source_latency = -offset; + source_offset = -offset; } int queued_samples = 0; @@ -360,10 +358,14 @@ static void get_state(struct ao *ao, struct mp_pcm_state *state) index = (index + 1) % p->num_buffers; } - state->delay = queued_samples / (double)ao->samplerate + soft_source_latency; + state->delay = queued_samples / (double)ao->samplerate + source_offset; state->queued_samples = queued_samples; state->free_samples = MPMAX(p->num_buffers - queued, 0) * p->num_samples; + + ALint source_state = 0; + alGetSourcei(source, AL_SOURCE_STATE, &source_state); + state->playing = source_state == AL_PLAYING; } #define OPT_BASE_STRUCT struct priv -- cgit v1.2.3