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