You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
356 lines
12 KiB
356 lines
12 KiB
/*****************************************************************************
|
|
* JVLC.java: JNI interface for vlc Java Bindings
|
|
*****************************************************************************
|
|
* Copyright (C) 1998-2005 the VideoLAN team
|
|
*
|
|
* Authors: Filippo Carone <filippo@carone.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
/* These are a must*/
|
|
#include <jni.h>
|
|
#include <vlc/vlc.h>
|
|
|
|
#include <stdio.h> // for printf
|
|
#include <stdlib.h> // for calloc
|
|
#include <string.h> // for strcmp
|
|
|
|
|
|
/* JVLC internal imports, generated by gcjh */
|
|
#include "org_videolan_jvlc_JVLC.h"
|
|
#include "org_videolan_jvlc_JVLCVariable.h"
|
|
#include "org_videolan_jvlc_JVLCIntVariable.h"
|
|
#include "org_videolan_jvlc_JVLCBoolVariable.h"
|
|
#include "org_videolan_jvlc_JVLCFloatVariable.h"
|
|
#include "org_videolan_jvlc_JVLCStringVariable.h"
|
|
#include "org_videolan_jvlc_JVLCTimeVariable.h"
|
|
#include "org_videolan_jvlc_JVLCVarVariable.h"
|
|
#include "org_videolan_jvlc_JVLCVarValue.h"
|
|
|
|
int getClassID (JNIEnv *env, jobject obj);
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_create (JNIEnv *env, jobject obj) {
|
|
return VLC_Create();
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_init (JNIEnv *env, jobject obj, jobjectArray args) {
|
|
|
|
/* build the argv vector */
|
|
const char **argv;
|
|
|
|
/* count the arguments */
|
|
// int argc = (int) (*env)->GetArrayLength(env, args)
|
|
int argc = (int) env->GetArrayLength((jarray) args);
|
|
|
|
/* convert java strings to c strings
|
|
how many pointers do we need? */
|
|
argv = (const char **) malloc(argc * sizeof(char*));
|
|
|
|
/* now fill the argv* */
|
|
for (int i = 0; i < argc; i++) {
|
|
argv[i] = env->GetStringUTFChars((jstring) env->GetObjectArrayElement(args, i),
|
|
0
|
|
);
|
|
}
|
|
|
|
/* execute the library call */
|
|
int res = VLC_Init(getClassID(env,obj), argc, (char **) argv);
|
|
|
|
free(argv);
|
|
|
|
return res;
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_addInterface (JNIEnv *env, jobject obj, jstring moduleName, jboolean blocking, jboolean startPlay) {
|
|
const char *psz_module = NULL;
|
|
int i_blocking, i_startPlay;
|
|
|
|
if (moduleName != NULL) {
|
|
psz_module = env->GetStringUTFChars(moduleName, 0);
|
|
}
|
|
|
|
if (blocking == true) i_blocking = 1;
|
|
else i_blocking = 0;
|
|
|
|
if (startPlay == true) i_startPlay = 1;
|
|
else i_startPlay = 0;
|
|
|
|
int addIntf_res = VLC_AddIntf(getClassID(env,obj), psz_module, i_blocking, i_startPlay);
|
|
|
|
if (psz_module != NULL) {
|
|
env->ReleaseStringUTFChars(moduleName, psz_module);
|
|
}
|
|
return addIntf_res;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL Java_org_videolan_jvlc_JVLC_getVersion (JNIEnv *env, jobject obj) {
|
|
return env->NewStringUTF(VLC_Version());
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL Java_org_videolan_jvlc_JVLC_getError (JNIEnv *env, jobject obj, jint errorCode) {
|
|
return env->NewStringUTF(VLC_Error(errorCode));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_die (JNIEnv *env, jobject obj) {
|
|
return VLC_Die(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_cleanUp (JNIEnv *env, jobject obj) {
|
|
return VLC_CleanUp(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_setVariable (JNIEnv *env, jobject obj, jobject jvlcVariable) {
|
|
vlc_value_t value;
|
|
char* psz_var = NULL;
|
|
jstring varName;
|
|
jstring stringValue = NULL;
|
|
|
|
if (jvlcVariable != NULL) {
|
|
/* get the name of jvlcVariable class */
|
|
jclass variableClass = env->GetObjectClass(jvlcVariable);
|
|
jclass varSuperClass = env->GetSuperclass (variableClass);
|
|
jmethodID getNameMethod = env->GetMethodID (varSuperClass, "getName", "()Ljava/lang/String;");
|
|
jstring varName = (jstring) env->CallObjectMethod (jvlcVariable, getNameMethod);
|
|
|
|
/* i_int */
|
|
jclass tmpClass = env->FindClass("org/videolan/jvlc/JVLCIntVariable");
|
|
if (env->IsInstanceOf(jvlcVariable, tmpClass)) {
|
|
jmethodID mid = env->GetMethodID(variableClass, "getIntValue", "()I");
|
|
value.i_int = env->CallIntMethod(jvlcVariable, mid);
|
|
goto done;
|
|
}
|
|
|
|
/* b_bool */
|
|
tmpClass = env->FindClass("org/videolan/jvlc/JVLCBoolVariable");
|
|
if (env->IsInstanceOf(jvlcVariable, tmpClass )) {
|
|
jmethodID mid = env->GetMethodID(variableClass, "getBoolValue", "()Z");
|
|
value.b_bool = env->CallBooleanMethod(jvlcVariable, mid);
|
|
goto done;
|
|
}
|
|
|
|
/* f_float */
|
|
tmpClass = env->FindClass("org/videolan/jvlc/JVLCFloatVariable");
|
|
if (env->IsInstanceOf(jvlcVariable, tmpClass )) {
|
|
jmethodID mid = env->GetMethodID(variableClass, "getFloatValue", "()F");
|
|
value.f_float = env->CallBooleanMethod(jvlcVariable, mid);
|
|
goto done;
|
|
}
|
|
|
|
/* psz_string */
|
|
tmpClass = env->FindClass("org/videolan/jvlc/JVLCStringVariable");
|
|
if (env->IsInstanceOf(jvlcVariable, tmpClass )) {
|
|
jmethodID mid = env->GetMethodID(variableClass, "getStringValue", "()Ljava/lang/String");
|
|
jstring stringValue = (jstring) env->CallObjectMethod(jvlcVariable, mid);
|
|
value.psz_string = (char *)env->GetStringUTFChars(stringValue, 0);
|
|
goto done;
|
|
}
|
|
|
|
/* i_time */
|
|
tmpClass = env->FindClass("org/videolan/jvlc/JVLCTimeVariable");
|
|
if (env->IsInstanceOf(jvlcVariable, tmpClass )) {
|
|
jmethodID mid = env->GetMethodID(variableClass, "getTimeValue", "()L");
|
|
value.i_time = env->CallLongMethod(jvlcVariable, mid);
|
|
goto done;
|
|
}
|
|
|
|
/* var */
|
|
tmpClass = env->FindClass("org/videolan/jvlc/JVLCVarVariable");
|
|
if (env->IsInstanceOf(jvlcVariable, tmpClass )) {
|
|
/*
|
|
* This is the longer one. We have to get the VarValue object
|
|
* from the JVLCVarVariable and retrieve the OID from it.
|
|
*/
|
|
jmethodID getVarValueMID = env->GetMethodID(variableClass, "getVarValue", "()Lorg/videolan/jvlc/JVLCVarValue;");
|
|
jobject varVariableObj = env->CallObjectMethod(jvlcVariable, getVarValueMID);
|
|
|
|
/*
|
|
* Now from the varVariableObj we need to retrieve its name and OID
|
|
*/
|
|
|
|
/*
|
|
* Get the VarValue name
|
|
*/
|
|
|
|
jclass varVariableCls = env->GetObjectClass(varVariableObj);
|
|
jmethodID getVarName = env->GetMethodID(varVariableCls, "getName","()Ljava/lang/String;");
|
|
jstring varName = (jstring) env->CallObjectMethod(varVariableObj, getVarName);
|
|
value.var.psz_name = (char *)env->GetStringUTFChars(varName, 0);
|
|
|
|
/*
|
|
* Get the VarValue OID
|
|
*/
|
|
|
|
jmethodID getOID = env->GetMethodID(varVariableCls, "getOID", "()I");
|
|
value.var.i_object_id = env->CallIntMethod(varVariableObj, getOID);
|
|
|
|
goto done;
|
|
}
|
|
|
|
done:
|
|
psz_var = (char *) env->GetStringUTFChars(varName, 0);
|
|
}
|
|
|
|
if (psz_var != NULL) {
|
|
int res = VLC_VariableSet(getClassID(env, obj), (char* const) psz_var, value);
|
|
env->ReleaseStringUTFChars(varName, psz_var);
|
|
if (stringValue != NULL) env->ReleaseStringUTFChars(stringValue, value.psz_string);
|
|
return res;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
JNIEXPORT jobject JNICALL Java_org_videolan_jvlc_JVLC_getVariable (JNIEnv *env, jobject obj, jstring varName) {
|
|
|
|
const char* psz_var = env->GetStringUTFChars(varName, 0);
|
|
vlc_value_t value;
|
|
if (VLC_VariableGet(getClassID(env, obj), psz_var, &value) != VLC_SUCCESS) {
|
|
// throw exception
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_addTarget (JNIEnv *env, jobject obj, jstring URI, jobjectArray options, jint insertMode, jint position) {
|
|
|
|
char* psz_target = NULL;
|
|
char** ppsz_options = NULL;
|
|
int options_number = 0;
|
|
|
|
if (URI != NULL) {
|
|
psz_target = (char *) env->GetStringUTFChars(URI, 0);
|
|
}
|
|
|
|
if (options != NULL) {
|
|
options_number = env->GetArrayLength(options);
|
|
ppsz_options = (char **) malloc (options_number * sizeof(char*));
|
|
|
|
for (int i = 0; i < options_number; i++) {
|
|
ppsz_options[i] = (char *) env->GetStringUTFChars((jstring) env->GetObjectArrayElement(options, i), 0);
|
|
}
|
|
}
|
|
|
|
int res = VLC_AddTarget(getClassID(env, obj), (char const *)psz_target, (const char **) ppsz_options, options_number, insertMode, position);
|
|
|
|
if (ppsz_options != NULL) {
|
|
for (int i = 0; i < options_number; i++) {
|
|
free(ppsz_options[i]);
|
|
}
|
|
free(ppsz_options);
|
|
}
|
|
if (psz_target != NULL) {
|
|
free(psz_target);
|
|
}
|
|
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_play (JNIEnv *env, jobject obj) {
|
|
return VLC_Play(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_pause (JNIEnv *env, jobject obj) {
|
|
return VLC_Pause(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_stop (JNIEnv *env, jobject obj) {
|
|
return VLC_Stop(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL Java_org_videolan_jvlc_JVLC_isPlaying (JNIEnv *env, jobject obj) {
|
|
return VLC_IsPlaying(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jfloat JNICALL Java_org_videolan_jvlc_JVLC_getPosition (JNIEnv *env, jobject obj) {
|
|
return VLC_PositionGet(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jfloat JNICALL Java_org_videolan_jvlc_JVLC_setPosition (JNIEnv *env, jobject obj, jfloat position) {
|
|
return VLC_PositionSet(getClassID(env, obj), position);
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_getTime (JNIEnv *env, jobject obj) {
|
|
return VLC_TimeGet(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_setTime (JNIEnv *env, jobject obj, jint seconds, jboolean relative) {
|
|
return VLC_TimeSet(getClassID(env, obj), seconds, relative);
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_getLength (JNIEnv *env, jobject obj) {
|
|
return VLC_LengthGet(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jfloat JNICALL Java_org_videolan_jvlc_JVLC_speedFaster (JNIEnv *env, jobject obj) {
|
|
return VLC_SpeedFaster(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jfloat JNICALL Java_org_videolan_jvlc_JVLC_speedSlower (JNIEnv *env, jobject obj) {
|
|
return VLC_SpeedSlower(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_getPlaylistIndex (JNIEnv *env, jobject obj) {
|
|
return VLC_PlaylistIndex(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_getPlaylistItems (JNIEnv *env, jobject obj) {
|
|
return VLC_PlaylistNumberOfItems(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_playlistNext (JNIEnv *env, jobject obj) {
|
|
return VLC_PlaylistNext(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_playlistPrev (JNIEnv *env, jobject obj) {
|
|
return VLC_PlaylistPrev(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_playlistClear (JNIEnv *env, jobject obj) {
|
|
return VLC_PlaylistClear(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_getVolume (JNIEnv *env, jobject obj) {
|
|
return VLC_VolumeGet(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_setVolume (JNIEnv *env, jobject obj, jint volume) {
|
|
return VLC_VolumeSet(getClassID(env, obj), volume);
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_muteVolume (JNIEnv *env, jobject obj) {
|
|
return VLC_VolumeMute(getClassID(env, obj));
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC_fullScreen (JNIEnv *env, jobject obj) {
|
|
return VLC_FullScreen(getClassID(env, obj));
|
|
}
|
|
|
|
/*
|
|
* This method is an helper method
|
|
* only valid if obj == JVLC
|
|
*/
|
|
|
|
int getClassID (JNIEnv *env, jobject obj) {
|
|
/* get the id field of object */
|
|
jclass cls = env->GetObjectClass(obj);
|
|
jmethodID mid = env->GetMethodID(cls, "getID", "()I");
|
|
int field = env->CallIntMethod(obj, mid);
|
|
return field;
|
|
}
|
|
|
|
|