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
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#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();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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 {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("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{
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //LOGV("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
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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)
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (int)lpJet);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete lpJet;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntField(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{
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("android_media_JetPlayer_finalize(): entering.");
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("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);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, 0);
12369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    LOGV("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{
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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()");
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set up event callback function
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lpJet->setEventCallback(jetPlayerEventCallback);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *pathStr = env->GetStringUTFChars(path, NULL);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pathStr == NULL) {  // Out of memory
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_openFile(): aborting, out of memory");
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("android_media_JetPlayer_openFile(): trying to open %s", pathStr );
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->loadFromFile(pathStr);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(path, pathStr);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_openFile(): file successfully opened");
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_openFile(): failed to open file with EAS error %d",
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (int)result);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobject fileDescriptor, jlong offset, jlong length)
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for openFile()");
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set up event callback function
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lpJet->setEventCallback(jetPlayerEventCallback);
17669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("android_media_JetPlayer_openFileDescr(): trying to load JET file through its fd" );
178a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    EAS_RESULT result = lpJet->loadFromFD(jniGetFDFromFileDescriptor(env, fileDescriptor),
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (long long)offset, (long long)length); // cast params to types used by EAS_FILE
18069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGV("android_media_JetPlayer_openFileDescr(): file successfully opened");
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d",
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (int)result);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz)
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for closeFile()");
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if( lpJet->closeFile()==EAS_SUCCESS) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_closeFile(): file successfully closed");
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_closeFile(): failed to close file");
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_play(JNIEnv *env, jobject thiz)
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for play()");
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->play();
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if( result==EAS_SUCCESS) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_play(): play successful");
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
22969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        LOGE("android_media_JetPlayer_play(): failed to play with EAS error code %ld",
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_pause(JNIEnv *env, jobject thiz)
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for pause()");
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->pause();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if( result==EAS_SUCCESS) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_pause(): pause successful");
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(result==EAS_ERROR_QUEUE_IS_EMPTY) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGV("android_media_JetPlayer_pause(): paused with an empty queue");
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return JNI_TRUE;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("android_media_JetPlayer_pause(): failed to pause with EAS error code %ld",
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz,
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint segmentNum, jint libNum, jint repeatCount, jint transpose, jint muteFlags,
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jbyte userID)
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for queueSegment()");
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteFlags, userID);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_queueSegment(): segment successfully queued");
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_queueSegment(): failed with EAS error code %ld",
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz,
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint segmentNum, jint libNum, jint repeatCount, jint transpose, jbooleanArray muteArray,
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jbyte userID)
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for queueSegmentMuteArray()");
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result=EAS_FAILURE;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean *muteTracks = NULL;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (muteTracks == NULL) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_queueSegment(): failed to read track mute mask.");
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_U32 muteMask=0;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int maxTracks = lpJet->getMaxTracks();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = (muteMask << 1) | 0x00000001;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = muteMask << 1;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //LOGV("android_media_JetPlayer_queueSegmentMuteArray(): FINAL mute mask =0x%08lX", mask);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->queueSegment(segmentNum, libNum, repeatCount, transpose, muteMask, userID);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_queueSegmentMuteArray(): segment successfully queued");
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
32869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        LOGE("android_media_JetPlayer_queueSegmentMuteArray(): failed with EAS error code %ld",
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz,
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         jint muteFlags /*unsigned?*/, jboolean bSync)
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for setMuteFlags()");
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->setMuteFlags(muteFlags, bSync==JNI_TRUE ? true : false);
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_setMuteFlags(): mute flags successfully updated");
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_setMuteFlags(): failed with EAS error code %ld", result);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz,
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jbooleanArray muteArray, jboolean bSync)
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for setMuteArray()");
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result=EAS_FAILURE;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean *muteTracks = NULL;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (muteTracks == NULL) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_setMuteArray(): failed to read track mute mask.");
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_U32 muteMask=0;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int maxTracks = lpJet->getMaxTracks();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jint trackIndex=0; trackIndex<maxTracks; trackIndex++) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(muteTracks[maxTracks-1-trackIndex]==JNI_TRUE)
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = (muteMask << 1) | 0x00000001;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            muteMask = muteMask << 1;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //LOGV("android_media_JetPlayer_setMuteArray(): FINAL mute mask =0x%08lX", muteMask);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->setMuteFlags(muteMask, bSync==JNI_TRUE ? true : false);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseBooleanArrayElements(muteArray, muteTracks, 0);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_setMuteArray(): mute flags successfully updated");
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_setMuteArray(): \
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failed to update mute flags with EAS error code %ld", result);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz,
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         jint trackId, jboolean muteFlag, jboolean bSync)
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for setMuteFlag()");
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result;
41769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    result = lpJet->setMuteFlag(trackId,
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        muteFlag==JNI_TRUE ? true : false, bSync==JNI_TRUE ? true : false);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_setMuteFlag(): mute flag successfully updated for track %d", trackId);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_setMuteFlag(): failed to update mute flag for track %d with EAS error code %ld",
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                trackId, result);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId)
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for triggerClip()");
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = lpJet->triggerClip(clipId);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_triggerClip(): triggerClip successful for clip %d", clipId);
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_triggerClip(): triggerClip for clip %d failed with EAS error code %ld",
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clipId, result);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz)
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JetPlayer *lpJet = (JetPlayer *)env->GetIntField(
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thiz, javaJetPlayerFields.nativePlayerInJavaObj);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (lpJet == NULL ) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException",
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Unable to retrieve JetPlayer pointer for clearQueue()");
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EAS_RESULT result = lpJet->clearQueue();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(result==EAS_SUCCESS) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGV("android_media_JetPlayer_clearQueue(): clearQueue successful");
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld",
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // name,               signature,               funcPtr
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setup",       "(Ljava/lang/Object;II)Z", (void *)android_media_JetPlayer_setup},
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_finalize",    "()V",                   (void *)android_media_JetPlayer_finalize},
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_release",     "()V",                   (void *)android_media_JetPlayer_release},
48469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    {"native_loadJetFromFile",
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           "(Ljava/lang/String;)Z", (void *)android_media_JetPlayer_loadFromFile},
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_loadJetFromFileD", "(Ljava/io/FileDescriptor;JJ)Z",
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    (void *)android_media_JetPlayer_loadFromFileD},
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_closeJetFile","()Z",                   (void *)android_media_JetPlayer_closeFile},
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_playJet",     "()Z",                   (void *)android_media_JetPlayer_play},
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_pauseJet",    "()Z",                   (void *)android_media_JetPlayer_pause},
49169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    {"native_queueJetSegment",
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           "(IIIIIB)Z",             (void *)android_media_JetPlayer_queueSegment},
49369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    {"native_queueJetSegmentMuteArray",
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           "(IIII[ZB)Z",     (void *)android_media_JetPlayer_queueSegmentMuteArray},
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setMuteFlags","(IZ)Z",                 (void *)android_media_JetPlayer_setMuteFlags},
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setMuteArray","([ZZ)Z",                (void *)android_media_JetPlayer_setMuteArray},
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setMuteFlag", "(IZZ)Z",                (void *)android_media_JetPlayer_setMuteFlag},
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_triggerClip", "(I)Z",                  (void *)android_media_JetPlayer_triggerClip},
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_clearQueue",  "()Z",                   (void *)android_media_JetPlayer_clearQueue},
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_JetPlayer(JNIEnv *env)
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass jetPlayerClass = NULL;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.jetClass = NULL;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.postNativeEventInJava = NULL;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.nativePlayerInJavaObj = NULL;
51269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get the JetPlayer java class
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jetPlayerClass = env->FindClass(kClassPathName);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (jetPlayerClass == NULL) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find %s", kClassPathName);
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.jetClass = (jclass)env->NewGlobalRef(jetPlayerClass);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get the mNativePlayerInJavaObj variable field
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.nativePlayerInJavaObj = env->GetFieldID(
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jetPlayerClass,
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "I");
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (javaJetPlayerFields.nativePlayerInJavaObj == NULL) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find AudioTrack.%s", JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get the callback to post events from this native code to Java
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    javaJetPlayerFields.postNativeEventInJava = env->GetStaticMethodID(javaJetPlayerFields.jetClass,
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME, "(Ljava/lang/Object;III)V");
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (javaJetPlayerFields.postNativeEventInJava == NULL) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find Jet.%s", JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kClassPathName, gMethods, NELEM(gMethods));
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
541