android_media_MediaPlayer.cpp revision c371a02e7cf504e9a926ca29c33e63b658c2cef7
1b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala/*
2b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala**
3b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** Copyright 2007, The Android Open Source Project
4b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala**
5b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** Licensed under the Apache License, Version 2.0 (the "License");
6b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** you may not use this file except in compliance with the License.
7b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** You may obtain a copy of the License at
8b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala**
9b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala**     http://www.apache.org/licenses/LICENSE-2.0
10b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala**
11b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** Unless required by applicable law or agreed to in writing, software
12b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** distributed under the License is distributed on an "AS IS" BASIS,
13b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** See the License for the specific language governing permissions and
15b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala** limitations under the License.
16b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala*/
172f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvala
18b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala//#define LOG_NDEBUG 0
1970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#define LOG_TAG "MediaPlayer-JNI"
2070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#include "utils/Log.h"
2170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
22b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <media/mediaplayer.h>
23b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <media/MediaPlayerInterface.h>
2470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#include <stdio.h>
256bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin#include <assert.h>
26b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <limits.h>
27b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <unistd.h>
28b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <fcntl.h>
2970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include <utils/threads.h>
3070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include "jni.h"
31b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include "JNIHelp.h"
32b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include "android_runtime/AndroidRuntime.h"
3370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include "utils/Errors.h"  // for status_t
3470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include "utils/KeyedVector.h"
3570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include "utils/String8.h"
36b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include "android_util_Binder.h"
3770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include <binder/Parcel.h>
3870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include <gui/SurfaceTexture.h>
39b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <gui/ISurfaceTexture.h>
40b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <surfaceflinger/Surface.h>
41b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <binder/IPCThreadState.h>
42b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala#include <binder/IServiceManager.h>
43b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
44b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala// ----------------------------------------------------------------------------
45b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
4670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalausing namespace android;
4770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
48b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala// ----------------------------------------------------------------------------
49b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
50b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvalastruct fields_t {
51b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    jfieldID    context;
52b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    jfieldID    surface;
53b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    jfieldID    surfaceTexture;
54b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    /* actually in android.view.Surface XXX */
55b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    jfieldID    surface_native;
5670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // actually in android.graphics.SurfaceTexture
57b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    jfieldID    surfaceTexture_native;
5870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
5970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    jmethodID   post_event;
6070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala};
6170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalastatic fields_t fields;
6270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
634068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvalastatic Mutex sLock;
64b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
65b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala// ----------------------------------------------------------------------------
666bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin// ref-counted object for callbacks
676bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkinclass JNIMediaPlayerListener: public MediaPlayerListener
686bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin{
6970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinpublic:
706bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz);
7170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    ~JNIMediaPlayerListener();
7270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    void notify(int msg, int ext1, int ext2);
73b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvalaprivate:
74b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    JNIMediaPlayerListener();
75b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    jclass      mClass;     // Reference to MediaPlayer class
766bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    jobject     mObject;    // Weak ref to MediaPlayer Java object to call on
776bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin};
786bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin
79b2675542c2f414154125b534767ae0903fba581eEino-Ville TalvalaJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz)
806bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin{
8170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
8270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // Hold onto the MediaPlayer class for use in calling the static method
8370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // that posts events to the application thread.
847b01c5c4d27ebbd739d9e5e0de7eaafbffd8e084Eino-Ville Talvala    jclass clazz = env->GetObjectClass(thiz);
85b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    if (clazz == NULL) {
86b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        LOGE("Can't find android/media/MediaPlayer");
87b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        jniThrowException(env, "java/lang/Exception", NULL);
886bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin        return;
896bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    }
906bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    mClass = (jclass)env->NewGlobalRef(clazz);
91b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
9270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // We use a weak reference so the MediaPlayer object can be garbage collected.
9370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // The reference is only used as a proxy for callbacks.
9470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    mObject  = env->NewGlobalRef(weak_thiz);
9570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin}
9670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
976bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor MurashkinJNIMediaPlayerListener::~JNIMediaPlayerListener()
9870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala{
9970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // remove global references
10070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    JNIEnv *env = AndroidRuntime::getJNIEnv();
1014068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala    env->DeleteGlobalRef(mObject);
1024068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala    env->DeleteGlobalRef(mClass);
1034068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala}
1044068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala
1054068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvalavoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2)
1064068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala{
1074068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala    JNIEnv *env = AndroidRuntime::getJNIEnv();
1084068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala    env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, 0);
1094af73c2153747d0624ccc75dfa001cb91982957fEino-Ville Talvala}
1104068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala
1114068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala// ----------------------------------------------------------------------------
1124068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala
1134068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvalastatic Surface* get_surface(JNIEnv* env, jobject clazz)
11470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala{
1154068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala    return (Surface*)env->GetIntField(clazz, fields.surface_native);
1164068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala}
11770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
1184068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvalasp<ISurfaceTexture> getSurfaceTexture(JNIEnv* env, jobject clazz)
1194068388beea728bbf9f321b0b5b5c52ce4ab3d06Eino-Ville Talvala{
1206bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    sp<ISurfaceTexture> surfaceTexture(
1216bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin        (ISurfaceTexture*)env->GetIntField(clazz, fields.surfaceTexture_native));
1226bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    return surfaceTexture;
1236bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin}
1246bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin
1256bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkinstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
1266bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin{
1276bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    Mutex::Autolock l(sLock);
1286bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    MediaPlayer* const p = (MediaPlayer*)env->GetIntField(thiz, fields.context);
1296bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    return sp<MediaPlayer>(p);
1306bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin}
1316bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin
1326bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkinstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player)
1336bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin{
1346bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    Mutex::Autolock l(sLock);
1356bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    sp<MediaPlayer> old = (MediaPlayer*)env->GetIntField(thiz, fields.context);
1366bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    if (player.get()) {
1376bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin        player->incStrong(thiz);
1386bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    }
1396bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    if (old != 0) {
1406bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin        old->decStrong(thiz);
1416bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    }
1426bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    env->SetIntField(thiz, fields.context, (int)player.get());
1436bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin    return old;
1446bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin}
1456bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin
1466bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin// If exception is NULL and opStatus is not OK, this method sends an error
1476bbf9dc5ae7ebc85991dcfe3e18e837b12d3f333Igor Murashkin// event to the client application; otherwise, if exception is not NULL and
14870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin// opStatus is not OK, this method throws the given exception to the client
14970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin// application.
15070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message)
15170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin{
15270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    if (exception == NULL) {  // Don't throw exception. Instead, send an event.
15370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        if (opStatus != (status_t) OK) {
15470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
15570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0);
15670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
15770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    } else {  // Throw exception!
15870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        if ( opStatus == (status_t) INVALID_OPERATION ) {
15970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            jniThrowException(env, "java/lang/IllegalStateException", NULL);
16070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        } else if ( opStatus != (status_t) OK ) {
16170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            if (strlen(message) > 230) {
16270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin               // if the message is too long, don't bother displaying the status code
16370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin               jniThrowException( env, exception, message);
16470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            } else {
16570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin               char msg[256];
16670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala                // append the status code to the message
16770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala               sprintf(msg, "%s: status=0x%X", message, opStatus);
16870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala               jniThrowException( env, exception, msg);
16970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            }
17070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
17170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
17270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin}
17370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
17470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinstatic void
17570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalaandroid_media_MediaPlayer_setDataSourceAndHeaders(
17670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        JNIEnv *env, jobject thiz, jstring path, jobject headers) {
17770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
17870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    if (mp == NULL ) {
17970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
18070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        return;
18170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    }
18270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
18370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    if (path == NULL) {
18470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
18570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        return;
18670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
18770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
18870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    const char *tmp = env->GetStringUTFChars(path, NULL);
18970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    if (tmp == NULL) {  // Out of memory
19070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        return;
19170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    }
19270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
19370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    String8 pathStr(tmp);
19470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    env->ReleaseStringUTFChars(path, tmp);
19570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    tmp = NULL;
19670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
19770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // headers is a Map<String, String>.
19870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    // We build a similar KeyedVector out of it.
19970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    KeyedVector<String8, String8> headersVector;
20070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    if (headers) {
20170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        // Get the Map's entry Set.
20270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jclass mapClass = env->FindClass("java/util/Map");
20370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (mapClass == NULL) {
20470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
20570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
20670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
20770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jmethodID entrySet =
20870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->GetMethodID(mapClass, "entrySet", "()Ljava/util/Set;");
20970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (entrySet == NULL) {
21070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
21170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
21270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
21370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jobject set = env->CallObjectMethod(headers, entrySet);
21470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (set == NULL) {
21570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
2167a36a0fbb0a5f14047a3680668da954beca05dcbIgor Murashkin        }
21770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
21870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        // Obtain an iterator over the Set
21970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jclass setClass = env->FindClass("java/util/Set");
22070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (setClass == NULL) {
22170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
22270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
22370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
22470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jmethodID iterator =
22570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->GetMethodID(setClass, "iterator", "()Ljava/util/Iterator;");
22670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (iterator == NULL) {
22770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
22870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
22970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
23070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jobject iter = env->CallObjectMethod(set, iterator);
23170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (iter == NULL) {
23270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
23370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
23470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
23570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        // Get the Iterator method IDs
23670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jclass iteratorClass = env->FindClass("java/util/Iterator");
23770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (iteratorClass == NULL) {
23870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
23970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
24070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
24170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jmethodID hasNext = env->GetMethodID(iteratorClass, "hasNext", "()Z");
24270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        if (hasNext == NULL) {
24370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
24470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
24570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
24670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jmethodID next =
24770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->GetMethodID(iteratorClass, "next", "()Ljava/lang/Object;");
24870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (next == NULL) {
24970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
25070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
25170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
25270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        // Get the Entry class method IDs
25370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jclass entryClass = env->FindClass("java/util/Map$Entry");
25470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (entryClass == NULL) {
25570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
25670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
25770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
25870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jmethodID getKey =
25970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->GetMethodID(entryClass, "getKey", "()Ljava/lang/Object;");
26070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (getKey == NULL) {
26170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
26270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
26370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
26470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        jmethodID getValue =
26570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->GetMethodID(entryClass, "getValue", "()Ljava/lang/Object;");
26670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        if (getValue == NULL) {
26770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            return;
26870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
26970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
27070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        // Iterate over the entry Set
27170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        while (env->CallBooleanMethod(iter, hasNext)) {
27270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            jobject entry = env->CallObjectMethod(iter, next);
27370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            jstring key = (jstring) env->CallObjectMethod(entry, getKey);
27470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            jstring value = (jstring) env->CallObjectMethod(entry, getValue);
27570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
27670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            const char* keyStr = env->GetStringUTFChars(key, NULL);
27770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            if (!keyStr) {  // Out of memory
27870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala                return;
27970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            }
28070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
28170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            const char* valueStr = env->GetStringUTFChars(value, NULL);
28270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            if (!valueStr) {  // Out of memory
28370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala                env->ReleaseStringUTFChars(key, keyStr);
28470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala                return;
28570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            }
28670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
28770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            headersVector.add(String8(keyStr), String8(valueStr));
28870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
28970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->DeleteLocalRef(entry);
29070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->ReleaseStringUTFChars(key, keyStr);
29170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->DeleteLocalRef(key);
29270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->ReleaseStringUTFChars(value, valueStr);
29370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env->DeleteLocalRef(value);
29470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        }
29570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
29670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    }
29770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
29870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    LOGV("setDataSource: path %s", pathStr);
29970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    status_t opStatus =
30070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala        mp->setDataSource(
30170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala                pathStr,
30270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala                headers ? &headersVector : NULL);
30370c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
30470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala    process_media_player_call(
30570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            env, thiz, opStatus, "java/io/IOException",
30670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala            "setDataSource failed." );
30770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala}
30870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
30970c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalastatic void
31070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalaandroid_media_MediaPlayer_setDataSource(JNIEnv *env, jobject thiz, jstring path)
31170c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala{
312b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    android_media_MediaPlayer_setDataSourceAndHeaders(env, thiz, path, 0);
313b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala}
3145a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
3155a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
3165a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length)
3175a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
3185a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3195a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
3200da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3215a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
3227d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    }
3237d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin
3247d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    if (fileDescriptor == NULL) {
3257d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
3267d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        return;
3277d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    }
3287d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    int fd = getParcelFileDescriptorFD(env, fileDescriptor);
3297d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    LOGV("setDataSourceFD: fd %d", fd);
3307d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." );
3317d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin}
3327d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin
3337d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkinstatic void setVideoSurfaceOrSurfaceTexture(
3347d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        const sp<MediaPlayer>& mp, JNIEnv *env, jobject thiz, const char *prefix)
3357d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin{
3367d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    // The Java MediaPlayer class makes sure that at most one of mSurface and
3377d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    // mSurfaceTexture is non-null.  But just in case, we give priority to
3387d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    // mSurface over mSurfaceTexture.
3397d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    jobject surface = env->GetObjectField(thiz, fields.surface);
3407d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    if (surface != NULL) {
3417d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        sp<Surface> native_surface(get_surface(env, surface));
3427d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        LOGV("%s: surface=%p (id=%d)", prefix,
3437d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin             native_surface.get(), native_surface->getIdentity());
3447d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        mp->setVideoSurface(native_surface);
3457d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    } else {
3467d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        jobject surfaceTexture = env->GetObjectField(thiz, fields.surfaceTexture);
3477d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        if (surfaceTexture != NULL) {
3487d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin            sp<ISurfaceTexture> native_surfaceTexture(
3497d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin                    getSurfaceTexture(env, surfaceTexture));
3507d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin            LOGV("%s: texture=%p", prefix, native_surfaceTexture.get());
3517d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin            mp->setVideoSurfaceTexture(native_surfaceTexture);
3527d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        }
3537d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    }
3547d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin}
3557d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin
3567d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkinstatic void
3577d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkinandroid_media_MediaPlayer_setVideoSurfaceOrSurfaceTexture(JNIEnv *env, jobject thiz)
3587d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin{
3597d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3607d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    if (mp == NULL ) {
3617d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3620da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return;
3637d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    }
3647d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    setVideoSurfaceOrSurfaceTexture(mp, env, thiz,
3650da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala            "_setVideoSurfaceOrSurfaceTexture");
3665a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
3675a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
3685a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
3695a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz)
3705a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
3715a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3725a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
3735a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
374ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        return;
375ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
37649a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    setVideoSurfaceOrSurfaceTexture(mp, env, thiz, "prepare");
3770da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." );
3785a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
3790da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
38049a3ca9330d213fe35280c0af78a4d21acb98234Zhijun Hestatic void
38149a3ca9330d213fe35280c0af78a4d21acb98234Zhijun Heandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)
38249a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He{
38349a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
38449a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    if (mp == NULL ) {
3850da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3860da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return;
3875a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
3885a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    setVideoSurfaceOrSurfaceTexture(mp, env, thiz, "prepareAsync");
3895a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." );
3905a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
3915a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
3927d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkinstatic void
393ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkinandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
394ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin{
3957d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    LOGV("start");
3967d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3977d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    if (mp == NULL ) {
3985a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3997d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin        return;
4007d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkin    }
401ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    process_media_player_call( env, thiz, mp->start(), NULL, NULL );
4020da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala}
403d5ff06a2ce4a65615ce5e8b8df93f2c3da2a8bbdIgor Murashkin
4040da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic void
4057d2a5c5e7350658d0da4eaf75f9380593083e969Igor Murashkinandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)
406ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin{
4070da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    LOGV("stop");
4080da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
4095a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
4105a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4115a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
4125a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
4135a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
4140da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala}
4150da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
4160da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic void
4170da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalaandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz)
4180da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala{
4190da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    LOGV("pause");
4200da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
4210da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (mp == NULL ) {
4220da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4230da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return;
4240da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
4250da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    process_media_player_call( env, thiz, mp->pause(), NULL, NULL );
4260da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala}
4270da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
4280da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic jboolean
4290da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalaandroid_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz)
4300da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala{
4310da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
4320da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (mp == NULL ) {
4330da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4340da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return false;
4350da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
4360da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    const jboolean is_playing = mp->isPlaying();
4370da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
4380da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    LOGV("isPlaying: %d", is_playing);
4390da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    return is_playing;
4400da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala}
4410da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
4420da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic void
4430da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalaandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, int msec)
4445f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He{
445399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
446265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala    if (mp == NULL ) {
447265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4485a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
4495a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
4505a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    LOGV("seekTo: %d(msec)", msec);
4515a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->seekTo(msec), NULL, NULL );
4525a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
4535a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
4545a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic int
4555a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz)
4565a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
457ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
458ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    if (mp == NULL ) {
459ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4605a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return 0;
461ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
4625a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    int w;
4635a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (0 != mp->getVideoWidth(&w)) {
4645a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("getVideoWidth failed");
4655a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        w = 0;
4665a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
467ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    LOGV("getVideoWidth: %d", w);
46849a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    return w;
469ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin}
47049a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He
471ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkinstatic int
47249a3ca9330d213fe35280c0af78a4d21acb98234Zhijun Heandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz)
47349a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He{
47449a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
47549a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    if (mp == NULL ) {
47649a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He        jniThrowException(env, "java/lang/IllegalStateException", NULL);
47749a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He        return 0;
47849a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    }
47949a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    int h;
48049a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    if (0 != mp->getVideoHeight(&h)) {
48149a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He        LOGE("getVideoHeight failed");
48249a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He        h = 0;
48349a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    }
48449a3ca9330d213fe35280c0af78a4d21acb98234Zhijun He    LOGV("getVideoHeight: %d", h);
4855a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    return h;
4865a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
4875a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
4885a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
4895a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic int
4900da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalaandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz)
4910da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala{
4920da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
4930da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (mp == NULL ) {
4940da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4950da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return 0;
4960da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
4970da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    int msec;
4980da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL );
4990da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    LOGV("getCurrentPosition: %d (msec)", msec);
5000da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    return msec;
5010da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala}
5020da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
5030da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic int
5040da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalaandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz)
5050da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala{
5060da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5070da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (mp == NULL ) {
5080da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5090da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return 0;
5100da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
5115f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    int msec;
512265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala    process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL );
513265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala    LOGV("getDuration: %d (msec)", msec);
514aef3b7ed9f2a27aed9aecef030432d1100a60406Igor Murashkin    return msec;
515aef3b7ed9f2a27aed9aecef030432d1100a60406Igor Murashkin}
516399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He
5175a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
5185a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz)
5195a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
5205a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    LOGV("reset");
5215a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5225a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
5235a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5245a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
5255a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
5265a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->reset(), NULL, NULL );
527ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin}
528f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk
529ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkinstatic void
530f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunkandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, int streamtype)
531ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin{
532ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    LOGV("setAudioStreamType: %d", streamtype);
5332629f27362f1a35521501f3a28279ab05b9beb32Timothy Knight    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5340da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (mp == NULL ) {
5350da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5362629f27362f1a35521501f3a28279ab05b9beb32Timothy Knight        return;
537ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
538ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    process_media_player_call( env, thiz, mp->setAudioStreamType(streamtype) , NULL, NULL );
5395a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
5400da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
5415a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
542f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunkandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping)
5430da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala{
5440da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    LOGV("setLooping: %d", looping);
545265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5465a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
5475a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5485a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
5495a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
5505a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL );
551ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin}
552ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
553ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkinstatic jboolean
5540da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalaandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz)
5550da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala{
5560da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    LOGV("isLooping");
5575a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5585a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
5595a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5605a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return false;
5615a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
562228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He    return mp->isLooping();
563228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He}
564ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
5655a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
566228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun Heandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, float leftVolume, float rightVolume)
567ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin{
568ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    LOGV("setVolume: left %f  right %f", leftVolume, rightVolume);
569228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
570228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He    if (mp == NULL ) {
571228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He        jniThrowException(env, "java/lang/IllegalStateException", NULL);
572228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He        return;
5735a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
5745a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->setVolume(leftVolume, rightVolume), NULL, NULL );
5755a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
5765a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
5775a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala// FIXME: deprecated
5785a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic jobject
5795a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_getFrameAt(JNIEnv *env, jobject thiz, jint msec)
580ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin{
581ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    return NULL;
5820da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala}
58378146ecb24871302a4c4dc0a7341044a06d29ee8Zhijun He
58478146ecb24871302a4c4dc0a7341044a06d29ee8Zhijun He
58578146ecb24871302a4c4dc0a7341044a06d29ee8Zhijun He// Sends the request and reply parcels to the media player via the
5860da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala// binder interface.
5870da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic jint
5885a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz,
5895a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala                                 jobject java_request, jobject java_reply)
5905a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
5915a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
5925a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (media_player == NULL ) {
5935a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5945a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return UNKNOWN_ERROR;
5955a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
5965a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
5975a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
5985a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    Parcel *request = parcelForJavaObject(env, java_request);
599ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    Parcel *reply = parcelForJavaObject(env, java_reply);
600f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk
601ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    // Don't use process_media_player_call which use the async loop to
602f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk    // report errors, instead returns the status.
603ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    return media_player->invoke(*request, reply);
604ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin}
6052629f27362f1a35521501f3a28279ab05b9beb32Timothy Knight
6060da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala// Sends the new filter to the client.
6070da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic jint
6082629f27362f1a35521501f3a28279ab05b9beb32Timothy Knightandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request)
609ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin{
610ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
6115a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (media_player == NULL ) {
6120da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6135a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return UNKNOWN_ERROR;
614f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk    }
6150da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
6160da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    Parcel *filter = parcelForJavaObject(env, request);
617265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala
6185a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (filter == NULL ) {
6195a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/RuntimeException", "Filter is null");
6205a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return UNKNOWN_ERROR;
6215a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
6225a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
623228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He    return media_player->setMetadataFilter(*filter);
624ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin}
625ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
626228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun Hestatic jboolean
627228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun Heandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only,
628228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He                                      jboolean apply_filter, jobject reply)
629228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He{
630228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
631228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He    if (media_player == NULL ) {
632228f4f92e70d9326d473e02bcdcc8faf9e706a4dZhijun He        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6335a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return false;
6345a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
6355a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
6365a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    Parcel *metadata = parcelForJavaObject(env, reply);
6375a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
6385a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (metadata == NULL ) {
6395a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null");
6405a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return false;
641ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
6422d5e89778e955b4ff209a93e738761356349d48cZhijun He
643ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    metadata->freeData();
6445a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    // On return metadata is positioned at the beginning of the
6452d5e89778e955b4ff209a93e738761356349d48cZhijun He    // metadata. Note however that the parcel actually starts with the
6465a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    // return code so you should not rewind the parcel using
6475a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    // setDataPosition(0).
6485a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    return media_player->getMetadata(update_only, apply_filter, metadata) == OK;
6495a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
6505a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
651ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin// This function gets some field IDs, which in turn causes class initialization.
6525a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala// It is called from a static block in MediaPlayer, which won't run until the
653ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin// first time an instance of this class is used.
654399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun Hestatic void
655399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun Heandroid_media_MediaPlayer_native_init(JNIEnv *env)
656399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He{
657399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    jclass clazz;
658399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He
659399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    clazz = env->FindClass("android/media/MediaPlayer");
660399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    if (clazz == NULL) {
661399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He        return;
662399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    }
663399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He
664399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
665399f05d1e7182ef6c88d30d3b98a467b845ca7c4Zhijun He    if (fields.context == NULL) {
6660da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return;
667265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala    }
6685f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He
6695f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
670265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala                                               "(Ljava/lang/Object;IIILjava/lang/Object;)V");
6715a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (fields.post_event == NULL) {
6725a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
6735a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
6745a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
6755a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    fields.surface = env->GetFieldID(clazz, "mSurface", "Landroid/view/Surface;");
6765a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (fields.surface == NULL) {
6775a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
6785a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
6795a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
6805a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    jclass surface = env->FindClass("android/view/Surface");
6815a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (surface == NULL) {
6825a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
6835a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
6845a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
685ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    fields.surface_native = env->GetFieldID(surface, ANDROID_VIEW_SURFACE_JNI_ID, "I");
686f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk    if (fields.surface_native == NULL) {
687ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        return;
688ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
689f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk
690ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    fields.surfaceTexture = env->GetFieldID(clazz, "mSurfaceTexture",
691ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin            "Landroid/graphics/SurfaceTexture;");
6922629f27362f1a35521501f3a28279ab05b9beb32Timothy Knight    if (fields.surfaceTexture == NULL) {
6930da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return;
6940da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
6952629f27362f1a35521501f3a28279ab05b9beb32Timothy Knight
696ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    jclass surfaceTexture = env->FindClass("android/graphics/SurfaceTexture");
697ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    if (surfaceTexture == NULL) {
6985a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
6990da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
7005a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
701f59521d3b182de217b12e6d4ea31bd32e2418564Ruben Brunk    fields.surfaceTexture_native = env->GetFieldID(surfaceTexture,
7020da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala            ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I");
7030da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (fields.surfaceTexture_native == NULL) {
704265b34ce331cbe296f82ca357645312718c8d4c7Eino-Ville Talvala        return;
7055a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
7065a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7075a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
7085a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7095a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
71066d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
71166d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He{
71266d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He    LOGV("native_setup");
71366d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He    sp<MediaPlayer> mp = new MediaPlayer();
71466d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He    if (mp == NULL) {
71566d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
7160da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return;
7170da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    }
7185a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7195a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    // create new listener and give it to MediaPlayer
7205a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);
7215a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    mp->setListener(listener);
7225a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7235a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    // Stow our new C++ MediaPlayer in an opaque field in the Java object.
7245a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    setMediaPlayer(env, thiz, mp);
7255a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
7265a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7275a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void
7285a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz)
7295f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk{
7305f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk    LOGV("release");
7315f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk    sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0);
7325f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk    if (mp != NULL) {
7335f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk        // this prevents native callbacks after the object is released
7345f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk        mp->setListener(0);
7355f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk        mp->disconnect();
7365f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk    }
7375f1dcfe49dfe7b9a4a40482152638af6ca925a6dRuben Brunk}
7380da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala
7390da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvalastatic void
7405a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalaandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
7415a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
7425a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    LOGV("native_finalize");
7435a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    android_media_MediaPlayer_release(env, thiz);
7445a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
7455a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7465a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env,  jobject thiz, jint sessionId) {
7475a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    LOGV("set_session_id(): %d", sessionId);
7485a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7495a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (mp == NULL ) {
7505a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7515a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
7525a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
7535a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    process_media_player_call( env, thiz, mp->setAudioSessionId(sessionId), NULL, NULL );
754ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin}
755ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
756f353742124af698098884b4172644af0851b30caZhijun Hestatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env,  jobject thiz) {
7575f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    LOGV("get_session_id()");
758f353742124af698098884b4172644af0851b30caZhijun He    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
759f353742124af698098884b4172644af0851b30caZhijun He    if (mp == NULL ) {
7600da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
761f353742124af698098884b4172644af0851b30caZhijun He        return 0;
7625f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    }
763f353742124af698098884b4172644af0851b30caZhijun He
7645f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    return mp->getAudioSessionId();
765f353742124af698098884b4172644af0851b30caZhijun He}
7662d5e89778e955b4ff209a93e738761356349d48cZhijun He
7672d5e89778e955b4ff209a93e738761356349d48cZhijun Hestatic void
7682d5e89778e955b4ff209a93e738761356349d48cZhijun Heandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level)
7692d5e89778e955b4ff209a93e738761356349d48cZhijun He{
7702d5e89778e955b4ff209a93e738761356349d48cZhijun He    LOGV("setAuxEffectSendLevel: level %f", level);
7710da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7720da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    if (mp == NULL ) {
7735a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7745a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        return;
7755a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
7762d5e89778e955b4ff209a93e738761356349d48cZhijun He    process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL );
7775a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
7785a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7795a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env,  jobject thiz, jint effectId) {
7805a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    LOGV("attachAuxEffect(): %d", effectId);
7815a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
782e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk    if (mp == NULL ) {
783e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk        jniThrowException(env, "java/lang/IllegalStateException", NULL);
784e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk        return;
785e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk    }
786e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk    process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL );
787e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk}
788e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk
789e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunkstatic jint
790e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunkandroid_media_MediaPlayer_pullBatteryData(JNIEnv *env, jobject thiz, jobject java_reply)
791e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk{
7920da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player"));
793e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
794e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk    if (service.get() == NULL) {
795e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk        jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService");
7960da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala        return UNKNOWN_ERROR;
797e6679366938fd3ed197ba1ff1b2ad0bf2ff4246bRuben Brunk    }
7985a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
7995a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    Parcel *reply = parcelForJavaObject(env, java_reply);
8005a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8015a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    return service->pullBatteryData(reply);
8025a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
8035a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8045a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala// ----------------------------------------------------------------------------
8055a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8065a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic JNINativeMethod gMethods[] = {
8075a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"setDataSource",       "(Ljava/lang/String;)V",            (void *)android_media_MediaPlayer_setDataSource},
8085a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"setDataSource",       "(Ljava/lang/String;Ljava/util/Map;)V",(void *)android_media_MediaPlayer_setDataSourceAndHeaders},
8095a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"setDataSource",       "(Ljava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer_setDataSourceFD},
8105a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"_setVideoSurfaceOrSurfaceTexture", "()V",                 (void *)android_media_MediaPlayer_setVideoSurfaceOrSurfaceTexture},
8115a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"prepare",             "()V",                              (void *)android_media_MediaPlayer_prepare},
8125a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"prepareAsync",        "()V",                              (void *)android_media_MediaPlayer_prepareAsync},
8135a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"_start",              "()V",                              (void *)android_media_MediaPlayer_start},
8145a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"_stop",               "()V",                              (void *)android_media_MediaPlayer_stop},
8155a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"getVideoWidth",       "()I",                              (void *)android_media_MediaPlayer_getVideoWidth},
8165a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"getVideoHeight",      "()I",                              (void *)android_media_MediaPlayer_getVideoHeight},
8175a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"seekTo",              "(I)V",                             (void *)android_media_MediaPlayer_seekTo},
8185a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"_pause",              "()V",                              (void *)android_media_MediaPlayer_pause},
819ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    {"isPlaying",           "()Z",                              (void *)android_media_MediaPlayer_isPlaying},
820ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    {"getCurrentPosition",  "()I",                              (void *)android_media_MediaPlayer_getCurrentPosition},
821ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    {"getDuration",         "()I",                              (void *)android_media_MediaPlayer_getDuration},
8220da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    {"_release",            "()V",                              (void *)android_media_MediaPlayer_release},
823ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    {"_reset",              "()V",                              (void *)android_media_MediaPlayer_reset},
8240da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    {"setAudioStreamType",  "(I)V",                             (void *)android_media_MediaPlayer_setAudioStreamType},
8250da8bf5dbc8912cf70df14bfa655189a04c75476Eino-Ville Talvala    {"setLooping",          "(Z)V",                             (void *)android_media_MediaPlayer_setLooping},
8265a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"isLooping",           "()Z",                              (void *)android_media_MediaPlayer_isLooping},
8275a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"setVolume",           "(FF)V",                            (void *)android_media_MediaPlayer_setVolume},
8285a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"getFrameAt",          "(I)Landroid/graphics/Bitmap;",     (void *)android_media_MediaPlayer_getFrameAt},
8295a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"native_invoke",       "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke},
8305a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    {"native_setMetadataFilter", "(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},
831ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},
832ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    {"native_init",         "()V",                              (void *)android_media_MediaPlayer_native_init},
8332807936f5dfdeff25e9ace3482100511a69dcf13Zhijun He    {"native_setup",        "(Ljava/lang/Object;)V",            (void *)android_media_MediaPlayer_native_setup},
8342807936f5dfdeff25e9ace3482100511a69dcf13Zhijun He    {"native_finalize",     "()V",                              (void *)android_media_MediaPlayer_native_finalize},
8355f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},
8362807936f5dfdeff25e9ace3482100511a69dcf13Zhijun He    {"setAudioSessionId",   "(I)V",                             (void *)android_media_MediaPlayer_set_audio_session_id},
8375f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    {"setAuxEffectSendLevel", "(F)V",                           (void *)android_media_MediaPlayer_setAuxEffectSendLevel},
8385f2a47f3dedfc7859457067d8cdcdbfc28ee08acZhijun He    {"attachAuxEffect",     "(I)V",                             (void *)android_media_MediaPlayer_attachAuxEffect},
8392807936f5dfdeff25e9ace3482100511a69dcf13Zhijun He    {"native_pullBatteryData", "(Landroid/os/Parcel;)I",        (void *)android_media_MediaPlayer_pullBatteryData},
8405a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala};
8415a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8425a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic const char* const kClassPathName = "android/media/MediaPlayer";
8435a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8445a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala// This function only registers the native methods
8455a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalastatic int register_android_media_MediaPlayer(JNIEnv *env)
8465a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala{
8475a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    return AndroidRuntime::registerNativeMethods(env,
84866d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He                "android/media/MediaPlayer", gMethods, NELEM(gMethods));
84966d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He}
850153ac102d36df66853b523ab01763dc457972517Zhijun He
85166d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_media_MediaMetadataRetriever(JNIEnv *env);
85266d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_media_MediaRecorder(JNIEnv *env);
85366d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_media_MediaScanner(JNIEnv *env);
85466d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_media_ResampleInputStream(JNIEnv *env);
85566d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_media_MediaProfiles(JNIEnv *env);
85666d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_media_AmrInputStream(JNIEnv *env);
85766d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_mtp_MtpDatabase(JNIEnv *env);
85866d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_mtp_MtpDevice(JNIEnv *env);
85966d065a6d48cafe390c697c77b44ba5196ee0870Zhijun Heextern int register_android_mtp_MtpServer(JNIEnv *env);
86066d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He
861ca1b73a5f4e8ae4a7cef2cb2127024d0ddb9e0e0Zhijun Hejint JNI_OnLoad(JavaVM* vm, void* reserved)
86266d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He{
86366d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He    JNIEnv* env = NULL;
86466d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He    jint result = -1;
86566d065a6d48cafe390c697c77b44ba5196ee0870Zhijun He
866ca1b73a5f4e8ae4a7cef2cb2127024d0ddb9e0e0Zhijun He    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
8675a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: GetEnv failed\n");
8685a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
8695a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
8705a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    assert(env != NULL);
8715a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8725a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (register_android_media_MediaPlayer(env) < 0) {
8735a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: MediaPlayer native registration failed\n");
8745a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
875eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk    }
876eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk
877eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk    if (register_android_media_MediaRecorder(env) < 0) {
878eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk        LOGE("ERROR: MediaRecorder native registration failed\n");
879eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk        goto bail;
880eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk    }
881eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk
882eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk    if (register_android_media_MediaScanner(env) < 0) {
883eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk        LOGE("ERROR: MediaScanner native registration failed\n");
884eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk        goto bail;
885eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk    }
886eba1b3a843278a92611edf153faa41a01d793b25Ruben Brunk
887ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    if (register_android_media_MediaMetadataRetriever(env) < 0) {
888ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        LOGE("ERROR: MediaMetadataRetriever native registration failed\n");
8895a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
8905a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
8915a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8925a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (register_android_media_AmrInputStream(env) < 0) {
8935a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: AmrInputStream native registration failed\n");
894ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        goto bail;
895ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
8965a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
8975a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (register_android_media_ResampleInputStream(env) < 0) {
8985a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: ResampleInputStream native registration failed\n");
8995a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
9005a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
901ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
902ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    if (register_android_media_MediaProfiles(env) < 0) {
9035a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: MediaProfiles native registration failed");
9045a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
9055a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
9065a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
9075a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (register_android_mtp_MtpDatabase(env) < 0) {
908ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        LOGE("ERROR: MtpDatabase native registration failed");
909ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin        goto bail;
9105a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
9115a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
9125a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    if (register_android_mtp_MtpDevice(env) < 0) {
9135a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: MtpDevice native registration failed");
9145a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
915ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    }
916ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
917ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    if (register_android_mtp_MtpServer(env) < 0) {
9185a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        LOGE("ERROR: MtpServer native registration failed");
9195a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala        goto bail;
9205a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    }
9215a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
9225a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    /* success -- return valid version number */
923ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin    result = JNI_VERSION_1_4;
924ace5bf04126f7dd49d75fca9218031f0db02e5ddIgor Murashkin
9255a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvalabail:
9265a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala    return result;
9275a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala}
9285a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala
9295a32b20ccc34fd7d4f048de05c427a7a96786531Eino-Ville Talvala// KTHXBYE
9305a9ff379233025bc85ebc41ac5979def09d3ebfaZhijun He