From d13542f12be58ec3dd4381cf25cc59c951c110e7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 24 Aug 2013 05:10:14 +0200 Subject: [PATCH] (Android) Detects buffer size properly now on Android 4.2 and up - bases requested latency on this. Old fallback applies for non-4.2 --- .../retroarch/browser/MainMenuActivity.java | 28 +++++++++++++++++-- audio/opensl.c | 2 ++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java b/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java index d0fa8531c8..1c0491ec53 100644 --- a/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java +++ b/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java @@ -163,6 +163,18 @@ public class MainMenuActivity extends PreferenceActivity { return Integer.parseInt(manager .getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE)); } + + @TargetApi(17) + public static int getLowLatencyBufferSize() { + AudioManager manager = (AudioManager) MainMenuActivity.getInstance() + .getApplicationContext() + .getSystemService(Context.AUDIO_SERVICE); + int buffersize = Integer.parseInt(manager + .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER)); + + Log.i(TAG, "Queried ideal buffer size: " + buffersize); + return buffersize; + } public static int getOptimalSamplingRate() { int ret; @@ -251,8 +263,20 @@ public class MainMenuActivity extends PreferenceActivity { prefs.getBoolean("audio_rate_control", true)); config.setInt("audio_out_rate", MainMenuActivity.getOptimalSamplingRate()); - config.setInt("audio_latency", - prefs.getBoolean("audio_high_latency", false) ? 160 : 64); + + int buffersize = 0; + + if (android.os.Build.VERSION.SDK_INT >= 17) { + buffersize = getLowLatencyBufferSize(); + if (config.getBoolean("audio_high_latency") == false) { + config.setInt("audio_latency", buffersize / 32); + } + } + else { + config.setInt("audio_latency", + prefs.getBoolean("audio_high_latency", false) ? 160 : 64); + } + config.setBoolean("audio_enable", prefs.getBoolean("audio_enable", true)); config.setBoolean("video_smooth", diff --git a/audio/opensl.c b/audio/opensl.c index 068e42a7a2..06362baab9 100644 --- a/audio/opensl.c +++ b/audio/opensl.c @@ -115,6 +115,8 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency) if (!sl) goto error; + RARCH_LOG("[SLES ] : Requested audio latency: %dms...", latency); + GOTO_IF_FAIL(slCreateEngine(&sl->engine_object, 0, NULL, 0, NULL, NULL)); GOTO_IF_FAIL(SLObjectItf_Realize(sl->engine_object, SL_BOOLEAN_FALSE)); GOTO_IF_FAIL(SLObjectItf_GetInterface(sl->engine_object, SL_IID_ENGINE, &sl->engine));