android_media_MediaPlayer.cpp revision 10353e36018224b86ef2918d1d68107459d445cf
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> 260e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <media/MediaAnalyticsItem.h> 270e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <media/stagefright/Utils.h> // for FOURCC definition 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 371ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg#include "android_runtime/android_view_Surface.h" 3887eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h" 394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project#include "utils/Errors.h" // for status_t 40256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/KeyedVector.h" 41256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/String8.h" 4223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia#include "android_media_BufferingParams.h" 434eaa2938084353a54dc259466172909329a048ccChris Watkins#include "android_media_MediaDataSource.h" 440e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include "android_media_MediaMetricsJNI.h" 452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_PlaybackParams.h" 462d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_SyncParams.h" 47035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung#include "android_media_VolumeShaper.h" 4879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include "android_media_Utils.h" 4979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong 50d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 5120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include "android_util_Binder.h" 5220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <binder/Parcel.h> 53d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h> 548335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 55d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IPCThreadState.h> 56d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IServiceManager.h> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h" 590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM begin 610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#define FIND_CLASS(var, className) \ 620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniavar = env->FindClass(className); \ 630b52e95c3fe5e8de93276678d7db9a17b217622eHassan ShojaniaLOG_FATAL_IF(! (var), "Unable to find class " className); 640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#define GET_METHOD_ID(var, clazz, fieldName, fieldDescriptor) \ 660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniavar = env->GetMethodID(clazz, fieldName, fieldDescriptor); \ 670b52e95c3fe5e8de93276678d7db9a17b217622eHassan ShojaniaLOG_FATAL_IF(! (var), "Unable to find method " fieldName); 680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct StateExceptionFields { 700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jmethodID init; 710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jclass classId; 720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}; 730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 7406b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojaniastatic StateExceptionFields gStateExceptionFields; 750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM end 760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID context; 851ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg jfieldID surface_texture; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID post_event; 88d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 89d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetHost; 90d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetPort; 91d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetExclusionList; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9523dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic BufferingParams::fields_t gBufferingParamsFields; 962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic PlaybackParams::fields_t gPlaybackParamsFields; 972d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic SyncParams::fields_t gSyncParamsFields; 98035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic VolumeShaperHelper::fields_t gVolumeShaperFields; 99b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex sLock; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ref-counted object for callbacks 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JNIMediaPlayerListener: public MediaPlayerListener 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~JNIMediaPlayerListener(); 109162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; // Reference to MediaPlayer class 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject mObject; // Weak ref to MediaPlayer Java object to call on 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hold onto the MediaPlayer class for use in calling the static method 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that posts events to the application thread. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->GetObjectClass(thiz); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 1233762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/media/MediaPlayer"); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/Exception", NULL); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = (jclass)env->NewGlobalRef(clazz); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We use a weak reference so the MediaPlayer object can be garbage collected. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The reference is only used as a proxy for callbacks. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObject = env->NewGlobalRef(weak_thiz); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::~JNIMediaPlayerListener() 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remove global references 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mClass); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 142162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wangvoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 145162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang if (obj && obj->dataSize() > 0) { 146333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang jobject jParcel = createJavaParcelObject(env); 147333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang if (jParcel != NULL) { 148333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang Parcel* nativeParcel = parcelForJavaObject(env, jParcel); 1498902097bb686752ff207e3bda12713be1a8c74ebInsun Kang nativeParcel->setData(obj->data(), obj->dataSize()); 150162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 151333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang msg, ext1, ext2, jParcel); 15299f752149b1a0df9ea0ba311d609d4d6e103787cElliott Hughes env->DeleteLocalRef(jParcel); 153162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 154162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } else { 155162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 156162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang msg, ext1, ext2, NULL); 157162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 1588902097bb686752ff207e3bda12713be1a8c74ebInsun Kang if (env->ExceptionCheck()) { 1598902097bb686752ff207e3bda12713be1a8c74ebInsun Kang ALOGW("An exception occurred while notifying an event."); 1608902097bb686752ff207e3bda12713be1a8c74ebInsun Kang LOGW_EX(env); 1618902097bb686752ff207e3bda12713be1a8c74ebInsun Kang env->ExceptionClear(); 1628902097bb686752ff207e3bda12713be1a8c74ebInsun Kang } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 170075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sp<MediaPlayer>(p); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player) 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 177075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (player.get()) { 179b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian player->incStrong((void*)setMediaPlayer); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old != 0) { 182b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old->decStrong((void*)setMediaPlayer); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 184075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, (jlong)player.get()); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return old; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18832f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// If exception is NULL and opStatus is not OK, this method sends an error 18932f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// event to the client application; otherwise, if exception is not NULL and 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// opStatus is not OK, this method throws the given exception to the client 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// application. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message) 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (exception == NULL) { // Don't throw exception. Instead, send an event. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opStatus != (status_t) OK) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { // Throw exception! 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( opStatus == (status_t) INVALID_OPERATION ) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 20205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } else if ( opStatus == (status_t) BAD_VALUE ) { 20305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 204fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke } else if ( opStatus == (status_t) PERMISSION_DENIED ) { 205fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke jniThrowException(env, "java/lang/SecurityException", NULL); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ( opStatus != (status_t) OK ) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strlen(message) > 230) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the message is too long, don't bother displaying the status code 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, message); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char msg[256]; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // append the status code to the message 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(msg, "%s: status=0x%X", message, opStatus); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, msg); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 221256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberandroid_media_MediaPlayer_setDataSourceAndHeaders( 222d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path, 22317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong jobjectArray keys, jobjectArray values) { 22417524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 236c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong const char *tmp = env->GetStringUTFChars(path, NULL); 237c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong if (tmp == NULL) { // Out of memory 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSource: path %s", tmp); 241256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 242c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong String8 pathStr(tmp); 243c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong env->ReleaseStringUTFChars(path, tmp); 244c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong tmp = NULL; 245c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong 24617524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong // We build a KeyedVector out of the key and val arrays 24717524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong KeyedVector<String8, String8> headersVector; 24879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong if (!ConvertKeyValueArraysToKeyedVector( 24979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong env, keys, values, &headersVector)) { 25079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong return; 251256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber } 252256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 253d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IMediaHTTPService> httpService; 254d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (httpServiceBinderObj != NULL) { 255d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj); 256d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService = interface_cast<IMediaHTTPService>(binder); 257d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 258d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 259256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber status_t opStatus = 260256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber mp->setDataSource( 261d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService, 262c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong pathStr, 26379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong headersVector.size() > 0? &headersVector : NULL); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 265256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber process_media_player_call( 266256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber env, thiz, opStatus, "java/io/IOException", 267256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber "setDataSource failed." ); 268256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber} 269256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 270256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberstatic void 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fileDescriptor == NULL) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 283a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 28471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSourceFD: fd %d", fd); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." ); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2884eaa2938084353a54dc259466172909329a048ccChris Watkinsstatic void 2894eaa2938084353a54dc259466172909329a048ccChris Watkinsandroid_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource) 2904eaa2938084353a54dc259466172909329a048ccChris Watkins{ 2914eaa2938084353a54dc259466172909329a048ccChris Watkins sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2924eaa2938084353a54dc259466172909329a048ccChris Watkins if (mp == NULL ) { 2934eaa2938084353a54dc259466172909329a048ccChris Watkins jniThrowException(env, "java/lang/IllegalStateException", NULL); 2944eaa2938084353a54dc259466172909329a048ccChris Watkins return; 2954eaa2938084353a54dc259466172909329a048ccChris Watkins } 2964eaa2938084353a54dc259466172909329a048ccChris Watkins 2974eaa2938084353a54dc259466172909329a048ccChris Watkins if (dataSource == NULL) { 2984eaa2938084353a54dc259466172909329a048ccChris Watkins jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2994eaa2938084353a54dc259466172909329a048ccChris Watkins return; 3004eaa2938084353a54dc259466172909329a048ccChris Watkins } 3014eaa2938084353a54dc259466172909329a048ccChris Watkins sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource); 3024eaa2938084353a54dc259466172909329a048ccChris Watkins process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." ); 3034eaa2938084353a54dc259466172909329a048ccChris Watkins} 3044eaa2938084353a54dc259466172909329a048ccChris Watkins 305d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstatic sp<IGraphicBufferProducer> 3061ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted BonkenburggetVideoSurfaceTexture(JNIEnv* env, jobject thiz) { 307075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture); 308d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden return sp<IGraphicBufferProducer>(p); 3098b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 312d59310d08637c8531dc7949fc166b0daeede53c0Gloria WangdecVideoSurfaceRef(JNIEnv *env, jobject thiz) 313d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang{ 314e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 315e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang if (mp == NULL) { 316e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang return; 317e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang } 318e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang 319d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz); 320d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang if (old_st != NULL) { 321b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old_st->decStrong((void*)decVideoSurfaceRef); 322d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang } 323d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang} 324d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 325d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wangstatic void 32643ef913815ec84d04877a698614a31e129cd97e3James DongsetVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive) 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 32943ef913815ec84d04877a698614a31e129cd97e3James Dong if (mp == NULL) { 33043ef913815ec84d04877a698614a31e129cd97e3James Dong if (mediaPlayerMustBeAlive) { 33143ef913815ec84d04877a698614a31e129cd97e3James Dong jniThrowException(env, "java/lang/IllegalStateException", NULL); 33243ef913815ec84d04877a698614a31e129cd97e3James Dong } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3351ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 336d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 337d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 338d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> new_st; 3391ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (jsurface) { 34064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown sp<Surface> surface(android_view_Surface_getSurface(env, jsurface)); 341f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis if (surface != NULL) { 34252800617946c456e78ed010c82d0ec4358368164Mathias Agopian new_st = surface->getIGraphicBufferProducer(); 343097922b9c1e0821beb107024bcd0dc14144c0920James Dong if (new_st == NULL) { 344097922b9c1e0821beb107024bcd0dc14144c0920James Dong jniThrowException(env, "java/lang/IllegalArgumentException", 345097922b9c1e0821beb107024bcd0dc14144c0920James Dong "The surface does not have a binding SurfaceTexture!"); 346097922b9c1e0821beb107024bcd0dc14144c0920James Dong return; 347097922b9c1e0821beb107024bcd0dc14144c0920James Dong } 348b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian new_st->incStrong((void*)decVideoSurfaceRef); 349f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } else { 350f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis jniThrowException(env, "java/lang/IllegalArgumentException", 351f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis "The surface has been released"); 352f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis return; 353f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } 3541ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg } 355d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 356075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get()); 3571ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3581ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // This will fail if the media player has not been initialized yet. This 3591ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // can be the case if setDisplay() on MediaPlayer.java has been called 3601ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // before setDataSource(). The redundant call to setVideoSurfaceTexture() 3611ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // in prepare/prepareAsync covers for this case. 3621ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(new_st); 3638b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 3648b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks 3658b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksstatic void 36643ef913815ec84d04877a698614a31e129cd97e3James Dongandroid_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface) 36743ef913815ec84d04877a698614a31e129cd97e3James Dong{ 36843ef913815ec84d04877a698614a31e129cd97e3James Dong setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */); 36943ef913815ec84d04877a698614a31e129cd97e3James Dong} 37043ef913815ec84d04877a698614a31e129cd97e3James Dong 37123dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic jobject 37223dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_getDefaultBufferingParams(JNIEnv *env, jobject thiz) 37323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{ 37423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 37523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (mp == NULL) { 37623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 37723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return NULL; 37823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 37923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 38023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingParams bp; 38123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingSettings &settings = bp.settings; 38223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia process_media_player_call( 38323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia env, thiz, mp->getDefaultBufferingSettings(&settings), 38423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia "java/lang/IllegalStateException", "unexpected error"); 38523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia ALOGV("getDefaultBufferingSettings:{%s}", settings.toString().string()); 38623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 38723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return bp.asJobject(env, gBufferingParamsFields); 38823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia} 38923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 39023dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic jobject 39123dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_getBufferingParams(JNIEnv *env, jobject thiz) 39223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{ 39323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 39423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (mp == NULL) { 39523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 39623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return NULL; 39723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 39823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 39923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingParams bp; 40023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingSettings &settings = bp.settings; 40123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia process_media_player_call( 40223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia env, thiz, mp->getBufferingSettings(&settings), 40323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia "java/lang/IllegalStateException", "unexpected error"); 40423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia ALOGV("getBufferingSettings:{%s}", settings.toString().string()); 40523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 40623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return bp.asJobject(env, gBufferingParamsFields); 40723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia} 40823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 40923dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic void 41023dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_setBufferingParams(JNIEnv *env, jobject thiz, jobject params) 41123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{ 41223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (params == NULL) { 41323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return; 41423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 41523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 41623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 41723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (mp == NULL) { 41823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 41923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return; 42023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 42123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 42223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingParams bp; 42323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia bp.fillFromJobject(env, gBufferingParamsFields, params); 42423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia ALOGV("setBufferingParams:{%s}", bp.settings.toString().string()); 42523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 42623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia process_media_player_call( 42723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia env, thiz, mp->setBufferingSettings(bp.settings), 42823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia "java/lang/IllegalStateException", "unexpected error"); 42923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia} 43023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 43143ef913815ec84d04877a698614a31e129cd97e3James Dongstatic void 4328b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) 4338b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks{ 4348b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4358b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks if (mp == NULL ) { 4368b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks jniThrowException(env, "java/lang/IllegalStateException", NULL); 4378b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks return; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4391ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4401ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 4411ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 442d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 4431ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 4441ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." ); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz) 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4561ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4571ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 4581ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 459d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 4601ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 4611ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." ); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz) 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 46871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("start"); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->start(), NULL, NULL ); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz) 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 48071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("stop"); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48632f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania process_media_player_call( env, thiz, mp->stop(), NULL, NULL ); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz) 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 49271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("pause"); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->pause(), NULL, NULL ); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz) 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 507075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project const jboolean is_playing = mp->isPlaying(); 5104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 51171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isPlaying: %d", is_playing); 5124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return is_playing; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 5162d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params) 517d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia{ 518d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 519d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia if (mp == NULL) { 520d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 521d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia return; 522d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia } 523b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5242d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia PlaybackParams pbp; 5252d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.fillFromJobject(env, gPlaybackParamsFields, params); 5262d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", 5272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.speedSet, pbp.audioRate.mSpeed, 5282d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.pitchSet, pbp.audioRate.mPitch, 5292d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode, 5302d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioStretchModeSet, pbp.audioRate.mStretchMode); 531b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 53205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar AudioPlaybackRate rate; 53305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar status_t err = mp->getPlaybackSettings(&rate); 53405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (err == OK) { 53505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar bool updatedRate = false; 5362d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.speedSet) { 5372d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mSpeed = pbp.audioRate.mSpeed; 53805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 53905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5402d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.pitchSet) { 5412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mPitch = pbp.audioRate.mPitch; 54205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 54305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5442d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.audioFallbackModeSet) { 5452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mFallbackMode = pbp.audioRate.mFallbackMode; 54605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 54705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5482d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.audioStretchModeSet) { 5492d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mStretchMode = pbp.audioRate.mStretchMode; 55005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 55105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 55205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (updatedRate) { 55305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar err = mp->setPlaybackSettings(rate); 55405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 55505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 55605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 55705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, err, 55805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 559b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar} 560b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 561b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnarstatic jobject 5622d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz) 563b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar{ 564b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 565b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar if (mp == NULL) { 566b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 567b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar return NULL; 568b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar } 569b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5702d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia PlaybackParams pbp; 5712d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia AudioPlaybackRate &audioRate = pbp.audioRate; 57205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 57305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, mp->getPlaybackSettings(&audioRate), 57405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 575b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar ALOGV("getPlaybackSettings: %f %f %d %d", 576b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode); 577b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5782d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.speedSet = true; 5792d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.pitchSet = true; 5802d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioFallbackModeSet = true; 5812d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioStretchModeSet = true; 582b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5832d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia return pbp.asJobject(env, gPlaybackParamsFields); 584d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia} 585d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia 586d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jiastatic void 5872d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params) 588c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{ 589c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 590c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar if (mp == NULL) { 591c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 592c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar return; 593c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar } 594c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 5952d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia SyncParams scp; 5962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.fillFromJobject(env, gSyncParamsFields, params); 5972d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f", 5982d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.syncSourceSet, scp.sync.mSource, 5992d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode, 6002d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.toleranceSet, scp.sync.mTolerance, 6012d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRateSet, scp.frameRate); 60205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 60305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar AVSyncSettings avsync; 60405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar float videoFrameRate; 60505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar status_t err = mp->getSyncSettings(&avsync, &videoFrameRate); 60605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (err == OK) { 6072d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia bool updatedSync = scp.frameRateSet; 6082d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.syncSourceSet) { 6092d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mSource = scp.sync.mSource; 61005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 61105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 6122d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.audioAdjustModeSet) { 6132d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode; 61405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 61505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 6162d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.toleranceSet) { 6172d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mTolerance = scp.sync.mTolerance; 61805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 61905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 62005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (updatedSync) { 6212d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f); 62205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 62305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 62405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 62505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, err, 62605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 627c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar} 628c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 629c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic jobject 6302d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz) 631c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{ 632c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 633c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar if (mp == NULL) { 634c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 635c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar return NULL; 636c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar } 637c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 6382d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia SyncParams scp; 6392d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRate = -1.f; 64005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 6412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate), 64205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 64305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 644c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar ALOGV("getSyncSettings: %d %d %f %f", 6452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate); 64605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 6472d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia // sanity check params 6482d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.sync.mSource >= AVSYNC_SOURCE_MAX 6492d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX 6502d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mTolerance < 0.f 6512d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) { 65205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 65305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar return NULL; 65405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 655c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 6562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.syncSourceSet = true; 6572d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.audioAdjustModeSet = true; 6582d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.toleranceSet = true; 6592d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRateSet = scp.frameRate >= 0.f; 660c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 6612d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia return scp.asJobject(env, gSyncParamsFields); 662c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar} 663c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 664c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic void 665ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jiaandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec, jint mode) 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 672ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jia ALOGV("seekTo: %d(msec), mode=%d", msec, mode); 673ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jia process_media_player_call( env, thiz, mp->seekTo(msec, (MediaPlayerSeekMode)mode), NULL, NULL ); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 676075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz) 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w; 6854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoWidth(&w)) { 6863762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoWidth failed"); 6874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project w = 0; 6884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 68971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoWidth: %d", w); 690075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) w; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 693075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz) 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h; 7024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoHeight(&h)) { 7033762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoHeight failed"); 7044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project h = 0; 7054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 70671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoHeight: %d", h); 707075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) h; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7100e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essickstatic jobject 711f2d0e40bf01fa133dd6b36f3716005d53fa9776cRay Essickandroid_media_MediaPlayer_native_getMetrics(JNIEnv *env, jobject thiz) 7120e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick{ 7130e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7140e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick if (mp == NULL ) { 7150e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick jniThrowException(env, "java/lang/IllegalStateException", NULL); 7160e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick return 0; 7170e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick } 7180e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7190e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick Parcel p; 7200e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick int key = FOURCC('m','t','r','X'); 7210e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick status_t status = mp->getParameter(key, &p); 7220e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick if (status != OK) { 7230e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick ALOGD("getMetrics() failed: %d", status); 7240e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick return (jobject) NULL; 7250e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick } 7260e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7270e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick MediaAnalyticsItem *item = new MediaAnalyticsItem; 7280e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick item->readFromParcel(p); 7290e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL); 7300e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7310e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick // housekeeping 7320e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick delete item; 7330e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick item = NULL; 7340e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7350e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick return mybundle; 7360e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick} 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 738075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz) 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL ); 74871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getCurrentPosition: %d (msec)", msec); 749075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 752075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz) 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL ); 76271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getDuration: %d (msec)", msec); 763075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz) 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 76971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("reset"); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->reset(), NULL, NULL ); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 779075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype) 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 78171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAudioStreamType: %d", streamtype); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 787bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL ); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7901af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockstatic jint 7911af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockandroid_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz) 7921af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock{ 7931af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7941af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock if (mp == NULL ) { 7951af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock jniThrowException(env, "java/lang/IllegalStateException", NULL); 7961af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return 0; 7971af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock } 7981af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock audio_stream_type_t streamtype; 7991af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL ); 8001af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock ALOGV("getAudioStreamType: %d (streamtype)", streamtype); 8011af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return (jint) streamtype; 8021af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock} 8031af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock 8048df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivistatic jboolean 8058df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Triviandroid_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request) 8068df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi{ 8078df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi ALOGV("setParameter: key %d", key); 8088df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8098df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (mp == NULL ) { 8108df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi jniThrowException(env, "java/lang/IllegalStateException", NULL); 8118df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 8128df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 8138df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 8148df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi Parcel *request = parcelForJavaObject(env, java_request); 8158df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi status_t err = mp->setParameter(key, *request); 8168df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (err == OK) { 8178df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return true; 8188df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } else { 8198df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 8208df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 8218df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi} 8228df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping) 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 82671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setLooping: %d", looping); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL ); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz) 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 83871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isLooping"); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 842075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 844075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return mp->isLooping() ? JNI_TRUE : JNI_FALSE; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 848075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume) 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 850075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 856075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL ); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// Sends the request and reply parcels to the media player via the 86020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// binder interface. 86120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniastatic jint 86220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, 86320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jobject java_request, jobject java_reply) 86420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania{ 86520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 86620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania if (media_player == NULL ) { 86720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 868b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 86920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania } 87020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 87120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *request = parcelForJavaObject(env, java_request); 87220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *reply = parcelForJavaObject(env, java_reply); 87320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 87420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // Don't use process_media_player_call which use the async loop to 87520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // report errors, instead returns the status. 876075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->invoke(*request, reply); 87720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania} 87820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 879b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania// Sends the new filter to the client. 880b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniastatic jint 881b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniaandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request) 882b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania{ 883b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 884b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania if (media_player == NULL ) { 885b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 886b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 887b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania } 888b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 889b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania Parcel *filter = parcelForJavaObject(env, request); 890b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 8915d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (filter == NULL ) { 8925d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Filter is null"); 8935d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania return UNKNOWN_ERROR; 8945d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 8955d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 896075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->setMetadataFilter(*filter); 897b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania} 898b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 8995d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniastatic jboolean 9005d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniaandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only, 9015d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jboolean apply_filter, jobject reply) 9025d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania{ 9035d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 9045d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (media_player == NULL ) { 9055d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 906075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 9075d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 9085d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9095d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania Parcel *metadata = parcelForJavaObject(env, reply); 9105d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9115d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (metadata == NULL ) { 9125d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null"); 913075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 9145d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 9155d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9165d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania metadata->freeData(); 9175d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // On return metadata is positioned at the beginning of the 9185d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // metadata. Note however that the parcel actually starts with the 9195d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // return code so you should not rewind the parcel using 9205d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // setDataPosition(0). 921075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) { 922075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 923075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } else { 924075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 925075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } 9265d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania} 9275d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9284935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function gets some field IDs, which in turn causes class initialization. 9294935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// It is called from a static block in MediaPlayer, which won't run until the 9304935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// first time an instance of this class is used. 9314935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenstatic void 9324935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenandroid_media_MediaPlayer_native_init(JNIEnv *env) 9334935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen{ 9344935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen jclass clazz; 9354935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 9364935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen clazz = env->FindClass("android/media/MediaPlayer"); 9374935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (clazz == NULL) { 9384935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 9394935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 9404935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 941075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); 9424935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.context == NULL) { 9434935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 9444935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 9454935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 9464935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", 9474935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 9484935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.post_event == NULL) { 9494935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 9504935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 9514935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 952075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J"); 9531ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (fields.surface_texture == NULL) { 954cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return; 955cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 956d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 957b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar env->DeleteLocalRef(clazz); 958b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 9595ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun clazz = env->FindClass("android/net/ProxyInfo"); 960d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber if (clazz == NULL) { 961d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber return; 962d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber } 963d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 964d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetHost = 965d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;"); 966d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 967d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetPort = 968d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getPort", "()I"); 969d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 970d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetExclusionList = 9715ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;"); 972b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 973b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar env->DeleteLocalRef(clazz); 974b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 97523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia gBufferingParamsFields.init(env); 9760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 9770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania // Modular DRM 9780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania FIND_CLASS(clazz, "android/media/MediaDrm$MediaDrmStateException"); 9790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (clazz) { 98006b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania GET_METHOD_ID(gStateExceptionFields.init, clazz, "<init>", "(ILjava/lang/String;)V"); 98106b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania gStateExceptionFields.classId = static_cast<jclass>(env->NewGlobalRef(clazz)); 9820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 9830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->DeleteLocalRef(clazz); 9840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else { 98506b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania ALOGE("JNI android_media_MediaPlayer_native_init couldn't " 9860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "get clazz android/media/MediaDrm$MediaDrmStateException"); 9870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 9880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 9892d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia gPlaybackParamsFields.init(env); 9902d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia gSyncParamsFields.init(env); 991035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung gVolumeShaperFields.init(env); 9924935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen} 993b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 99771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_setup"); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = new MediaPlayer(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL) { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create new listener and give it to MediaPlayer 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(listener); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ MediaPlayer in an opaque field in the Java object. 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaPlayer(env, thiz, mp); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz) 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 101571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("release"); 1016d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != NULL) { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this prevents native callbacks after the object is released 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(0); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->disconnect(); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz) 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 102871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_finalize"); 10298dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 10308dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen if (mp != NULL) { 10318564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("MediaPlayer finalized without being released"); 10328dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen } 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_media_MediaPlayer_release(env, thiz); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 103633b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kastenstatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env, jobject thiz, 103733b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten jint sessionId) { 103871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("set_session_id(): %d", sessionId); 1039619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1040619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 1041619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 1042619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return; 1043619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 104433b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioSessionId((audio_session_t) sessionId), NULL, 104533b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten NULL); 1046619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 1047619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 1048619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env, jobject thiz) { 104971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("get_session_id()"); 1050619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1051619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 1052619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 1053619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return 0; 1054619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 1055619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 1056075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) mp->getAudioSessionId(); 1057619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 1058619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 10597070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void 10607070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level) 10617070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{ 106271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAuxEffectSendLevel: level %f", level); 10637070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 10647070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 10657070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 10667070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 10677070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 10687070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL ); 10697070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 10707070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 10717070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env, jobject thiz, jint effectId) { 107271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("attachAuxEffect(): %d", effectId); 10737070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 10747070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 10757070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 10767070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 10777070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 10787070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL ); 10797070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 10807070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 1081d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wangstatic jint 1082d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberandroid_media_MediaPlayer_pullBatteryData( 1083d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject /* thiz */, jobject java_reply) 1084d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang{ 1085d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player")); 1086d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1087d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang if (service.get() == NULL) { 1088d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService"); 1089d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang return UNKNOWN_ERROR; 1090d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang } 1091d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 1092d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang Parcel *reply = parcelForJavaObject(env, java_reply); 1093d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 1094075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) service->pullBatteryData(reply); 1095d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang} 1096d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 1097720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanstatic jint 1098720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanandroid_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz, 1099720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jstring addrString, jint port) { 1100720aa282791ef9405d39a15f419a41ab24f11e30John Grossman sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1101720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (mp == NULL ) { 1102720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 1103720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return INVALID_OPERATION; 1104720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1105720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1106720aa282791ef9405d39a15f419a41ab24f11e30John Grossman const char *cAddrString = NULL; 1107720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1108720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 1109720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString = env->GetStringUTFChars(addrString, NULL); 1110720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString == NULL) { // Out of memory 1111720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return NO_MEMORY; 1112720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1113720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1114720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ALOGV("setRetransmitEndpoint: %s:%d", 1115720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString ? cAddrString : "(null)", port); 1116720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1117720aa282791ef9405d39a15f419a41ab24f11e30John Grossman status_t ret; 1118720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString && (port > 0xFFFF)) { 1119720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = BAD_VALUE; 1120720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } else { 1121720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = mp->setRetransmitEndpoint(cAddrString, 1122720aa282791ef9405d39a15f419a41ab24f11e30John Grossman static_cast<uint16_t>(port)); 1123720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1124720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1125720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 1126720aa282791ef9405d39a15f419a41ab24f11e30John Grossman env->ReleaseStringUTFChars(addrString, cAddrString); 1127720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1128720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1129720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (ret == INVALID_OPERATION ) { 1130720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 1131720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1132720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1133075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) ret; 1134720aa282791ef9405d39a15f419a41ab24f11e30John Grossman} 1135720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 113684b832054552e00257bb04997143ca33d6d100beMarco Nelissenstatic void 113784b832054552e00257bb04997143ca33d6d100beMarco Nelissenandroid_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player) 113884b832054552e00257bb04997143ca33d6d100beMarco Nelissen{ 113984b832054552e00257bb04997143ca33d6d100beMarco Nelissen ALOGV("setNextMediaPlayer"); 114084b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz); 114184b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (thisplayer == NULL) { 114284b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized"); 114384b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 114484b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 114584b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player); 114684b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == NULL && java_player != NULL) { 114784b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized"); 114884b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 114984b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 115084b832054552e00257bb04997143ca33d6d100beMarco Nelissen 115184b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == thisplayer) { 115284b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self"); 115384b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 115484b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 115584b832054552e00257bb04997143ca33d6d100beMarco Nelissen // tie the two players together 115684b832054552e00257bb04997143ca33d6d100beMarco Nelissen process_media_player_call( 115784b832054552e00257bb04997143ca33d6d100beMarco Nelissen env, thiz, thisplayer->setNextMediaPlayer(nextplayer), 115884b832054552e00257bb04997143ca33d6d100beMarco Nelissen "java/lang/IllegalArgumentException", 115984b832054552e00257bb04997143ca33d6d100beMarco Nelissen "setNextMediaPlayer failed." ); 116084b832054552e00257bb04997143ca33d6d100beMarco Nelissen ; 116184b832054552e00257bb04997143ca33d6d100beMarco Nelissen} 116284b832054552e00257bb04997143ca33d6d100beMarco Nelissen 1163035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung// Pass through the arguments to the MediaServer player implementation. 1164035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic jint android_media_MediaPlayer_applyVolumeShaper(JNIEnv *env, jobject thiz, 1165035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung jobject jconfig, jobject joperation) { 1166035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung // NOTE: hard code here to prevent platform issues. Must match VolumeShaper.java 1167035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung const int VOLUME_SHAPER_INVALID_OPERATION = -38; 1168035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1169035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1170035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (mp == nullptr) { 1171035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jint)VOLUME_SHAPER_INVALID_OPERATION; 1172035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1173035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1174035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<VolumeShaper::Configuration> configuration; 1175035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<VolumeShaper::Operation> operation; 1176035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (jconfig != nullptr) { 1177035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung configuration = VolumeShaperHelper::convertJobjectToConfiguration( 1178035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung env, gVolumeShaperFields, jconfig); 1179035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung ALOGV("applyVolumeShaper configuration: %s", configuration->toString().c_str()); 1180035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1181035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (joperation != nullptr) { 1182035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung operation = VolumeShaperHelper::convertJobjectToOperation( 1183035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung env, gVolumeShaperFields, joperation); 1184035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung ALOGV("applyVolumeShaper operation: %s", operation->toString().c_str()); 1185035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1186035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung VolumeShaper::Status status = mp->applyVolumeShaper(configuration, operation); 1187035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (status == INVALID_OPERATION) { 1188035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung status = VOLUME_SHAPER_INVALID_OPERATION; 1189035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1190035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jint)status; // if status < 0 an error, else a VolumeShaper id 1191035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung} 1192035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1193035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung// Pass through the arguments to the MediaServer player implementation. 1194035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic jobject android_media_MediaPlayer_getVolumeShaperState(JNIEnv *env, jobject thiz, 1195035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung jint id) { 1196035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1197035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (mp == nullptr) { 1198035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jobject)nullptr; 1199035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1200035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1201035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<VolumeShaper::State> state = mp->getVolumeShaperState((int)id); 1202035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (state.get() == nullptr) { 1203035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jobject)nullptr; 1204035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1205035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return VolumeShaperHelper::convertStateToJobject(env, gVolumeShaperFields, state); 1206035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung} 1207035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 12080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania///////////////////////////////////////////////////////////////////////////////////// 12090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM begin 12100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts 12120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void throwDrmStateException(JNIEnv *env, const char *msg, status_t err) 12130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 12140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania ALOGE("Illegal DRM state exception: %s (%d)", msg, err); 12150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 121606b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania jobject exception = env->NewObject(gStateExceptionFields.classId, 121706b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania gStateExceptionFields.init, static_cast<int>(err), 12180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->NewStringUTF(msg)); 12190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->Throw(static_cast<jthrowable>(exception)); 12200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 12210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts 12230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic bool throwDrmExceptionAsNecessary(JNIEnv *env, status_t err, const char *msg = NULL) 12240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 12250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania const char *drmMessage = "Unknown DRM Msg"; 12260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania switch (err) { 12280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_UNKNOWN: 12290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "General DRM error"; 12300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_NO_LICENSE: 12320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "No license"; 12330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_LICENSE_EXPIRED: 12350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "License expired"; 12360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_SESSION_NOT_OPENED: 12380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Session not opened"; 12390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED: 12410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Not initialized"; 12420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_DECRYPT: 12440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Decrypt error"; 12450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_CANNOT_HANDLE: 12470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Unsupported scheme or data format"; 12480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_TAMPER_DETECTED: 12500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Invalid state"; 12510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania default: 12530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania String8 vendorMessage; 12570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err >= ERROR_DRM_VENDOR_MIN && err <= ERROR_DRM_VENDOR_MAX) { 12580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania vendorMessage = String8::format("DRM vendor-defined error: %d", err); 12590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = vendorMessage.string(); 12600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err == BAD_VALUE) { 12630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalArgumentException", msg); 12640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_NOT_PROVISIONED) { 12660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/NotProvisionedException", msg); 12670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_RESOURCE_BUSY) { 12690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/ResourceBusyException", msg); 12700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_DEVICE_REVOKED) { 12720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/DeniedByServerException", msg); 12730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == DEAD_OBJECT) { 12750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/MediaDrmResetException", 12760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "mediaserver died"); 12770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err != OK) { 12790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania String8 errbuf; 12800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (drmMessage != NULL) { 12810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (msg == NULL) { 12820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania msg = drmMessage; 12830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else { 12840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania errbuf = String8::format("%s: %s", msg, drmMessage); 12850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania msg = errbuf.string(); 12860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania throwDrmStateException(env, msg, err); 12890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return false; 12920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 12930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic Vector<uint8_t> JByteArrayToVector(JNIEnv *env, jbyteArray const &byteArray) 12950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 12960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania Vector<uint8_t> vector; 12970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania size_t length = env->GetArrayLength(byteArray); 12980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania vector.insertAt((size_t)0, length); 12990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->GetByteArrayRegion(byteArray, 0, length, (jbyte *)vector.editArray()); 13000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return vector; 13010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 13020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_prepareDrm(JNIEnv *env, jobject thiz, 130406b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania jbyteArray uuidObj, jbyteArray drmSessionIdObj) 13050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 13060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 13070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (mp == NULL) { 13080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalStateException", NULL); 13090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (uuidObj == NULL) { 13130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 13140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania Vector<uint8_t> uuid = JByteArrayToVector(env, uuidObj); 13180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (uuid.size() != 16) { 13200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "java/lang/IllegalArgumentException", 13230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "invalid UUID size, expected 16 bytes"); 13240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 132706b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania Vector<uint8_t> drmSessionId = JByteArrayToVector(env, drmSessionIdObj); 132806b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania 132906b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania if (drmSessionId.size() == 0) { 133006b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania jniThrowException( 133106b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania env, 133206b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "java/lang/IllegalArgumentException", 133306b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "empty drmSessionId"); 133406b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania return; 133506b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania } 133606b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania 133706b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania status_t err = mp->prepareDrm(uuid.array(), drmSessionId); 13380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err != OK) { 13390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err == INVALID_OPERATION) { 13400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "java/lang/IllegalStateException", 134306b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "The player must be in prepared state."); 13440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_CANNOT_HANDLE) { 13450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "android/media/UnsupportedSchemeException", 13480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "Failed to instantiate drm object."); 13490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else { 13500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania throwDrmExceptionAsNecessary(env, err, "Failed to prepare DRM scheme"); 13510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 13540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_releaseDrm(JNIEnv *env, jobject thiz) 13560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 13570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 13580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (mp == NULL ) { 13590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalStateException", NULL); 13600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania status_t err = mp->releaseDrm(); 13640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err != OK) { 13650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err == INVALID_OPERATION) { 13660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "java/lang/IllegalStateException", 136906b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "Can not release DRM in an active player state."); 13700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 13730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM end 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 137676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 137717524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong { 1378d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "nativeSetDataSource", 1379d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;" 1380d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "[Ljava/lang/String;)V", 138117524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong (void *)android_media_MediaPlayer_setDataSourceAndHeaders 138217524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong }, 138317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 13844eaa2938084353a54dc259466172909329a048ccChris Watkins {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD}, 13854eaa2938084353a54dc259466172909329a048ccChris Watkins {"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback }, 13861ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface}, 138723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia {"getDefaultBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer_getDefaultBufferingParams}, 138823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia {"getBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer_getBufferingParams}, 138923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia {"setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer_setBufferingParams}, 1390c42a96dba4beaf87875e71b8d8b77ce7154c5cdbRobert Shih {"_prepare", "()V", (void *)android_media_MediaPlayer_prepare}, 139107830aa6ba4804880df3cb39f8932aa6b3906a8aRobert Shih {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync}, 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_start", "()V", (void *)android_media_MediaPlayer_start}, 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_stop", "()V", (void *)android_media_MediaPlayer_stop}, 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth}, 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight}, 139610353e36018224b86ef2918d1d68107459d445cfRay Essick {"native_getMetrics", "()Landroid/os/PersistableBundle;", (void *)android_media_MediaPlayer_native_getMetrics}, 13972d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams}, 13982d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams}, 13992d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"setSyncParams", "(Landroid/media/SyncParams;)V", (void *)android_media_MediaPlayer_setSyncParams}, 14002d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"getSyncParams", "()Landroid/media/SyncParams;", (void *)android_media_MediaPlayer_getSyncParams}, 1401ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jia {"_seekTo", "(II)V", (void *)android_media_MediaPlayer_seekTo}, 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_pause", "()V", (void *)android_media_MediaPlayer_pause}, 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isPlaying", "()Z", (void *)android_media_MediaPlayer_isPlaying}, 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer_getCurrentPosition}, 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getDuration", "()I", (void *)android_media_MediaPlayer_getDuration}, 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_release", "()V", (void *)android_media_MediaPlayer_release}, 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_reset", "()V", (void *)android_media_MediaPlayer_reset}, 14081af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAudioStreamType", "(I)V", (void *)android_media_MediaPlayer_setAudioStreamType}, 14091af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer_getAudioStreamType}, 14108df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi {"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_setParameter}, 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setLooping", "(Z)V", (void *)android_media_MediaPlayer_setLooping}, 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isLooping", "()Z", (void *)android_media_MediaPlayer_isLooping}, 14131af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer_setVolume}, 141420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania {"native_invoke", "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke}, 1415b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania {"native_setMetadataFilter", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_setMetadataFilter}, 14165d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_getMetadata}, 14174935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen {"native_init", "()V", (void *)android_media_MediaPlayer_native_init}, 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer_native_setup}, 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize}, 1420619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"getAudioSessionId", "()I", (void *)android_media_MediaPlayer_get_audio_session_id}, 1421619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer_set_audio_session_id}, 14221af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer_setAuxEffectSendLevel}, 14237070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer_attachAuxEffect}, 1424d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang {"native_pullBatteryData", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_pullBatteryData}, 1425720aa282791ef9405d39a15f419a41ab24f11e30John Grossman {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer_setRetransmitEndpoint}, 142684b832054552e00257bb04997143ca33d6d100beMarco Nelissen {"setNextMediaPlayer", "(Landroid/media/MediaPlayer;)V", (void *)android_media_MediaPlayer_setNextMediaPlayer}, 1427035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung {"native_applyVolumeShaper", 1428035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung "(Landroid/media/VolumeShaper$Configuration;Landroid/media/VolumeShaper$Operation;)I", 1429035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung (void *)android_media_MediaPlayer_applyVolumeShaper}, 1430035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung {"native_getVolumeShaperState", 1431035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung "(I)Landroid/media/VolumeShaper$State;", 1432035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung (void *)android_media_MediaPlayer_getVolumeShaperState}, 14330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania // Modular DRM 143406b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania { "_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer_prepareDrm }, 14350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania { "_releaseDrm", "()V", (void *)android_media_MediaPlayer_releaseDrm }, 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14384935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function only registers the native methods 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int register_android_media_MediaPlayer(JNIEnv *env) 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/media/MediaPlayer", gMethods, NELEM(gMethods)); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1444212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun Heextern int register_android_media_ImageReader(JNIEnv *env); 1445f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun Heextern int register_android_media_ImageWriter(JNIEnv *env); 14468240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberextern int register_android_media_Crypto(JNIEnv *env); 14478a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerextern int register_android_media_Drm(JNIEnv *env); 1448d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhangextern int register_android_media_Descrambler(JNIEnv *env); 144988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaCodec(JNIEnv *env); 145088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaExtractor(JNIEnv *env); 14515a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberextern int register_android_media_MediaCodecList(JNIEnv *env); 1452d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberextern int register_android_media_MediaHTTPConnection(JNIEnv *env); 1453bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_MediaMetadataRetriever(JNIEnv *env); 145468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiextern int register_android_media_MediaMuxer(JNIEnv *env); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaRecorder(JNIEnv *env); 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaScanner(JNIEnv *env); 1457071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jiaextern int register_android_media_MediaSync(JNIEnv *env); 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_ResampleInputStream(JNIEnv *env); 1459c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongextern int register_android_media_MediaProfiles(JNIEnv *env); 14600cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpDatabase(JNIEnv *env); 14618182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodextern int register_android_mtp_MtpDevice(JNIEnv *env); 14620cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpServer(JNIEnv *env); 1463bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber 1464d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberjint JNI_OnLoad(JavaVM* vm, void* /* reserved */) 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = NULL; 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint result = -1; 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 14703762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: GetEnv failed\n"); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(env != NULL); 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1475f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He if (register_android_media_ImageWriter(env) != JNI_OK) { 1476f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He ALOGE("ERROR: ImageWriter native registration failed"); 1477f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He goto bail; 1478f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He } 1479f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He 1480212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He if (register_android_media_ImageReader(env) < 0) { 1481212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He ALOGE("ERROR: ImageReader native registration failed"); 1482212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He goto bail; 1483212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He } 1484212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaPlayer(env) < 0) { 14863762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaPlayer native registration failed\n"); 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaRecorder(env) < 0) { 14913762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaRecorder native registration failed\n"); 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaScanner(env) < 0) { 14963762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaScanner native registration failed\n"); 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaMetadataRetriever(env) < 0) { 15013762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaMetadataRetriever native registration failed\n"); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_ResampleInputStream(env) < 0) { 15063762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: ResampleInputStream native registration failed\n"); 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1510c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong if (register_android_media_MediaProfiles(env) < 0) { 15113762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaProfiles native registration failed"); 1512c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong goto bail; 1513c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong } 1514c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong 15150cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpDatabase(env) < 0) { 15163762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDatabase native registration failed"); 1517d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto bail; 1518d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1519d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 15208182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood if (register_android_mtp_MtpDevice(env) < 0) { 15213762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDevice native registration failed"); 15228182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood goto bail; 15238182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood } 15248182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood 15250cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpServer(env) < 0) { 15263762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpServer native registration failed"); 152781ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood goto bail; 152881ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood } 152981ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood 153088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaCodec(env) < 0) { 153188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 1532071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia goto bail; 1533071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia } 1534071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia 1535071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia if (register_android_media_MediaSync(env) < 0) { 1536071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia ALOGE("ERROR: MediaSync native registration failed"); 153788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 153888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 153988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 154088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaExtractor(env) < 0) { 154188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 154288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 154388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 154488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 154568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui if (register_android_media_MediaMuxer(env) < 0) { 154668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui ALOGE("ERROR: MediaMuxer native registration failed"); 154768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui goto bail; 154868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui } 154968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui 15505a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber if (register_android_media_MediaCodecList(env) < 0) { 15515a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 15525a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber goto bail; 15535a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber } 15545a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 15558240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber if (register_android_media_Crypto(env) < 0) { 15568240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 15578240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber goto bail; 15588240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 15598240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 15608a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (register_android_media_Drm(env) < 0) { 15618a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker ALOGE("ERROR: MediaDrm native registration failed"); 15628a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker goto bail; 15638a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 15648a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1565d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang if (register_android_media_Descrambler(env) < 0) { 1566d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang ALOGE("ERROR: MediaDescrambler native registration failed"); 1567d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang goto bail; 1568d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang } 1569d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang 1570d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (register_android_media_MediaHTTPConnection(env) < 0) { 1571d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber ALOGE("ERROR: MediaHTTPConnection native registration failed"); 1572d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber goto bail; 1573d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 1574d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* success -- return valid version number */ 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = JNI_VERSION_1_4; 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// KTHXBYE 1583