1c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "MediaPlayer-JNI" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/mediaplayer.h> 23d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <media/IMediaHTTPService.h> 2420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <media/MediaPlayerInterface.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 341ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg#include "android_runtime/android_view_Surface.h" 3587eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h" 364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project#include "utils/Errors.h" // for status_t 37256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/KeyedVector.h" 38256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/String8.h" 3979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include "android_media_Utils.h" 4079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong 41d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 4220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include "android_util_Binder.h" 4320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <binder/Parcel.h> 44d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h> 458335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 46d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IPCThreadState.h> 47d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IServiceManager.h> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h" 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID context; 581ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg jfieldID surface_texture; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID post_event; 61d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 62d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetHost; 63d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetPort; 64d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetExclusionList; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex sLock; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ref-counted object for callbacks 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JNIMediaPlayerListener: public MediaPlayerListener 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~JNIMediaPlayerListener(); 77162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; // Reference to MediaPlayer class 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject mObject; // Weak ref to MediaPlayer Java object to call on 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hold onto the MediaPlayer class for use in calling the static method 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that posts events to the application thread. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->GetObjectClass(thiz); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 913762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/media/MediaPlayer"); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/Exception", NULL); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = (jclass)env->NewGlobalRef(clazz); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We use a weak reference so the MediaPlayer object can be garbage collected. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The reference is only used as a proxy for callbacks. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObject = env->NewGlobalRef(weak_thiz); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::~JNIMediaPlayerListener() 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remove global references 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mClass); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 110162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wangvoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 113162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang if (obj && obj->dataSize() > 0) { 114333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang jobject jParcel = createJavaParcelObject(env); 115333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang if (jParcel != NULL) { 116333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang Parcel* nativeParcel = parcelForJavaObject(env, jParcel); 1178902097bb686752ff207e3bda12713be1a8c74ebInsun Kang nativeParcel->setData(obj->data(), obj->dataSize()); 118162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 119333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang msg, ext1, ext2, jParcel); 12099f752149b1a0df9ea0ba311d609d4d6e103787cElliott Hughes env->DeleteLocalRef(jParcel); 121162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 122162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } else { 123162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 124162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang msg, ext1, ext2, NULL); 125162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 1268902097bb686752ff207e3bda12713be1a8c74ebInsun Kang if (env->ExceptionCheck()) { 1278902097bb686752ff207e3bda12713be1a8c74ebInsun Kang ALOGW("An exception occurred while notifying an event."); 1288902097bb686752ff207e3bda12713be1a8c74ebInsun Kang LOGW_EX(env); 1298902097bb686752ff207e3bda12713be1a8c74ebInsun Kang env->ExceptionClear(); 1308902097bb686752ff207e3bda12713be1a8c74ebInsun Kang } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 138075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sp<MediaPlayer>(p); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player) 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 145075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (player.get()) { 147b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian player->incStrong((void*)setMediaPlayer); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old != 0) { 150b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old->decStrong((void*)setMediaPlayer); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 152075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, (jlong)player.get()); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return old; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// If exception is NULL and opStatus is not OK, this method sends an error 15732f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// event to the client application; otherwise, if exception is not NULL and 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// opStatus is not OK, this method throws the given exception to the client 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// application. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message) 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (exception == NULL) { // Don't throw exception. Instead, send an event. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opStatus != (status_t) OK) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { // Throw exception! 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( opStatus == (status_t) INVALID_OPERATION ) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 170fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke } else if ( opStatus == (status_t) PERMISSION_DENIED ) { 171fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke jniThrowException(env, "java/lang/SecurityException", NULL); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ( opStatus != (status_t) OK ) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strlen(message) > 230) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the message is too long, don't bother displaying the status code 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, message); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char msg[256]; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // append the status code to the message 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(msg, "%s: status=0x%X", message, opStatus); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, msg); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 187256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberandroid_media_MediaPlayer_setDataSourceAndHeaders( 188d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path, 18917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong jobjectArray keys, jobjectArray values) { 19017524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 202c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong const char *tmp = env->GetStringUTFChars(path, NULL); 203c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong if (tmp == NULL) { // Out of memory 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSource: path %s", tmp); 207256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 208c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong String8 pathStr(tmp); 209c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong env->ReleaseStringUTFChars(path, tmp); 210c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong tmp = NULL; 211c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong 21217524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong // We build a KeyedVector out of the key and val arrays 21317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong KeyedVector<String8, String8> headersVector; 21479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong if (!ConvertKeyValueArraysToKeyedVector( 21579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong env, keys, values, &headersVector)) { 21679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong return; 217256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber } 218256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 219d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IMediaHTTPService> httpService; 220d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (httpServiceBinderObj != NULL) { 221d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj); 222d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService = interface_cast<IMediaHTTPService>(binder); 223d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 224d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 225256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber status_t opStatus = 226256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber mp->setDataSource( 227d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService, 228c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong pathStr, 22979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong headersVector.size() > 0? &headersVector : NULL); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 231256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber process_media_player_call( 232256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber env, thiz, opStatus, "java/io/IOException", 233256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber "setDataSource failed." ); 234256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber} 235256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 236256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberstatic void 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fileDescriptor == NULL) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 249a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 25071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSourceFD: fd %d", fd); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." ); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 254d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstatic sp<IGraphicBufferProducer> 2551ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted BonkenburggetVideoSurfaceTexture(JNIEnv* env, jobject thiz) { 256075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture); 257d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden return sp<IGraphicBufferProducer>(p); 2588b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 261d59310d08637c8531dc7949fc166b0daeede53c0Gloria WangdecVideoSurfaceRef(JNIEnv *env, jobject thiz) 262d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang{ 263e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 264e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang if (mp == NULL) { 265e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang return; 266e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang } 267e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang 268d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz); 269d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang if (old_st != NULL) { 270b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old_st->decStrong((void*)decVideoSurfaceRef); 271d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang } 272d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang} 273d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 274d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wangstatic void 27543ef913815ec84d04877a698614a31e129cd97e3James DongsetVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 27843ef913815ec84d04877a698614a31e129cd97e3James Dong if (mp == NULL) { 27943ef913815ec84d04877a698614a31e129cd97e3James Dong if (mediaPlayerMustBeAlive) { 28043ef913815ec84d04877a698614a31e129cd97e3James Dong jniThrowException(env, "java/lang/IllegalStateException", NULL); 28143ef913815ec84d04877a698614a31e129cd97e3James Dong } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2841ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 285d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 286d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 287d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> new_st; 2881ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (jsurface) { 28964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown sp<Surface> surface(android_view_Surface_getSurface(env, jsurface)); 290f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis if (surface != NULL) { 29152800617946c456e78ed010c82d0ec4358368164Mathias Agopian new_st = surface->getIGraphicBufferProducer(); 292097922b9c1e0821beb107024bcd0dc14144c0920James Dong if (new_st == NULL) { 293097922b9c1e0821beb107024bcd0dc14144c0920James Dong jniThrowException(env, "java/lang/IllegalArgumentException", 294097922b9c1e0821beb107024bcd0dc14144c0920James Dong "The surface does not have a binding SurfaceTexture!"); 295097922b9c1e0821beb107024bcd0dc14144c0920James Dong return; 296097922b9c1e0821beb107024bcd0dc14144c0920James Dong } 297b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian new_st->incStrong((void*)decVideoSurfaceRef); 298f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } else { 299f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis jniThrowException(env, "java/lang/IllegalArgumentException", 300f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis "The surface has been released"); 301f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis return; 302f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } 3031ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg } 304d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 305075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get()); 3061ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3071ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // This will fail if the media player has not been initialized yet. This 3081ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // can be the case if setDisplay() on MediaPlayer.java has been called 3091ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // before setDataSource(). The redundant call to setVideoSurfaceTexture() 3101ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // in prepare/prepareAsync covers for this case. 3111ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(new_st); 3128b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 3138b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks 3148b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksstatic void 31543ef913815ec84d04877a698614a31e129cd97e3James Dongandroid_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface) 31643ef913815ec84d04877a698614a31e129cd97e3James Dong{ 31743ef913815ec84d04877a698614a31e129cd97e3James Dong setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */); 31843ef913815ec84d04877a698614a31e129cd97e3James Dong} 31943ef913815ec84d04877a698614a31e129cd97e3James Dong 32043ef913815ec84d04877a698614a31e129cd97e3James Dongstatic void 3218b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) 3228b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks{ 3238b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3248b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks if (mp == NULL ) { 3258b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks jniThrowException(env, "java/lang/IllegalStateException", NULL); 3268b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks return; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3281ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3291ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 3301ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 331d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 3321ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 3331ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." ); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz) 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3451ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3461ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 3471ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 348d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 3491ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 3501ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." ); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz) 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 35771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("start"); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->start(), NULL, NULL ); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz) 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 36971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("stop"); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania process_media_player_call( env, thiz, mp->stop(), NULL, NULL ); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz) 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 38171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("pause"); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->pause(), NULL, NULL ); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz) 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 396075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project const jboolean is_playing = mp->isPlaying(); 3994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 40071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isPlaying: %d", is_playing); 4014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return is_playing; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 405075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec) 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("seekTo: %d(msec)", msec); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->seekTo(msec), NULL, NULL ); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 416075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz) 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w; 4254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoWidth(&w)) { 4263762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoWidth failed"); 4274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project w = 0; 4284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 42971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoWidth: %d", w); 430075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) w; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 433075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz) 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h; 4424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoHeight(&h)) { 4433762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoHeight failed"); 4444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project h = 0; 4454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 44671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoHeight: %d", h); 447075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) h; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 451075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz) 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL ); 46171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getCurrentPosition: %d (msec)", msec); 462075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 465075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz) 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL ); 47571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getDuration: %d (msec)", msec); 476075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz) 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 48271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("reset"); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->reset(), NULL, NULL ); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 492075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype) 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 49471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAudioStreamType: %d", streamtype); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 500bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL ); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5031af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockstatic jint 5041af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockandroid_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz) 5051af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock{ 5061af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5071af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock if (mp == NULL ) { 5081af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock jniThrowException(env, "java/lang/IllegalStateException", NULL); 5091af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return 0; 5101af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock } 5111af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock audio_stream_type_t streamtype; 5121af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL ); 5131af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock ALOGV("getAudioStreamType: %d (streamtype)", streamtype); 5141af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return (jint) streamtype; 5151af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock} 5161af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock 5178df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivistatic jboolean 5188df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Triviandroid_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request) 5198df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi{ 5208df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi ALOGV("setParameter: key %d", key); 5218df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5228df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (mp == NULL ) { 5238df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi jniThrowException(env, "java/lang/IllegalStateException", NULL); 5248df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 5258df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 5268df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 5278df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi Parcel *request = parcelForJavaObject(env, java_request); 5288df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi status_t err = mp->setParameter(key, *request); 5298df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (err == OK) { 5308df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return true; 5318df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } else { 5328df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 5338df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 5348df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi} 5358df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping) 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 53971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setLooping: %d", looping); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL ); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz) 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 55171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isLooping"); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 555075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 557075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return mp->isLooping() ? JNI_TRUE : JNI_FALSE; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 561075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume) 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 563075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL ); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// Sends the request and reply parcels to the media player via the 57320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// binder interface. 57420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniastatic jint 57520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, 57620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jobject java_request, jobject java_reply) 57720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania{ 57820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 57920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania if (media_player == NULL ) { 58020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 581b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 58220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania } 58320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 58420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *request = parcelForJavaObject(env, java_request); 58520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *reply = parcelForJavaObject(env, java_reply); 58620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 58720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // Don't use process_media_player_call which use the async loop to 58820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // report errors, instead returns the status. 589075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->invoke(*request, reply); 59020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania} 59120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 592b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania// Sends the new filter to the client. 593b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniastatic jint 594b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniaandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request) 595b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania{ 596b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 597b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania if (media_player == NULL ) { 598b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 599b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 600b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania } 601b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 602b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania Parcel *filter = parcelForJavaObject(env, request); 603b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 6045d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (filter == NULL ) { 6055d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Filter is null"); 6065d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania return UNKNOWN_ERROR; 6075d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 6085d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 609075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->setMetadataFilter(*filter); 610b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania} 611b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 6125d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniastatic jboolean 6135d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniaandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only, 6145d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jboolean apply_filter, jobject reply) 6155d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania{ 6165d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 6175d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (media_player == NULL ) { 6185d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 619075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 6205d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 6215d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 6225d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania Parcel *metadata = parcelForJavaObject(env, reply); 6235d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 6245d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (metadata == NULL ) { 6255d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null"); 626075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 6275d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 6285d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 6295d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania metadata->freeData(); 6305d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // On return metadata is positioned at the beginning of the 6315d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // metadata. Note however that the parcel actually starts with the 6325d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // return code so you should not rewind the parcel using 6335d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // setDataPosition(0). 634075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) { 635075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 636075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } else { 637075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 638075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } 6395d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania} 6405d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 6414935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function gets some field IDs, which in turn causes class initialization. 6424935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// It is called from a static block in MediaPlayer, which won't run until the 6434935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// first time an instance of this class is used. 6444935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenstatic void 6454935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenandroid_media_MediaPlayer_native_init(JNIEnv *env) 6464935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen{ 6474935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen jclass clazz; 6484935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 6494935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen clazz = env->FindClass("android/media/MediaPlayer"); 6504935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (clazz == NULL) { 6514935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 6524935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 6534935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 654075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); 6554935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.context == NULL) { 6564935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 6574935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 6584935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 6594935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", 6604935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 6614935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.post_event == NULL) { 6624935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 6634935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 6644935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 665075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J"); 6661ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (fields.surface_texture == NULL) { 667cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return; 668cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 669d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 6705ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun clazz = env->FindClass("android/net/ProxyInfo"); 671d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber if (clazz == NULL) { 672d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber return; 673d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber } 674d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 675d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetHost = 676d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;"); 677d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 678d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetPort = 679d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getPort", "()I"); 680d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 681d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetExclusionList = 6825ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;"); 6834935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen} 684b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 68871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_setup"); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = new MediaPlayer(); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create new listener and give it to MediaPlayer 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(listener); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ MediaPlayer in an opaque field in the Java object. 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaPlayer(env, thiz, mp); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz) 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 70671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("release"); 707d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != NULL) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this prevents native callbacks after the object is released 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(0); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->disconnect(); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz) 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 71971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_finalize"); 7208dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7218dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen if (mp != NULL) { 7228564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("MediaPlayer finalized without being released"); 7238dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_media_MediaPlayer_release(env, thiz); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 727619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env, jobject thiz, jint sessionId) { 72871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("set_session_id(): %d", sessionId); 729619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 730619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 731619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 732619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return; 733619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 734619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent process_media_player_call( env, thiz, mp->setAudioSessionId(sessionId), NULL, NULL ); 735619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 736619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 737619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env, jobject thiz) { 73871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("get_session_id()"); 739619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 740619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 741619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 742619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return 0; 743619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 744619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 745075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) mp->getAudioSessionId(); 746619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 747619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 7487070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void 7497070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level) 7507070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{ 75171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAuxEffectSendLevel: level %f", level); 7527070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7537070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 7547070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 7557070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 7567070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 7577070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL ); 7587070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 7597070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 7607070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env, jobject thiz, jint effectId) { 76171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("attachAuxEffect(): %d", effectId); 7627070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7637070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 7647070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 7657070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 7667070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 7677070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL ); 7687070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 7697070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 770d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wangstatic jint 771d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberandroid_media_MediaPlayer_pullBatteryData( 772d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject /* thiz */, jobject java_reply) 773d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang{ 774d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player")); 775d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 776d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang if (service.get() == NULL) { 777d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService"); 778d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang return UNKNOWN_ERROR; 779d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang } 780d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 781d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang Parcel *reply = parcelForJavaObject(env, java_reply); 782d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 783075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) service->pullBatteryData(reply); 784d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang} 785d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 786720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanstatic jint 787720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanandroid_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz, 788720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jstring addrString, jint port) { 789720aa282791ef9405d39a15f419a41ab24f11e30John Grossman sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 790720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (mp == NULL ) { 791720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 792720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return INVALID_OPERATION; 793720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 794720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 795720aa282791ef9405d39a15f419a41ab24f11e30John Grossman const char *cAddrString = NULL; 796720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 797720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 798720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString = env->GetStringUTFChars(addrString, NULL); 799720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString == NULL) { // Out of memory 800720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return NO_MEMORY; 801720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 802720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 803720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ALOGV("setRetransmitEndpoint: %s:%d", 804720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString ? cAddrString : "(null)", port); 805720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 806720aa282791ef9405d39a15f419a41ab24f11e30John Grossman status_t ret; 807720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString && (port > 0xFFFF)) { 808720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = BAD_VALUE; 809720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } else { 810720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = mp->setRetransmitEndpoint(cAddrString, 811720aa282791ef9405d39a15f419a41ab24f11e30John Grossman static_cast<uint16_t>(port)); 812720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 813720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 814720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 815720aa282791ef9405d39a15f419a41ab24f11e30John Grossman env->ReleaseStringUTFChars(addrString, cAddrString); 816720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 817720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 818720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (ret == INVALID_OPERATION ) { 819720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 820720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 821720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 822075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) ret; 823720aa282791ef9405d39a15f419a41ab24f11e30John Grossman} 824720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 82584b832054552e00257bb04997143ca33d6d100beMarco Nelissenstatic void 82684b832054552e00257bb04997143ca33d6d100beMarco Nelissenandroid_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player) 82784b832054552e00257bb04997143ca33d6d100beMarco Nelissen{ 82884b832054552e00257bb04997143ca33d6d100beMarco Nelissen ALOGV("setNextMediaPlayer"); 82984b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz); 83084b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (thisplayer == NULL) { 83184b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized"); 83284b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 83384b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 83484b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player); 83584b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == NULL && java_player != NULL) { 83684b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized"); 83784b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 83884b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 83984b832054552e00257bb04997143ca33d6d100beMarco Nelissen 84084b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == thisplayer) { 84184b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self"); 84284b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 84384b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 84484b832054552e00257bb04997143ca33d6d100beMarco Nelissen // tie the two players together 84584b832054552e00257bb04997143ca33d6d100beMarco Nelissen process_media_player_call( 84684b832054552e00257bb04997143ca33d6d100beMarco Nelissen env, thiz, thisplayer->setNextMediaPlayer(nextplayer), 84784b832054552e00257bb04997143ca33d6d100beMarco Nelissen "java/lang/IllegalArgumentException", 84884b832054552e00257bb04997143ca33d6d100beMarco Nelissen "setNextMediaPlayer failed." ); 84984b832054552e00257bb04997143ca33d6d100beMarco Nelissen ; 85084b832054552e00257bb04997143ca33d6d100beMarco Nelissen} 85184b832054552e00257bb04997143ca33d6d100beMarco Nelissen 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 85517524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong { 856d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "nativeSetDataSource", 857d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;" 858d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "[Ljava/lang/String;)V", 85917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong (void *)android_media_MediaPlayer_setDataSourceAndHeaders 86017524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong }, 86117524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 862d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD}, 8631ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface}, 864c42a96dba4beaf87875e71b8d8b77ce7154c5cdbRobert Shih {"_prepare", "()V", (void *)android_media_MediaPlayer_prepare}, 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync}, 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_start", "()V", (void *)android_media_MediaPlayer_start}, 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_stop", "()V", (void *)android_media_MediaPlayer_stop}, 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth}, 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight}, 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"seekTo", "(I)V", (void *)android_media_MediaPlayer_seekTo}, 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_pause", "()V", (void *)android_media_MediaPlayer_pause}, 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isPlaying", "()Z", (void *)android_media_MediaPlayer_isPlaying}, 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer_getCurrentPosition}, 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getDuration", "()I", (void *)android_media_MediaPlayer_getDuration}, 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_release", "()V", (void *)android_media_MediaPlayer_release}, 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_reset", "()V", (void *)android_media_MediaPlayer_reset}, 8771af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAudioStreamType", "(I)V", (void *)android_media_MediaPlayer_setAudioStreamType}, 8781af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer_getAudioStreamType}, 8798df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi {"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_setParameter}, 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setLooping", "(Z)V", (void *)android_media_MediaPlayer_setLooping}, 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isLooping", "()Z", (void *)android_media_MediaPlayer_isLooping}, 8821af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer_setVolume}, 88320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania {"native_invoke", "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke}, 884b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania {"native_setMetadataFilter", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_setMetadataFilter}, 8855d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_getMetadata}, 8864935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen {"native_init", "()V", (void *)android_media_MediaPlayer_native_init}, 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer_native_setup}, 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize}, 889619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"getAudioSessionId", "()I", (void *)android_media_MediaPlayer_get_audio_session_id}, 890619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer_set_audio_session_id}, 8911af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer_setAuxEffectSendLevel}, 8927070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer_attachAuxEffect}, 893d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang {"native_pullBatteryData", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_pullBatteryData}, 894720aa282791ef9405d39a15f419a41ab24f11e30John Grossman {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer_setRetransmitEndpoint}, 89584b832054552e00257bb04997143ca33d6d100beMarco Nelissen {"setNextMediaPlayer", "(Landroid/media/MediaPlayer;)V", (void *)android_media_MediaPlayer_setNextMediaPlayer}, 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const kClassPathName = "android/media/MediaPlayer"; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9004935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function only registers the native methods 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int register_android_media_MediaPlayer(JNIEnv *env) 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/media/MediaPlayer", gMethods, NELEM(gMethods)); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 907212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun Heextern int register_android_media_ImageReader(JNIEnv *env); 9088240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberextern int register_android_media_Crypto(JNIEnv *env); 9098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerextern int register_android_media_Drm(JNIEnv *env); 91088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaCodec(JNIEnv *env); 91188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaExtractor(JNIEnv *env); 9125a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberextern int register_android_media_MediaCodecList(JNIEnv *env); 913d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberextern int register_android_media_MediaHTTPConnection(JNIEnv *env); 914bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_MediaMetadataRetriever(JNIEnv *env); 91568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiextern int register_android_media_MediaMuxer(JNIEnv *env); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaRecorder(JNIEnv *env); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaScanner(JNIEnv *env); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_ResampleInputStream(JNIEnv *env); 919c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongextern int register_android_media_MediaProfiles(JNIEnv *env); 920bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_AmrInputStream(JNIEnv *env); 9210cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpDatabase(JNIEnv *env); 9228182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodextern int register_android_mtp_MtpDevice(JNIEnv *env); 9230cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpServer(JNIEnv *env); 924bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber 925d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberjint JNI_OnLoad(JavaVM* vm, void* /* reserved */) 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = NULL; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint result = -1; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 9313762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: GetEnv failed\n"); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(env != NULL); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 936212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He if (register_android_media_ImageReader(env) < 0) { 937212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He ALOGE("ERROR: ImageReader native registration failed"); 938212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He goto bail; 939212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He } 940212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaPlayer(env) < 0) { 9423762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaPlayer native registration failed\n"); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaRecorder(env) < 0) { 9473762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaRecorder native registration failed\n"); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaScanner(env) < 0) { 9523762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaScanner native registration failed\n"); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaMetadataRetriever(env) < 0) { 9573762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaMetadataRetriever native registration failed\n"); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_AmrInputStream(env) < 0) { 9623762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: AmrInputStream native registration failed\n"); 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_ResampleInputStream(env) < 0) { 9673762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: ResampleInputStream native registration failed\n"); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 971c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong if (register_android_media_MediaProfiles(env) < 0) { 9723762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaProfiles native registration failed"); 973c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong goto bail; 974c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong } 975c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong 9760cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpDatabase(env) < 0) { 9773762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDatabase native registration failed"); 978d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto bail; 979d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 980d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 9818182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood if (register_android_mtp_MtpDevice(env) < 0) { 9823762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDevice native registration failed"); 9838182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood goto bail; 9848182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood } 9858182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood 9860cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpServer(env) < 0) { 9873762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpServer native registration failed"); 98881ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood goto bail; 98981ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood } 99081ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood 99188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaCodec(env) < 0) { 99288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 99388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 99488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 99588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 99688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaExtractor(env) < 0) { 99788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 99888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 99988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 100088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 100168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui if (register_android_media_MediaMuxer(env) < 0) { 100268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui ALOGE("ERROR: MediaMuxer native registration failed"); 100368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui goto bail; 100468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui } 100568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui 10065a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber if (register_android_media_MediaCodecList(env) < 0) { 10075a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 10085a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber goto bail; 10095a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber } 10105a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 10118240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber if (register_android_media_Crypto(env) < 0) { 10128240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 10138240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber goto bail; 10148240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 10158240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 10168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (register_android_media_Drm(env) < 0) { 10178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker ALOGE("ERROR: MediaDrm native registration failed"); 10188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker goto bail; 10198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 10208a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1021d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (register_android_media_MediaHTTPConnection(env) < 0) { 1022d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber ALOGE("ERROR: MediaHTTPConnection native registration failed"); 1023d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber goto bail; 1024d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 1025d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* success -- return valid version number */ 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = JNI_VERSION_1_4; 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// KTHXBYE 1034