(Android) Set buffer count to 4 instead of 8 for Jelly Bean and

higher - test experimental lower latency for fast OpenSL mixer
This commit is contained in:
twinaphex 2012-12-02 07:31:44 +01:00
parent 321596fc73
commit 623822126a
5 changed files with 24 additions and 11 deletions

View File

@ -34,9 +34,10 @@ struct droid
unsigned width; unsigned width;
unsigned height; unsigned height;
struct saved_state state; struct saved_state state;
int version;
}; };
extern struct droid g_android; extern struct droid g_android;
extern int android_get_sdk_version(void);
#endif #endif

View File

@ -65,6 +65,11 @@ static void print_cur_config(struct android_app* android_app)
AConfiguration_getUiModeNight(android_app->config)); AConfiguration_getUiModeNight(android_app->config));
} }
int android_get_sdk_version(void)
{
return AConfiguration_getSdkVersion(g_android.app->config);
}
static void android_get_char_argv(char *argv, size_t sizeof_argv, const char *arg_name) static void android_get_char_argv(char *argv, size_t sizeof_argv, const char *arg_name)
{ {
JNIEnv *env; JNIEnv *env;
@ -283,15 +288,11 @@ static void* android_app_entry(void* param)
char rom_path[512]; char rom_path[512];
char libretro_path[512]; char libretro_path[512];
char android_version[16];
// Get arguments */ // Get arguments */
android_get_char_argv(rom_path, sizeof(rom_path), "ROM"); android_get_char_argv(rom_path, sizeof(rom_path), "ROM");
android_get_char_argv(libretro_path, sizeof(libretro_path), "LIBRETRO"); android_get_char_argv(libretro_path, sizeof(libretro_path), "LIBRETRO");
android_get_char_argv(android_version, sizeof(android_version), "ANDROIDVER");
g_android.version = atoi(android_version);
RARCH_LOG("Android version: %d\n", g_android.version);
RARCH_LOG("Checking arguments passed...\n"); RARCH_LOG("Checking arguments passed...\n");
RARCH_LOG("ROM Filename: [%s].\n", rom_path); RARCH_LOG("ROM Filename: [%s].\n", rom_path);
RARCH_LOG("Libretro path: [%s].\n", libretro_path); RARCH_LOG("Libretro path: [%s].\n", libretro_path);

View File

@ -91,7 +91,6 @@ public class phoenix extends Activity
myIntent = new Intent(this, NativeActivity.class); myIntent = new Intent(this, NativeActivity.class);
myIntent.putExtra("ROM", data.getStringExtra("PATH")); myIntent.putExtra("ROM", data.getStringExtra("PATH"));
myIntent.putExtra("LIBRETRO", libretro_path); myIntent.putExtra("LIBRETRO", libretro_path);
myIntent.putExtra("ANDROIDVER", Integer.toString(android.os.Build.VERSION.SDK_INT));
startActivity(myIntent); startActivity(myIntent);
} }
else else

View File

@ -36,7 +36,6 @@
// TODO: Are these sane? // TODO: Are these sane?
#define BUFFER_SIZE 4096 #define BUFFER_SIZE 4096
#define NUM_BUFFERS 8
typedef struct sl typedef struct sl
{ {
@ -53,6 +52,7 @@ typedef struct sl
slock_t *lock; slock_t *lock;
scond_t *cond; scond_t *cond;
bool nonblock; bool nonblock;
unsigned buf_count;
} sl_t; } sl_t;
static void opensl_callback(SLAndroidSimpleBufferQueueItf bq, void *ctx) static void opensl_callback(SLAndroidSimpleBufferQueueItf bq, void *ctx)
@ -132,6 +132,17 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency)
GOTO_IF_FAIL(SLEngineItf_CreateOutputMix(sl->engine, &sl->output_mix, 0, NULL, NULL)); GOTO_IF_FAIL(SLEngineItf_CreateOutputMix(sl->engine, &sl->output_mix, 0, NULL, NULL));
GOTO_IF_FAIL(SLObjectItf_Realize(sl->output_mix, SL_BOOLEAN_FALSE)); GOTO_IF_FAIL(SLObjectItf_Realize(sl->output_mix, SL_BOOLEAN_FALSE));
int api_level = android_get_sdk_version();
if(api_level > 15)
{
RARCH_LOG("API level 16 and higher has a fast OpenSL mixer - adjust settings for lower audio latency...\n");
sl->buf_count = 4;
}
else
sl->buf_count = 8;
RARCH_LOG("[SLES] : Android API level [%d] detected, setting audio latency (buffer size: [%d])..\n", api_level, sl->buf_count * BUFFER_SIZE);
fmt_pcm.formatType = SL_DATAFORMAT_PCM; fmt_pcm.formatType = SL_DATAFORMAT_PCM;
fmt_pcm.numChannels = 2; fmt_pcm.numChannels = 2;
fmt_pcm.samplesPerSec = rate * 1000; // Samplerate is in milli-Hz. fmt_pcm.samplesPerSec = rate * 1000; // Samplerate is in milli-Hz.
@ -144,7 +155,7 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency)
audio_src.pFormat = &fmt_pcm; audio_src.pFormat = &fmt_pcm;
loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
loc_bufq.numBuffers = NUM_BUFFERS; loc_bufq.numBuffers = sl->buf_count;
loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
loc_outmix.outputMix = sl->output_mix; loc_outmix.outputMix = sl->output_mix;
@ -161,7 +172,7 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency)
sl->cond = scond_new(); sl->cond = scond_new();
sl->lock = slock_new(); sl->lock = slock_new();
sl->fifo = fifo_new(BUFFER_SIZE * NUM_BUFFERS); sl->fifo = fifo_new(BUFFER_SIZE * sl->buf_count);
(*buffer_queue)->RegisterCallback(buffer_queue, opensl_callback, sl); (*buffer_queue)->RegisterCallback(buffer_queue, opensl_callback, sl);
(*buffer_queue)->Enqueue(buffer_queue, sl->buffer, BUFFER_SIZE); (*buffer_queue)->Enqueue(buffer_queue, sl->buffer, BUFFER_SIZE);
@ -248,7 +259,8 @@ static size_t sl_write_avail(void *data)
static size_t sl_buffer_size(void *data) static size_t sl_buffer_size(void *data)
{ {
return BUFFER_SIZE * NUM_BUFFERS; sl_t *sl = (sl_t*)data;
return BUFFER_SIZE * sl->buf_count;
} }
const audio_driver_t audio_opensl = { const audio_driver_t audio_opensl = {

View File

@ -74,7 +74,7 @@ static inline bool input_key_pressed_func(int key)
#define audio_free_func() sl_free(driver.audio_data) #define audio_free_func() sl_free(driver.audio_data)
#define audio_use_float_func() driver.audio->use_float(driver.audio_data) #define audio_use_float_func() driver.audio->use_float(driver.audio_data)
#define audio_write_avail_func() sl_write_avail(driver.audio_data) #define audio_write_avail_func() sl_write_avail(driver.audio_data)
#define audio_buffer_size_func() (BUFFER_SIZE * NUM_BUFFERS) #define audio_buffer_size_func() (BUFFER_SIZE * ((sl_t*)driver.audio_data)->buf_count)
#else #else