blob: da116bf7c96afed22cd8ed728f2746f07f55d011 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jean-Michel Trivie89554b2009-03-24 18:46:20 -070017//#define LOG_NDEBUG 0
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018#define LOG_TAG "JET_JNI"
19
20
21#include <stdio.h>
22#include <unistd.h>
23#include <fcntl.h>
24
Glenn Kastenc81d31c2012-03-13 14:46:23 -070025#include <jni.h>
Steven Moreland2279b252017-07-19 09:50:45 -070026#include <nativehelper/JNIHelp.h>
Andreas Gampeed6b9df2014-11-20 22:02:20 -080027#include "core_jni_helpers.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028
Glenn Kastenc81d31c2012-03-13 14:46:23 -070029#include <utils/Log.h>
30#include <media/JetPlayer.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031
32
33using namespace android;
34
35// ----------------------------------------------------------------------------
36static const char* const kClassPathName = "android/media/JetPlayer";
37
38// ----------------------------------------------------------------------------
39struct fields_t {
40 // these fields provide access from C++ to the...
41 jclass jetClass; // JetPlayer java class global ref
42 jmethodID postNativeEventInJava; // java method to post events to the Java thread from native
43 jfieldID nativePlayerInJavaObj; // stores in Java the native JetPlayer object
44};
45
46static fields_t javaJetPlayerFields;
47
48
49// ----------------------------------------------------------------------------
50// ----------------------------------------------------------------------------
51
52/*
53 * This function is called from JetPlayer instance's render thread
54 */
55static void
56jetPlayerEventCallback(int what, int arg1=0, int arg2=0, void* javaTarget = NULL)
57{
58 JNIEnv *env = AndroidRuntime::getJNIEnv();
Glenn Kasten18db49a2012-03-12 16:29:55 -070059 if (env) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080060 env->CallStaticVoidMethod(
61 javaJetPlayerFields.jetClass, javaJetPlayerFields.postNativeEventInJava,
62 javaTarget,
63 what, arg1, arg2);
64 if (env->ExceptionCheck()) {
65 env->ExceptionDescribe();
66 env->ExceptionClear();
67 }
68 } else {
Steve Block3762c312012-01-06 19:20:56 +000069 ALOGE("JET jetPlayerEventCallback(): No JNI env for JET event callback, can't post event.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080070 return;
71 }
72}
73
74
75// ----------------------------------------------------------------------------
76// ----------------------------------------------------------------------------
77
78static jboolean
79android_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this,
80 jint maxTracks, jint trackBufferSize)
81{
Steve Block71f2cf12011-10-20 11:56:00 +010082 //ALOGV("android_media_JetPlayer_setup(): entering.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080083 JetPlayer* lpJet = new JetPlayer(env->NewGlobalRef(weak_this), maxTracks, trackBufferSize);
84
85 EAS_RESULT result = lpJet->init();
86
Glenn Kasten18db49a2012-03-12 16:29:55 -070087 if (result==EAS_SUCCESS) {
Elliott Hughes69a017b2011-04-08 14:10:28 -070088 // save our newly created C++ JetPlayer in the "nativePlayerInJavaObj" field
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080089 // of the Java object (in mNativePlayerInJavaObj)
Ashok Bhat075e9a12014-01-06 13:45:09 +000090 env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (jlong)lpJet);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080091 return JNI_TRUE;
92 } else {
Steve Block3762c312012-01-06 19:20:56 +000093 ALOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080094 delete lpJet;
Ashok Bhat075e9a12014-01-06 13:45:09 +000095 env->SetLongField(weak_this, javaJetPlayerFields.nativePlayerInJavaObj, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080096 return JNI_FALSE;
97 }
98}
99
100
101// ----------------------------------------------------------------------------
102static void
103android_media_JetPlayer_finalize(JNIEnv *env, jobject thiz)
104{
Steve Block71f2cf12011-10-20 11:56:00 +0100105 ALOGV("android_media_JetPlayer_finalize(): entering.");
Ashok Bhat075e9a12014-01-06 13:45:09 +0000106 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800107 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700108 if (lpJet != NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 lpJet->release();
110 delete lpJet;
111 }
112
Steve Block71f2cf12011-10-20 11:56:00 +0100113 ALOGV("android_media_JetPlayer_finalize(): exiting.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114}
115
116
117// ----------------------------------------------------------------------------
118static void
119android_media_JetPlayer_release(JNIEnv *env, jobject thiz)
120{
121 android_media_JetPlayer_finalize(env, thiz);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000122 env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, 0);
Steve Block71f2cf12011-10-20 11:56:00 +0100123 ALOGV("android_media_JetPlayer_release() done");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124}
125
126
127// ----------------------------------------------------------------------------
128static jboolean
129android_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path)
130{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000131 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800132 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900133 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800134 jniThrowException(env, "java/lang/IllegalStateException",
135 "Unable to retrieve JetPlayer pointer for openFile()");
You Kim8f5691f2012-12-12 05:34:21 +0900136 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800137 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700138
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800139 // set up event callback function
140 lpJet->setEventCallback(jetPlayerEventCallback);
141
142 const char *pathStr = env->GetStringUTFChars(path, NULL);
143 if (pathStr == NULL) { // Out of memory
Steve Block3762c312012-01-06 19:20:56 +0000144 ALOGE("android_media_JetPlayer_openFile(): aborting, out of memory");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145 return JNI_FALSE;
146 }
147
Steve Block71f2cf12011-10-20 11:56:00 +0100148 ALOGV("android_media_JetPlayer_openFile(): trying to open %s", pathStr );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149 EAS_RESULT result = lpJet->loadFromFile(pathStr);
150 env->ReleaseStringUTFChars(path, pathStr);
151
Glenn Kasten18db49a2012-03-12 16:29:55 -0700152 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100153 //ALOGV("android_media_JetPlayer_openFile(): file successfully opened");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154 return JNI_TRUE;
155 } else {
Steve Block3762c312012-01-06 19:20:56 +0000156 ALOGE("android_media_JetPlayer_openFile(): failed to open file with EAS error %d",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800157 (int)result);
158 return JNI_FALSE;
159 }
160}
161
162
163// ----------------------------------------------------------------------------
164static jboolean
165android_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz,
166 jobject fileDescriptor, jlong offset, jlong length)
167{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000168 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800169 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900170 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800171 jniThrowException(env, "java/lang/IllegalStateException",
172 "Unable to retrieve JetPlayer pointer for openFile()");
You Kim8f5691f2012-12-12 05:34:21 +0900173 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800174 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700175
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800176 // set up event callback function
177 lpJet->setEventCallback(jetPlayerEventCallback);
Elliott Hughes69a017b2011-04-08 14:10:28 -0700178
Steve Block71f2cf12011-10-20 11:56:00 +0100179 ALOGV("android_media_JetPlayer_openFileDescr(): trying to load JET file through its fd" );
Elliott Hughesa3804cf2011-04-11 16:50:19 -0700180 EAS_RESULT result = lpJet->loadFromFD(jniGetFDFromFileDescriptor(env, fileDescriptor),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181 (long long)offset, (long long)length); // cast params to types used by EAS_FILE
Elliott Hughes69a017b2011-04-08 14:10:28 -0700182
Glenn Kasten18db49a2012-03-12 16:29:55 -0700183 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100184 ALOGV("android_media_JetPlayer_openFileDescr(): file successfully opened");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800185 return JNI_TRUE;
186 } else {
Steve Block3762c312012-01-06 19:20:56 +0000187 ALOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800188 (int)result);
189 return JNI_FALSE;
190 }
191}
192
193
194// ----------------------------------------------------------------------------
195static jboolean
196android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz)
197{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000198 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800199 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900200 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201 jniThrowException(env, "java/lang/IllegalStateException",
202 "Unable to retrieve JetPlayer pointer for closeFile()");
You Kim8f5691f2012-12-12 05:34:21 +0900203 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800204 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700205
Glenn Kasten18db49a2012-03-12 16:29:55 -0700206 if (lpJet->closeFile()==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100207 //ALOGV("android_media_JetPlayer_closeFile(): file successfully closed");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800208 return JNI_TRUE;
209 } else {
Steve Block3762c312012-01-06 19:20:56 +0000210 ALOGE("android_media_JetPlayer_closeFile(): failed to close file");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800211 return JNI_FALSE;
212 }
213}
214
215
216// ----------------------------------------------------------------------------
217static jboolean
218android_media_JetPlayer_play(JNIEnv *env, jobject thiz)
219{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000220 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800221 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900222 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800223 jniThrowException(env, "java/lang/IllegalStateException",
224 "Unable to retrieve JetPlayer pointer for play()");
You Kim8f5691f2012-12-12 05:34:21 +0900225 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800226 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700227
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800228 EAS_RESULT result = lpJet->play();
Glenn Kasten18db49a2012-03-12 16:29:55 -0700229 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100230 //ALOGV("android_media_JetPlayer_play(): play successful");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231 return JNI_TRUE;
232 } else {
Steve Block3762c312012-01-06 19:20:56 +0000233 ALOGE("android_media_JetPlayer_play(): failed to play with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800234 result);
235 return JNI_FALSE;
236 }
237}
238
239
240// ----------------------------------------------------------------------------
241static jboolean
242android_media_JetPlayer_pause(JNIEnv *env, jobject thiz)
243{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000244 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800245 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900246 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800247 jniThrowException(env, "java/lang/IllegalStateException",
248 "Unable to retrieve JetPlayer pointer for pause()");
You Kim8f5691f2012-12-12 05:34:21 +0900249 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800250 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700251
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800252 EAS_RESULT result = lpJet->pause();
Glenn Kasten18db49a2012-03-12 16:29:55 -0700253 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100254 //ALOGV("android_media_JetPlayer_pause(): pause successful");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800255 return JNI_TRUE;
256 } else {
Glenn Kasten18db49a2012-03-12 16:29:55 -0700257 if (result==EAS_ERROR_QUEUE_IS_EMPTY) {
Steve Block71f2cf12011-10-20 11:56:00 +0100258 ALOGV("android_media_JetPlayer_pause(): paused with an empty queue");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800259 return JNI_TRUE;
260 } else
Steve Block3762c312012-01-06 19:20:56 +0000261 ALOGE("android_media_JetPlayer_pause(): failed to pause with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800262 result);
263 return JNI_FALSE;
264 }
265}
266
267
268// ----------------------------------------------------------------------------
269static jboolean
270android_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz,
271 jint segmentNum, jint libNum, jint repeatCount, jint transpose, jint muteFlags,
272 jbyte userID)
273{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000274 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800275 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900276 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800277 jniThrowException(env, "java/lang/IllegalStateException",
278 "Unable to retrieve JetPlayer pointer for queueSegment()");
You Kim8f5691f2012-12-12 05:34:21 +0900279 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800280 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700281
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800282 EAS_RESULT result
283 = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteFlags, userID);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700284 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100285 //ALOGV("android_media_JetPlayer_queueSegment(): segment successfully queued");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800286 return JNI_TRUE;
287 } else {
Steve Block3762c312012-01-06 19:20:56 +0000288 ALOGE("android_media_JetPlayer_queueSegment(): failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 result);
290 return JNI_FALSE;
291 }
292}
293
294
295// ----------------------------------------------------------------------------
296static jboolean
297android_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz,
298 jint segmentNum, jint libNum, jint repeatCount, jint transpose, jbooleanArray muteArray,
299 jbyte userID)
300{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000301 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800302 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900303 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800304 jniThrowException(env, "java/lang/IllegalStateException",
305 "Unable to retrieve JetPlayer pointer for queueSegmentMuteArray()");
You Kim8f5691f2012-12-12 05:34:21 +0900306 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800307 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700308
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800309 EAS_RESULT result=EAS_FAILURE;
310
311 jboolean *muteTracks = NULL;
312 muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
313 if (muteTracks == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000314 ALOGE("android_media_JetPlayer_queueSegment(): failed to read track mute mask.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800315 return JNI_FALSE;
316 }
317
318 EAS_U32 muteMask=0;
319 int maxTracks = lpJet->getMaxTracks();
320 for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
Glenn Kasten18db49a2012-03-12 16:29:55 -0700321 if (muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800322 muteMask = (muteMask << 1) | 0x00000001;
323 else
324 muteMask = muteMask << 1;
325 }
Steve Block71f2cf12011-10-20 11:56:00 +0100326 //ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): FINAL mute mask =0x%08lX", mask);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800327
328 result = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteMask, userID);
329
330 env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700331 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100332 //ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): segment successfully queued");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800333 return JNI_TRUE;
334 } else {
Steve Block3762c312012-01-06 19:20:56 +0000335 ALOGE("android_media_JetPlayer_queueSegmentMuteArray(): failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800336 result);
337 return JNI_FALSE;
338 }
339}
340
341
342// ----------------------------------------------------------------------------
343static jboolean
344android_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz,
345 jint muteFlags /*unsigned?*/, jboolean bSync)
346{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000347 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800348 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900349 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800350 jniThrowException(env, "java/lang/IllegalStateException",
351 "Unable to retrieve JetPlayer pointer for setMuteFlags()");
You Kim8f5691f2012-12-12 05:34:21 +0900352 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800353 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700354
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800355 EAS_RESULT result;
356 result = lpJet->setMuteFlags(muteFlags, bSync==JNI_TRUE ? true : false);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700357 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100358 //ALOGV("android_media_JetPlayer_setMuteFlags(): mute flags successfully updated");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800359 return JNI_TRUE;
360 } else {
Steve Block3762c312012-01-06 19:20:56 +0000361 ALOGE("android_media_JetPlayer_setMuteFlags(): failed with EAS error code %ld", result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800362 return JNI_FALSE;
363 }
364}
365
366
367// ----------------------------------------------------------------------------
368static jboolean
369android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz,
370 jbooleanArray muteArray, jboolean bSync)
371{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000372 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900374 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800375 jniThrowException(env, "java/lang/IllegalStateException",
376 "Unable to retrieve JetPlayer pointer for setMuteArray()");
You Kim8f5691f2012-12-12 05:34:21 +0900377 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800378 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700379
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800380 EAS_RESULT result=EAS_FAILURE;
381
382 jboolean *muteTracks = NULL;
383 muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
384 if (muteTracks == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000385 ALOGE("android_media_JetPlayer_setMuteArray(): failed to read track mute mask.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800386 return JNI_FALSE;
387 }
388
389 EAS_U32 muteMask=0;
390 int maxTracks = lpJet->getMaxTracks();
391 for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
Glenn Kasten18db49a2012-03-12 16:29:55 -0700392 if (muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800393 muteMask = (muteMask << 1) | 0x00000001;
394 else
395 muteMask = muteMask << 1;
396 }
Steve Block71f2cf12011-10-20 11:56:00 +0100397 //ALOGV("android_media_JetPlayer_setMuteArray(): FINAL mute mask =0x%08lX", muteMask);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800398
399 result = lpJet->setMuteFlags(muteMask, bSync==JNI_TRUE ? true : false);
400
401 env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700402 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100403 //ALOGV("android_media_JetPlayer_setMuteArray(): mute flags successfully updated");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 return JNI_TRUE;
405 } else {
Steve Block3762c312012-01-06 19:20:56 +0000406 ALOGE("android_media_JetPlayer_setMuteArray(): \
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800407 failed to update mute flags with EAS error code %ld", result);
408 return JNI_FALSE;
409 }
410}
411
412
413// ----------------------------------------------------------------------------
414static jboolean
415android_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz,
416 jint trackId, jboolean muteFlag, jboolean bSync)
417{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000418 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800419 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900420 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800421 jniThrowException(env, "java/lang/IllegalStateException",
422 "Unable to retrieve JetPlayer pointer for setMuteFlag()");
You Kim8f5691f2012-12-12 05:34:21 +0900423 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800424 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700425
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800426 EAS_RESULT result;
Elliott Hughes69a017b2011-04-08 14:10:28 -0700427 result = lpJet->setMuteFlag(trackId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800428 muteFlag==JNI_TRUE ? true : false, bSync==JNI_TRUE ? true : false);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700429 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100430 //ALOGV("android_media_JetPlayer_setMuteFlag(): mute flag successfully updated for track %d", trackId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800431 return JNI_TRUE;
432 } else {
Steve Block3762c312012-01-06 19:20:56 +0000433 ALOGE("android_media_JetPlayer_setMuteFlag(): failed to update mute flag for track %d with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800434 trackId, result);
435 return JNI_FALSE;
436 }
437}
438
439
440// ----------------------------------------------------------------------------
441static jboolean
442android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId)
443{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000444 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800445 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900446 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800447 jniThrowException(env, "java/lang/IllegalStateException",
448 "Unable to retrieve JetPlayer pointer for triggerClip()");
You Kim8f5691f2012-12-12 05:34:21 +0900449 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800450 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700451
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800452 EAS_RESULT result;
453 result = lpJet->triggerClip(clipId);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700454 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100455 //ALOGV("android_media_JetPlayer_triggerClip(): triggerClip successful for clip %d", clipId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800456 return JNI_TRUE;
457 } else {
Steve Block3762c312012-01-06 19:20:56 +0000458 ALOGE("android_media_JetPlayer_triggerClip(): triggerClip for clip %d failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800459 clipId, result);
460 return JNI_FALSE;
461 }
462}
463
464
465// ----------------------------------------------------------------------------
466static jboolean
467android_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz)
468{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000469 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800470 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900471 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800472 jniThrowException(env, "java/lang/IllegalStateException",
473 "Unable to retrieve JetPlayer pointer for clearQueue()");
You Kim8f5691f2012-12-12 05:34:21 +0900474 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800475 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700476
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800477 EAS_RESULT result = lpJet->clearQueue();
Glenn Kasten18db49a2012-03-12 16:29:55 -0700478 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100479 //ALOGV("android_media_JetPlayer_clearQueue(): clearQueue successful");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800480 return JNI_TRUE;
481 } else {
Steve Block3762c312012-01-06 19:20:56 +0000482 ALOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800483 result);
484 return JNI_FALSE;
485 }
486}
487
488
489// ----------------------------------------------------------------------------
490// ----------------------------------------------------------------------------
Daniel Micay76f6a862015-09-19 17:31:01 -0400491static const JNINativeMethod gMethods[] = {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800492 // name, signature, funcPtr
493 {"native_setup", "(Ljava/lang/Object;II)Z", (void *)android_media_JetPlayer_setup},
494 {"native_finalize", "()V", (void *)android_media_JetPlayer_finalize},
495 {"native_release", "()V", (void *)android_media_JetPlayer_release},
Elliott Hughes69a017b2011-04-08 14:10:28 -0700496 {"native_loadJetFromFile",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800497 "(Ljava/lang/String;)Z", (void *)android_media_JetPlayer_loadFromFile},
498 {"native_loadJetFromFileD", "(Ljava/io/FileDescriptor;JJ)Z",
499 (void *)android_media_JetPlayer_loadFromFileD},
500 {"native_closeJetFile","()Z", (void *)android_media_JetPlayer_closeFile},
501 {"native_playJet", "()Z", (void *)android_media_JetPlayer_play},
502 {"native_pauseJet", "()Z", (void *)android_media_JetPlayer_pause},
Elliott Hughes69a017b2011-04-08 14:10:28 -0700503 {"native_queueJetSegment",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800504 "(IIIIIB)Z", (void *)android_media_JetPlayer_queueSegment},
Elliott Hughes69a017b2011-04-08 14:10:28 -0700505 {"native_queueJetSegmentMuteArray",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800506 "(IIII[ZB)Z", (void *)android_media_JetPlayer_queueSegmentMuteArray},
507 {"native_setMuteFlags","(IZ)Z", (void *)android_media_JetPlayer_setMuteFlags},
508 {"native_setMuteArray","([ZZ)Z", (void *)android_media_JetPlayer_setMuteArray},
509 {"native_setMuteFlag", "(IZZ)Z", (void *)android_media_JetPlayer_setMuteFlag},
510 {"native_triggerClip", "(I)Z", (void *)android_media_JetPlayer_triggerClip},
511 {"native_clearQueue", "()Z", (void *)android_media_JetPlayer_clearQueue},
512};
513
514#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
515#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
516
517
518int register_android_media_JetPlayer(JNIEnv *env)
519{
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800520 javaJetPlayerFields.jetClass = NULL;
521 javaJetPlayerFields.postNativeEventInJava = NULL;
522 javaJetPlayerFields.nativePlayerInJavaObj = NULL;
Elliott Hughes69a017b2011-04-08 14:10:28 -0700523
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800524 // Get the JetPlayer java class
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800525 jclass jetPlayerClass = FindClassOrDie(env, kClassPathName);
526 javaJetPlayerFields.jetClass = MakeGlobalRefOrDie(env, jetPlayerClass);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800527
528 // Get the mNativePlayerInJavaObj variable field
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800529 javaJetPlayerFields.nativePlayerInJavaObj = GetFieldIDOrDie(env,
530 jetPlayerClass, JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800531
532 // Get the callback to post events from this native code to Java
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800533 javaJetPlayerFields.postNativeEventInJava = GetStaticMethodIDOrDie(env,
534 javaJetPlayerFields.jetClass, JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME,
535 "(Ljava/lang/Object;III)V");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800536
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800537 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800538}