19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17e89554b02d65eb87fb502b675b366d41abfa4979Jean-Michel Trivi//#define LOG_NDEBUG 0
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "JET_JNI"
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <jni.h>
26c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <JNIHelp.h>
27c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <android_runtime/AndroidRuntime.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <utils/Log.h>
30c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <media/JetPlayer.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const kClassPathName = "android/media/JetPlayer";
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // these fields provide access from C++ to the...
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass    jetClass;              // JetPlayer java class global ref
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jmethodID postNativeEventInJava; // java method to post events to the Java thread from native
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID  nativePlayerInJavaObj; // stores in Java the native JetPlayer object
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t javaJetPlayerFields;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This function is called from JetPlayer instance's render thread
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectjetPlayerEventCallback(int what, int arg1=0, int arg2=0, void* javaTarget = NULL)
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv *env = AndroidRuntime::getJNIEnv();
5918db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (env) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->CallStaticVoidMethod(
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            javaJetPlayerFields.jetClass, javaJetPlayerFields.postNativeEventInJava,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            javaTarget,
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            what, arg1, arg2);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (env->ExceptionCheck()) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->ExceptionDescribe();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->ExceptionClear();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
693762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("JET jetPlayerEventCallback(): No JNI env for JET event callback, can't post event.");
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint maxTracks, jint trackBufferSize)
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    //ALOGV("android_media_JetPlayer_setup(): entering.");
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer* lpJet = new JetPlayer(env->NewGlobalRef(weak_this), maxTracks, trackBufferSize);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->init();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8718db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
8869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        // save our newly created C++ JetPlayer in the "nativePlayerInJavaObj" field
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // of the Java object (in mNativePlayerInJavaObj)
90075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (jlong)lpJet);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
933762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete lpJet;
95075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        env->SetLongField(weak_this, javaJetPlayerFields.nativePlayerInJavaObj, 0);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_finalize(JNIEnv *env, jobject thiz)
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("android_media_JetPlayer_finalize(): entering.");
106075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
10818db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (lpJet != NULL) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lpJet->release();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete lpJet;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("android_media_JetPlayer_finalize(): exiting.");
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_release(JNIEnv *env, jobject thiz)
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    android_media_JetPlayer_finalize(env, thiz);
122075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, 0);
12371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("android_media_JetPlayer_release() done");
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path)
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
131075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
1338f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for openFile()");
1368f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set up event callback function
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lpJet->setEventCallback(jetPlayerEventCallback);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *pathStr = env->GetStringUTFChars(path, NULL);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pathStr == NULL) {  // Out of memory
1443762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_openFile(): aborting, out of memory");
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("android_media_JetPlayer_openFile(): trying to open %s", pathStr );
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->loadFromFile(pathStr);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(path, pathStr);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15218db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
15371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_openFile(): file successfully opened");
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_openFile(): failed to open file with EAS error %d",
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (int)result);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobject fileDescriptor, jlong offset, jlong length)
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
168075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
1708f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for openFile()");
1738f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set up event callback function
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lpJet->setEventCallback(jetPlayerEventCallback);
17869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
17971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("android_media_JetPlayer_openFileDescr(): trying to load JET file through its fd" );
180a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    EAS_RESULT result = lpJet->loadFromFD(jniGetFDFromFileDescriptor(env, fileDescriptor),
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (long long)offset, (long long)length); // cast params to types used by EAS_FILE
18269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
18318db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
18471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        ALOGV("android_media_JetPlayer_openFileDescr(): file successfully opened");
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1873762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d",
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (int)result);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz)
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
198075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2008f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for closeFile()");
2038f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
20618db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (lpJet->closeFile()==EAS_SUCCESS) {
20771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_closeFile(): file successfully closed");
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2103762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_closeFile(): failed to close file");
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_play(JNIEnv *env, jobject thiz)
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
220075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2228f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for play()");
2258f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->play();
22918db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
23071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_play(): play successful");
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2333762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_play(): failed to play with EAS error code %ld",
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_pause(JNIEnv *env, jobject thiz)
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
244075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2468f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for pause()");
2498f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->pause();
25318db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
25471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_pause(): pause successful");
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
25718db49a46259020387c40fff36d92edc1087a366Glenn Kasten        if (result==EAS_ERROR_QUEUE_IS_EMPTY) {
25871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block            ALOGV("android_media_JetPlayer_pause(): paused with an empty queue");
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return JNI_TRUE;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else
2613762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("android_media_JetPlayer_pause(): failed to pause with EAS error code %ld",
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz,
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint segmentNum, jint libNum, jint repeatCount, jint transpose, jint muteFlags,
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jbyte userID)
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
274075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2768f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for queueSegment()");
2798f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteFlags, userID);
28418db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
28571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_queueSegment(): segment successfully queued");
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2883762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_queueSegment(): failed with EAS error code %ld",
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz,
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint segmentNum, jint libNum, jint repeatCount, jint transpose, jbooleanArray muteArray,
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jbyte userID)
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
301075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
3038f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for queueSegmentMuteArray()");
3068f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result=EAS_FAILURE;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean *muteTracks = NULL;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (muteTracks == NULL) {
3143762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_queueSegment(): failed to read track mute mask.");
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_U32 muteMask=0;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int maxTracks = lpJet->getMaxTracks();
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
32118db49a46259020387c40fff36d92edc1087a366Glenn Kasten        if (muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = (muteMask << 1) | 0x00000001;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = muteMask << 1;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    //ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): FINAL mute mask =0x%08lX", mask);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteMask, userID);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
33118db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
33271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): segment successfully queued");
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3353762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_queueSegmentMuteArray(): failed with EAS error code %ld",
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz,
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         jint muteFlags /*unsigned?*/, jboolean bSync)
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
347075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
3498f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for setMuteFlags()");
3528f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->setMuteFlags(muteFlags, bSync==JNI_TRUE ? true : false);
35718db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
35871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_setMuteFlags(): mute flags successfully updated");
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3613762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_setMuteFlags(): failed with EAS error code %ld", result);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz,
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jbooleanArray muteArray, jboolean bSync)
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
372075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
3748f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for setMuteArray()");
3778f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result=EAS_FAILURE;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean *muteTracks = NULL;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (muteTracks == NULL) {
3853762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_setMuteArray(): failed to read track mute mask.");
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_U32 muteMask=0;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int maxTracks = lpJet->getMaxTracks();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
39218db49a46259020387c40fff36d92edc1087a366Glenn Kasten        if (muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = (muteMask << 1) | 0x00000001;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = muteMask << 1;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    //ALOGV("android_media_JetPlayer_setMuteArray(): FINAL mute mask =0x%08lX", muteMask);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->setMuteFlags(muteMask, bSync==JNI_TRUE ? true : false);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
40218db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
40371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_setMuteArray(): mute flags successfully updated");
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4063762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_setMuteArray(): \
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failed to update mute flags with EAS error code %ld", result);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz,
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         jint trackId, jboolean muteFlag, jboolean bSync)
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
418075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
4208f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for setMuteFlag()");
4238f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result;
42769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    result = lpJet->setMuteFlag(trackId,
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        muteFlag==JNI_TRUE ? true : false, bSync==JNI_TRUE ? true : false);
42918db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
43071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_setMuteFlag(): mute flag successfully updated for track %d", trackId);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4333762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_setMuteFlag(): failed to update mute flag for track %d with EAS error code %ld",
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                trackId, result);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId)
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
444075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
4468f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for triggerClip()");
4498f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->triggerClip(clipId);
45418db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
45571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_triggerClip(): triggerClip successful for clip %d", clipId);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4583762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_triggerClip(): triggerClip for clip %d failed with EAS error code %ld",
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clipId, result);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz)
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
469075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    JetPlayer *lpJet = (JetPlayer *)env->GetLongField(
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
4718f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim    if (lpJet == NULL) {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for clearQueue()");
4748f5691fd92c29c1dbe9e35f39e9550ab525add07You Kim        return JNI_FALSE;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->clearQueue();
47818db49a46259020387c40fff36d92edc1087a366Glenn Kasten    if (result==EAS_SUCCESS) {
47971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block        //ALOGV("android_media_JetPlayer_clearQueue(): clearQueue successful");
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4823762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld",
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // name,               signature,               funcPtr
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setup",       "(Ljava/lang/Object;II)Z", (void *)android_media_JetPlayer_setup},
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_finalize",    "()V",                   (void *)android_media_JetPlayer_finalize},
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_release",     "()V",                   (void *)android_media_JetPlayer_release},
49669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    {"native_loadJetFromFile",
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           "(Ljava/lang/String;)Z", (void *)android_media_JetPlayer_loadFromFile},
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_loadJetFromFileD", "(Ljava/io/FileDescriptor;JJ)Z",
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    (void *)android_media_JetPlayer_loadFromFileD},
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_closeJetFile","()Z",                   (void *)android_media_JetPlayer_closeFile},
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_playJet",     "()Z",                   (void *)android_media_JetPlayer_play},
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_pauseJet",    "()Z",                   (void *)android_media_JetPlayer_pause},
50369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    {"native_queueJetSegment",
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           "(IIIIIB)Z",             (void *)android_media_JetPlayer_queueSegment},
50569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    {"native_queueJetSegmentMuteArray",
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           "(IIII[ZB)Z",     (void *)android_media_JetPlayer_queueSegmentMuteArray},
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setMuteFlags","(IZ)Z",                 (void *)android_media_JetPlayer_setMuteFlags},
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setMuteArray","([ZZ)Z",                (void *)android_media_JetPlayer_setMuteArray},
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setMuteFlag", "(IZZ)Z",                (void *)android_media_JetPlayer_setMuteFlag},
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_triggerClip", "(I)Z",                  (void *)android_media_JetPlayer_triggerClip},
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_clearQueue",  "()Z",                   (void *)android_media_JetPlayer_clearQueue},
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_JetPlayer(JNIEnv *env)
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass jetPlayerClass = NULL;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.jetClass = NULL;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.postNativeEventInJava = NULL;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.nativePlayerInJavaObj = NULL;
52469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get the JetPlayer java class
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jetPlayerClass = env->FindClass(kClassPathName);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (jetPlayerClass == NULL) {
5283762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find %s", kClassPathName);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.jetClass = (jclass)env->NewGlobalRef(jetPlayerClass);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get the mNativePlayerInJavaObj variable field
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.nativePlayerInJavaObj = env->GetFieldID(
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jetPlayerClass,
536075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat            JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (javaJetPlayerFields.nativePlayerInJavaObj == NULL) {
53824c255acc6dc492ee91d0f3a9538f29e1d8977baGlenn Kasten        ALOGE("Can't find JetPlayer.%s", JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME);
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get the callback to post events from this native code to Java
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.postNativeEventInJava = env->GetStaticMethodID(javaJetPlayerFields.jetClass,
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME, "(Ljava/lang/Object;III)V");
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (javaJetPlayerFields.postNativeEventInJava == NULL) {
5463762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find Jet.%s", JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kClassPathName, gMethods, NELEM(gMethods));
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
553