From aaa076b63185e3692a7d48f8d1272aa6bacf3f3f Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Sat, 10 Mar 2018 18:55:44 -0800 Subject: ao_opensles: fix audio sync using device latency extension --- audio/out/ao_opensles.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/audio/out/ao_opensles.c b/audio/out/ao_opensles.c index 28b5d748c8..f54f4db035 100644 --- a/audio/out/ao_opensles.c +++ b/audio/out/ao_opensles.c @@ -38,6 +38,7 @@ struct priv { char *curbuf, *buf1, *buf2; size_t buffer_size; pthread_mutex_t buffer_lock; + double audio_latency; int cfg_frames_per_buffer; int cfg_sample_rate; @@ -89,6 +90,7 @@ static void buffer_callback(SLBufferQueueItf buffer_queue, void *context) data[0] = p->curbuf; delay = 2 * p->buffer_size / (double)ao->bps; + delay += p->audio_latency; ao_read_data(ao, data, p->buffer_size / ao->sstride, mp_time_us() + 1000000LL * delay); @@ -188,10 +190,11 @@ static int init(struct ao *ao) audio_sink.pLocator = (void*)&locator_output_mix; audio_sink.pFormat = NULL; - SLboolean required[] = { SL_BOOLEAN_TRUE }; - SLInterfaceID iid_array[] = { SL_IID_BUFFERQUEUE }; + SLInterfaceID iid_array[] = { SL_IID_BUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }; + SLboolean required[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE }; CHK((*p->engine)->CreateAudioPlayer(p->engine, &p->player, &audio_source, - &audio_sink, 1, iid_array, required)); + &audio_sink, 2, iid_array, required)); + CHK((*p->player)->Realize(p->player, SL_BOOLEAN_FALSE)); CHK((*p->player)->GetInterface(p->player, SL_IID_PLAY, (void*)&p->play)); CHK((*p->player)->GetInterface(p->player, SL_IID_BUFFERQUEUE, @@ -200,6 +203,20 @@ static int init(struct ao *ao) buffer_callback, ao)); CHK((*p->play)->SetPlayState(p->play, SL_PLAYSTATE_PLAYING)); + SLAndroidConfigurationItf android_config; + SLuint32 audio_latency = 0, value_size = sizeof(SLuint32); + SLint32 result = (*p->player)->GetInterface(p->player, + SL_IID_ANDROIDCONFIGURATION, &android_config); + if (result == SL_RESULT_SUCCESS) { + result = (*android_config)->GetConfiguration(android_config, + (const SLchar *)"androidGetAudioLatency", + &value_size, &audio_latency); + } + if (result == SL_RESULT_SUCCESS) { + p->audio_latency = (double)audio_latency / 1000.0; + MP_INFO(ao, "Device latency is %f\n", p->audio_latency); + } + return 1; error: uninit(ao); -- cgit v1.2.3