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> 23b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar#include <media/AudioResamplerPublic.h> 24d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <media/IMediaHTTPService.h> 2520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <media/MediaPlayerInterface.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 351ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg#include "android_runtime/android_view_Surface.h" 3687eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h" 374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project#include "utils/Errors.h" // for status_t 38256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/KeyedVector.h" 39256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/String8.h" 404eaa2938084353a54dc259466172909329a048ccChris Watkins#include "android_media_MediaDataSource.h" 412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_PlaybackParams.h" 422d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_SyncParams.h" 4379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include "android_media_Utils.h" 4479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong 45d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 4620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include "android_util_Binder.h" 4720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <binder/Parcel.h> 48d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h> 498335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 50d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IPCThreadState.h> 51d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IServiceManager.h> 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h" 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID context; 621ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg jfieldID surface_texture; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID post_event; 65d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 66d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetHost; 67d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetPort; 68d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetExclusionList; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 722d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic PlaybackParams::fields_t gPlaybackParamsFields; 732d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic SyncParams::fields_t gSyncParamsFields; 74b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex sLock; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ref-counted object for callbacks 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JNIMediaPlayerListener: public MediaPlayerListener 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~JNIMediaPlayerListener(); 84162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; // Reference to MediaPlayer class 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject mObject; // Weak ref to MediaPlayer Java object to call on 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz) 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hold onto the MediaPlayer class for use in calling the static method 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that posts events to the application thread. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->GetObjectClass(thiz); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 983762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/media/MediaPlayer"); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/Exception", NULL); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = (jclass)env->NewGlobalRef(clazz); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We use a weak reference so the MediaPlayer object can be garbage collected. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The reference is only used as a proxy for callbacks. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObject = env->NewGlobalRef(weak_thiz); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::~JNIMediaPlayerListener() 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remove global references 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mClass); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 117162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wangvoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 120162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang if (obj && obj->dataSize() > 0) { 121333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang jobject jParcel = createJavaParcelObject(env); 122333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang if (jParcel != NULL) { 123333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang Parcel* nativeParcel = parcelForJavaObject(env, jParcel); 1248902097bb686752ff207e3bda12713be1a8c74ebInsun Kang nativeParcel->setData(obj->data(), obj->dataSize()); 125162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 126333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang msg, ext1, ext2, jParcel); 12799f752149b1a0df9ea0ba311d609d4d6e103787cElliott Hughes env->DeleteLocalRef(jParcel); 128162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 129162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } else { 130162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 131162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang msg, ext1, ext2, NULL); 132162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 1338902097bb686752ff207e3bda12713be1a8c74ebInsun Kang if (env->ExceptionCheck()) { 1348902097bb686752ff207e3bda12713be1a8c74ebInsun Kang ALOGW("An exception occurred while notifying an event."); 1358902097bb686752ff207e3bda12713be1a8c74ebInsun Kang LOGW_EX(env); 1368902097bb686752ff207e3bda12713be1a8c74ebInsun Kang env->ExceptionClear(); 1378902097bb686752ff207e3bda12713be1a8c74ebInsun Kang } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 145075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sp<MediaPlayer>(p); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player) 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 152075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (player.get()) { 154b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian player->incStrong((void*)setMediaPlayer); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old != 0) { 157b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old->decStrong((void*)setMediaPlayer); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 159075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, (jlong)player.get()); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return old; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// If exception is NULL and opStatus is not OK, this method sends an error 16432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// event to the client application; otherwise, if exception is not NULL and 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// opStatus is not OK, this method throws the given exception to the client 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// application. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message) 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (exception == NULL) { // Don't throw exception. Instead, send an event. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opStatus != (status_t) OK) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { // Throw exception! 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( opStatus == (status_t) INVALID_OPERATION ) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 17705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } else if ( opStatus == (status_t) BAD_VALUE ) { 17805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 179fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke } else if ( opStatus == (status_t) PERMISSION_DENIED ) { 180fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke jniThrowException(env, "java/lang/SecurityException", NULL); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ( opStatus != (status_t) OK ) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strlen(message) > 230) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the message is too long, don't bother displaying the status code 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, message); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char msg[256]; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // append the status code to the message 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(msg, "%s: status=0x%X", message, opStatus); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, msg); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 196256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberandroid_media_MediaPlayer_setDataSourceAndHeaders( 197d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path, 19817524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong jobjectArray keys, jobjectArray values) { 19917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 211c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong const char *tmp = env->GetStringUTFChars(path, NULL); 212c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong if (tmp == NULL) { // Out of memory 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSource: path %s", tmp); 216256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 217c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong String8 pathStr(tmp); 218c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong env->ReleaseStringUTFChars(path, tmp); 219c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong tmp = NULL; 220c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong 22117524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong // We build a KeyedVector out of the key and val arrays 22217524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong KeyedVector<String8, String8> headersVector; 22379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong if (!ConvertKeyValueArraysToKeyedVector( 22479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong env, keys, values, &headersVector)) { 22579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong return; 226256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber } 227256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 228d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IMediaHTTPService> httpService; 229d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (httpServiceBinderObj != NULL) { 230d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj); 231d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService = interface_cast<IMediaHTTPService>(binder); 232d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 233d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 234256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber status_t opStatus = 235256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber mp->setDataSource( 236d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService, 237c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong pathStr, 23879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong headersVector.size() > 0? &headersVector : NULL); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 240256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber process_media_player_call( 241256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber env, thiz, opStatus, "java/io/IOException", 242256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber "setDataSource failed." ); 243256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber} 244256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 245256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberstatic void 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fileDescriptor == NULL) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 258a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 25971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSourceFD: fd %d", fd); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." ); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2634eaa2938084353a54dc259466172909329a048ccChris Watkinsstatic void 2644eaa2938084353a54dc259466172909329a048ccChris Watkinsandroid_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource) 2654eaa2938084353a54dc259466172909329a048ccChris Watkins{ 2664eaa2938084353a54dc259466172909329a048ccChris Watkins sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2674eaa2938084353a54dc259466172909329a048ccChris Watkins if (mp == NULL ) { 2684eaa2938084353a54dc259466172909329a048ccChris Watkins jniThrowException(env, "java/lang/IllegalStateException", NULL); 2694eaa2938084353a54dc259466172909329a048ccChris Watkins return; 2704eaa2938084353a54dc259466172909329a048ccChris Watkins } 2714eaa2938084353a54dc259466172909329a048ccChris Watkins 2724eaa2938084353a54dc259466172909329a048ccChris Watkins if (dataSource == NULL) { 2734eaa2938084353a54dc259466172909329a048ccChris Watkins jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2744eaa2938084353a54dc259466172909329a048ccChris Watkins return; 2754eaa2938084353a54dc259466172909329a048ccChris Watkins } 2764eaa2938084353a54dc259466172909329a048ccChris Watkins sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource); 2774eaa2938084353a54dc259466172909329a048ccChris Watkins process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." ); 2784eaa2938084353a54dc259466172909329a048ccChris Watkins} 2794eaa2938084353a54dc259466172909329a048ccChris Watkins 280d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstatic sp<IGraphicBufferProducer> 2811ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted BonkenburggetVideoSurfaceTexture(JNIEnv* env, jobject thiz) { 282075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture); 283d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden return sp<IGraphicBufferProducer>(p); 2848b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 287d59310d08637c8531dc7949fc166b0daeede53c0Gloria WangdecVideoSurfaceRef(JNIEnv *env, jobject thiz) 288d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang{ 289e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 290e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang if (mp == NULL) { 291e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang return; 292e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang } 293e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang 294d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz); 295d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang if (old_st != NULL) { 296b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old_st->decStrong((void*)decVideoSurfaceRef); 297d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang } 298d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang} 299d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 300d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wangstatic void 30143ef913815ec84d04877a698614a31e129cd97e3James DongsetVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive) 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 30443ef913815ec84d04877a698614a31e129cd97e3James Dong if (mp == NULL) { 30543ef913815ec84d04877a698614a31e129cd97e3James Dong if (mediaPlayerMustBeAlive) { 30643ef913815ec84d04877a698614a31e129cd97e3James Dong jniThrowException(env, "java/lang/IllegalStateException", NULL); 30743ef913815ec84d04877a698614a31e129cd97e3James Dong } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3101ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 311d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 312d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 313d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> new_st; 3141ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (jsurface) { 31564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown sp<Surface> surface(android_view_Surface_getSurface(env, jsurface)); 316f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis if (surface != NULL) { 31752800617946c456e78ed010c82d0ec4358368164Mathias Agopian new_st = surface->getIGraphicBufferProducer(); 318097922b9c1e0821beb107024bcd0dc14144c0920James Dong if (new_st == NULL) { 319097922b9c1e0821beb107024bcd0dc14144c0920James Dong jniThrowException(env, "java/lang/IllegalArgumentException", 320097922b9c1e0821beb107024bcd0dc14144c0920James Dong "The surface does not have a binding SurfaceTexture!"); 321097922b9c1e0821beb107024bcd0dc14144c0920James Dong return; 322097922b9c1e0821beb107024bcd0dc14144c0920James Dong } 323b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian new_st->incStrong((void*)decVideoSurfaceRef); 324f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } else { 325f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis jniThrowException(env, "java/lang/IllegalArgumentException", 326f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis "The surface has been released"); 327f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis return; 328f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } 3291ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg } 330d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 331075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get()); 3321ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3331ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // This will fail if the media player has not been initialized yet. This 3341ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // can be the case if setDisplay() on MediaPlayer.java has been called 3351ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // before setDataSource(). The redundant call to setVideoSurfaceTexture() 3361ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // in prepare/prepareAsync covers for this case. 3371ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(new_st); 3388b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 3398b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks 3408b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksstatic void 34143ef913815ec84d04877a698614a31e129cd97e3James Dongandroid_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface) 34243ef913815ec84d04877a698614a31e129cd97e3James Dong{ 34343ef913815ec84d04877a698614a31e129cd97e3James Dong setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */); 34443ef913815ec84d04877a698614a31e129cd97e3James Dong} 34543ef913815ec84d04877a698614a31e129cd97e3James Dong 34643ef913815ec84d04877a698614a31e129cd97e3James Dongstatic void 3478b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) 3488b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks{ 3498b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3508b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks if (mp == NULL ) { 3518b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks jniThrowException(env, "java/lang/IllegalStateException", NULL); 3528b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks return; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3541ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3551ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 3561ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 357d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 3581ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 3591ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." ); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz) 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3711ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3721ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 3731ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 374d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 3751ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 3761ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." ); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz) 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 38371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("start"); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->start(), NULL, NULL ); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz) 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 39571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("stop"); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania process_media_player_call( env, thiz, mp->stop(), NULL, NULL ); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz) 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 40771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("pause"); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->pause(), NULL, NULL ); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isPlaying(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); 422075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project const jboolean is_playing = mp->isPlaying(); 4254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 42671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isPlaying: %d", is_playing); 4274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return is_playing; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4312d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params) 432d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia{ 433d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 434d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia if (mp == NULL) { 435d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 436d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia return; 437d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia } 438b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 4392d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia PlaybackParams pbp; 4402d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.fillFromJobject(env, gPlaybackParamsFields, params); 4412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", 4422d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.speedSet, pbp.audioRate.mSpeed, 4432d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.pitchSet, pbp.audioRate.mPitch, 4442d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode, 4452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioStretchModeSet, pbp.audioRate.mStretchMode); 446b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 44705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar AudioPlaybackRate rate; 44805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar status_t err = mp->getPlaybackSettings(&rate); 44905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (err == OK) { 45005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar bool updatedRate = false; 4512d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.speedSet) { 4522d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mSpeed = pbp.audioRate.mSpeed; 45305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 45405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 4552d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.pitchSet) { 4562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mPitch = pbp.audioRate.mPitch; 45705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 45805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 4592d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.audioFallbackModeSet) { 4602d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mFallbackMode = pbp.audioRate.mFallbackMode; 46105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 46205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 4632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.audioStretchModeSet) { 4642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mStretchMode = pbp.audioRate.mStretchMode; 46505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 46605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 46705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (updatedRate) { 46805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar err = mp->setPlaybackSettings(rate); 46905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 47005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 47105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 47205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, err, 47305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 474b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar} 475b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 476b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnarstatic jobject 4772d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz) 478b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar{ 479b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 480b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar if (mp == NULL) { 481b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 482b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar return NULL; 483b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar } 484b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 4852d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia PlaybackParams pbp; 4862d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia AudioPlaybackRate &audioRate = pbp.audioRate; 48705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 48805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, mp->getPlaybackSettings(&audioRate), 48905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 490b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar ALOGV("getPlaybackSettings: %f %f %d %d", 491b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode); 492b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 4932d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.speedSet = true; 4942d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.pitchSet = true; 4952d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioFallbackModeSet = true; 4962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioStretchModeSet = true; 497b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 4982d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia return pbp.asJobject(env, gPlaybackParamsFields); 499d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia} 500d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia 501d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jiastatic void 5022d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params) 503c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{ 504c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 505c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar if (mp == NULL) { 506c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 507c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar return; 508c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar } 509c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 5102d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia SyncParams scp; 5112d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.fillFromJobject(env, gSyncParamsFields, params); 5122d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f", 5132d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.syncSourceSet, scp.sync.mSource, 5142d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode, 5152d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.toleranceSet, scp.sync.mTolerance, 5162d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRateSet, scp.frameRate); 51705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 51805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar AVSyncSettings avsync; 51905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar float videoFrameRate; 52005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar status_t err = mp->getSyncSettings(&avsync, &videoFrameRate); 52105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (err == OK) { 5222d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia bool updatedSync = scp.frameRateSet; 5232d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.syncSourceSet) { 5242d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mSource = scp.sync.mSource; 52505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 52605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.audioAdjustModeSet) { 5282d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode; 52905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 53005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5312d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.toleranceSet) { 5322d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mTolerance = scp.sync.mTolerance; 53305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 53405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 53505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (updatedSync) { 5362d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f); 53705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 53805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 53905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 54005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, err, 54105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 542c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar} 543c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 544c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic jobject 5452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz) 546c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{ 547c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 548c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar if (mp == NULL) { 549c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 550c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar return NULL; 551c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar } 552c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 5532d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia SyncParams scp; 5542d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRate = -1.f; 55505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 5562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate), 55705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 55805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 559c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar ALOGV("getSyncSettings: %d %d %f %f", 5602d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate); 56105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 5622d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia // sanity check params 5632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.sync.mSource >= AVSYNC_SOURCE_MAX 5642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX 5652d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mTolerance < 0.f 5662d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) { 56705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 56805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar return NULL; 56905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 570c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 5712d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.syncSourceSet = true; 5722d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.audioAdjustModeSet = true; 5732d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.toleranceSet = true; 5742d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRateSet = scp.frameRate >= 0.f; 575c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 5762d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia return scp.asJobject(env, gSyncParamsFields); 577c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar} 578c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 579c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic void 580075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec) 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("seekTo: %d(msec)", msec); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->seekTo(msec), NULL, NULL ); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 591075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz) 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w; 6004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoWidth(&w)) { 6013762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoWidth failed"); 6024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project w = 0; 6034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 60471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoWidth: %d", w); 605075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) w; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 608075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz) 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h; 6174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoHeight(&h)) { 6183762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoHeight failed"); 6194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project h = 0; 6204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 62171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoHeight: %d", h); 622075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) h; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 626075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz) 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL ); 63671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getCurrentPosition: %d (msec)", msec); 637075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 640075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz) 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL ); 65071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getDuration: %d (msec)", msec); 651075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz) 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 65771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("reset"); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->reset(), NULL, NULL ); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 667075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype) 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 66971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAudioStreamType: %d", streamtype); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 675bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL ); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6781af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockstatic jint 6791af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockandroid_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz) 6801af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock{ 6811af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6821af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock if (mp == NULL ) { 6831af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock jniThrowException(env, "java/lang/IllegalStateException", NULL); 6841af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return 0; 6851af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock } 6861af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock audio_stream_type_t streamtype; 6871af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL ); 6881af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock ALOGV("getAudioStreamType: %d (streamtype)", streamtype); 6891af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return (jint) streamtype; 6901af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock} 6911af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock 6928df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivistatic jboolean 6938df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Triviandroid_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request) 6948df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi{ 6958df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi ALOGV("setParameter: key %d", key); 6968df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6978df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (mp == NULL ) { 6988df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi jniThrowException(env, "java/lang/IllegalStateException", NULL); 6998df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 7008df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 7018df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 7028df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi Parcel *request = parcelForJavaObject(env, java_request); 7038df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi status_t err = mp->setParameter(key, *request); 7048df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (err == OK) { 7058df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return true; 7068df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } else { 7078df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 7088df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 7098df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi} 7108df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping) 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 71471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setLooping: %d", looping); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL ); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz) 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 72671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isLooping"); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 730075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 732075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return mp->isLooping() ? JNI_TRUE : JNI_FALSE; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 736075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume) 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 738075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 744075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL ); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// Sends the request and reply parcels to the media player via the 74820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// binder interface. 74920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniastatic jint 75020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, 75120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jobject java_request, jobject java_reply) 75220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania{ 75320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 75420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania if (media_player == NULL ) { 75520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 756b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 75720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania } 75820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 75920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *request = parcelForJavaObject(env, java_request); 76020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *reply = parcelForJavaObject(env, java_reply); 76120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 76220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // Don't use process_media_player_call which use the async loop to 76320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // report errors, instead returns the status. 764075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->invoke(*request, reply); 76520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania} 76620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 767b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania// Sends the new filter to the client. 768b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniastatic jint 769b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniaandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request) 770b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania{ 771b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 772b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania if (media_player == NULL ) { 773b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 774b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 775b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania } 776b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 777b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania Parcel *filter = parcelForJavaObject(env, request); 778b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 7795d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (filter == NULL ) { 7805d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Filter is null"); 7815d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania return UNKNOWN_ERROR; 7825d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 7835d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 784075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->setMetadataFilter(*filter); 785b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania} 786b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 7875d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniastatic jboolean 7885d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniaandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only, 7895d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jboolean apply_filter, jobject reply) 7905d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania{ 7915d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 7925d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (media_player == NULL ) { 7935d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 794075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 7955d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 7965d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 7975d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania Parcel *metadata = parcelForJavaObject(env, reply); 7985d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 7995d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (metadata == NULL ) { 8005d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null"); 801075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 8025d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 8035d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 8045d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania metadata->freeData(); 8055d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // On return metadata is positioned at the beginning of the 8065d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // metadata. Note however that the parcel actually starts with the 8075d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // return code so you should not rewind the parcel using 8085d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // setDataPosition(0). 809075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) { 810075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 811075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } else { 812075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 813075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } 8145d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania} 8155d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 8164935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function gets some field IDs, which in turn causes class initialization. 8174935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// It is called from a static block in MediaPlayer, which won't run until the 8184935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// first time an instance of this class is used. 8194935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenstatic void 8204935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenandroid_media_MediaPlayer_native_init(JNIEnv *env) 8214935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen{ 8224935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen jclass clazz; 8234935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 8244935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen clazz = env->FindClass("android/media/MediaPlayer"); 8254935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (clazz == NULL) { 8264935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 8274935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 8284935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 829075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); 8304935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.context == NULL) { 8314935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 8324935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 8334935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 8344935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", 8354935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 8364935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.post_event == NULL) { 8374935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 8384935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 8394935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 840075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J"); 8411ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (fields.surface_texture == NULL) { 842cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return; 843cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 844d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 845b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar env->DeleteLocalRef(clazz); 846b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 8475ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun clazz = env->FindClass("android/net/ProxyInfo"); 848d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber if (clazz == NULL) { 849d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber return; 850d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber } 851d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 852d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetHost = 853d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;"); 854d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 855d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetPort = 856d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getPort", "()I"); 857d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 858d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetExclusionList = 8595ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;"); 860b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 861b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar env->DeleteLocalRef(clazz); 862b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 8632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia gPlaybackParamsFields.init(env); 8642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia gSyncParamsFields.init(env); 8654935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen} 866b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 87071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_setup"); 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = new MediaPlayer(); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create new listener and give it to MediaPlayer 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this); 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(listener); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ MediaPlayer in an opaque field in the Java object. 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaPlayer(env, thiz, mp); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz) 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 88871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("release"); 889d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != NULL) { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this prevents native callbacks after the object is released 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(0); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->disconnect(); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz) 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 90171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_finalize"); 9028dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 9038dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen if (mp != NULL) { 9048564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("MediaPlayer finalized without being released"); 9058dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_media_MediaPlayer_release(env, thiz); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90933b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kastenstatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env, jobject thiz, 91033b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten jint sessionId) { 91171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("set_session_id(): %d", sessionId); 912619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 913619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 914619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 915619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return; 916619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 91733b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioSessionId((audio_session_t) sessionId), NULL, 91833b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten NULL); 919619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 920619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 921619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env, jobject thiz) { 92271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("get_session_id()"); 923619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 924619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 925619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 926619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return 0; 927619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 928619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 929075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) mp->getAudioSessionId(); 930619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 931619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 9327070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void 9337070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level) 9347070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{ 93571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAuxEffectSendLevel: level %f", level); 9367070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 9377070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 9387070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 9397070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 9407070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 9417070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL ); 9427070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 9437070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 9447070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env, jobject thiz, jint effectId) { 94571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("attachAuxEffect(): %d", effectId); 9467070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 9477070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 9487070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 9497070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 9507070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 9517070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL ); 9527070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 9537070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 954d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wangstatic jint 955d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberandroid_media_MediaPlayer_pullBatteryData( 956d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject /* thiz */, jobject java_reply) 957d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang{ 958d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player")); 959d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 960d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang if (service.get() == NULL) { 961d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService"); 962d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang return UNKNOWN_ERROR; 963d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang } 964d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 965d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang Parcel *reply = parcelForJavaObject(env, java_reply); 966d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 967075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) service->pullBatteryData(reply); 968d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang} 969d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 970720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanstatic jint 971720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanandroid_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz, 972720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jstring addrString, jint port) { 973720aa282791ef9405d39a15f419a41ab24f11e30John Grossman sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 974720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (mp == NULL ) { 975720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 976720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return INVALID_OPERATION; 977720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 978720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 979720aa282791ef9405d39a15f419a41ab24f11e30John Grossman const char *cAddrString = NULL; 980720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 981720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 982720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString = env->GetStringUTFChars(addrString, NULL); 983720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString == NULL) { // Out of memory 984720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return NO_MEMORY; 985720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 986720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 987720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ALOGV("setRetransmitEndpoint: %s:%d", 988720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString ? cAddrString : "(null)", port); 989720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 990720aa282791ef9405d39a15f419a41ab24f11e30John Grossman status_t ret; 991720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString && (port > 0xFFFF)) { 992720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = BAD_VALUE; 993720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } else { 994720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = mp->setRetransmitEndpoint(cAddrString, 995720aa282791ef9405d39a15f419a41ab24f11e30John Grossman static_cast<uint16_t>(port)); 996720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 997720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 998720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 999720aa282791ef9405d39a15f419a41ab24f11e30John Grossman env->ReleaseStringUTFChars(addrString, cAddrString); 1000720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1001720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1002720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (ret == INVALID_OPERATION ) { 1003720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 1004720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1005720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1006075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) ret; 1007720aa282791ef9405d39a15f419a41ab24f11e30John Grossman} 1008720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 100984b832054552e00257bb04997143ca33d6d100beMarco Nelissenstatic void 101084b832054552e00257bb04997143ca33d6d100beMarco Nelissenandroid_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player) 101184b832054552e00257bb04997143ca33d6d100beMarco Nelissen{ 101284b832054552e00257bb04997143ca33d6d100beMarco Nelissen ALOGV("setNextMediaPlayer"); 101384b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz); 101484b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (thisplayer == NULL) { 101584b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized"); 101684b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 101784b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 101884b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player); 101984b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == NULL && java_player != NULL) { 102084b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized"); 102184b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 102284b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 102384b832054552e00257bb04997143ca33d6d100beMarco Nelissen 102484b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == thisplayer) { 102584b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self"); 102684b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 102784b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 102884b832054552e00257bb04997143ca33d6d100beMarco Nelissen // tie the two players together 102984b832054552e00257bb04997143ca33d6d100beMarco Nelissen process_media_player_call( 103084b832054552e00257bb04997143ca33d6d100beMarco Nelissen env, thiz, thisplayer->setNextMediaPlayer(nextplayer), 103184b832054552e00257bb04997143ca33d6d100beMarco Nelissen "java/lang/IllegalArgumentException", 103284b832054552e00257bb04997143ca33d6d100beMarco Nelissen "setNextMediaPlayer failed." ); 103384b832054552e00257bb04997143ca33d6d100beMarco Nelissen ; 103484b832054552e00257bb04997143ca33d6d100beMarco Nelissen} 103584b832054552e00257bb04997143ca33d6d100beMarco Nelissen 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 103876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 103917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong { 1040d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "nativeSetDataSource", 1041d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;" 1042d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "[Ljava/lang/String;)V", 104317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong (void *)android_media_MediaPlayer_setDataSourceAndHeaders 104417524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong }, 104517524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 10464eaa2938084353a54dc259466172909329a048ccChris Watkins {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD}, 10474eaa2938084353a54dc259466172909329a048ccChris Watkins {"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback }, 10481ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface}, 1049c42a96dba4beaf87875e71b8d8b77ce7154c5cdbRobert Shih {"_prepare", "()V", (void *)android_media_MediaPlayer_prepare}, 105007830aa6ba4804880df3cb39f8932aa6b3906a8aRobert Shih {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync}, 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_start", "()V", (void *)android_media_MediaPlayer_start}, 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_stop", "()V", (void *)android_media_MediaPlayer_stop}, 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth}, 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight}, 10552d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams}, 10562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams}, 10572d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"setSyncParams", "(Landroid/media/SyncParams;)V", (void *)android_media_MediaPlayer_setSyncParams}, 10582d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"getSyncParams", "()Landroid/media/SyncParams;", (void *)android_media_MediaPlayer_getSyncParams}, 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"seekTo", "(I)V", (void *)android_media_MediaPlayer_seekTo}, 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_pause", "()V", (void *)android_media_MediaPlayer_pause}, 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isPlaying", "()Z", (void *)android_media_MediaPlayer_isPlaying}, 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer_getCurrentPosition}, 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getDuration", "()I", (void *)android_media_MediaPlayer_getDuration}, 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_release", "()V", (void *)android_media_MediaPlayer_release}, 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_reset", "()V", (void *)android_media_MediaPlayer_reset}, 10661af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAudioStreamType", "(I)V", (void *)android_media_MediaPlayer_setAudioStreamType}, 10671af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer_getAudioStreamType}, 10688df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi {"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_setParameter}, 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setLooping", "(Z)V", (void *)android_media_MediaPlayer_setLooping}, 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isLooping", "()Z", (void *)android_media_MediaPlayer_isLooping}, 10711af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer_setVolume}, 107220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania {"native_invoke", "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke}, 1073b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania {"native_setMetadataFilter", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_setMetadataFilter}, 10745d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_getMetadata}, 10754935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen {"native_init", "()V", (void *)android_media_MediaPlayer_native_init}, 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer_native_setup}, 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize}, 1078619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"getAudioSessionId", "()I", (void *)android_media_MediaPlayer_get_audio_session_id}, 1079619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer_set_audio_session_id}, 10801af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer_setAuxEffectSendLevel}, 10817070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer_attachAuxEffect}, 1082d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang {"native_pullBatteryData", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_pullBatteryData}, 1083720aa282791ef9405d39a15f419a41ab24f11e30John Grossman {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer_setRetransmitEndpoint}, 108484b832054552e00257bb04997143ca33d6d100beMarco Nelissen {"setNextMediaPlayer", "(Landroid/media/MediaPlayer;)V", (void *)android_media_MediaPlayer_setNextMediaPlayer}, 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10874935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function only registers the native methods 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int register_android_media_MediaPlayer(JNIEnv *env) 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/media/MediaPlayer", gMethods, NELEM(gMethods)); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1093fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chungextern int register_android_media_ExifInterface(JNIEnv *env); 1094212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun Heextern int register_android_media_ImageReader(JNIEnv *env); 1095f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun Heextern int register_android_media_ImageWriter(JNIEnv *env); 10968240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberextern int register_android_media_Crypto(JNIEnv *env); 10978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerextern int register_android_media_Drm(JNIEnv *env); 109888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaCodec(JNIEnv *env); 109988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaExtractor(JNIEnv *env); 11005a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberextern int register_android_media_MediaCodecList(JNIEnv *env); 1101d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberextern int register_android_media_MediaHTTPConnection(JNIEnv *env); 1102bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_MediaMetadataRetriever(JNIEnv *env); 110368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiextern int register_android_media_MediaMuxer(JNIEnv *env); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaRecorder(JNIEnv *env); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaScanner(JNIEnv *env); 1106071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jiaextern int register_android_media_MediaSync(JNIEnv *env); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_ResampleInputStream(JNIEnv *env); 1108c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongextern int register_android_media_MediaProfiles(JNIEnv *env); 1109bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_AmrInputStream(JNIEnv *env); 11100cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpDatabase(JNIEnv *env); 11118182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodextern int register_android_mtp_MtpDevice(JNIEnv *env); 11120cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpServer(JNIEnv *env); 1113bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber 1114d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberjint JNI_OnLoad(JavaVM* vm, void* /* reserved */) 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = NULL; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint result = -1; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 11203762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: GetEnv failed\n"); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(env != NULL); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1125f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He if (register_android_media_ImageWriter(env) != JNI_OK) { 1126f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He ALOGE("ERROR: ImageWriter native registration failed"); 1127f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He goto bail; 1128f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He } 1129f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He 1130212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He if (register_android_media_ImageReader(env) < 0) { 1131212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He ALOGE("ERROR: ImageReader native registration failed"); 1132212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He goto bail; 1133212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He } 1134212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaPlayer(env) < 0) { 11363762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaPlayer native registration failed\n"); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaRecorder(env) < 0) { 11413762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaRecorder native registration failed\n"); 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaScanner(env) < 0) { 11463762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaScanner native registration failed\n"); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaMetadataRetriever(env) < 0) { 11513762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaMetadataRetriever native registration failed\n"); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_AmrInputStream(env) < 0) { 11563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: AmrInputStream native registration failed\n"); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_ResampleInputStream(env) < 0) { 11613762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: ResampleInputStream native registration failed\n"); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1165c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong if (register_android_media_MediaProfiles(env) < 0) { 11663762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaProfiles native registration failed"); 1167c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong goto bail; 1168c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong } 1169c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong 11700cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpDatabase(env) < 0) { 11713762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDatabase native registration failed"); 1172d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto bail; 1173d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1174d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 11758182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood if (register_android_mtp_MtpDevice(env) < 0) { 11763762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDevice native registration failed"); 11778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood goto bail; 11788182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood } 11798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood 11800cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpServer(env) < 0) { 11813762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpServer native registration failed"); 118281ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood goto bail; 118381ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood } 118481ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood 118588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaCodec(env) < 0) { 118688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 1187071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia goto bail; 1188071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia } 1189071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia 1190071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia if (register_android_media_MediaSync(env) < 0) { 1191071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia ALOGE("ERROR: MediaSync native registration failed"); 119288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 119388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 119488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 119588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaExtractor(env) < 0) { 119688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 119788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 119888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 119988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 120068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui if (register_android_media_MediaMuxer(env) < 0) { 120168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui ALOGE("ERROR: MediaMuxer native registration failed"); 120268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui goto bail; 120368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui } 120468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui 12055a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber if (register_android_media_MediaCodecList(env) < 0) { 12065a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 12075a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber goto bail; 12085a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber } 12095a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 12108240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber if (register_android_media_Crypto(env) < 0) { 12118240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 12128240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber goto bail; 12138240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 12148240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 12158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (register_android_media_Drm(env) < 0) { 12168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker ALOGE("ERROR: MediaDrm native registration failed"); 12178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker goto bail; 12188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 12198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1220d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (register_android_media_MediaHTTPConnection(env) < 0) { 1221d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber ALOGE("ERROR: MediaHTTPConnection native registration failed"); 1222d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber goto bail; 1223d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 1224d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 1225fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung if (register_android_media_ExifInterface(env) < 0) { 1226fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung ALOGE("ERROR: ExifInterface native registration failed"); 1227fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung goto bail; 1228fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung } 1229fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* success -- return valid version number */ 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = JNI_VERSION_1_4; 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// KTHXBYE 1238