[vlc-devel] [PATCH v2] opensles_android: conditional compile for native sample rate check
Alexandre Janniaux
ajanni at videolabs.io
Wed Feb 3 13:03:46 UTC 2021
Hi,
LGTM,
Regards,
--
Alexandre Janniaux
Videolabs
On Tue, Feb 02, 2021 at 12:08:56PM +0800, Zhao Zhili wrote:
> From: Zhao Zhili <zhilizhao at tencent.com>
>
> The android bug has been fixed since Android 5.0.
> ---
> v2:
> Check device api level when compile time check failed.
>
> modules/audio_output/opensles_android.c | 20 +++++++++++++-------
> 1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/modules/audio_output/opensles_android.c b/modules/audio_output/opensles_android.c
> index 5459c40f04..0f661f2ae6 100644
> --- a/modules/audio_output/opensles_android.c
> +++ b/modules/audio_output/opensles_android.c
> @@ -58,6 +58,8 @@ JNIEnv *android_getEnv(vlc_object_t *p_obj, const char *psz_thread_name);
> goto error; \
> }
>
> +#define CHECK_NATIVE_SAMPLE_RATE (__ANDROID_API__ < 21)
> +
> typedef SLresult (*slCreateEngine_t)(
> SLObjectItf*, SLuint32, const SLEngineOption*, SLuint32,
> const SLInterfaceID*, const SLboolean*);
> @@ -356,6 +358,7 @@ static void PlayedCallback (SLAndroidSimpleBufferQueueItf caller, void *pContext
> vlc_mutex_unlock(&sys->lock);
> }
>
> +#if CHECK_NATIVE_SAMPLE_RATE
> static int aout_get_native_sample_rate(audio_output_t *aout)
> {
> JNIEnv *p_env;
> @@ -376,6 +379,7 @@ static int aout_get_native_sample_rate(audio_output_t *aout)
> msg_Dbg(aout, "%s: %d", __func__, sample_rate);
> return sample_rate;
> }
> +#endif
>
> /*****************************************************************************
> *
> @@ -417,19 +421,21 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
> const SLInterfaceID ids2[] = { sys->SL_IID_ANDROIDSIMPLEBUFFERQUEUE, sys->SL_IID_VOLUME };
> static const SLboolean req2[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };
>
> - if (aout_get_native_sample_rate(aout) >= (int)fmt->i_rate) {
> - result = CreateAudioPlayer(sys->engineEngine, &sys->playerObject, &audioSrc,
> - &audioSnk, sizeof(ids2) / sizeof(*ids2),
> - ids2, req2);
> - } else {
> +#if CHECK_NATIVE_SAMPLE_RATE
> + if (android_get_device_api_level() < 21 &&
> + aout_get_native_sample_rate(aout) < (int)fmt->i_rate) {
> // Don't try to play back a sample rate higher than the native one,
> // since OpenSL ES will try to use the fast path, which AudioFlinger
> // will reject (fast path can't do resampling), and will end up with
> // too small buffers for the resampling. See http://b.android.com/59453
> - // for details. This bug is still present in 4.4. If it is fixed later
> - // this workaround could be made conditional.
> + // for details. This bug is fixed in 5.0
> result = SL_RESULT_UNKNOWN_ERROR;
> }
> + else
> +#endif
> + result = CreateAudioPlayer(sys->engineEngine, &sys->playerObject, &audioSrc,
> + &audioSnk, sizeof(ids2) / sizeof(*ids2),
> + ids2, req2);
> if (unlikely(result != SL_RESULT_SUCCESS)) {
> /* Try again with a more sensible samplerate */
> fmt->i_rate = 44100;
> --
> 2.28.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list