blob: 10a5b586c2b9c30f0c831b82c2c562fcd17c6474 [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>
Orion Hodson329c6122020-06-02 13:22:06 +010026#include <nativehelper/JNIPlatformHelp.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>
Marco Nelissen5ff11732019-10-17 08:55:52 -070030#include "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
Orion Hodson2a822ea2021-02-22 11:57:16 +000046static fields_t javaJetPlayerFields {};
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047
Orion Hodson2a822ea2021-02-22 11:57:16 +000048#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
49#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
50
51static void initializeJavaIDs(JNIEnv* env) {
52 static std::once_flag sJniInitialized;
53
54 std::call_once(sJniInitialized, [](JNIEnv* env) {
55 // Get the JetPlayer java class
56 jclass jetPlayerClass = FindClassOrDie(env, kClassPathName);
57 javaJetPlayerFields.jetClass = MakeGlobalRefOrDie(env, jetPlayerClass);
58
59 // Get the mNativePlayerInJavaObj variable field
60 javaJetPlayerFields.nativePlayerInJavaObj =
61 GetFieldIDOrDie(env, jetPlayerClass, JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
62
63 // Get the callback to post events from this native code to Java
64 javaJetPlayerFields.postNativeEventInJava = GetStaticMethodIDOrDie(env,
65 javaJetPlayerFields.jetClass, JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME,
66 "(Ljava/lang/Object;III)V");
67 }, env);
68}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080069
70// ----------------------------------------------------------------------------
71// ----------------------------------------------------------------------------
72
Orion Hodson2a822ea2021-02-22 11:57:16 +000073
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074/*
75 * This function is called from JetPlayer instance's render thread
76 */
77static void
78jetPlayerEventCallback(int what, int arg1=0, int arg2=0, void* javaTarget = NULL)
79{
80 JNIEnv *env = AndroidRuntime::getJNIEnv();
Glenn Kasten18db49a2012-03-12 16:29:55 -070081 if (env) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082 env->CallStaticVoidMethod(
83 javaJetPlayerFields.jetClass, javaJetPlayerFields.postNativeEventInJava,
84 javaTarget,
85 what, arg1, arg2);
86 if (env->ExceptionCheck()) {
87 env->ExceptionDescribe();
88 env->ExceptionClear();
89 }
90 } else {
Steve Block3762c312012-01-06 19:20:56 +000091 ALOGE("JET jetPlayerEventCallback(): No JNI env for JET event callback, can't post event.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 return;
93 }
94}
95
96
97// ----------------------------------------------------------------------------
98// ----------------------------------------------------------------------------
99
100static jboolean
101android_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this,
102 jint maxTracks, jint trackBufferSize)
103{
Orion Hodson2a822ea2021-02-22 11:57:16 +0000104 initializeJavaIDs(env);
105
Steve Block71f2cf12011-10-20 11:56:00 +0100106 //ALOGV("android_media_JetPlayer_setup(): entering.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800107 JetPlayer* lpJet = new JetPlayer(env->NewGlobalRef(weak_this), maxTracks, trackBufferSize);
108
109 EAS_RESULT result = lpJet->init();
110
Glenn Kasten18db49a2012-03-12 16:29:55 -0700111 if (result==EAS_SUCCESS) {
Elliott Hughes69a017b2011-04-08 14:10:28 -0700112 // save our newly created C++ JetPlayer in the "nativePlayerInJavaObj" field
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800113 // of the Java object (in mNativePlayerInJavaObj)
Ashok Bhat075e9a12014-01-06 13:45:09 +0000114 env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (jlong)lpJet);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800115 return JNI_TRUE;
116 } else {
Steve Block3762c312012-01-06 19:20:56 +0000117 ALOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800118 delete lpJet;
Ashok Bhat075e9a12014-01-06 13:45:09 +0000119 env->SetLongField(weak_this, javaJetPlayerFields.nativePlayerInJavaObj, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120 return JNI_FALSE;
121 }
122}
123
124
125// ----------------------------------------------------------------------------
126static void
127android_media_JetPlayer_finalize(JNIEnv *env, jobject thiz)
128{
Steve Block71f2cf12011-10-20 11:56:00 +0100129 ALOGV("android_media_JetPlayer_finalize(): entering.");
Ashok Bhat075e9a12014-01-06 13:45:09 +0000130 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800131 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700132 if (lpJet != NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800133 lpJet->release();
134 delete lpJet;
135 }
136
Steve Block71f2cf12011-10-20 11:56:00 +0100137 ALOGV("android_media_JetPlayer_finalize(): exiting.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138}
139
140
141// ----------------------------------------------------------------------------
142static void
143android_media_JetPlayer_release(JNIEnv *env, jobject thiz)
144{
145 android_media_JetPlayer_finalize(env, thiz);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000146 env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, 0);
Steve Block71f2cf12011-10-20 11:56:00 +0100147 ALOGV("android_media_JetPlayer_release() done");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800148}
149
150
151// ----------------------------------------------------------------------------
152static jboolean
153android_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path)
154{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000155 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800156 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900157 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 jniThrowException(env, "java/lang/IllegalStateException",
159 "Unable to retrieve JetPlayer pointer for openFile()");
You Kim8f5691f2012-12-12 05:34:21 +0900160 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700162
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800163 // set up event callback function
164 lpJet->setEventCallback(jetPlayerEventCallback);
165
166 const char *pathStr = env->GetStringUTFChars(path, NULL);
167 if (pathStr == NULL) { // Out of memory
Steve Block3762c312012-01-06 19:20:56 +0000168 ALOGE("android_media_JetPlayer_openFile(): aborting, out of memory");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800169 return JNI_FALSE;
170 }
171
Steve Block71f2cf12011-10-20 11:56:00 +0100172 ALOGV("android_media_JetPlayer_openFile(): trying to open %s", pathStr );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800173 EAS_RESULT result = lpJet->loadFromFile(pathStr);
174 env->ReleaseStringUTFChars(path, pathStr);
175
Glenn Kasten18db49a2012-03-12 16:29:55 -0700176 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100177 //ALOGV("android_media_JetPlayer_openFile(): file successfully opened");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800178 return JNI_TRUE;
179 } else {
Steve Block3762c312012-01-06 19:20:56 +0000180 ALOGE("android_media_JetPlayer_openFile(): failed to open file with EAS error %d",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181 (int)result);
182 return JNI_FALSE;
183 }
184}
185
186
187// ----------------------------------------------------------------------------
188static jboolean
189android_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz,
190 jobject fileDescriptor, jlong offset, jlong length)
191{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000192 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800193 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900194 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 jniThrowException(env, "java/lang/IllegalStateException",
196 "Unable to retrieve JetPlayer pointer for openFile()");
You Kim8f5691f2012-12-12 05:34:21 +0900197 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800198 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700199
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800200 // set up event callback function
201 lpJet->setEventCallback(jetPlayerEventCallback);
Elliott Hughes69a017b2011-04-08 14:10:28 -0700202
Steve Block71f2cf12011-10-20 11:56:00 +0100203 ALOGV("android_media_JetPlayer_openFileDescr(): trying to load JET file through its fd" );
Elliott Hughesa3804cf2011-04-11 16:50:19 -0700204 EAS_RESULT result = lpJet->loadFromFD(jniGetFDFromFileDescriptor(env, fileDescriptor),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800205 (long long)offset, (long long)length); // cast params to types used by EAS_FILE
Elliott Hughes69a017b2011-04-08 14:10:28 -0700206
Glenn Kasten18db49a2012-03-12 16:29:55 -0700207 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100208 ALOGV("android_media_JetPlayer_openFileDescr(): file successfully opened");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800209 return JNI_TRUE;
210 } else {
Steve Block3762c312012-01-06 19:20:56 +0000211 ALOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800212 (int)result);
213 return JNI_FALSE;
214 }
215}
216
217
218// ----------------------------------------------------------------------------
219static jboolean
220android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz)
221{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000222 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800223 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900224 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800225 jniThrowException(env, "java/lang/IllegalStateException",
226 "Unable to retrieve JetPlayer pointer for closeFile()");
You Kim8f5691f2012-12-12 05:34:21 +0900227 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800228 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700229
Glenn Kasten18db49a2012-03-12 16:29:55 -0700230 if (lpJet->closeFile()==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100231 //ALOGV("android_media_JetPlayer_closeFile(): file successfully closed");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800232 return JNI_TRUE;
233 } else {
Steve Block3762c312012-01-06 19:20:56 +0000234 ALOGE("android_media_JetPlayer_closeFile(): failed to close file");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800235 return JNI_FALSE;
236 }
237}
238
239
240// ----------------------------------------------------------------------------
241static jboolean
242android_media_JetPlayer_play(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 play()");
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->play();
Glenn Kasten18db49a2012-03-12 16:29:55 -0700253 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100254 //ALOGV("android_media_JetPlayer_play(): play successful");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800255 return JNI_TRUE;
256 } else {
Steve Block3762c312012-01-06 19:20:56 +0000257 ALOGE("android_media_JetPlayer_play(): failed to play with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800258 result);
259 return JNI_FALSE;
260 }
261}
262
263
264// ----------------------------------------------------------------------------
265static jboolean
266android_media_JetPlayer_pause(JNIEnv *env, jobject thiz)
267{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000268 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800269 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900270 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800271 jniThrowException(env, "java/lang/IllegalStateException",
272 "Unable to retrieve JetPlayer pointer for pause()");
You Kim8f5691f2012-12-12 05:34:21 +0900273 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800274 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700275
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800276 EAS_RESULT result = lpJet->pause();
Glenn Kasten18db49a2012-03-12 16:29:55 -0700277 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100278 //ALOGV("android_media_JetPlayer_pause(): pause successful");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800279 return JNI_TRUE;
280 } else {
Glenn Kasten18db49a2012-03-12 16:29:55 -0700281 if (result==EAS_ERROR_QUEUE_IS_EMPTY) {
Steve Block71f2cf12011-10-20 11:56:00 +0100282 ALOGV("android_media_JetPlayer_pause(): paused with an empty queue");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800283 return JNI_TRUE;
284 } else
Steve Block3762c312012-01-06 19:20:56 +0000285 ALOGE("android_media_JetPlayer_pause(): failed to pause with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800286 result);
287 return JNI_FALSE;
288 }
289}
290
291
292// ----------------------------------------------------------------------------
293static jboolean
294android_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz,
295 jint segmentNum, jint libNum, jint repeatCount, jint transpose, jint muteFlags,
296 jbyte userID)
297{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000298 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800299 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900300 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800301 jniThrowException(env, "java/lang/IllegalStateException",
302 "Unable to retrieve JetPlayer pointer for queueSegment()");
You Kim8f5691f2012-12-12 05:34:21 +0900303 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800304 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700305
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800306 EAS_RESULT result
307 = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteFlags, userID);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700308 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100309 //ALOGV("android_media_JetPlayer_queueSegment(): segment successfully queued");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800310 return JNI_TRUE;
311 } else {
Steve Block3762c312012-01-06 19:20:56 +0000312 ALOGE("android_media_JetPlayer_queueSegment(): failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800313 result);
314 return JNI_FALSE;
315 }
316}
317
318
319// ----------------------------------------------------------------------------
320static jboolean
321android_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz,
322 jint segmentNum, jint libNum, jint repeatCount, jint transpose, jbooleanArray muteArray,
323 jbyte userID)
324{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000325 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800326 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900327 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800328 jniThrowException(env, "java/lang/IllegalStateException",
329 "Unable to retrieve JetPlayer pointer for queueSegmentMuteArray()");
You Kim8f5691f2012-12-12 05:34:21 +0900330 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800331 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700332
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800333 EAS_RESULT result=EAS_FAILURE;
334
335 jboolean *muteTracks = NULL;
336 muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
337 if (muteTracks == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000338 ALOGE("android_media_JetPlayer_queueSegment(): failed to read track mute mask.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800339 return JNI_FALSE;
340 }
341
342 EAS_U32 muteMask=0;
343 int maxTracks = lpJet->getMaxTracks();
344 for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
Glenn Kasten18db49a2012-03-12 16:29:55 -0700345 if (muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800346 muteMask = (muteMask << 1) | 0x00000001;
347 else
348 muteMask = muteMask << 1;
349 }
Steve Block71f2cf12011-10-20 11:56:00 +0100350 //ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): FINAL mute mask =0x%08lX", mask);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351
352 result = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteMask, userID);
353
354 env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700355 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100356 //ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): segment successfully queued");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800357 return JNI_TRUE;
358 } else {
Steve Block3762c312012-01-06 19:20:56 +0000359 ALOGE("android_media_JetPlayer_queueSegmentMuteArray(): failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800360 result);
361 return JNI_FALSE;
362 }
363}
364
365
366// ----------------------------------------------------------------------------
367static jboolean
368android_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz,
369 jint muteFlags /*unsigned?*/, jboolean bSync)
370{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000371 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800372 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900373 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800374 jniThrowException(env, "java/lang/IllegalStateException",
375 "Unable to retrieve JetPlayer pointer for setMuteFlags()");
You Kim8f5691f2012-12-12 05:34:21 +0900376 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800377 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700378
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800379 EAS_RESULT result;
380 result = lpJet->setMuteFlags(muteFlags, bSync==JNI_TRUE ? true : false);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700381 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100382 //ALOGV("android_media_JetPlayer_setMuteFlags(): mute flags successfully updated");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800383 return JNI_TRUE;
384 } else {
Steve Block3762c312012-01-06 19:20:56 +0000385 ALOGE("android_media_JetPlayer_setMuteFlags(): failed with EAS error code %ld", result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800386 return JNI_FALSE;
387 }
388}
389
390
391// ----------------------------------------------------------------------------
392static jboolean
393android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz,
394 jbooleanArray muteArray, jboolean bSync)
395{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000396 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800397 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900398 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800399 jniThrowException(env, "java/lang/IllegalStateException",
400 "Unable to retrieve JetPlayer pointer for setMuteArray()");
You Kim8f5691f2012-12-12 05:34:21 +0900401 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800402 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700403
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 EAS_RESULT result=EAS_FAILURE;
405
406 jboolean *muteTracks = NULL;
407 muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
408 if (muteTracks == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000409 ALOGE("android_media_JetPlayer_setMuteArray(): failed to read track mute mask.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800410 return JNI_FALSE;
411 }
412
413 EAS_U32 muteMask=0;
414 int maxTracks = lpJet->getMaxTracks();
415 for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
Glenn Kasten18db49a2012-03-12 16:29:55 -0700416 if (muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800417 muteMask = (muteMask << 1) | 0x00000001;
418 else
419 muteMask = muteMask << 1;
420 }
Steve Block71f2cf12011-10-20 11:56:00 +0100421 //ALOGV("android_media_JetPlayer_setMuteArray(): FINAL mute mask =0x%08lX", muteMask);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800422
423 result = lpJet->setMuteFlags(muteMask, bSync==JNI_TRUE ? true : false);
424
425 env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700426 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100427 //ALOGV("android_media_JetPlayer_setMuteArray(): mute flags successfully updated");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800428 return JNI_TRUE;
429 } else {
Steve Block3762c312012-01-06 19:20:56 +0000430 ALOGE("android_media_JetPlayer_setMuteArray(): \
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800431 failed to update mute flags with EAS error code %ld", result);
432 return JNI_FALSE;
433 }
434}
435
436
437// ----------------------------------------------------------------------------
438static jboolean
439android_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz,
440 jint trackId, jboolean muteFlag, jboolean bSync)
441{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000442 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800443 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900444 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800445 jniThrowException(env, "java/lang/IllegalStateException",
446 "Unable to retrieve JetPlayer pointer for setMuteFlag()");
You Kim8f5691f2012-12-12 05:34:21 +0900447 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800448 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700449
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800450 EAS_RESULT result;
Elliott Hughes69a017b2011-04-08 14:10:28 -0700451 result = lpJet->setMuteFlag(trackId,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800452 muteFlag==JNI_TRUE ? true : false, bSync==JNI_TRUE ? true : false);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700453 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100454 //ALOGV("android_media_JetPlayer_setMuteFlag(): mute flag successfully updated for track %d", trackId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800455 return JNI_TRUE;
456 } else {
Steve Block3762c312012-01-06 19:20:56 +0000457 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 -0800458 trackId, result);
459 return JNI_FALSE;
460 }
461}
462
463
464// ----------------------------------------------------------------------------
465static jboolean
466android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId)
467{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000468 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800469 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900470 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800471 jniThrowException(env, "java/lang/IllegalStateException",
472 "Unable to retrieve JetPlayer pointer for triggerClip()");
You Kim8f5691f2012-12-12 05:34:21 +0900473 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800474 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700475
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800476 EAS_RESULT result;
477 result = lpJet->triggerClip(clipId);
Glenn Kasten18db49a2012-03-12 16:29:55 -0700478 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100479 //ALOGV("android_media_JetPlayer_triggerClip(): triggerClip successful for clip %d", clipId);
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_triggerClip(): triggerClip for clip %d failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800483 clipId, result);
484 return JNI_FALSE;
485 }
486}
487
488
489// ----------------------------------------------------------------------------
490static jboolean
491android_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz)
492{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000493 JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800494 thiz, javaJetPlayerFields.nativePlayerInJavaObj);
You Kim8f5691f2012-12-12 05:34:21 +0900495 if (lpJet == NULL) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800496 jniThrowException(env, "java/lang/IllegalStateException",
497 "Unable to retrieve JetPlayer pointer for clearQueue()");
You Kim8f5691f2012-12-12 05:34:21 +0900498 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800499 }
Elliott Hughes69a017b2011-04-08 14:10:28 -0700500
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800501 EAS_RESULT result = lpJet->clearQueue();
Glenn Kasten18db49a2012-03-12 16:29:55 -0700502 if (result==EAS_SUCCESS) {
Steve Block71f2cf12011-10-20 11:56:00 +0100503 //ALOGV("android_media_JetPlayer_clearQueue(): clearQueue successful");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800504 return JNI_TRUE;
505 } else {
Steve Block3762c312012-01-06 19:20:56 +0000506 ALOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800507 result);
508 return JNI_FALSE;
509 }
510}
511
512
513// ----------------------------------------------------------------------------
514// ----------------------------------------------------------------------------
Daniel Micay76f6a862015-09-19 17:31:01 -0400515static const JNINativeMethod gMethods[] = {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800516 // name, signature, funcPtr
517 {"native_setup", "(Ljava/lang/Object;II)Z", (void *)android_media_JetPlayer_setup},
518 {"native_finalize", "()V", (void *)android_media_JetPlayer_finalize},
519 {"native_release", "()V", (void *)android_media_JetPlayer_release},
Elliott Hughes69a017b2011-04-08 14:10:28 -0700520 {"native_loadJetFromFile",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800521 "(Ljava/lang/String;)Z", (void *)android_media_JetPlayer_loadFromFile},
522 {"native_loadJetFromFileD", "(Ljava/io/FileDescriptor;JJ)Z",
523 (void *)android_media_JetPlayer_loadFromFileD},
524 {"native_closeJetFile","()Z", (void *)android_media_JetPlayer_closeFile},
525 {"native_playJet", "()Z", (void *)android_media_JetPlayer_play},
526 {"native_pauseJet", "()Z", (void *)android_media_JetPlayer_pause},
Elliott Hughes69a017b2011-04-08 14:10:28 -0700527 {"native_queueJetSegment",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800528 "(IIIIIB)Z", (void *)android_media_JetPlayer_queueSegment},
Elliott Hughes69a017b2011-04-08 14:10:28 -0700529 {"native_queueJetSegmentMuteArray",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800530 "(IIII[ZB)Z", (void *)android_media_JetPlayer_queueSegmentMuteArray},
531 {"native_setMuteFlags","(IZ)Z", (void *)android_media_JetPlayer_setMuteFlags},
532 {"native_setMuteArray","([ZZ)Z", (void *)android_media_JetPlayer_setMuteArray},
533 {"native_setMuteFlag", "(IZZ)Z", (void *)android_media_JetPlayer_setMuteFlag},
534 {"native_triggerClip", "(I)Z", (void *)android_media_JetPlayer_triggerClip},
535 {"native_clearQueue", "()Z", (void *)android_media_JetPlayer_clearQueue},
536};
537
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800538
539
540int register_android_media_JetPlayer(JNIEnv *env)
541{
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800542 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800543}