libbluray | branch: master | hpi1 <[email protected]> | Fri Sep 14 13:54:09 2012 +0300| [a4b66e6cdab0ec97cd5c4e92322a3c9d54e7793d] | committer: hpi1
Splitted bdj_open() and bdj_close() > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=a4b66e6cdab0ec97cd5c4e92322a3c9d54e7793d --- src/libbluray/bdj/bdj.c | 46 +++++++++++++++++----------------- src/libbluray/bdj/bdj.h | 6 +++-- src/libbluray/bluray.c | 63 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index 096dff2..18c805a 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -36,10 +36,9 @@ typedef jint (JNICALL * fptr_JNI_CreateJavaVM) (JavaVM **pvm, void **penv,void *args); -int bdj_start(JNIEnv* env, const char* path, jobject bdjo, BDJAVA* bdjava); void* load_jvm(); -BDJAVA* bdj_open(const char *path, const char *start, +BDJAVA* bdj_open(const char *path, struct bluray *bd, struct bd_registers_s *registers, struct indx_root_s *index) { @@ -92,28 +91,13 @@ BDJAVA* bdj_open(const char *path, const char *start, return NULL; } - // determine path of bdjo file to load - char* bdjo_path = str_printf("%s%s/%s.bdjo", path, BDJ_BDJO_PATH, start); - jobject bdjo = bdjo_read(bdjava->env, bdjo_path); - free(bdjo_path); - - if (!bdjo) { - free(bdjava); - BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to load BDJO file.\n"); - return NULL; - } - - if (bdj_start(bdjava->env, path, bdjo, bdjava) == BDJ_ERROR) { - free(bdjava); - BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to start BDJ program.\n"); - return NULL; - } - return bdjava; } -int bdj_start(JNIEnv* env, const char* path, jobject bdjo, BDJAVA* bdjava) +int bdj_start(BDJAVA *bdjava, const char *start) { + JNIEnv* env = bdjava->env; + jclass init_class = (*env)->FindClass(env, "org/videolan/BDJLoader"); if (init_class == NULL) { @@ -129,7 +113,18 @@ int bdj_start(JNIEnv* env, const char* path, jobject bdjo, BDJAVA* bdjava) return BDJ_ERROR; } - jstring param_base_dir = (*env)->NewStringUTF(env, path); + // determine path of bdjo file to load + char* bdjo_path = str_printf("%s%s/%s.bdjo", bdjava->path, BDJ_BDJO_PATH, start); + jobject bdjo = bdjo_read(bdjava->env, bdjo_path); + free(bdjo_path); + + if (!bdjo) { + free(bdjava); + BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to load BDJO file.\n"); + return BDJ_ERROR; + } + + jstring param_base_dir = (*env)->NewStringUTF(env, bdjava->path); jlong param_bdjava_ptr = (jlong)(intptr_t)bdjava; (*env)->CallStaticVoidMethod(env, init_class, load_id, param_base_dir, bdjo, @@ -138,16 +133,21 @@ int bdj_start(JNIEnv* env, const char* path, jobject bdjo, BDJAVA* bdjava) return BDJ_SUCCESS; } -void bdj_close(BDJAVA *bdjava) +void bdj_stop(BDJAVA *bdjava) { JNIEnv* env = bdjava->env; - JavaVM* jvm = bdjava->jvm; jclass init_class = (*env)->FindClass(env, "org/videolan/BDJLoader"); jmethodID shutdown_id = (*env)->GetStaticMethodID(env, init_class, "Shutdown", "()V"); (*env)->CallStaticVoidMethod(env, init_class, shutdown_id); +} + +void bdj_close(BDJAVA *bdjava) +{ + JavaVM* jvm = bdjava->jvm; + (*jvm)->DestroyJavaVM(jvm); free(bdjava); diff --git a/src/libbluray/bdj/bdj.h b/src/libbluray/bdj/bdj.h index 4f14cd2..2c86fc5 100644 --- a/src/libbluray/bdj/bdj.h +++ b/src/libbluray/bdj/bdj.h @@ -28,8 +28,10 @@ struct bluray; struct bd_registers_s; struct indx_root_s; -BDJAVA* bdj_open(const char *path, const char *start, - struct bluray *bd, struct bd_registers_s *registers, struct indx_root_s *index); +BDJAVA* bdj_open(const char *path, struct bluray *bd, + struct bd_registers_s *registers, struct indx_root_s *index); +int bdj_start(BDJAVA *bdjava, const char *start); +void bdj_stop(BDJAVA *bdjava); void bdj_close(BDJAVA *bdjava); void bdj_send_event(BDJAVA *bdjava, int type, int keyCode); diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 4236eb3..d02b915 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -984,6 +984,45 @@ static void _fill_disc_info(BLURAY *bd) } } +/* + * bdj + */ + +static int _start_bdj(BLURAY *bd, const char *start) +{ +#ifdef USING_BDJAVA + if (bd->bdjava == NULL) { + bd->bdjava = bdj_open(bd->device_path, bd, bd->regs, bd->index); + if (!bd->bdjava) { + return 0; + } + } + return bdj_start(bd->bdjava, start); +#else + BD_DEBUG(DBG_BLURAY | DBG_CRIT, "Title %s.bdjo: BD-J not compiled in (%p)\n", start, bd); + return 0; +#endif +} + +static void _stop_bdj(BLURAY *bd) +{ +#ifdef USING_BDJAVA + if (bd->bdjava != NULL) { + bdj_stop(bd->bdjava); + } +#endif +} + +static void _close_bdj(BLURAY *bd) +{ +#ifdef USING_BDJAVA + if (bd->bdjava != NULL) { + bdj_close(bd->bdjava); + bd->bdjava = NULL; + } +#endif +} + #ifdef HAVE_MNTENT_H /* * Replace device node (/dev/sr0) by mount point @@ -1094,7 +1133,7 @@ BLURAY *bd_open(const char* device_path, const char* keyfile_path) void bd_close(BLURAY *bd) { - bd_stop_bdj(bd); + _close_bdj(bd); _libaacs_unload(bd); @@ -2006,33 +2045,17 @@ int bd_set_player_setting_str(BLURAY *bd, uint32_t idx, const char *s) } /* - * bdj + * BD-J testing */ int bd_start_bdj(BLURAY *bd, const char *start_object) { -#ifdef USING_BDJAVA - if (bd->bdjava == NULL) { - bd->bdjava = bdj_open(bd->device_path, start_object, bd, bd->regs, bd->index); - return !!bd->bdjava; - } else { - BD_DEBUG(DBG_BLURAY | DBG_CRIT, "BD-J is already running (%p)\n", bd); - return 1; - } -#else - BD_DEBUG(DBG_BLURAY | DBG_CRIT, "%s.bdjo: BD-J not compiled in (%p)\n", start_object, bd); -#endif - return 0; + return _start_bdj(bd, start_object); } void bd_stop_bdj(BLURAY *bd) { -#ifdef USING_BDJAVA - if (bd->bdjava != NULL) { - bdj_close((BDJAVA*)bd->bdjava); - bd->bdjava = NULL; - } -#endif + _close_bdj(bd); } /* _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
