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

/*****************************************************************************
* 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;
}