提交 d557c702 编写于 作者: Z Zhang Rui

ijksdl: setup thread env and audo destory

上级 5da75245
......@@ -26,25 +26,31 @@
#include "ijksdl_inc_internal_android.h"
#include "android_audiotrack.h"
JavaVM *g_jvm;
static JavaVM *g_jvm;
static pthread_key_t g_thread_key;
static pthread_once_t g_key_once = PTHREAD_ONCE_INIT;
JavaVM *SDL_AndroidJni_GetJvm()
{
return g_jvm;
}
jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env)
static void SDL_AndroidJni_ThreadDestroyed(void* value)
{
JavaVM *jvm = g_jvm;
if (!jvm) {
ALOGE("SDL_AndroidJni_GetJvm: AttachCurrentThread: NULL jvm");
return -1;
JNIEnv *env = (JNIEnv*) value;
if (env != NULL) {
(*g_jvm)->DetachCurrentThread(g_jvm);
pthread_setspecific(g_thread_key, NULL);
}
}
return (*jvm)->AttachCurrentThread(jvm, p_env, NULL);
static void make_thread_key()
{
pthread_key_create(&g_thread_key, SDL_AndroidJni_ThreadDestroyed);
}
jint SDL_AndroidJni_DetachCurrentThread()
jint SDL_AndroidJni_SetupThreadEnv(JNIEnv **p_env)
{
JavaVM *jvm = g_jvm;
if (!jvm) {
......@@ -52,7 +58,18 @@ jint SDL_AndroidJni_DetachCurrentThread()
return -1;
}
return (*jvm)->DetachCurrentThread(jvm);
pthread_once(&g_key_once, make_thread_key);
JNIEnv *env = (JNIEnv*) pthread_getspecific(g_thread_key);
if (!env) {
if ((*jvm)->AttachCurrentThread(jvm, &env, NULL) == JNI_OK) {
pthread_setspecific(g_thread_key, env);
*p_env = env;
return 0;
}
}
return -1;
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
......
......@@ -28,8 +28,6 @@
JavaVM *SDL_AndroidJni_GetJvm();
jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env);
jint SDL_AndroidJni_DetachCurrentThread();
jint SDL_AndroidJni_SetupThreadEnv(JNIEnv **p_env);
#endif
......@@ -92,15 +92,12 @@ int aout_thread(void *arg)
// SDL_Aout_Opaque *opaque = aout->opaque;
JNIEnv *env = NULL;
if (JNI_OK != SDL_AndroidJni_AttachCurrentThread(&env)) {
ALOGE("aout_thread: AttachCurrentThread: failed");
if (JNI_OK != SDL_AndroidJni_SetupThreadEnv(&env)) {
ALOGE("aout_thread: SDL_AndroidJni_SetupEnv: failed");
return -1;
}
int retval = aout_thread_n(env, aout);
SDL_AndroidJni_DetachCurrentThread();
return retval;
return aout_thread_n(env, aout);
}
int aout_open_audio_n(JNIEnv *env, SDL_Aout *aout, SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
......@@ -110,12 +107,22 @@ int aout_open_audio_n(JNIEnv *env, SDL_Aout *aout, SDL_AudioSpec *desired, SDL_A
opaque->spec = *desired;
opaque->atrack = sdl_audiotrack_new_from_sdl_spec(env, desired);
if (!opaque->atrack)
if (!opaque->atrack) {
ALOGE("aout_open_audio_n: failed to new AudioTrcak()");
return -1;
}
opaque->buffer_size = sdl_audiotrack_get_min_buffer_size(opaque->atrack);
if (opaque->buffer_size <= 0) {
ALOGE("aout_open_audio_n: failed to getMinBufferSize()");
sdl_audiotrack_free(env, opaque->atrack);
opaque->atrack = NULL;
return -1;
}
opaque->buffer = malloc(opaque->buffer_size);
if (!opaque->buffer) {
ALOGE("aout_open_audio_n: failed to allocate buffer");
sdl_audiotrack_free(env, opaque->atrack);
opaque->atrack = NULL;
return -1;
......@@ -130,28 +137,26 @@ int aout_open_audio_n(JNIEnv *env, SDL_Aout *aout, SDL_AudioSpec *desired, SDL_A
opaque->abort_request = 0;
opaque->audio_tid = SDL_CreateThreadEx(&opaque->_audio_tid, aout_thread, aout);
if (!opaque->audio_tid) {
ALOGE("aout_open_audio_n: failed to create audio thread");
sdl_audiotrack_free(env, opaque->atrack);
opaque->atrack = NULL;
return -1;
}
return 0;
SDLTRACE("aout_open_audio_n()=%d", opaque->buffer_size);
return opaque->buffer_size;
}
int aout_open_audio(SDL_Aout *aout, SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
{
// SDL_Aout_Opaque *opaque = aout->opaque;
JNIEnv *env = NULL;
if (JNI_OK != SDL_AndroidJni_AttachCurrentThread(&env)) {
if (JNI_OK != SDL_AndroidJni_SetupThreadEnv(&env)) {
ALOGE("aout_open_audio: AttachCurrentThread: failed");
return -1;
}
int retval = aout_open_audio_n(env, aout, desired, obtained);
// FIXME: 1 SDL_AndroidJni_DetachCurrentThread() ?
SDL_AndroidJni_DetachCurrentThread();
return retval;
return aout_open_audio_n(env, aout, desired, obtained);
}
void aout_pause_audio(SDL_Aout *aout, int pause_on)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册